{"version":3,"sources":["img/circle_support.svg","img/login-logo.svg","img/account.svg","img/studio_logo.svg","img/close_black.svg","img/create.svg","img/coming_soon.svg","img/loader.svg","img/exclamation-error.svg","img/Check.svg","img/conversion.svg","img/EmptyStateDesk.svg","img/arrow-upload.svg","img/features-hide-show.svg","img/features-hide-show.png","img/features-hotspot.svg","img/features-image-hotspot.png","img/features-split-icon.svg","img/features-break-1.png","img/features-break-2.png","img/features-pdf-import.png","js/utils/constants.ts","js/actions/projects.ts","js/utils/miscUtils.ts","js/reducers/projects.ts","js/reducers/products.ts","js/actions/login.ts","js/reducers/login.ts","js/actions/products.ts","js/reducers/error.ts","js/reducers/loading.ts","js/reducers/index.ts","js/components/PrivateRoute.jsx","js/utils/history.ts","js/utils/routerUtils.ts","js/types/Types.ts","js/api/StudioAPI.ts","js/middleware/loginActions.ts","js/components/Recaptcha.tsx","js/utils/loginUtils.ts","js/components/SigninForm.tsx","js/utils/selectors.ts","js/containers/LoginContainer.tsx","js/components/LoginForm.tsx","js/pages/Login.jsx","js/components/AccountNav.tsx","js/containers/AccountNavContainer.tsx","js/components/Closeable.tsx","js/components/ShowHideMenu.tsx","js/components/Header.tsx","js/containers/HeaderContainer.tsx","js/pages/Error404.jsx","js/utils/PollingManager.ts","js/middleware/productActions.ts","js/middleware/projectsActions.ts","js/utils/angularManagerUtils.ts","js/components/ProjectFolder.tsx","js/utils/sortCompUtils.ts","js/components/ProjectsList.tsx","js/containers/ProjectsContainer.tsx","js/pages/Projects.jsx","js/components/FullscreenDialog.tsx","js/components/Clickable.tsx","js/components/addProductWizard/ProductTypeCard.tsx","js/components/LinkWithGATracker.tsx","js/components/addProductWizard/AddProductWizard.tsx","js/components/ProductEditPanel.tsx","js/components/productCard/ProductCtrlPanel.tsx","js/components/LoadingSpinner.tsx","js/utils/helperUtils.ts","js/components/progressIndicator/ProgressIndicator.tsx","js/components/progressIndicator/ProductProgressIndicator.tsx","js/containers/ProductProgressIndicatorContainer.tsx","js/components/productCard/ProductCard.tsx","js/containers/ProductCardContainer.tsx","js/components/ToolbarUtility.tsx","js/components/EmptyItemsPlaceholder.tsx","js/components/progressIndicator/FileImportProgressIndicator.tsx","js/containers/FileImportProgressIndicatorContainer.tsx","js/components/ProductsList.tsx","js/containers/ProductsContainer.tsx","js/components/HeaderNav.tsx","js/containers/HeaderNavContainer.tsx","js/pages/Products.jsx","js/pages/Error500.jsx","js/pages/FeatureUpdates.jsx","js/Routes.tsx","js/containers/LoadingContainer.tsx","js/components/ErrorDialog.tsx","js/containers/GenericErrorContainer.tsx","js/Foundry.tsx","index.tsx","img/create.gif","img/import.gif","img/import.svg","img/features-import.svg","img/vst_logo_signin.svg"],"names":["module","exports","__webpack_require__","p","ROUTES","AUTH","PROJECTS","PRODUCTS","FOUR_OH_FOUR","FIVE_HUNDRED","FEATURE_UPDATES","KEYCODES","PRODUCT_STATUS","ACTIVE","DUPLICATION_IN_PROGRESS","CONVERSION_IN_PROGRESS","CONVERSION_FAILED","TOC_LOCKED","IMPORT_IN_PROGRESS","DEFAULT_REQUEST_OPTIONS","hideLoader","COLORS","PRODUCT_FILTER_PREFIX","FILE_EXTENSIONS","STUDIO_DISABLE_LIBRARIES_LINK","SORT_ATTRIBUTE","lastEdited","key","displayVal","a_z","z_a","IMPORT_POLL_INTERVAL","MOCK_IMPORT_FILE_PROGRESS_TIME_THRESHOLD","MOCK_IMPORT_FILE_PROGRESS_INTERVAL","FETCH_PROJECTS_BEGIN","concat","FETCH_PROJECTS_SUCCESS","FETCH_PROJECTS_FAILURE","fetchProjectsBegin","options","arguments","length","undefined","type","fetchProjectsSuccess","projects","payload","fetchProjectsError","error","updateObject","object","properties","Object","assign","updateCollection","collection","newItem","index","lastCollectionIndex","map","item","itemIndex","getObjectIndexByProperty","objs","prop","value","obj","indexOf","product","initialState","items","filter","state","action","POST_SESSION_BEGIN","POST_SESSION_SUCCESS","POST_SESSION_FAILURE","DELETE_SESSION_BEGIN","DELETE_SESSION_SUCCESS","DELETE_SESSION_FAILURE","FETCH_SESSION_BEGIN","FETCH_SESSION_SUCCESS","FETCH_SESSION_FAILURE","postSessionError","failedAttempts","showRecaptcha","email","firstName","lastName","id","superAdmin","message","recaptcha","isSubmitted","login","sessionData","session","clearedState","FETCH_PRODUCTS_BEGIN","FETCH_PRODUCTS_SUCCESS","FETCH_PRODUCTS_FAILURE","FETCH_PRODUCT_STATUS_SUCCESS","FETCH_PRODUCT_STATUS_FAILURE","CREATE_PRODUCT_BEGIN","CREATE_PRODUCT_SUCCESS","CREATE_PRODUCT_FAILURE","UPDATE_PRODUCT_BEGIN","UPDATE_PRODUCT_SUCCESS","UPDATE_PRODUCT_FAILURE","DUPLICATE_PRODUCT_BEGIN","DUPLICATE_PRODUCT_SUCCESS","DUPLICATE_PRODUCT_FAILURE","DELETE_PRODUCT_BEGIN","DELETE_PRODUCT_SUCCESS","DELETE_PRODUCT_FAILURE","IMPORT_FILE_BEGIN","IMPORT_FILE_SUCCESS","IMPORT_FILE_FAILURE","IMPORT_FILE_PROGRESS_STATUS","IMPORT_FILE_RESET_PROCESS","fetchProductsBegin","projectId","fetchProductsSuccess","products","fetchProductsError","createProductBegin","createProductSuccess","createProductFailure","updateProductBegin","updateProductSuccess","updateProductFailure","deleteProductBegin","deleteProductSuccess","deleteProductFailure","duplicateProductBegin","duplicateProductSuccess","duplicateProductFailure","fetchProductStatusSuccess","productStatus","inProgress","progressPct","fetchProductStatusFailure","importFileBegin","importFileSuccess","importFileFailure","importFileProgressStatus","percent","projectName","itemInEditMode","fileImport","status","progress","name","productStatusObject","indexForStatusUpdate","toString","updatedProduct","localStorage","getItem","matches","exec","_matches","slicedToArray","requestName","requestState","objectSpread","defineProperty","loading","typeMatches","shouldShowLoader","_typeMatches","showLoader","combineReducers","withCookies","_ref","Component","component","rest","objectWithoutProperties","react_default","a","createElement","Route","render","props","cookies","get","Redirect","to","pathname","from","location","createHashHistory","buildRoute","routeTemplate","parameters","param","hasOwnProperty","replace","ProductCardType","ProductCardButtonAction","LogLevel","AjaxProgress","logout","Cookies","path","domain","history","push","fourOhFour","api","window","protocol","hostname","sessionRoute","projectsRoute","projectRoute","project","productsRoute","productRoute","StudioAPI","classCallCheck","this","credentials","instance","getJSON","data","sendJson","deleteEntity","productId","file","onProgress","sendMultipartFile","convertFileToFormData","formData","FormData","append","route","method","fetch","headers","Content-Type","body","JSON","stringify","then","handleFetchResponse","opts","Promise","res","rej","uploadStartTime","Date","getTime","xhr","XMLHttpRequest","open","withCredentials","onload","e","target","responseText","onerror","upload","onprogress","send","fetchWithProgress","handleXHRResponse","response","json","ok","statustext","statusText","code","reject","responseJSON","parse","getInstance","postSession","username","password","dispatch","getState","recaptchaWindow","recaptchaResponse","grecaptcha","getResponse","messageid","metadata","version","postSessionBegin","errorResponse","failedLoginAttempts","reset","messageText","messageLevel","errorMessage","showRecaptchaAttempts","Error","text","level","fetchSession","fetchSessionBegin","deleteSession","deleteSessionBegin","Recaptcha","_this","possibleConstructorReturn","getPrototypeOf","call","isReady","updateReadyState","bind","assertThisInitialized","readyInterval","setInterval","prevProps","prevState","sitekey","process","onLoad","clearInterval","setState","recaptchaClasses","classNames","hidden","visible","g-recaptcha","className","loadRecaptcha","script","document","async","defer","src","appendChild","actions","SignInForm","styled","Form","_templateObject","SignInFormTextField","TextField","_templateObject2","SigninForm","isValid","forgotPassedDialogOpen","handleFieldChange","handleSubmit","validate","toggleForgotPasswordDialog","onRecaptchaReady","preventDefault","console","info","updateRecaptchaId","_this2","vstui","closeButtonLabel","onRequestClose","primaryActionButton","label","onClick","rootSelector","secondaryActionButton","size","title","_this3","getDialog","SigninForm_SignInForm","onSubmit","onValidate","studioLoginLogo","showIfError","onChange","required","Recaptcha_Recaptcha","fullWidth","href","loadingSelector","some","loadingInfo","connect","Styled","XSmall","LoginForm_templateObject","LoginForm","LoginContainer","vitalSourceLogo","supportLogo","Login","components_LoginForm","withRouter","AccountNav","Closeable","handleKeyDown","handleClickOutside","addEventListener","removeEventListener","event","domNode","ReactDOM","findDOMNode","contains","onClickOutside","which","onEscape","children","ShowHideMenu","onMenuItemClick","handleEscape","onVisibleChange","isVisible","Closeable_Closeable","menu","Header","accountSelected","accountVisibleChange","loginNotRequired","accountClasses","AccountButtonSelected","Link","logo","alt","ShowHideMenu_ShowHideMenu","AccountNavContainer","accountLogo","Error404","HeaderContainer","PollingManager","_len","args","Array","_key","join","callback","interval","activePolls","FILE_IMPORT_INTERVAL_REF","fetchProductStatus","mockProductsProgressStatus","PollManager","remove","createKey","removeItem","getLocalStoreKeyForProgress","importFile","importStartTime","shouldMockIndicator","loaded","total","isLoadingToFastForIndicator","mockGcsTransfer","Math","floor","calculateProgressPercentage","add","resolve","pct","mockProgressIfFastUpload","kill","progressVal","parseInt","setItem","fetchProjects","i","startsWith","clearProductFilters",":projectId","fetchProject","forEach","angularRouterHost","ProjectFolder","productCount","src_default","clamp","sortBy","list","sortByNames","reverse","decoratedSort","lastOpenDate","valueOf","sortByDates","toLowerCase","b","localeCompare","sortables","decorator","sort","undecorated","tuple","SearchField","ProjectsList_templateObject","SearchIconOverLay","SearchIcon","ProjectsList_templateObject2","ProjectsList","updateProjectsFilter","sortTitles","filteredProjects","applyFilterToProjects","placeholder","maxLength","labelHidden","fitleredProjects","projectContainerList","components_ProjectFolder","apply","j","mapProjectsToProjectFolder","ProjectsContainer","components_ProjectsList","Projects","containers_ProjectsContainer","FullscreenDialog","requestClose","classList","onClose","interactive","autoFocus","close","Clickable","hover","focus","toggleHover","toggleFocus","hasHover","onHoverChange","disabled","hasFocus","onFocusChange","Wrapper","isInline","onMouseEnter","onMouseLeave","onFocus","onBlur","ProductTypeCard","hoverChange","raised","Clickable_Clickable","onSelected","hoverIcon","icon","description","LinkWithGATracker","propsWithGATracker","initPropsWithGATracker","ReactGA","pageview","LearnMoreIcon","Icon","AddProductWizard_templateObject","AddProductWizard","ProductTypeCard_ProductTypeCard","createIcon","createIconAnim","onProductTypeSelected","EPUB","projectConfig","allowPdfImport","importIcon","importIconAnim","Import","allowXmlZipImport","LinkWithGATracker_LinkWithGATracker","stopPropagation","Fragment","height","width","vstui_icons","react_inlinesvg_es","comingSoon","getImportFileCard","StyledTextField","ProductEditPanel_templateObject","ProductEditPanel","editField","nameLength","nameInput","nameIsValid","shouldShakeTextField","clickOutside","selectEscape","textfieldChange","updateProduct","setShakeState","setTimeout","removeShakeState","clearTimeout","trim","blur","editProduct","lowerCaseValue","lowerCaseProducts","matchingIndex","multiline","rows","defaultValue","nativeFormControlRef","input","EllipsisColor","theme","createTheme","color","primary","red","DeleteModal","Dialog","ProductCtrlPanel_templateObject","ModalLabel","div","ProductCtrlPanel_templateObject2","ModalValue","_templateObject3","ButtonPanel","handleDeleteConfirmationClick","enableContinueDelete","setIsConfirmationDialogShown","deleteProduct","validationMessage","deleteCBXRef","checkboxClicked","checkboxValue","isFullPanel","isConfirmationDialogShown","btnHovered","VSTUIButtonColor","setIsFullPanel","alert","productName","numberOfScreens","publishDate","toLocaleDateString","month","day","year","checked","x","style","Delete","Edit","Duplicate","duplicateProduct","getConfirmationDialog","aria-label","handleOnClick","_this4","isProcessInProgress","GREY","WHITE","displayStatus","_this5","getEllipsisColor","getFullPanelLayout","getDeleteProductLayout","getProcessInProgressLayout","getInitialLayout","LoadingSpinner","styles","loader","scroller","Scroll","checkTitleDupAndModify","appendedString","it","productList","isDuplicate","scrollToObject","scrollToId","containerId","scrollTo","delay","duration","smooth","offset","STROKE_COLOR","IN_PROGRESS","SUCCESS","FAILURE","DEFAULT","SIZE_MAP","large","ringHeight","ringWidth","iconHeight","iconWidth","small","CLASS_NAME_FOR_STATUS","SUCCESS_small","ProgressIndicator","ProgressRingContainer","ProgressIndicator_templateObject","setDelayedState","wait","nextProps","nextState","triggerSuccessAnimation","rc_progress_es","progressInfo","strokeWidth","trailWidth","strokeColor","trailColor","onSuccess","getProgressIndicator","progressCompleteMessage","successIcon","inProgressMessage","renderOnSuccess","progressFailureMessage","errorIcon","getRenderedContent","ProductProgressIndicator","isHidden","isTransitioning","setHiddenState","setIsTransitioningState","actionType","ProgressIndicator_ProgressIndicator","conversionIcon","derivePropertyInfo","ownProps","find","getProgressInfo","ProductTitle","ProductCard_templateObject","ProductLastEdited","ProductCard_templateObject2","ProductCardElem","Card","ProductCard_templateObject3","ICircleCustom","ICircle","_templateObject4","spinnerStyles","position","zIndex","WithLink","link","ProductCard","intervalId","_useState","useState","_useState2","setLoading","_useState3","_useState4","currentStatus","setCurrentStatus","showCardStatus","processInProgress","useEffect","getProductDetails","coverUrl","asyncToGenerator","regenerator_default","mark","_callee","url","productIndex","wrap","_context","prev","next","URL","origin","searchParams","sent","isArray","findIndex","log","t0","stop","getFormattedDate","dateString","showFullDate","currentYear","getFullYear","modifiedDate","getProductCloneName","cpyRegExp","RegExp","test","similarTitlesReg","matchingTitles","updateCoverPosition","coverImage","naturalHeight","naturalWidth","setAttribute","getAttribute","ProductProgressIndicatorContainer","components_LoadingSpinner","getInProgressMessage","ProductCard_WithLink","Tooltip_default","placement","includes","inEditMode","productCard_ProductCtrlPanel","clone","srcProduct","srcProject","ProductEditPanel_ProductEditPanel","productData","updateItemInEditMode","ToolbarUtility_templateObject","ToolbarUtility_templateObject2","SelectDropDown","Select","ToolbarUtility_templateObject3","CustomButton","Button","ToolbarUtility_templateObject4","disabledStyle","_ref2","_ref3","_ref4","ToolbarUtility","showTooltip","setShowTooltip","timer","ToolbarUtility_SearchField","onUpdateFilter","ToolbarUtility_SearchIconOverLay","onUpdateSort","btnAction","ref","addButtonRefCb","emptyFilterState","EmptyItemsPlaceholder_templateObject","EmptyItemsPlaceholder","EmptyItemsPlaceholder_CustomButton","buttonOnClick","emptyStateDeskSvg","FileImportProgressIndicator_templateObject","ErrorButton","FileImportProgressIndicator_templateObject2","FileImportProgressIndicator","resetImportProcess","generateFailureMessageFromServer","handleUploadRetry","handleClose","FileImportProgressIndicator_LearnMoreIcon","uploadIcon","getProgressCompleteMessage","getFailureMessage","STUDIO_PRODUCT_SORT_VALUE","ProductsList","addDialogVisible","productCreatedFromFileImport","disableDialogInteraction","addButton","React","createRef","fileInputSelector","clickAdd","addDialogRequestClose","productTypeSelected","handleInputFileSelectedChanged","handleRetrySelectFile","setRefAddButton","setProductCreatedFromFileImport","match","params","resetProducts","fetchData","projectData","elem","querySelector","currentTarget","files","fileToImport","typedData","err","productContainerList","ProductCardContainer","screens","_this6","addProduct","current","click","updateProductsFilter","fileExts","dialog","_this7","filteredAndSortedProducts","applyFilterAndSortToProducts","acceptableFileFormats","getAcceptedFileFormats","FullscreenDialog_FullscreenDialog","accept","display","FileImportProgressIndicatorContainer","addProductWizard_AddProductWizard","isLoading","components_ToolbarUtility","mapProductsToProductCard","components_EmptyItemsPlaceholder","isFetchingProducts","HeaderNav","breadcrumb","activeItem","tabs","Children","tab","classes","header-nav-link--active","HeaderNavContainer","NavLink","ProductsContainer","Error500","FeatureUpdates","pdfImportIcon","pdfImportPic","screenBreakIcon","fontWeight","screenBreakPic1","screenBreakPic2","hideShowIcon","hideShowPic","hotspotIcon","hotspotPic","listen","excludedActions","Routes","Router","Switch","exact","components_PrivateRoute","Products","remainingActions","ErrorDialog","requireInteraction","reload","errorSelector","filteredActions","createErrorUnselector","host","initialize","hash","ocean","secondary","cheddar","loggerMiddleware","createLogger","store","createStore","foundryApp","applyMiddleware","thunkMiddleware","Foundry","es","themes","es6","LoadingContainer","GenericErrorContainer","Routes_Routes","js_Foundry","getElementById"],"mappings":"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","file":"static/js/main.491d3951.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/circle_support.222dd8e5.svg\";","module.exports = __webpack_public_path__ + \"static/media/login-logo.48cb0953.svg\";","module.exports = __webpack_public_path__ + \"static/media/account.fb7283f5.svg\";","module.exports = __webpack_public_path__ + \"static/media/studio_logo.3287d33e.svg\";","module.exports = __webpack_public_path__ + \"static/media/close_black.cc344362.svg\";","module.exports = __webpack_public_path__ + \"static/media/create.2c19908b.svg\";","module.exports = __webpack_public_path__ + \"static/media/coming_soon.cf8d866a.svg\";","module.exports = __webpack_public_path__ + \"static/media/loader.c64edfc9.svg\";","module.exports = __webpack_public_path__ + \"static/media/exclamation-error.378ee595.svg\";","module.exports = __webpack_public_path__ + \"static/media/Check.08af8ae0.svg\";","module.exports = __webpack_public_path__ + \"static/media/conversion.ea8e9509.svg\";","module.exports = __webpack_public_path__ + \"static/media/EmptyStateDesk.f314ac1d.svg\";","module.exports = __webpack_public_path__ + \"static/media/arrow-upload.1bb0adc4.svg\";","module.exports = __webpack_public_path__ + \"static/media/features-hide-show.1bfa0893.svg\";","module.exports = __webpack_public_path__ + \"static/media/features-hide-show.93b1134c.png\";","module.exports = __webpack_public_path__ + \"static/media/features-hotspot.1c95ef0f.svg\";","module.exports = __webpack_public_path__ + \"static/media/features-image-hotspot.5346e93e.png\";","module.exports = __webpack_public_path__ + \"static/media/features-split-icon.55589237.svg\";","module.exports = __webpack_public_path__ + \"static/media/features-break-1.bfcf03ae.png\";","module.exports = __webpack_public_path__ + \"static/media/features-break-2.6ef5ee88.png\";","module.exports = __webpack_public_path__ + \"static/media/features-pdf-import.e8d1c86b.png\";","\nexport const STUDIO_SESSION_COOKIE_DEV = 'doorman-vst_signin-services-dev';\nexport const STUDIO_SESSION_COOKIE_PROD = 'doorman-vst_signin-services';\nexport const DUPLICATE_PRODUCT_NAME_API_ERROR = \"response.duplicate.product\";\nexport const FILE_SIZE_EXCEEDS_LIMIT_ERROR = \"response.file.size.exceeds.limit\";\nexport const INVALID_FILE_CONTENT_TYPE_ERROR = \"response.invalid.file.content.type\"\n\nexport const ROUTES = {\n AUTH: \"/\",\n PROJECTS: \"/projects\",\n PRODUCTS: \"/projects/:projectId\",\n FOUR_OH_FOUR: \"/error/404\",\n FIVE_HUNDRED: \"/error/unknown\",\n FEATURE_UPDATES: \"/feature-updates\"\n};\n\nexport const KEYCODES = {\n ENTER: 13,\n ESCAPE: 27\n}\n\nexport const PRODUCT_STATUS = {\n ACTIVE: \"Active\",\n DUPLICATION_IN_PROGRESS: \"Duplication In Progress\",\n CONVERSION_IN_PROGRESS: \"Conversion In Progress\",\n CONVERSION_FAILED: \"Conversion Failed\",\n TOC_LOCKED: \"TOC Locked\",\n IMPORT_IN_PROGRESS: \"Import in Progress\"\n};\n\nexport const recaptchaHtmlId = \"signin-recaptcha\";\n\nexport const DEFAULT_REQUEST_OPTIONS = {\n hideLoader: false\n};\n\nexport const COLORS = {\n WHITE: \"WHITE\"\n};\n\nexport const PRODUCT_FILTER_PREFIX = \"product-filter-\";\nexport const FILE_EXTENSIONS = {\n PDF: \".pdf\",\n ZIP: \".zip\"\n};\n\nexport const INPUT_FILE_TYPES = {\n ZIP: \"application/zip\",\n PDF: \"application/pdf\"\n};\nexport const STUDIO_DISABLE_LIBRARIES_LINK = \"STUDIO_DISABLE_LIBRARIES_LINK\";\nexport const SORT_ATTRIBUTE = {\n lastEdited: {\n key: \"lastEdited\",\n displayVal: \"Last Edited\"\n },\n a_z: {\n key: \"A_Z\",\n displayVal: \"A - Z\"\n },\n z_a: {\n key: \"Z_A\",\n displayVal: \"Z - A\"\n }\n};\nexport const IMPORT_POLL_INTERVAL = 20000;\nexport const MOCK_IMPORT_FILE_PROGRESS_TIME_THRESHOLD = 5000;\nexport const MOCK_IMPORT_FILE_PROGRESS_INTERVAL = 350;\n\n","import {ErrorResponse} from \"../types/StudioAPITypes\";\nimport {DEFAULT_REQUEST_OPTIONS} from \"../utils/constants\";\nimport {RequestOptions} from \"../types/Types\";\n\nexport const FETCH_PROEJCTS_BASE = 'FETCH_PROJECTS';\nexport const FETCH_PROJECTS_BEGIN = `${FETCH_PROEJCTS_BASE}_BEGIN`;\nexport const FETCH_PROJECTS_SUCCESS = `${FETCH_PROEJCTS_BASE}_SUCCESS`;\nexport const FETCH_PROJECTS_FAILURE = `${FETCH_PROEJCTS_BASE}_FAILURE`;\nexport const UPDATE_PROJECTS_FILTER = 'UPDATE_PROJECTS_FILTER'\n\nexport const fetchProjectsBegin = (options: RequestOptions = DEFAULT_REQUEST_OPTIONS) => ({\n type: FETCH_PROJECTS_BEGIN,\n options: options\n});\n\nexport const fetchProjectsSuccess = (projects: any) => ({\n type: FETCH_PROJECTS_SUCCESS,\n payload: { projects }\n});\n\nexport const fetchProjectsError = (error: ErrorResponse) => ({\n type: FETCH_PROJECTS_FAILURE,\n payload: { error }\n});\n\nexport const updateProjectsFilter = (filter: string) => ({\n type: UPDATE_PROJECTS_FILTER,\n filter: filter\n})\n","/**\n * Add new properties to an object, replacing the original with a new one\n * Useful for Redux reducers\n *\n * @param {T} object\n * @param {Object} properties\n * @returns {T}\n */\nexport function updateObject(object: T, properties: Object): T {\n return Object.assign({}, object, properties)\n};\n\n/**\n * Update a collection with a new member, replacing the original with a new one\n * Useful for redux reducers\n *\n * @param {A[]} collection\n * @param {A} item\n * @param {number} index\n * @returns {A[]}\n */\nexport function updateCollection(collection: A[], newItem: A, index: number): A[] {\n const lastCollectionIndex = collection.length - 1;\n if (index > lastCollectionIndex) {\n index = lastCollectionIndex;\n }\n return collection.map((item: A, itemIndex: number) => {\n if (index === itemIndex) {\n return newItem;\n }\n\n return item;\n })\n\n return [];\n}\n\n/**\n * Get an object from a collection by a property using its key-value pair\n */\nexport function getObjectByProperty(objs: T[], prop: string, value: U): T | null {\n const index: number = getObjectIndexByProperty(objs, prop, value);\n\n if (index === -1) {\n return null;\n }\n\n return objs[index];\n}\n\n/**\n * Get an object index from a collection by a property using its key-value pair\n *\n * @param {T[]} objs\n * @param {string} prop\n * @param {U} value\n * @returns {number}\n */\nexport function getObjectIndexByProperty(objs: T[], prop: string, value: U): number {\n return objs.map((obj: T) => {\n if ((obj)[prop]) {\n return (obj)[prop];\n }\n\n return null;\n }).indexOf(value);\n}\n","import {FETCH_PROJECTS_BEGIN, FETCH_PROJECTS_FAILURE, FETCH_PROJECTS_SUCCESS, UPDATE_PROJECTS_FILTER} from \"../actions/projects\";\nimport {ProjectsState} from \"./index\";\nimport {AnyAction} from \"redux\";\nimport {updateObject} from \"../utils/miscUtils\";\n\nconst initialState: ProjectsState = {\n items: [],\n filter: \"\"\n};\n\nconst projects = (state: ProjectsState = initialState, action: AnyAction) => {\n switch(action.type) {\n case FETCH_PROJECTS_BEGIN:\n return updateObject(state, {\n filter: \"\"\n });\n case FETCH_PROJECTS_SUCCESS:\n return updateObject(state, {\n items: action.payload.projects,\n filter: \"\"\n });\n case FETCH_PROJECTS_FAILURE:\n return updateObject(state, {\n filter: \"\"\n });\n case UPDATE_PROJECTS_FILTER:\n return updateObject(state,{\n filter: action.filter\n });\n default:\n return state;\n }\n};\n\nexport default projects;\n","import {ProductState} from \"./index\";\nimport {AnyAction} from \"redux\";\nimport {\n CREATE_PRODUCT_BEGIN,\n CREATE_PRODUCT_FAILURE,\n CREATE_PRODUCT_SUCCESS,\n FETCH_PRODUCTS_BEGIN,\n FETCH_PRODUCTS_FAILURE,\n FETCH_PRODUCTS_SUCCESS,\n UPDATE_ITEM_IN_EDIT_MODE,\n UPDATE_PRODUCT_BEGIN,\n UPDATE_PRODUCT_FAILURE,\n UPDATE_PRODUCT_SUCCESS,\n DUPLICATE_PRODUCT_BEGIN,\n DUPLICATE_PRODUCT_FAILURE,\n DUPLICATE_PRODUCT_SUCCESS,\n UPDATE_PRODUCTS_FILTER,\n FETCH_PRODUCT_STATUS_SUCCESS,\n IMPORT_FILE_BEGIN,\n IMPORT_FILE_FAILURE,\n IMPORT_FILE_SUCCESS,\n IMPORT_FILE_PROGRESS_STATUS,\n IMPORT_FILE_RESET_PROCESS,\n UPDATE_PRODUCTS\n} from \"../actions/products\";\nimport {getObjectIndexByProperty, updateCollection, updateObject} from \"../utils/miscUtils\";\nimport {ProductDataItem} from \"../types/StudioAPITypes\";\nimport {PRODUCT_FILTER_PREFIX} from \"../utils/constants\";\n\nconst initialState: ProductState = {\n items: [],\n projectId: \"\",\n projectName: \"\",\n filter: \"\",\n itemInEditMode: \"\",\n fileImport: {\n status: \"\",\n progress: 0\n }\n};\n\nlet product: ProductDataItem;\n\nconst products = (state: ProductState = initialState, action: AnyAction) => {\n switch(action.type) {\n case UPDATE_PRODUCTS:\n return updateObject(state, {\n items: action.items\n });\n case FETCH_PRODUCTS_SUCCESS:\n return updateObject(state, {\n items: action.payload.products.products,\n projectId: action.payload.products.id,\n projectName: action.payload.products.name\n });\n case DUPLICATE_PRODUCT_SUCCESS:\n product = action.payload.product;\n return updateObject(state, {\n items: state.items.concat([product]),\n filter:\"\",\n });\n case IMPORT_FILE_SUCCESS:\n product = action.payload.product;\n return updateObject(state, {\n items: state.items.concat([product]),\n filter:\"\",\n fileImport: {\n progress: 100,\n status: \"SUCCESS\"\n }\n });\n case CREATE_PRODUCT_SUCCESS:\n product = action.payload.product;\n return updateObject(state, {\n items: state.items.concat([product]),\n itemInEditMode: product.id,\n filter:\"\"\n });\n case UPDATE_PRODUCT_SUCCESS:\n product = action.payload.product;\n const index = getObjectIndexByProperty(state.items, \"id\", product.id);\n\n if (index !== -1) {\n return updateObject(state, {\n items: updateCollection(state.items, product, index),\n filter: \"\",\n });\n }\n return state;\n case FETCH_PRODUCT_STATUS_SUCCESS:\n let productStatusObject = action.payload.productStatus;\n let progressPct = action.progressPct;\n const indexForStatusUpdate = getObjectIndexByProperty(state.items, \"id\", productStatusObject.id.toString());\n\n if (indexForStatusUpdate !== -1) {\n let product = state.items[indexForStatusUpdate];\n\n let updatedProduct = updateObject(product, {\n status: productStatusObject.productStatus,\n progressPct: progressPct\n });\n\n return updateObject(state, {\n items: updateCollection(state.items, updatedProduct, indexForStatusUpdate),\n filter: \"\"\n });\n }\n return state;\n case UPDATE_ITEM_IN_EDIT_MODE:\n return updateObject(state, {\n itemInEditMode: action.id\n });\n case UPDATE_PRODUCTS_FILTER:\n return updateObject(state,{\n filter: action.filter\n });\n case FETCH_PRODUCTS_BEGIN:\n return updateObject(state,{\n projectName: \"\",\n filter: (localStorage.getItem(PRODUCT_FILTER_PREFIX + action.projectId) !== null) ? localStorage.getItem(PRODUCT_FILTER_PREFIX + action.projectId) : \"\",\n });\n case IMPORT_FILE_PROGRESS_STATUS:\n return updateObject(state, {\n fileImport: {\n progress: action.payload.percent,\n status: \"IN_PROGRESS\"\n }\n });\n case IMPORT_FILE_FAILURE:\n return updateObject(state, {\n fileImport: {\n progress: 100,\n status: \"FAILURE\"\n }\n });\n case IMPORT_FILE_BEGIN:\n return updateObject(state, {\n fileImport: {\n progress: 0,\n status: \"IN_PROGRESS\"\n }\n });\n case IMPORT_FILE_RESET_PROCESS:\n return updateObject(state, {\n fileImport: {\n progress: 0,\n status: \"\"\n }\n });\n case FETCH_PRODUCTS_FAILURE:\n case CREATE_PRODUCT_BEGIN:\n case CREATE_PRODUCT_FAILURE:\n case UPDATE_PRODUCT_BEGIN:\n case UPDATE_PRODUCT_FAILURE:\n case DUPLICATE_PRODUCT_FAILURE:\n default:\n return state;\n }\n};\n\n\nexport default products;\n","import {ErrorResponse, SessionErrorResponse} from \"../types/StudioAPITypes\";\nimport {LogLevel, RequestOptions} from \"../types/Types\";\nimport {DEFAULT_REQUEST_OPTIONS} from \"../utils/constants\";\n\nexport const POST_SESSION_BASE = 'POST_SESSION';\nexport const POST_SESSION_BEGIN = `${POST_SESSION_BASE}_BEGIN`;\nexport const POST_SESSION_SUCCESS = `${POST_SESSION_BASE}_SUCCESS`;\nexport const POST_SESSION_FAILURE = `${POST_SESSION_BASE}_FAILURE`;\nexport const DELETE_SESSION_BASE = `DELETE_SESSION`;\nexport const DELETE_SESSION_BEGIN = `${DELETE_SESSION_BASE}_BEGIN`;\nexport const DELETE_SESSION_SUCCESS = `${DELETE_SESSION_BASE}_SUCCESS`;\nexport const DELETE_SESSION_FAILURE = `${DELETE_SESSION_BASE}_FAILURE`;\nexport const FETCH_SESSION_BASE = 'FETCH_SESSION';\nexport const FETCH_SESSION_BEGIN = `${FETCH_SESSION_BASE}_BEGIN`;\nexport const FETCH_SESSION_SUCCESS = `${FETCH_SESSION_BASE}_SUCCESS`;\nexport const FETCH_SESSION_FAILURE = `${FETCH_SESSION_BASE}_FAILURE`;\nexport const UPDATE_LOGIN_MESSAGE = 'UPDATE_LOGIN_MESSAGE';\nexport const UPDATE_RECAPTCHA_ID = 'UPDATE_RECAPTCHA_ID';\n\nexport const postSessionBegin = (options: RequestOptions = DEFAULT_REQUEST_OPTIONS) => ({\n type: POST_SESSION_BEGIN,\n options: options\n});\n\nexport const postSessionSuccess = (session: any) => ({\n type: POST_SESSION_SUCCESS,\n payload: { session }\n});\n\nexport const postSessionError = (error: SessionErrorResponse, failedAttempts: number, showRecaptcha: boolean) => ({\n type: POST_SESSION_FAILURE,\n payload: { error },\n failedAttempts: failedAttempts,\n showRecaptcha: showRecaptcha\n});\n\nexport const deleteSessionBegin = (options: RequestOptions = DEFAULT_REQUEST_OPTIONS) => ({\n type: DELETE_SESSION_BEGIN,\n options: options\n});\n\nexport const deleteSessionSuccess = () => ({\n type: DELETE_SESSION_SUCCESS\n});\n\nexport const deleteSessionFailure = (error: ErrorResponse) => ({\n type: DELETE_SESSION_FAILURE,\n payload: { error }\n});\n\nexport const fetchSessionBegin = (options: RequestOptions = DEFAULT_REQUEST_OPTIONS) => ({\n type: FETCH_SESSION_BEGIN,\n options: options\n});\n\nexport const fetchSessionSuccess = (session: any) => ({\n type: FETCH_SESSION_SUCCESS,\n payload: { session }\n});\n\nexport const fetchSessionFailure = (error: ErrorResponse) => ({\n type: FETCH_SESSION_FAILURE,\n payload: { error }\n});\n\nexport const updateMessage = (messageText: string, messageLevel: LogLevel) => ({\n type: UPDATE_LOGIN_MESSAGE,\n message: {\n text: messageText,\n level: messageLevel\n }\n});\n\nexport const updateRecaptchaId = (id: number) => ({\n type: UPDATE_RECAPTCHA_ID,\n id: id\n})\n","import {\n POST_SESSION_BEGIN, POST_SESSION_FAILURE, POST_SESSION_SUCCESS, DELETE_SESSION_BEGIN, DELETE_SESSION_SUCCESS,\n DELETE_SESSION_FAILURE,\n FETCH_SESSION_BEGIN,\n FETCH_SESSION_SUCCESS,\n FETCH_SESSION_FAILURE, UPDATE_LOGIN_MESSAGE, UPDATE_RECAPTCHA_ID\n} from \"../actions/login\";\nimport {AnyAction} from \"redux\";\nimport {LoginState} from \"./index\";\nimport {updateObject} from \"../utils/miscUtils\";\n\nconst initialState = {\n showRecaptcha: false,\n failedAttempts: 0,\n email: \"\",\n firstName: \"\",\n lastName: \"\",\n id: -1,\n superAdmin: false,\n message: null,\n recaptcha: 0,\n isSubmitted: false\n};\n\nconst login = (state: LoginState = initialState, action: AnyAction) => {\n\n switch(action.type) {\n case UPDATE_RECAPTCHA_ID:\n return updateObject(state, {\n recaptcha: action.id\n })\n case UPDATE_LOGIN_MESSAGE:\n return updateObject(state, {\n message: action.message\n })\n case POST_SESSION_BEGIN:\n return updateObject(state, {\n message: null,\n isSubmitted: true\n })\n case POST_SESSION_FAILURE:\n case FETCH_SESSION_FAILURE:\n return updateObject(state, {\n failedAttempts: action.failedAttempts,\n showRecaptcha: action.showRecaptcha,\n isSubmitted: false\n })\n case POST_SESSION_SUCCESS:\n case FETCH_SESSION_SUCCESS:\n const sessionData = action.payload.session;\n\n return updateObject(state, {\n failedAttempts: 0,\n showRecaptcha: false,\n email: sessionData.email,\n firstName: sessionData.firstName,\n lastName: sessionData.lastName,\n id: sessionData.id,\n superAdmin: sessionData.superAdmin,\n isSubmitted: false\n })\n case DELETE_SESSION_SUCCESS:\n case DELETE_SESSION_FAILURE:\n const clearedState = updateObject(initialState, {\n recaptcha: state.recaptcha\n })\n return updateObject(state, clearedState)\n case FETCH_SESSION_BEGIN:\n case DELETE_SESSION_BEGIN:\n default:\n return state\n }\n};\n\nexport default login;\n","import {ErrorResponse, ProductDataItem} from \"../types/StudioAPITypes\";\nimport {DEFAULT_REQUEST_OPTIONS} from \"../utils/constants\";\nimport {RequestOptions} from \"../types/Types\";\n\nexport const FETCH_PRODUCTS_BASE = 'FETCH_PRODUCTS';\nexport const FETCH_PRODUCTS_BEGIN = `${FETCH_PRODUCTS_BASE}_BEGIN`;\nexport const FETCH_PRODUCTS_SUCCESS = `${FETCH_PRODUCTS_BASE}_SUCCESS`;\nexport const FETCH_PRODUCTS_FAILURE = `${FETCH_PRODUCTS_BASE}_FAILURE`;\n\nexport const FETCH_PRODUCT_STATUS_BASE = `FETCH_PRODUCT_STATUS`;\nexport const FETCH_PRODUCT_STATUS_SUCCESS = `${FETCH_PRODUCT_STATUS_BASE}_SUCCESS`;\nexport const FETCH_PRODUCT_STATUS_FAILURE = `${FETCH_PRODUCT_STATUS_BASE}_FAILURE`;\n\nexport const CREATE_PRODUCT_BASE = 'CREATE_PRODUCT';\nexport const CREATE_PRODUCT_BEGIN = `${CREATE_PRODUCT_BASE}_BEGIN`;\nexport const CREATE_PRODUCT_SUCCESS = `${CREATE_PRODUCT_BASE}_SUCCESS`;\nexport const CREATE_PRODUCT_FAILURE = `${CREATE_PRODUCT_BASE}_FAILURE`;\n\nexport const UPDATE_PRODUCT_BASE = `UPDATE_PRODUCT`;\nexport const UPDATE_PRODUCT_BEGIN = `${UPDATE_PRODUCT_BASE}_BEGIN`;\nexport const UPDATE_PRODUCT_SUCCESS = `${UPDATE_PRODUCT_BASE}_SUCCESS`;\nexport const UPDATE_PRODUCT_FAILURE = `${UPDATE_PRODUCT_BASE}_FAILURE`;\n\nexport const DUPLICATE_PRODUCT_BASE = `DUPLICATE_PRODUCT`;\nexport const DUPLICATE_PRODUCT_BEGIN = `${DUPLICATE_PRODUCT_BASE}_BEGIN`;\nexport const DUPLICATE_PRODUCT_SUCCESS = `${DUPLICATE_PRODUCT_BASE}_SUCCESS`;\nexport const DUPLICATE_PRODUCT_FAILURE = `${DUPLICATE_PRODUCT_BASE}_FAILURE`;\n\nexport const DELETE_PRODUCT_BASE = `DELETE_PRODUCT`;\nexport const DELETE_PRODUCT_BEGIN = `${DELETE_PRODUCT_BASE}_BEGIN`;\nexport const DELETE_PRODUCT_SUCCESS = `${DELETE_PRODUCT_BASE}_SUCCESS`;\nexport const DELETE_PRODUCT_FAILURE = `${DELETE_PRODUCT_BASE}_FAILURE`;\n\nexport const IMPORT_FILE_BASE = `IMPORT_FILE`;\nexport const IMPORT_FILE_BEGIN = `${IMPORT_FILE_BASE}_BEGIN`;\nexport const IMPORT_FILE_SUCCESS = `${IMPORT_FILE_BASE}_SUCCESS`;\nexport const IMPORT_FILE_FAILURE = `${IMPORT_FILE_BASE}_FAILURE`;\nexport const IMPORT_FILE_PROGRESS_STATUS = `${IMPORT_FILE_BASE}_PROGRESS_STATUS`;\nexport const IMPORT_FILE_RESET_PROCESS = `${IMPORT_FILE_BASE}_RESET_PROCESS`;\n\nexport const UPDATE_ITEM_IN_EDIT_MODE = `UPDATE_ITEM_IN_EDIT_MODE`;\nexport const UPDATE_PRODUCTS_FILTER = 'UPDATE_PRODUCTS_FILTER';\n\nexport const UPDATE_PRODUCTS = 'UPDATE_PRODUCTS';\n\nexport const fetchProductsBegin = (projectId: string, options: RequestOptions = DEFAULT_REQUEST_OPTIONS) => ({\n type: FETCH_PRODUCTS_BEGIN,\n projectId: projectId,\n options: options\n});\n\nexport const fetchProductsSuccess = (products: any) => ({\n type: FETCH_PRODUCTS_SUCCESS,\n payload: { products }\n});\n\nexport const fetchProductsError = (error: ErrorResponse) => ({\n type: FETCH_PRODUCTS_FAILURE,\n payload: { error }\n});\n\nexport const createProductBegin = (options: RequestOptions = DEFAULT_REQUEST_OPTIONS) => ({\n type: CREATE_PRODUCT_BEGIN,\n options: options\n});\n\nexport const createProductSuccess = (product: any) => ({\n type: CREATE_PRODUCT_SUCCESS,\n payload: { product }\n});\n\nexport const createProductFailure = (error: ErrorResponse) => ({\n type: CREATE_PRODUCT_FAILURE,\n payload: { error }\n});\n\nexport const updateItemInEditMode = (productId: string) => ({\n type: UPDATE_ITEM_IN_EDIT_MODE,\n id: productId\n});\n\nexport const updateProductBegin = (options: RequestOptions = DEFAULT_REQUEST_OPTIONS) => ({\n type: UPDATE_PRODUCT_BEGIN,\n options: options\n});\n\nexport const updateProductSuccess = (product: any) => ({\n type: UPDATE_PRODUCT_SUCCESS,\n payload: { product }\n});\n\nexport const updateProductFailure = (error: ErrorResponse) => ({\n type: UPDATE_PRODUCT_FAILURE,\n payload: { error }\n});\n\nexport const deleteProductBegin = (options: RequestOptions = DEFAULT_REQUEST_OPTIONS) => ({\n type: DELETE_PRODUCT_BEGIN,\n options: options\n});\n\nexport const deleteProductSuccess = (product: any) => ({\n type: DELETE_PRODUCT_SUCCESS,\n payload: { product }\n});\n\nexport const deleteProductFailure = (error: ErrorResponse) => ({\n type: DELETE_PRODUCT_FAILURE,\n payload: { error }\n});\n\nexport const duplicateProductBegin = (options: RequestOptions = DEFAULT_REQUEST_OPTIONS) => ({\n type: DUPLICATE_PRODUCT_BEGIN,\n options: options\n});\n\nexport const duplicateProductSuccess = (product: any) => ({\n type: DUPLICATE_PRODUCT_SUCCESS,\n payload: { product },\n});\n\nexport const duplicateProductFailure = (error: ErrorResponse) => ({\n type: DUPLICATE_PRODUCT_FAILURE,\n payload: { error }\n});\n\nexport const fetchProductStatusSuccess = (productStatus: any, inProgress: boolean, progressPct: number) => ({\n type: FETCH_PRODUCT_STATUS_SUCCESS,\n payload: { productStatus},\n inProgress: inProgress,\n progressPct: progressPct\n});\n\nexport const fetchProductStatusFailure = (error: ErrorResponse) => ({\n type: FETCH_PRODUCT_STATUS_FAILURE,\n payload: { error }\n});\n\nexport const updateProductsFilter = (filter: string) => ({\n type: UPDATE_PRODUCTS_FILTER,\n filter: filter\n});\n\nexport const importFileBegin = (options: RequestOptions = DEFAULT_REQUEST_OPTIONS) => ({\n type: IMPORT_FILE_BEGIN,\n options: options\n});\n\nexport const importFileSuccess = (product: any) => ({\n type: IMPORT_FILE_SUCCESS,\n payload: { product }\n});\n\nexport const importFileFailure = ( error: ErrorResponse) => ({\n type: IMPORT_FILE_FAILURE,\n payload: { error }\n});\n\nexport const importFileProgressStatus = ( percent: number) => ({\n type: IMPORT_FILE_PROGRESS_STATUS,\n payload: { percent }\n});\n\nexport const updateProducts = (items: ProductDataItem[]) => ({\n type: UPDATE_PRODUCTS,\n items: items\n});\n\nexport const importFileResetProcess = () => ({\n type: IMPORT_FILE_RESET_PROCESS\n});\n\n","import {ErrorState} from \"./index\";\nimport {AnyAction} from \"redux\";\n\nexport const error = (state: ErrorState = {}, action: AnyAction) => {\n const {type, payload} = action;\n\n // Store BEGIN to clear messages when a new request is processed\n const matches = /(.*)_(BEGIN|FAILURE)/.exec(type);\n\n if (!matches) {\n return state;\n }\n\n const [, requestName, requestState] = matches;\n\n return {\n ...state,\n [requestName]: requestState === \"FAILURE\" ? action.payload.error : null\n }\n}\n\nexport default error;\n","import {AnyAction} from \"redux\";\nimport {LoadingState} from \"./index\";\nimport {RequestOptions} from \"../types/Types\";\n\n/**\n * Provide a way to store all loading events in one place\n * Example: https://medium.com/stashaway-engineering/react-redux-tips-better-way-to-handle-loading-flags-in-your-reducers-afda42a804c6\n *\n * @param {LoadingState} state\n * @param {AnyAction} action\n * @returns {LoadingState}\n */\n\nconst loading = (state: LoadingState = {}, action: AnyAction) => {\n const {type} = action;\n const options: RequestOptions = action.options;\n\n const typeMatches = (/(.*)_(BEGIN|SUCCESS|FAILURE)/).exec(type);\n if (!typeMatches) {\n return state;\n }\n\n const shouldShowLoader = options && !options.hideLoader;\n\n const [, requestName, requestState] = typeMatches;\n\n return {\n ...state,\n [requestName]: {\n showLoader: requestState === \"BEGIN\" && shouldShowLoader\n }\n };\n};\n\nexport default loading;\n","import {combineReducers} from 'redux';\nimport projects from \"./projects\";\nimport login from \"./login\";\nimport products from \"./products\";\nimport error from \"./error\";\nimport {ProductDataItem} from \"../types/StudioAPITypes\";\nimport loading from \"./loading\";\nimport {Dictionary, LogLevel} from \"../types/Types\";\nimport {ErrorResponse, ProjectDataItem} from \"../types/StudioAPITypes\";\n\nexport default combineReducers({\n projects: projects,\n login: login,\n products: products,\n loading: loading,\n error: error\n});\n\nexport interface State {\n login: LoginState;\n projects: ProjectsState;\n products: ProductState;\n loading: LoadingState;\n error: ErrorState;\n}\n\nexport interface LoginMessage {\n text: string,\n level: LogLevel\n}\n\nexport interface LoginState {\n showRecaptcha: boolean;\n recaptcha: number;\n failedAttempts: number;\n email: string;\n firstName: string;\n lastName: string;\n id: number;\n superAdmin: boolean;\n message: LoginMessage | null;\n isSubmitted: boolean;\n}\n\nexport interface ProjectsState {\n items: ProjectDataItem[];\n filter: string;\n}\n\nexport interface ProgressObject {\n progress: number;\n status: string\n}\n\nexport interface ProductState {\n projectId: string;\n projectName: string;\n items: ProductDataItem[];\n filter: string;\n itemInEditMode: string;\n fileImport: ProgressObject;\n}\n\nexport interface LoadingItem {\n showLoader: boolean\n}\n\nexport type LoadingState = Dictionary;\n\nexport type ErrorState = Dictionary;\n","import React from \"react\";\n\nimport {\n Route,\n Redirect\n} from \"react-router-dom\";\n\nimport { withCookies } from 'react-cookie';\nimport {ROUTES, STUDIO_SESSION_COOKIE_DEV, STUDIO_SESSION_COOKIE_PROD} from \"../utils/constants\";\n\nconst PrivateRoute = function({component: Component,...rest}) {\n let renderable = function(props) {\n if (rest.cookies.get(STUDIO_SESSION_COOKIE_DEV) || rest.cookies.get(STUDIO_SESSION_COOKIE_PROD)) {\n return ;\n } else {\n return \n }\n }\n return (\n \n )\n};\n\nexport default withCookies(PrivateRoute);\n","import {createHashHistory} from 'history'\nexport default createHashHistory();\n","import {Dictionary} from \"../types/Types\";\nimport * as Cookies from \"js-cookie\";\nimport {ROUTES, STUDIO_SESSION_COOKIE_DEV, STUDIO_SESSION_COOKIE_PROD} from \"./constants\";\nimport history from \"./history\";\n\nexport function buildRoute(routeTemplate: string, parameters: Dictionary): string {\n for (const param in parameters) {\n if (parameters.hasOwnProperty(param)) {\n routeTemplate = routeTemplate.replace(param, parameters[param])\n }\n }\n\n return routeTemplate;\n};\n\nexport const logout = () => {\n\n if (Cookies.get(STUDIO_SESSION_COOKIE_PROD)) {\n Cookies.remove(STUDIO_SESSION_COOKIE_PROD, {path: '/', domain: 'vitalsource.com'});\n }\n\n if (Cookies.get(STUDIO_SESSION_COOKIE_DEV)) {\n Cookies.remove(STUDIO_SESSION_COOKIE_DEV, {path: '/', domain: 'vitalbook.com'});\n }\n\n if (history.location.pathname !== ROUTES.AUTH) {\n history.push(ROUTES.AUTH);\n }\n}\n\nexport const fourOhFour = () => {\n history.push(ROUTES.FOUR_OH_FOUR);\n}\n","import {ThunkAction, ThunkDispatch} from \"redux-thunk\";\nimport {State} from \"../reducers\";\nimport {AnyAction} from \"redux\";\n\nexport interface RecaptchaWindow extends Window {\n grecaptcha: ReCaptchaV2.ReCaptcha;\n}\n\nexport interface CustomDispatchProps {\n dispatch: GenericThunkDispatch;\n}\n\nexport interface Dictionary {\n [key: string]: T;\n}\n\nexport enum ProductCardType {\n EPUB,\n Import\n}\n\nexport enum ProductCardButtonAction {\n Edit,\n Delete,\n Duplicate\n}\n\nexport type GenericThunkDispatch = ThunkDispatch;\n\nexport type GenericThunkGetState = () => State;\n\nexport type GenericThunkAction = ThunkAction;\n\nexport type ArgumentAction = (...args: any[]) => AnyAction;\n\nexport enum LogLevel {\n Info,\n Warning,\n Error\n}\n\nexport enum AjaxProgress {\n InProgress,\n Finished\n}\n\n/**\n * Options for any HTTP request in Redux passed to a \"BEGIN\" action\n */\nexport interface RequestOptions {\n hideLoader: boolean;\n}\n\nexport interface ProjectConfigType {\n allowPdfImport: boolean;\n allowXmlZipImport: boolean;\n}\n","\nimport {ErrorResponse, ProductData, StudioResponse, SessionData} from \"../types/StudioAPITypes\";\nimport {fourOhFour, logout} from \"../utils/routerUtils\";\n\n// Route creators\n// TODO make API endpoint configurable\nconst api = `${window.location.protocol}//${window.location.hostname}/api`;\nconst sessionRoute = `${api}/session`;\nconst projectsRoute = `${api}/projects`;\nconst projectRoute = (project: string) => `${projectsRoute}/${project}`;\nconst productsRoute = (project: string) => `${projectRoute(project)}/products`;\nconst productRoute = (project: string, product: string) => `${productsRoute(project)}/${product}`;\nconst productStatusRoute = (project: string, product: string) => `${productRoute(project, product)}/status`;\nconst productConversionRoute = (project: string) => `${productsRoute(project)}/convert`;\n\ntype Credentials = 'include' | 'same-origin';\n\nexport interface fetchTrackPogressOpts {\n method: string,\n credentials: any,\n headers: {},\n body: any\n}\n\nexport default class StudioAPI {\n\n private static instance: StudioAPI = new StudioAPI();\n\n static getInstance() {\n return this.instance;\n }\n\n private credentials: Credentials = 'include';\n\n constructor() {\n if (StudioAPI.instance) {\n return StudioAPI.instance;\n }\n\n // TODO Set credentials policy to 'same-origin' for production environment\n // TODO fetchWithProgress function sets useCredentials req header based on this variable -\n // This may be able to be removed under the same-origin policy when in prod\n this.credentials = 'include';\n }\n\n fetchProjects(): Promise> {\n return this.getJSON(projectsRoute);\n }\n\n fetchProject(projectId: string): Promise> {\n return this.getJSON(projectRoute(projectId));\n }\n\n postSession(data: SessionData): Promise> {\n return this.sendJson(sessionRoute, 'post', data);\n }\n\n deleteSession(): Promise> {\n return this.deleteEntity(sessionRoute);\n }\n\n fetchSession(): Promise> {\n return this.getJSON(sessionRoute);\n }\n\n deleteProduct(projectId: string, productId: string): Promise> {\n return this.deleteEntity(productRoute(projectId, productId));\n }\n\n updateProduct(projectId: string, productId: string, data: ProductData): Promise> {\n return this.sendJson(productRoute(projectId, productId), 'put', data);\n }\n\n addProduct(projectId: string, data: ProductData): Promise> {\n return this.sendJson(productsRoute(projectId), 'post', data);\n }\n\n duplicateProduct(projectId: string, data: any): Promise> {\n return this.sendJson(productsRoute(projectId), 'post', data);\n }\n\n fetchProductStatus(projectId: string, productId: string): Promise> {\n return this.getJSON(productStatusRoute(projectId, productId));\n }\n\n importFile(projectId: string, file: File, onProgress?: (e: any, uploadStartTime: number) => void): Promise> {\n return this.sendMultipartFile(productConversionRoute(projectId),\n this.convertFileToFormData(file),\n onProgress)\n }\n\n private convertFileToFormData(file: File) {\n let formData = new FormData();\n formData.append('sourceFile', file);\n return formData\n }\n\n private sendJson(route: string, method: 'post' | 'put', data: any): Promise> {\n return fetch(route, {\n method: method,\n credentials: this.credentials,\n headers: {\"Content-Type\": \"application/json; charset=utf-8\"},\n body: JSON.stringify(data)\n }).then(this.handleFetchResponse);\n }\n\n private fetchWithProgress(route: string, onProgress: any, opts: fetchTrackPogressOpts): any {\n return new Promise( (res, rej)=>{\n var uploadStartTime = new Date().getTime();\n var xhr = new XMLHttpRequest();\n xhr.open(opts.method, route);\n xhr.withCredentials = true;\n xhr.onload = (e: any) => res(e.target && e.target.responseText ? e.target.responseText: \"\");\n xhr.onerror = rej;\n if (xhr.upload && onProgress)\n xhr.upload.onprogress = (e: any) => {\n onProgress(e, uploadStartTime)\n };\n xhr.send(opts.body);\n });\n }\n\n private sendMultipartFile(route: string, formData: any, onProgress: any): Promise> {\n // Note: Not using fetch api here because fetch api does not support tracking file upload progress.\n\n return this.fetchWithProgress(route, onProgress ,{\n method: \"post\",\n credentials: this.credentials,\n headers: {},\n body: formData\n }).then(this.handleXHRResponse);\n }\n\n private getJSON(route: string): Promise> {\n return fetch(route, {\n credentials: 'include'\n }).then(this.handleFetchResponse)\n }\n\n private deleteEntity(route: string): Promise> {\n return fetch(route, {\n method: 'delete',\n credentials: 'include'\n }).then(this.handleFetchResponse)\n }\n\n private handleFetchResponse(response: Response): Promise> {\n return response.json().then(json => {\n if (!response.ok) {\n const error: ErrorResponse = Object.assign({}, json, {\n status: response.status,\n statustext: response.statusText\n });\n\n if (error.code === 401) {\n logout();\n }\n\n if (error.code === 404) {\n fourOhFour();\n }\n\n return Promise.reject(error);\n }\n\n return json;\n });\n }\n\n private handleXHRResponse(response: string): Promise> {\n var responseJSON = JSON.parse(response);\n if (responseJSON.code !== 200) {\n const error: ErrorResponse = Object.assign({}, responseJSON, {\n status: responseJSON.status,\n statustext: responseJSON.statusText\n });\n\n if (error.code === 401) {\n logout();\n }\n\n if (error.code === 404) {\n fourOhFour();\n }\n\n return Promise.reject(error);\n }\n\n return responseJSON;\n }\n}\n","import StudioAPI from \"../api/StudioAPI\";\nimport {\n deleteSessionBegin, deleteSessionFailure, deleteSessionSuccess, fetchSessionBegin, fetchSessionFailure,\n fetchSessionSuccess,\n postSessionBegin, postSessionError,\n postSessionSuccess, updateMessage\n} from \"../actions/login\";\nimport {GenericThunkDispatch, GenericThunkGetState, LogLevel, RecaptchaWindow} from \"../types/Types\";\nimport {SessionErrorResponse} from \"../types/StudioAPITypes\";\nimport {ROUTES} from \"../utils/constants\";\nimport history from \"../utils/history\";\nimport {logout} from \"../utils/routerUtils\";\n\nconst api = StudioAPI.getInstance();\n\nexport const postSession = (username: string, password: string) => {\n return (dispatch: GenericThunkDispatch, getState: GenericThunkGetState) => {\n const recaptchaWindow = window;\n const state = getState();\n let recaptchaResponse: string | null = null;\n if (state.login.showRecaptcha) {\n recaptchaResponse = recaptchaWindow.grecaptcha.getResponse(state.login.recaptcha);\n if (recaptchaResponse === \"\") {\n const response: SessionErrorResponse = {\n code: 401,\n data: {},\n error: [],\n message: \"Please verify you are not a robot before signing in.\",\n messageid: \"\",\n metadata: {},\n status: 401,\n statustext: \"\",\n version: 1\n }\n\n dispatch(postSessionError(response, state.login.failedAttempts, true));\n return;\n }\n }\n\n dispatch(postSessionBegin());\n api.postSession({\n username: username,\n password: password,\n recaptcha: recaptchaResponse\n })\n .then(response => {\n history.push(ROUTES.PROJECTS);\n\n dispatch(postSessionSuccess(response.data));\n },\n (errorResponse: SessionErrorResponse) => {\n const state = getState();\n let failedLoginAttempts = state.login.failedAttempts;\n let showRecaptcha = state.login.showRecaptcha;\n if (showRecaptcha) {\n recaptchaWindow.grecaptcha.reset(state.login.recaptcha);\n }\n let errorMessage = \"\";\n if (errorResponse.code === 401) {\n // If the response data has the number of failed attempts for the user and that number is\n // greater than the number of failed attempts for this session then use that number.\n // Otherwise just increment the local counter\n if (errorResponse.data !== undefined && errorResponse.data.failedLoginAttempts !== undefined) {\n if (state.login.failedAttempts < errorResponse.data.failedLoginAttempts) {\n failedLoginAttempts = errorResponse.data.failedLoginAttempts;\n }\n else {\n failedLoginAttempts++;\n }\n\n showRecaptcha = !!errorResponse.data.showRecaptchaAttempts && failedLoginAttempts >= errorResponse.data.showRecaptchaAttempts;\n errorMessage = \"Incorrect username or password.\"\n }\n } else if (!errorMessage) {\n errorMessage = \"An unknown error occurred.\"\n }\n\n if (errorMessage) {\n dispatch(updateMessage(errorMessage, LogLevel.Error));\n }\n\n dispatch(postSessionError(errorResponse, failedLoginAttempts, showRecaptcha))\n }\n )\n }\n}\n\nexport const fetchSession = () => {\n return (dispatch: GenericThunkDispatch, getState: GenericThunkGetState) => {\n\n // Check if user data already exists in the model\n const state = getState();\n if (state.login.id !== -1) {\n return;\n }\n\n dispatch(fetchSessionBegin());\n\n api.fetchSession()\n .then(response => {\n dispatch(fetchSessionSuccess(response.data));\n },\n errorResponse => {\n dispatch(fetchSessionFailure(errorResponse));\n });\n }\n};\n\nexport const deleteSession = () => {\n return (dispatch: GenericThunkDispatch, getState: GenericThunkGetState) => {\n dispatch(deleteSessionBegin());\n\n api.deleteSession()\n .then(response => {\n logout();\n dispatch(deleteSessionSuccess());\n },\n errorResponse => {\n logout();\n dispatch(deleteSessionFailure(errorResponse));\n })\n }\n};\n","import React, { Component } from \"react\";\nimport {RecaptchaWindow} from \"../types/Types\";\nimport {recaptchaHtmlId} from \"../utils/constants\";\nimport classNames from \"classnames\";\n\nconst recaptchaWindow: RecaptchaWindow = window as RecaptchaWindow;\n\ninterface RecaptchaState {\n isReady: boolean;\n}\n\nexport interface RecaptchaProps {\n onLoad: (recaptchaId: number) => void;\n visible: boolean;\n}\n\nexport default class Recaptcha extends Component {\n\n private readyInterval: number;\n private id: number = 0;\n\n constructor(props: RecaptchaProps) {\n super(props);\n\n this.state = {\n isReady: false\n }\n\n this.updateReadyState = this.updateReadyState.bind(this);\n\n this.readyInterval = window.setInterval(() => {\n this.updateReadyState();\n }, 500);\n }\n\n componentDidUpdate(prevProps: RecaptchaProps, prevState: RecaptchaState) {\n if (!prevState.isReady && this.state.isReady) {\n this.id = recaptchaWindow.grecaptcha.render(recaptchaHtmlId, {\n \"sitekey\": process.env.REACT_APP_RECAPTCHA_SITEKEY\n });\n this.props.onLoad(this.id);\n }\n }\n\n componentWillUnmount() {\n window.clearInterval(this.readyInterval);\n }\n\n updateReadyState() {\n if (this.isReady()) {\n this.setState({\n isReady: true\n });\n window.clearInterval(this.readyInterval);\n }\n }\n\n isReady(): boolean {\n return typeof recaptchaWindow.grecaptcha !== \"undefined\";\n }\n\n render() {\n const recaptchaClasses = classNames({\n hidden: !this.props.visible,\n \"g-recaptcha\": this.state.isReady\n });\n\n return (\n
\n
\n
\n )\n }\n}\n","import {RecaptchaWindow} from \"../types/Types\";\n\nconst loadRecaptcha = () => {\n if (typeof (window).grecaptcha !== \"undefined\") {\n return;\n }\n\n const script = document.createElement(\"script\");\n script.async = true;\n script.defer = true;\n script.src = \"https://www.google.com/recaptcha/api.js\";\n document.body.appendChild(script);\n}\n\nexport default loadRecaptcha;\n","import React, {\n Component\n} from 'react';\nimport {\n Button,\n Form,\n TextField,\n Dialog\n} from '@vitalsource/vstui';\nimport '../../styles/SignInForm.css';\nimport studioLoginLogo from \"../../img/login-logo.svg\";\nimport styled from \"styled-components\";\nimport {LoginMessage} from \"../reducers\";\nimport Recaptcha from \"./Recaptcha\";\nimport loadRecaptcha from \"../utils/loginUtils\";\n\nconst SignInForm = styled(Form) `\n font-family: \"Roboto\";\n text-align: center;\n`\n\nconst SignInFormTextField = styled(TextField)`\n width: 400px;\n display: block;\n margin-bottom: 40px;\n > input {\n height: 100%;\n width: 100%\n }\n input:autofill {\n -webkit-box-shadow: 0 0 0 2rem #e8f0fe inset;\n}\n`;\n\ninterface SigninFormState {\n username: string;\n password: string;\n isValid: boolean;\n forgotPassedDialogOpen: boolean;\n}\n\nexport interface SigninFormProps {\n login: (username: string, password: string) => void;\n showRecaptcha: boolean;\n message: LoginMessage | null;\n loading: boolean;\n updateRecaptchaId: (id: number) => void;\n isSubmitted: boolean;\n}\n\nexport default class SigninForm extends Component {\n constructor(props: SigninFormProps) {\n super(props);\n\n this.state = {\n username: '',\n password: '',\n isValid: false,\n forgotPassedDialogOpen: false,\n };\n\n this.handleFieldChange = this.handleFieldChange.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.validate = this.validate.bind(this);\n this.toggleForgotPasswordDialog = this.toggleForgotPasswordDialog.bind(this);\n this.onRecaptchaReady = this.onRecaptchaReady.bind(this);\n }\n\n componentDidMount() {\n loadRecaptcha();\n }\n\n validate(isValid: boolean) {\n this.setState({\n isValid: isValid\n })\n }\n\n handleSubmit(e: Event) {\n e.preventDefault();\n\n if (this.state.isValid) {\n if (!this.props.isSubmitted) {\n this.props.login(this.state.username, this.state.password);\n }\n else {\n console.info(\"Form already submitted\");\n }\n }\n }\n\n handleFieldChange(e: Event) {\n const target = e.target as HTMLInputElement;\n if (target) {\n const id = target.id;\n const value = target.value;\n\n this.setState({\n [id]: value\n } as any);\n }\n }\n\n showIfError(message: LoginMessage | null) {\n if ( !message ) {\n return '';\n } else {\n return (
{message.text}
);\n }\n\n }\n\n toggleForgotPasswordDialog(state: boolean) {\n this.setState({\n forgotPassedDialogOpen: state\n });\n }\n\n onRecaptchaReady(id: number) {\n this.props.updateRecaptchaId(id);\n }\n\n getDialog() {\n return ( this.toggleForgotPasswordDialog(false)}\n open={this.state.forgotPassedDialogOpen}\n primaryActionButton={{\n label: 'Continue',\n onClick: () =>{\n this.toggleForgotPasswordDialog(false);\n window.open(`${process.env.REACT_APP_MANAGE_URL}/forgot_password`, '_blank');\n }\n }}\n rootSelector=\"#signInForm \"\n secondaryActionButton={{\n label: 'Stay on This Page',\n onClick: () => { this.toggleForgotPasswordDialog(false)}\n }}\n size=\"medium\"\n title=\"After resetting your password:\"\n >\n
\n 1. Close the VitalSource Manage page that appears
\n 2. Return to Studio to sign in\n
\n )\n }\n\n render() {\n return (\n
\n {this.state.forgotPassedDialogOpen ? this.getDialog():\"\"}\n \n \n {this.showIfError(this.props.message)}\n \n \n \n \n Sign In\n \n {this.props.loading ? : \"\"}\n
this.toggleForgotPasswordDialog(true)}>Forgot your password?
\n
Don’t have an account? Request a demo.
\n \n
\n )\n }\n}\n","import {LoadingItem, State} from \"../reducers\";\nimport {ErrorResponse} from \"../types/StudioAPITypes\";\n\n/**\n * Check the loading state for selected actions\n *\n * @param {string[]} actions\n * @returns {(state: State) => boolean}\n */\nexport const createLoadingSelector = (actions: string[]) => (state: State) => {\n return actions.some((action: string) => {\n const loadingInfo: LoadingItem = state.loading[action];\n if (loadingInfo) {\n return loadingInfo.showLoader;\n }\n\n return false;\n })\n};\n\n/**\n * Create a selector that finds any loading state that is not excluded\n *\n * @param {string[]} excludedActions\n * @returns {(state: State) => boolean}\n */\nexport const createLoadingUnselector = (excludedActions: string[]) => (state: State) => {\n const remainingActions = [];\n for (const key in state.loading) {\n if (state.loading.hasOwnProperty(key) && excludedActions.indexOf(key) === -1) {\n const loadingInfo: LoadingItem = state.loading[key];\n if (loadingInfo.showLoader) {\n remainingActions.push(key);\n }\n }\n }\n\n return remainingActions.length > 0;\n};\n\n/**\n * Create a selector that finds the first non-401 error in the error state that is not excluded\n *\n * @param {string[]} excludedActions\n * @returns {(state: State) => (ErrorResponse | null)}\n */\nexport const createErrorUnselector = (excludedActions: string[]) => (state: State) => {\n let filteredActions: string[] = [];\n for (const key in state.error) {\n if (state.error.hasOwnProperty(key) && excludedActions.indexOf(key) === -1) {\n filteredActions.push(key);\n }\n }\n\n filteredActions = filteredActions.filter((action) => {\n if (!!state.error[action]) {\n const error: ErrorResponse = state.error[action];\n\n // Ignore 401 and 404 errors as they're handled separately\n return error.code !== 401 && error.code !== 404\n }\n });\n\n if (filteredActions.length > 0) {\n\n // Return the first error found for now\n return state.error[filteredActions[0]]\n }\n\n return null;\n}\n","import {connect} from \"react-redux\";\nimport {postSession} from \"../middleware/loginActions\";\nimport LoginForm from \"../components/LoginForm\";\nimport {State} from \"../reducers/index\";\nimport {GenericThunkDispatch} from \"../types/Types\";\nimport {createLoadingSelector} from \"../utils/selectors\";\nimport {POST_SESSION_BASE, updateRecaptchaId} from \"../actions/login\";\nimport SigninForm from \"../components/SigninForm\";\n\nconst loadingSelector = createLoadingSelector([\n POST_SESSION_BASE\n])\n\nconst mapStateToProps = (state: State) => ({\n message: state.login.message,\n showRecaptcha: state.login.showRecaptcha,\n loading: loadingSelector(state),\n isSubmitted: state.login.isSubmitted\n});\n\nconst mapDispatchToProps = (dispatch: GenericThunkDispatch) => {\n return {\n login: (username: string, password: string) => {\n dispatch(postSession(username, password))\n },\n updateRecaptchaId: (id: number) => {\n dispatch(updateRecaptchaId(id));\n }\n }\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SigninForm);\n","import React from \"react\"\nimport { Link } from 'react-router-dom';\nimport vitalSourceLogo from \"../../img/vst_logo_signin.svg\";\nimport supportLogo from \"../../img/circle_support.svg\";\nimport \"../../styles/LoginForm.css\";\nimport LoginContainer from \"../containers/LoginContainer\";\nimport { Icon } from \"@vitalsource/vstui\";\nimport externalTabIcon from \"../../img/new-external-tab.svg\";\nimport {Calendar, XSmall} from \"@vitalsource/vstui-icons\";\nimport Styled from \"styled-components\"\n\nconst CustomXSmall = Styled(XSmall)`\n pointer-events: none;\n`;\n\nexport interface LoginFormProps {\n}\n\nconst LoginForm = (props: LoginFormProps) => {\n return (\n
\n
\n \n
\n Powered by\n \n \n Support\n \n \n
\n
\n
\n )\n}\n\nexport default LoginForm;\n","import React, {\n Component\n} from 'react';\nimport {Redirect, withRouter} from 'react-router-dom'\nimport {withCookies} from \"react-cookie\";\nimport LoginForm from \"../components/LoginForm\";\nimport {ROUTES, STUDIO_SESSION_COOKIE_DEV, STUDIO_SESSION_COOKIE_PROD} from \"../utils/constants\";\n\nclass Login extends Component {\n render() {\n if (this.props.cookies.get(STUDIO_SESSION_COOKIE_DEV) || this.props.cookies.get(STUDIO_SESSION_COOKIE_PROD)) {\n return ;\n }\n\n return (\n \n );\n }\n};\n\nexport default withRouter(withCookies(Login));\n","import React from \"react\";\nimport \"../../styles/Account.css\";\n\nexport interface AccountNavProps {\n email: string,\n firstName: string,\n lastName: string,\n logout: (e: React.MouseEvent) => void;\n}\n\nconst AccountNav = (props: AccountNavProps) => {\n return (\n \n )\n}\n\nexport default AccountNav;\n","import {connect} from \"react-redux\";\nimport {State} from \"../reducers/index\";\nimport AccountNav from \"../components/AccountNav\";\nimport {deleteSession} from \"../middleware/loginActions\";\nimport {GenericThunkDispatch} from \"../types/Types\";\nconst mapStateToProps = (state: State) => ({\n email: state.login.email,\n firstName: state.login.firstName,\n lastName: state.login.lastName\n});\nconst mapDispatchToProps = (dispatch: GenericThunkDispatch) => {\n return {\n logout: (e: React.MouseEvent) => {\n dispatch(deleteSession())\n }\n }\n};\nexport default connect(mapStateToProps, mapDispatchToProps)(AccountNav);\n","import React, {Component} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport {KEYCODES} from \"../utils/constants\";\n\nexport interface CloseableProps {\n onClickOutside?: (e: MouseEvent) => void;\n onEscape?: () => void;\n}\n\n/**\n * Wrapper for elements that should close on escape or when a user clicks outside of the wrapped component\n */\nexport default class Closeable extends Component {\n constructor(props: CloseableProps) {\n super(props);\n\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleClickOutside = this.handleClickOutside.bind(this);\n }\n\n componentDidMount() {\n document.addEventListener('click', this.handleClickOutside, true);\n document.addEventListener('keydown', this.handleKeyDown, true);\n }\n\n componentWillUnmount() {\n document.removeEventListener('click', this.handleClickOutside, true);\n document.removeEventListener('keydown', this.handleKeyDown, true);\n }\n\n handleClickOutside(event: MouseEvent) {\n const domNode = ReactDOM.findDOMNode(this);\n\n if (!domNode || !domNode.contains(event.target as any)) {\n this.setState({\n visible : false\n });\n\n if (this.props.onClickOutside) {\n this.props.onClickOutside(event);\n }\n }\n }\n\n handleKeyDown(e: KeyboardEvent) {\n if (e.which === KEYCODES.ESCAPE) {\n this.setState({\n visible : false\n });\n\n if (this.props.onEscape) {\n this.props.onEscape();\n }\n }\n }\n\n render() {\n return (\n
\n {this.props.children}\n
\n )\n }\n}\n","import React, {Component} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport Closeable from \"./Closeable\";\n\ninterface ShowHideMenuState {\n visible: boolean;\n}\n\nexport interface ShowHideMenuProps {\n menu: React.ReactNode;\n onVisibleChange: (visible: boolean) => void;\n}\n\nexport default class ShowHideMenu extends Component {\n constructor(props: ShowHideMenuProps) {\n super(props);\n\n this.state = {\n visible: false\n }\n\n this.onMenuItemClick = this.onMenuItemClick.bind(this);\n this.handleEscape = this.handleEscape.bind(this);\n this.handleClickOutside = this.handleClickOutside.bind(this);\n }\n\n handleClickOutside(event: MouseEvent) {\n const domNode = ReactDOM.findDOMNode(this);\n\n if (!domNode || !domNode.contains(event.target as any)) {\n this.setState({\n visible : false\n });\n this.props.onVisibleChange(false);\n }\n }\n\n handleEscape() {\n this.setState({\n visible : false\n });\n this.props.onVisibleChange(false);\n }\n\n onMenuItemClick() {\n const isVisible = !this.state.visible;\n this.setState({\n visible: isVisible\n });\n\n this.props.onVisibleChange(isVisible);\n }\n\n render() {\n return (\n \n
\n {this.props.children}\n
\n {this.state.visible ? this.props.menu : \"\"}\n
\n )\n }\n}\n","import React, {Component, ReactElement} from 'react';\nimport '../../styles/Header.css';\nimport accountLogo from \"../../img/account.svg\";\nimport logo from \"../../img/studio_logo.svg\"\nimport {Link} from \"react-router-dom\";\nimport AccountNavContainer from \"../containers/AccountNavContainer\";\nimport classNames from \"classnames\";\nimport ShowHideMenu from \"./ShowHideMenu\";\n\ninterface HeaderState {\n accountSelected: boolean;\n}\n\nexport interface HeaderProps {\n fetchSession: () => void;\n loginNotRequired: boolean;\n children?: React.ReactChildren;\n}\n\nclass Header extends Component {\n constructor(props: HeaderProps) {\n super(props);\n\n this.state = {\n accountSelected: false\n };\n\n this.accountVisibleChange = this.accountVisibleChange.bind(this);\n }\n\n componentDidMount() {\n if (!this.props.loginNotRequired) {\n this.props.fetchSession();\n }\n }\n\n accountVisibleChange(visible: boolean) {\n this.setState({\n accountSelected: visible\n });\n }\n\n render() {\n const accountClasses = classNames(\"AccountButton\", {\n AccountButtonSelected: this.state.accountSelected\n });\n\n return (\n
\n
\n
\n \n \"Studio\"/\n \n
\n {!this.props.loginNotRequired ?\n
\n }\n onVisibleChange={this.accountVisibleChange}>\n \n \n
\n : \"\" }\n
\n {this.props.children}\n
\n )\n }\n}\n\nexport default Header;\n","import {connect} from \"react-redux\";\nimport {fetchSession} from \"../middleware/loginActions\";\nimport Header from \"../components/Header\";\nimport {GenericThunkDispatch} from \"../types/Types\";\n\nconst mapDispatchToProps = (dispatch: GenericThunkDispatch) => {\n return {\n fetchSession: () => {\n dispatch(fetchSession());\n }\n }\n};\n\n\nexport default connect( null, mapDispatchToProps)(Header);\n","import React from 'react';\nimport {ROUTES} from \"../utils/constants\";\nimport HeaderContainer from \"../containers/HeaderContainer\"\nimport {Link} from \"react-router-dom\";\n\nconst Error404 = (props) => {\n return (\n
\n \n
\n
\n
404
\n
We can't seem to find your page.
\n
Return Home
\n
\n
\n
\n );\n};\n\nexport default Error404;\n","import {Dictionary} from \"../types/Types\";\n\ntype IActivePolls = Dictionary;\n\nexport default class PollingManager {\n\n private static activePolls: IActivePolls = {};\n\n static createKey(...args: string[]): string {\n return args.join(\"_\");\n }\n\n static add(key: string, callback: () => void, interval: number): void {\n if (this.activePolls[key]) {\n clearInterval(this.activePolls[key]);\n }\n\n callback(); // activate the call back right away\n this.activePolls[key] = setInterval(() => {\n callback();\n }, interval);\n }\n\n static remove(key: string): void {\n clearInterval(this.activePolls[key]);\n delete this.activePolls[key];\n }\n}\n","import StudioAPI from \"../api/StudioAPI\";\nimport {fetchProject} from \"./projectsActions\";\nimport {\n createProductBegin,\n createProductSuccess,\n createProductFailure,\n updateProductBegin,\n updateProductSuccess,\n updateProductFailure,\n deleteProductBegin,\n deleteProductFailure,\n deleteProductSuccess,\n duplicateProductBegin,\n duplicateProductSuccess,\n duplicateProductFailure,\n fetchProductStatusFailure,\n fetchProductStatusSuccess,\n importFileBegin,\n importFileSuccess,\n importFileFailure,\n importFileProgressStatus\n} from \"../actions/products\";\nimport {GenericThunkAction, GenericThunkDispatch, GenericThunkGetState} from \"../types/Types\";\nimport {ErrorResponse, ProductData} from \"../types/StudioAPITypes\";\nimport PollManager from \"../utils/PollingManager\";\nimport {\n IMPORT_POLL_INTERVAL,\n PRODUCT_STATUS,\n MOCK_IMPORT_FILE_PROGRESS_TIME_THRESHOLD,\n MOCK_IMPORT_FILE_PROGRESS_INTERVAL\n} from \"../utils/constants\";\nimport GenericErrorContainer from \"../containers/GenericErrorContainer\";\n\nlet FILE_IMPORT_INTERVAL_REF = null;\n\nconst api = StudioAPI.getInstance();\n\nexport function deleteProduct(projectId: string, productId: string): GenericThunkAction> {\n return (dispatch: GenericThunkDispatch, getState: GenericThunkGetState) => {\n dispatch(deleteProductBegin());\n\n return api.deleteProduct(projectId, productId).then((response: {data:{}}) => {\n\n // Refresh page with latest projects after delete\n dispatch(fetchProject(projectId));\n\n dispatch(deleteProductSuccess(response.data))\n\n return response;\n }, (error: ErrorResponse) => {\n dispatch(deleteProductFailure(error));\n })\n }\n}\n\nexport function addProduct(projectId: string, name: string): GenericThunkAction> {\n return (dispatch: GenericThunkDispatch, getState: GenericThunkGetState) => {\n dispatch(createProductBegin());\n\n return api.addProduct(projectId, {\n name: name\n }).then((response: {data:any}) => {\n dispatch(createProductSuccess(response.data));\n\n return response.data;\n }, (error: ErrorResponse) => {\n dispatch(createProductFailure(error));\n })\n }\n}\n\nexport function updateProduct(projectId: string, productId: string, data: ProductData): GenericThunkAction> {\n return (dispatch: GenericThunkDispatch, getState: GenericThunkGetState) => {\n dispatch(updateProductBegin());\n\n return api.updateProduct(projectId, productId, data).then((response: {data:{}}) => {\n dispatch(updateProductSuccess(response.data));\n\n return response.data;\n }, (error: ErrorResponse) => {\n dispatch(updateProductFailure(error));\n })\n }\n}\n\nexport function fetchProductStatus(projectId: string, productId: string) {\n return (dispatch: GenericThunkDispatch, getState: GenericThunkGetState) => {\n let productStatus = PRODUCT_STATUS;\n return api.fetchProductStatus(projectId, productId).then( (response: {data: any}) => {\n let inProgress = response.data.productStatus !== productStatus.ACTIVE && response.data.productStatus !== productStatus.CONVERSION_FAILED;\n let progressPct = mockProductsProgressStatus(response.data.id);\n if (!inProgress) {\n PollManager.remove(PollManager.createKey(projectId, response.data.id));\n localStorage.removeItem(getLocalStoreKeyForProgress(response.data.id));\n progressPct = 100;\n }\n dispatch(fetchProductStatusSuccess(response.data, inProgress, progressPct));\n }),\n (error: ErrorResponse) => {\n // Something Went wrong. Kill the timeout\n PollManager.remove(PollManager.createKey(projectId, productId));\n localStorage.removeItem(getLocalStoreKeyForProgress(productId));\n dispatch(fetchProductStatusFailure(error));\n }\n }\n}\n\nexport function duplicateProduct(projectId: string, data: ProductData): GenericThunkAction> {\n return (dispatch: GenericThunkDispatch, getState: GenericThunkGetState) => {\n dispatch(duplicateProductBegin())\n return api.duplicateProduct(projectId, data).then( (response: {data:any}) => {\n PollManager.add(PollManager.createKey(projectId, response.data.id), () => {\n return dispatch(fetchProductStatus(projectId, response.data.id));\n }, IMPORT_POLL_INTERVAL);\n dispatch(duplicateProductSuccess(response.data));\n return response.data\n },\n (error: ErrorResponse) => {\n dispatch(duplicateProductFailure(error));\n })\n }\n}\n\nexport function importFile(projectId: string, file: File): GenericThunkAction> {\n return (dispatch: GenericThunkDispatch, getState: GenericThunkGetState) => {\n dispatch(importFileBegin());\n var importStartTime = new Date().getTime();\n return api.importFile(projectId, file, (e: any) => calculateProgressPercentage(e, dispatch, importStartTime))\n .then( (response: {data:any}) => {\n PollManager.add(PollManager.createKey(projectId, response.data.id), () => {\n return dispatch(fetchProductStatus(projectId, response.data.id));\n }, IMPORT_POLL_INTERVAL);\n mockGcsTransfer(dispatch, true);\n return response\n },\n (error: ErrorResponse) => {\n mockGcsTransfer(dispatch, true);\n dispatch(importFileFailure(error));\n return Promise.reject(error);\n }).then( (response: any ) => {\n return mockProgressIfFastUpload(response, importStartTime, dispatch);\n }).then( (response: any) => {\n dispatch(importFileSuccess(response.data));\n return response.data\n })\n }\n}\n\nfunction calculateProgressPercentage(e: any, dispatch: GenericThunkDispatch, importStartTime: number) {\n // This represents the percent complete for the first step of a file import. When this step is complete\n // It will fill up 50% of the progress bar\n let shouldMockIndicator = isLoadingToFastForIndicator(e, importStartTime);\n if (e.loaded !== e.total && !shouldMockIndicator) {\n dispatch(importFileProgressStatus(Math.floor(((e.loaded)/e.total)*50)));\n } else if (e.loaded === e.total && !shouldMockIndicator) {\n mockGcsTransfer(dispatch, false);\n }\n}\n\nfunction isLoadingToFastForIndicator(e: any, importStartTime: number) {\n // Estimated that if loaded more than 75% before the time threshold it will load to fast and indicator will be choppy\n return ((e.loaded/e.total)*100 > 50) &&\n (new Date().getTime() - importStartTime < MOCK_IMPORT_FILE_PROGRESS_TIME_THRESHOLD);\n}\n\nfunction mockGcsTransfer(dispatch: GenericThunkDispatch, kill: boolean) {\n let pct = 50;\n if (kill) {\n clearInterval(FILE_IMPORT_INTERVAL_REF);\n dispatch(importFileProgressStatus(100));\n } else {\n FILE_IMPORT_INTERVAL_REF = setInterval(() => {\n pct = pct + ((100-pct)/6);\n dispatch(importFileProgressStatus(pct));\n }, 5000)\n }\n}\n\nfunction mockProgressIfFastUpload(response: any, importStartTime: number, dispatch: GenericThunkDispatch): Promise<{} | void> {\n return new Promise(function(resolve, reject) {\n if (new Date().getTime() - importStartTime < MOCK_IMPORT_FILE_PROGRESS_TIME_THRESHOLD) {\n var pct = 0;\n var interval = setInterval(() => {\n pct += 33;\n if (pct < 100) {\n dispatch(importFileProgressStatus(pct));\n } else {\n dispatch(importFileProgressStatus(pct));\n clearInterval(interval);\n return resolve(response);\n }\n }, MOCK_IMPORT_FILE_PROGRESS_INTERVAL)\n } else {\n return resolve(response);\n }\n });\n}\n\nconst mockProductsProgressStatus = (productId: string) => {\n // TODO This is temporary until progress is calculated form the server.\n /*\n * Function increments a mocked progress percentage for an a product conversion. Saving cache to client so that\n * the progress is saved on refresh or navigating out of the product page. If the progress is incremented to 95%\n * before the actual success of a conversion then the indicator is stalled until a success\n *\n */\n var key = getLocalStoreKeyForProgress(productId);\n var progressVal = parseInt(localStorage.getItem(key) || \"0\" );\n\n if (progressVal < 95) {\n progressVal += 5;\n localStorage.setItem(key, progressVal.toString())\n }\n return progressVal;\n};\n\nconst getLocalStoreKeyForProgress = (productId: string) => {\n return `STUDIO_PROGRESS_${productId}`;\n};\n\n","import StudioAPI from \"../api/StudioAPI\";\nimport {fetchProjectsBegin, fetchProjectsError, fetchProjectsSuccess} from \"../actions/projects\";\nimport {fetchProductsBegin, fetchProductsSuccess, fetchProductsError} from \"../actions/products\";\nimport {GenericThunkAction, GenericThunkDispatch, GenericThunkGetState} from \"../types/Types\";\nimport {ErrorResponse, ProjectData, ProjectDataItem, StudioResponse} from \"../types/StudioAPITypes\";\nimport {\n PRODUCT_STATUS,\n ROUTES,\n PRODUCT_FILTER_PREFIX,\n STUDIO_DISABLE_LIBRARIES_LINK,\n IMPORT_POLL_INTERVAL\n} from \"../utils/constants\";\nimport {fetchProductStatus} from \"./productActions\";\nimport PollManager from \"../utils/PollingManager\";\nimport history from \"../utils/history\";\nimport {buildRoute} from \"../utils/routerUtils\";\nconst api = StudioAPI.getInstance();\n\nexport function fetchProjects(): GenericThunkAction> {\n clearProductFilters();\n return (dispatch: GenericThunkDispatch, getState: GenericThunkGetState) => {\n dispatch(fetchProjectsBegin());\n return api.fetchProjects()\n .then((json: StudioResponse<{}>) => {\n const response: StudioResponse = >json;\n const data = response.data;\n dispatch(fetchProjectsSuccess(data));\n\n if (data.length !== 1) {\n localStorage.setItem(STUDIO_DISABLE_LIBRARIES_LINK, \"false\");\n return data;\n } else {\n localStorage.setItem(STUDIO_DISABLE_LIBRARIES_LINK, \"true\");\n history.push(buildRoute(ROUTES.PRODUCTS, {\":projectId\": data[0].id}));\n }\n },\n (error: ErrorResponse) => dispatch(fetchProjectsError(error))\n )\n };\n}\n\nexport function fetchProject(projectId: string): GenericThunkAction> {\n return (dispatch: GenericThunkDispatch, getState: GenericThunkGetState) => {\n dispatch(fetchProductsBegin(projectId));\n return api.fetchProject(projectId)\n .then((json: StudioResponse<{}>) => {\n dispatch(fetchProductsSuccess(json.data));\n const response: StudioResponse = >json;\n\n // Start polling if any products are locked\n response.data.products.forEach((product) => {\n if (product.status === PRODUCT_STATUS.DUPLICATION_IN_PROGRESS || product.status === PRODUCT_STATUS.CONVERSION_IN_PROGRESS) {\n PollManager.add(PollManager.createKey(projectId, product.id), () => {\n return dispatch(fetchProductStatus(projectId, product.id));\n }, IMPORT_POLL_INTERVAL);\n } else {\n localStorage.removeItem(getLocalStoreKeyForProgress(product.id));\n }\n });\n\n return response.data\n },\n (error: ErrorResponse) => dispatch(fetchProductsError(error))\n )\n }\n}\n\nfunction clearProductFilters() {\n let i = 0;\n while (localStorage.key(i) !== null) {\n // Remove any product filters\n let key = localStorage.key(i);\n if ((key !== null) && key.startsWith(PRODUCT_FILTER_PREFIX)) {\n localStorage.removeItem(key);\n }\n else {\n i++;\n }\n }\n}\n\nconst getLocalStoreKeyForProgress = (productId: string) => {\n return `STUDIO_PROGRESS_${productId}`;\n};\n\n","/**\n * A set of utilities for dealing with the old AngularJS manager\n * running side-by-side with the newer React App\n */\n\nexport const angularRouterHost = () => {\n return \"http://\" + window.location.hostname + \":80/#/\";\n};\n","import React from \"react\"\nimport '../../styles/FolderCard.css';\nimport {angularRouterHost} from \"../utils/angularManagerUtils\";\nimport Dotdotdot from \"react-dotdotdot\";\nimport {buildRoute} from \"../utils/routerUtils\";\nimport {ROUTES} from \"../utils/constants\";\nimport {Link} from \"react-router-dom\";\n\n\nexport interface ProjectFolderProps {\n id: string;\n name: string;\n productCount: number;\n}\n\nconst getProductCountVerbiage = (productCount: number) => {\n if (!productCount) return '';\n else {\n return productCount + (productCount > 1 ? ' Products' : ' Product');\n }\n}\n\nconst onClick = (id: string) => {\n window.location.href = `${angularRouterHost()}${id}`;\n}\n\nconst ProjectFolder = (props: ProjectFolderProps) => {\n if (!props.id) {\n return (\n
\n
\n
\n
\n
\n
\n )\n }\n\n return (\n
\n
\n \n
\n
\n \n {props.name}\n \n
\n
{getProductCountVerbiage(props.productCount)}
\n
\n \n
\n
\n )\n}\n\nexport default ProjectFolder;\n","import {ProductDataItem} from \"../types/StudioAPITypes\";\nimport {SORT_ATTRIBUTE} from \"./constants\";\n\nexport type SortTuple = [U, D];\n\nexport type SortReturn = -1 | 0 | 1 | number;\n\nexport function sortBy(key: string, list: I[]) {\n\n switch (key) {\n case SORT_ATTRIBUTE.a_z.key:\n return sortByNames(list)\n break;\n case SORT_ATTRIBUTE.z_a.key:\n return sortByNames(list).reverse();\n break;\n case SORT_ATTRIBUTE.lastEdited.key:\n return sortByDates(list as any)\n break;\n default:\n return list;\n break;\n }\n}\n\n/**\n * Sort by dates, starting with the newest\n *\n * @param {ProductDataItem[]} list\n * @returns {ProductDataItem[]}\n */\nexport function sortByDates(list: ProductDataItem[]): ProductDataItem[] {\n return decoratedSort(list, (item: ProductDataItem) => {\n return new Date(item.lastOpenDate).valueOf();\n }).reverse();\n}\n\n/**\n * Sort by names alphabetically\n *\n * @param {I[]} list\n * @returns {I[]}\n */\nexport function sortByNames(list: I[]): I[] {\n return decoratedSort(list, (item: I) => {\n const anyItem = item;\n return anyItem.name.toLowerCase().replace(/^(the|an|a)\\s(.*)$/, \"$2\");\n }, (a: SortTuple, b: SortTuple) => {\n return a[1].localeCompare(b[1]);\n })\n}\n\n/**\n * Implementation of a Schwartzian Transform\n * https://en.wikipedia.org/wiki/Schwartzian_transform\n *\n * @param {U[]} sortables\n * @param {(item: U) => D} decorator\n * @param {(a: SortTuple, b: SortTuple) => SortReturn} sort\n * @returns {U[]}\n */\nexport function decoratedSort(sortables: U[], decorator: (item: U) => D, sort?: (a: SortTuple, b: SortTuple) => SortReturn): U[] {\n return sortables.map>((undecorated: U) => {\n return [undecorated, decorator(undecorated)];\n }).sort((a: SortTuple, b: SortTuple) => {\n if (sort) {\n return sort(a, b);\n }\n\n // Most generic sort possible if none is passed in\n return a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : 0;\n }).map((tuple: SortTuple) => {\n return tuple[0];\n });\n}\n","import React from 'react';\nimport { TextField } from '@vitalsource/vstui'\nimport { Search as SearchIcon} from '@vitalsource/vstui-icons';\nimport '../../styles/ProjectList.css';\nimport '../../styles/Layouts.css';\nimport ProjectFolder from \"./ProjectFolder\";\nimport styled from \"styled-components\";\nimport {ProjectDataItem} from \"../types/StudioAPITypes\";\nimport {sortByNames} from \"../utils/sortCompUtils\";\n\nconst SearchField = styled(TextField)`\n float:left;\n margin:auto;\n height: 40px;\n width: 522px;\n > input {\n min-height: 0;\n height: 100%;\n width: 100%\n }\n`;\n\nconst SearchIconOverLay = styled(SearchIcon) `\n position: relative;\n left: -44px;\n display: inline-block;\n margin: 12px 16px 12px 12px;\n height: 16px;\n width: 16px;\n\n`;\n\nexport interface ProjectsListProps {\n projects: ProjectDataItem[];\n filter: string;\n updateProjectsFilter: (e: any) => void;\n}\n\nconst ProjectsList = (props: ProjectsListProps) => {\n const { projects, filter, updateProjectsFilter } = props;\n\n const mapProjectsToProjectFolder = (fitleredProjects: any[], filter: string) => {\n let projectContainerList = fitleredProjects.map((project) => {\n return (\n
\n \n
\n )\n });\n\n if(projectContainerList.length) {\n return projectContainerList;\n } else {\n return Array.apply(null, Array(8)).map( (i: any, j: number) => {\n return (\n
\n \n
\n )\n });\n }\n\n };\n\n const applyFilterToProjects = (projects: ProjectDataItem[], filter: string) => {\n return sortTitles(projects.filter((project) => {\n return project.name.toLowerCase().indexOf(filter.toLowerCase()) !== -1\n }));\n };\n\n const sortTitles = (projects: ProjectDataItem[]) => {\n return sortByNames(projects);\n };\n\n const filteredProjects = applyFilterToProjects(projects, filter);\n\n return (\n
\n
\n
\n \n {!props.filter.length ? : \"\"}\n
\n
\n
{!filteredProjects.length && filter !== \"\" ? \"No results found\" : \"\"}
\n
\n {mapProjectsToProjectFolder(filteredProjects, filter)}\n
\n
\n
\n
\n );\n};\n\nexport default ProjectsList;\n","import React, {\n Component\n} from 'react';\nimport {connect} from \"react-redux\";\nimport {fetchProjects} from \"../middleware/projectsActions\";\nimport {updateProjectsFilter} from '../actions/projects'\nimport ProjectsList from \"../components/ProjectsList\";\nimport {CustomDispatchProps} from \"../types/Types\";\nimport {State} from \"../reducers\";\nimport {ProjectDataItem} from \"../types/StudioAPITypes\";\n\nexport interface ProjectsContainerProps extends CustomDispatchProps {\n projects: ProjectDataItem[];\n filter: string;\n updateProjectsFilter: (e: any) => void;\n}\n\nclass ProjectsContainer extends Component {\n componentDidMount() {\n this.props.dispatch(fetchProjects())\n }\n\n render() {\n return (\n {\n if (e.target) {\n this.props.dispatch(updateProjectsFilter(e.target.value || \"\"))\n }\n }}\n />\n )\n }\n}\n\nconst mapStateToProps = (state: State) => ({\n projects: state.projects.items,\n filter: state.projects.filter\n});\n\nexport default connect(mapStateToProps)(ProjectsContainer);\n","import React from 'react';\nimport ProjectsContainer from \"../containers/ProjectsContainer\";\nimport HeaderContainer from \"../containers/HeaderContainer\"\n\nconst Projects = (props) => {\n return (\n
\n \n \n
\n );\n};\n\nexport default Projects;\n","import React, { Component } from \"react\";\nimport \"../../styles/FullscreenDialog.css\";\nimport close from \"../../img/close_black.svg\";\nimport Closeable from \"./Closeable\";\n\nexport interface FullscreenDialogProps {\n onRequestClose?: () => void;\n onClose?: () => void;\n interactive?: boolean;\n}\n\nexport default class FullscreenDialog extends Component {\n constructor(props: any) {\n super(props);\n\n this.requestClose = this.requestClose.bind(this);\n }\n\n componentDidMount() {\n document.body.classList.add(\"no-sroll\")\n }\n\n componentWillUnmount() {\n document.body.classList.remove(\"no-sroll\")\n\n if (this.props.onClose) {\n this.props.onClose();\n }\n }\n\n requestClose() {\n const onRequestClose = this.props.onRequestClose;\n\n if (onRequestClose) {\n onRequestClose();\n }\n }\n\n render() {\n return (\n \n
\n {this.props.interactive ? : \"\"}\n {this.props.children}\n
\n
\n )\n }\n}\n","import React, { Component } from \"react\";\n\nexport interface ClickableProps {\n isInline?: boolean;\n onHoverChange?: (hasHover: boolean) => void;\n onFocusChange?: (hasFocus: boolean) => void;\n onClick?: (e: React.MouseEvent) => void;\n disabled?: boolean;\n}\n\ninterface ClickableState {\n hover: boolean;\n focus: boolean;\n}\n\n/**\n * Class that provides a way to detect hover and focus changes in child elements.\n * Should be used sparingly for situations where CSS is not sufficient\n */\nexport default class Clickable extends Component {\n constructor(props: ClickableProps) {\n super(props);\n\n this.state = {\n hover: false,\n focus: false,\n }\n\n this.toggleHover = this.toggleHover.bind(this);\n this.toggleFocus = this.toggleFocus.bind(this);\n this.onClick = this.onClick.bind(this);\n }\n\n toggleHover() {\n const hasHover = !this.state.hover;\n this.setState({\n hover: hasHover\n })\n\n if (this.props.onHoverChange && !this.props.disabled) {\n this.props.onHoverChange(hasHover);\n }\n }\n\n toggleFocus() {\n const hasFocus = !this.state.focus;\n this.setState({\n focus: hasFocus\n })\n\n if (this.props.onFocusChange && !this.props.disabled) {\n this.props.onFocusChange(hasFocus);\n }\n }\n\n onClick(e: React.MouseEvent) {\n if (this.props.onClick && !this.props.disabled) {\n this.props.onClick(e);\n }\n }\n\n render() {\n let Wrapper: any = \"div\";\n if (this.props.isInline) {\n Wrapper = \"span\";\n }\n\n return (\n \n {this.props.children}\n \n )\n }\n}\n","import React, { Component } from \"react\";\nimport { Card } from \"@vitalsource/vstui\";\nimport Clickable from \"../Clickable\";\nimport \"../../../styles/AddProductWizard.css\";\n\ninterface ProductTypeCardState {\n hasHover: boolean;\n}\n\nexport interface ProductTypeCardProps {\n onSelected: () => void;\n icon: string;\n hoverIcon: string;\n title: string;\n description: string | JSX.Element;\n}\n\nexport default class ProductTypeCard extends Component {\n\n constructor(props: ProductTypeCardProps) {\n super(props);\n\n this.state = {\n hasHover: false\n };\n\n this.hoverChange = this.hoverChange.bind(this);\n }\n\n hoverChange(hasHover: boolean) {\n this.setState({\n hasHover: hasHover\n })\n }\n\n render() {\n return (\n \n \n \n \n \n )\n }\n}\n","import React, {Component} from 'react';\nimport ReactGA from \"react-ga\";\n\nexport interface LinkWithGATrackerProps {\n href: string,\n className: string,\n onClick: (e: any) => void\n target: string,\n children?: JSX.Element[] | JSX.Element\n}\n\nexport default class LinkWithGATracker extends Component {\n propsWithGATracker: LinkWithGATrackerProps;\n\n constructor(props: LinkWithGATrackerProps) {\n super(props);\n\n this.propsWithGATracker = this.initPropsWithGATracker();\n\n Object.assign(this.propsWithGATracker, this.props, {\n onClick: (e: any) => {\n if (window.hasOwnProperty(\"ga\")) {\n ReactGA.pageview(\"/foundry\" + this.props.href);\n }\n this.props.onClick(e);\n }\n })\n }\n\n\n initPropsWithGATracker() {\n return {\n href: \"\",\n className: \"\",\n onClick: () => {},\n target: \"\",\n children: undefined\n }\n }\n\n render() {\n return (\n {this.props.children}\n )\n }\n}\n","import React from \"react\";\nimport {Card, Icon} from \"@vitalsource/vstui\";\nimport createIcon from \"../../../img/create.svg\";\nimport createIconAnim from \"../../../img/create.gif\";\nimport importIcon from \"../../../img/import.svg\";\nimport importIconAnim from \"../../../img/import.gif\";\nimport comingSoon from \"../../../img/coming_soon.svg\";\nimport \"../../../styles/AddProductWizard.css\";\nimport ProductTypeCard from \"./ProductTypeCard\";\nimport {ProductCardType, ProjectConfigType} from \"../../types/Types\";\nimport {ExternalWindow as ExternalWindowSvg} from \"@vitalsource/vstui-icons\";\nimport styled from \"styled-components\";\nimport Svg from \"react-inlinesvg\";\nimport LinkWithGATracker from \"../LinkWithGATracker\"\n\nconst LearnMoreIcon = styled(Icon)`\n position: relative;\n top: 5px;\n left: 5px;\n`;\n\nexport interface AddProductWizardProps {\n onProductTypeSelected: (type: ProductCardType) => void;\n projectConfig: ProjectConfigType\n}\n\nconst getimportCardText = (allowXmlZipImport: boolean) => {\n return allowXmlZipImport ? \"Import a PDF or XML\" : \"Import a PDF\";\n};\n\nconst getImportFileCard = (projectConfig: ProjectConfigType, onSelected: (type: ProductCardType) => void) => {\n\n if (projectConfig.allowPdfImport) {\n return (\n onSelected(ProductCardType.Import)}\n title={\"Import\"}\n description={
{getimportCardText(projectConfig.allowXmlZipImport)}
{e.stopPropagation()}}\n target=\"_blank\"><>Learn More\n \n \n
}\n />\n )\n } else {\n return (\n \n
\n \n \n

Import

\n

Import a PDF to create a new EPUB

\n
\n
\n )\n }\n};\nconst AddProductWizard = (props: AddProductWizardProps) => {\n return (\n
\n props.onProductTypeSelected(ProductCardType.EPUB)}\n title={\"Create\"}\n description={\"Start a new EPUB\"}\n />\n {getImportFileCard(props.projectConfig, props.onProductTypeSelected)}\n
\n )\n};\n\nexport default AddProductWizard;\n","import React, {Component} from \"react\";\nimport Closeable from \"./Closeable\";\nimport {KEYCODES} from \"../utils/constants\";\nimport {TextField} from \"@vitalsource/vstui\";\nimport \"../../styles/ProductCard.css\";\nimport {ProductData, ProjectDataItem} from \"../types/StudioAPITypes\";\nimport styled from \"styled-components\";\n\nconst StyledTextField = styled(TextField) `\n label {\n font-size: 16px;\n font-weight: 400;\n font-color: #2F2F39;\n }\n`;\n\ninterface ProductEditPanelState {\n nameLength: number;\n nameInput: string;\n nameIsValid: boolean;\n shouldShakeTextField: boolean;\n}\n\nexport interface ProductEditPanelProps {\n editProduct: (projectId: string) => void;\n updateProduct: (data: ProductData) => void;\n name: string;\n products: string[];\n}\n\nexport default class ProductEditPanel extends Component {\n\n private editField: HTMLTextAreaElement | null = null;\n\n constructor(props: ProductEditPanelProps) {\n super(props);\n\n this.state = {\n nameLength: this.props.name.length,\n nameInput: this.props.name,\n nameIsValid: true,\n shouldShakeTextField: false,\n };\n\n this.clickOutside = this.clickOutside.bind(this);\n this.selectEscape = this.selectEscape.bind(this);\n this.close = this.close.bind(this);\n this.validate = this.validate.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.textfieldChange = this.textfieldChange.bind(this);\n }\n\n componentWillReceiveProps() {\n this.setState({\n nameLength: this.props.name.length\n })\n }\n\n componentDidMount() {\n document.addEventListener('keydown', this.handleKeyDown, true);\n }\n\n componentWillUnmount() {\n document.removeEventListener('keydown', this.handleKeyDown, true);\n }\n\n updateProduct() {\n if (this.state.nameInput !== this.props.name) {\n this.props.updateProduct({\n name: this.state.nameInput\n });\n }\n this.close();\n }\n\n handleKeyDown(e: KeyboardEvent) {\n\n if (e.which === KEYCODES.ENTER) {\n if (this.state.nameIsValid) {\n e.preventDefault();\n this.updateProduct();\n } else {\n this.setShakeState();\n }\n }\n }\n\n clickOutside(e: MouseEvent) {\n if (this.state.nameIsValid) {\n this.updateProduct()\n } else {\n e.stopPropagation();\n this.setShakeState();\n }\n }\n\n\n setShakeState() {\n this.setState({\n shouldShakeTextField: true\n });\n\n setTimeout(function (this: any){\n this.removeShakeState();\n this.clearTimeout();\n }.bind(this),500)\n }\n\n removeShakeState() {\n this.setState({\n shouldShakeTextField: false,\n });\n }\n\n selectEscape() {\n this.close()\n }\n\n textfieldChange(e: Event) {\n const target = e.target as HTMLInputElement;\n if (target) {\n const value = target.value.trim();\n\n if (this.editField) {\n this.editField.blur();\n this.editField.focus();\n }\n\n this.setState({\n nameLength: value.length,\n nameInput: value\n })\n }\n }\n\n close() {\n this.props.editProduct(\"\");\n }\n\n validate() {\n if (this.editField) {\n let errorMessage = \"\";\n const value = this.editField.value.trim();\n const lowerCaseValue = value.toLowerCase();\n const lowerCaseProducts = this.props.products.map((product) => product.toLowerCase());\n const matchingIndex = lowerCaseProducts.indexOf(lowerCaseValue);\n if (matchingIndex !== -1 && this.props.name.toLowerCase()\n !== lowerCaseProducts[matchingIndex]) {\n errorMessage = \"Name already exists\"\n }\n\n if (value.length === 0) {\n errorMessage = \"Please enter a name\"\n }\n\n this.setState({\n nameIsValid: !errorMessage\n })\n\n return errorMessage;\n }\n }\n\n render() {\n return (\n
\n \n
\n this.editField = input}/>\n
\n
\n
\n )\n }\n}\n","import React, {Component} from \"react\"\nimport '../../../styles/ProductCtrlPanel.css';\nimport {Card, Dialog, Checkbox} from \"@vitalsource/vstui\";\nimport { Ellipsis as EllipsisIcon,\n Delete as DeleteIcon,\n Copy as DuplicateIcon,\n AddNote as EditIcon} from \"@vitalsource/vstui-icons\";\nimport Closeable from \"../Closeable\";\nimport {ProductCardButtonAction} from \"../../types/Types\";\nimport styled from \"styled-components\";\nimport { createTheme } from \"@vitalsource/vstui/themes\";\nimport {\n red,\n jungle,\n ocean\n} from '@vitalsource/vstui/colors';\nimport {PRODUCT_STATUS} from \"../../utils/constants\";\n\nconst theme = createTheme({\n color: {\n primary: red,\n },\n});\n\nenum EllipsisColor {\n GREY = \"GREY\",\n WHITE = \"WHITE\"\n}\n\nconst DeleteModal = styled(Dialog)`\n font-family: \"Roboto\";\n font-size: 15px;\n line-height: 21px;`;\n\nconst ModalLabel = styled.div`\n font-weight: 700;\n font-size: 15px;\n color: #3C3C3C;\n line-height: 21px;`;\n\nconst ModalValue = styled.div`\n color: #000000;\n max-width: 325px;\n white-space: normal;`;\n\nexport interface ProductCtrlPanelProps {\n productName: string;\n numberOfScreens: number;\n publishDate: string;\n status: string;\n deleteProduct: () => void;\n editProduct: () => void;\n duplicateProduct: () => void;\n}\n\nexport interface ProductCtrlPanelState {\n isFullPanel: boolean;\n isConfirmationDialogShown: boolean;\n enableContinueDelete: boolean;\n btnHovered: string;\n validationMessage: string;\n}\n\nclass ButtonPanel extends Component {\n deleteCBXRef: any;\n VSTUIButtonColor: string;\n\n constructor(props: ProductCtrlPanelProps) {\n super(props);\n\n this.state = {\n isFullPanel: false,\n isConfirmationDialogShown: false,\n enableContinueDelete: false,\n btnHovered: \"\",\n validationMessage: \"\",\n };\n\n this.VSTUIButtonColor = \"#007FAD\"\n\n this.setIsFullPanel = this.setIsFullPanel.bind(this);\n }\n\n handleDeleteConfirmationClick = () => {\n if (this.state.enableContinueDelete) {\n this.setIsConfirmationDialogShown(false);\n this.props.deleteProduct();\n }\n else if (!this.state.enableContinueDelete) {\n this.setState({ validationMessage: 'Required' });\n this.deleteCBXRef.focus();\n return;\n }\n };\n\n checkboxClicked = (checkboxValue: boolean) => {\n if (!checkboxValue) {\n this.setState({ validationMessage: 'Required' });\n this.deleteCBXRef.focus();\n return;\n }\n }\n\n getConfirmationDialog() {\n return ( this.setIsConfirmationDialogShown(false)}\n open={this.state.isConfirmationDialogShown}\n primaryActionButton={{\n label: 'Delete',\n onClick: () => {\n this.handleDeleteConfirmationClick()\n }}\n }\n rootSelector=\"#productButtonPanel\"\n secondaryActionButton={{\n label: 'Cancel',\n onClick: () => { this.setIsConfirmationDialogShown(false)},\n }}\n size=\"medium\"\n title=\"\"\n >\n
\n You are about to delete: \n {this.props.productName}\n
\n
\n
\n This contains: \n {this.props.numberOfScreens || 0 } {this.props.numberOfScreens !== 1 ? \"Screens\" : \"Screen\"}\n
\n
\n
\n This was published to Bookshelf on: \n {this.props.publishDate ? new Date(this.props.publishDate).toLocaleDateString(\"en-us\", {month: \"short\", day: \"numeric\", year:\"numeric\"}).toString() : \"Not Yet Published\"}\n
\n
\n
\n {\n this.setState({\n enableContinueDelete: e.target.checked\n })\n }}\n label=\"I understand that I will lose all of this content and will not be able to recover it.\"\n theme={theme}\n checked={this.state.enableContinueDelete}\n nativeFormControlRef={(x: any) => (this.deleteCBXRef = x)}\n validate={() => this.checkboxClicked(this.state.enableContinueDelete)}\n />\n
\n {!this.state.enableContinueDelete && this.state.validationMessage &&
{this.state.validationMessage}
}\n )\n };\n\n setEnableContinueDelete(state: boolean) {\n this.setState({\n enableContinueDelete: state\n })\n }\n\n setIsConfirmationDialogShown(state: boolean) {\n this.setState({\n isConfirmationDialogShown: state,\n enableContinueDelete: false,\n validationMessage: '',\n })\n };\n\n setIsFullPanel(state: boolean) {\n this.setState({\n isFullPanel: state\n });\n };\n\n handleOnClick(action: ProductCardButtonAction, e: any) {\n switch (action) {\n case ProductCardButtonAction.Delete:\n this.setIsConfirmationDialogShown(true);\n break;\n case ProductCardButtonAction.Edit:\n this.props.editProduct();\n break;\n case ProductCardButtonAction.Duplicate:\n this.props.duplicateProduct();\n break;\n default:\n // Do nothing\n }\n };\n\n getFullPanelLayout() {\n return (\n
\n {this.setIsFullPanel(false)}} onEscape={() => {this.setIsFullPanel(false)}}>\n
\n {this.getConfirmationDialog()}\n \n \n \n
\n
\n
\n );\n };\n\n getDeleteProductLayout() {\n return (\n
\n {this.getConfirmationDialog()}\n
Import Failed
\n \n
\n );\n }\n\n getEllipsisColor() {\n if (this.isProcessInProgress()) {\n return EllipsisColor.GREY;\n } else if (this.state.btnHovered === \"ELLIPSIS\") {\n return EllipsisColor.WHITE;\n } else {\n return this.VSTUIButtonColor;\n }\n }\n\n isProcessInProgress() {\n return this.props.status !== PRODUCT_STATUS.ACTIVE && this.props.status !== PRODUCT_STATUS.CONVERSION_FAILED\n }\n\n getProcessInProgressLayout() {\n const displayStatus = this.props.status\n .replace('Conversion', 'Import')\n .replace(PRODUCT_STATUS.TOC_LOCKED, PRODUCT_STATUS.IMPORT_IN_PROGRESS);//FLOE-5918\n return (\n
\n
{displayStatus}
\n
\n );\n }\n \n getInitialLayout() {\n return ()\n }\n\n render() {\n if (this.state.isFullPanel && !this.isProcessInProgress()) {\n return this.getFullPanelLayout();\n } else if (this.props.status === PRODUCT_STATUS.CONVERSION_FAILED) {\n return this.getDeleteProductLayout();\n } else if (this.isProcessInProgress()) {\n return this.getProcessInProgressLayout();\n } else {\n return this.getInitialLayout();\n }\n }\n}\n\n\nexport default ButtonPanel;\n","import React from \"react\";\nimport loader from \"../../img/loader.svg\";\nimport \"../../styles/Loader.css\";\n\nexport interface LoadingSpinnerProps {\n children: React.ReactNode;\n loading: boolean;\n message?: string;\n styles?: React.CSSProperties;\n}\n\nconst buildSpinner = (loading: boolean, message?: string, styles?: React.CSSProperties) => {\n if (loading) {\n return (\n
\n
{message ? message : \"\"}
\n \"Loading\"/\n
\n )\n }\n\n return null;\n}\n\nconst LoadingSpinner = (props: LoadingSpinnerProps) => {\n\n return (\n
\n {buildSpinner(props.loading, props.message, props.styles )}\n
{props.children}
\n
\n )\n}\n\nexport default LoadingSpinner;\n","/**\n* Utility contains domain specific helper methods used across components\n* */\n\nimport * as Scroll from 'react-scroll';\nconst scroller = Scroll.scroller;\n\n\n/**\n * In the case of of an auto generated title, we need to check if the title exists and append the iteration\n *\n * @param productName\n * @param appendedString\n * @param it\n * @param productList\n */\n\nexport function checkTitleDupAndModify(productName: string, appendedString: string, it: number, productList: string[]) {\n let title = \"\";\n let isDuplicate = false;\n appendedString = appendedString ? ` ${appendedString}`: \"\";\n\n do {\n title = `${productName}${appendedString}${it > 1 ? ` ${it}` :\"\"}`;\n\n if (productList.indexOf(title) === -1) {\n isDuplicate = false;\n } else {\n isDuplicate = true;\n it++;\n }\n }\n while (isDuplicate);\n return title;\n};\n\nexport function scrollToObject(scrollToId: string | void, containerId?: string, ) {\n if (scrollToId) {\n scroller.scrollTo(scrollToId, {\n containerId: containerId,\n delay: 100,\n duration: 500,\n smooth: true,\n offset: -126\n });\n }\n};\n","import React, {Component} from \"react\";\nimport { Circle } from 'rc-progress';\nimport styled from \"styled-components\";\nimport {ProgressObject} from \"../../reducers\";\nimport errorIcon from \"../../../img/exclamation-error.svg\";\nimport successIcon from \"../../../img/Check.svg\";\nimport \"../../../styles/ProgressIndicator.css\"\n\nexport interface ProgressIndicatorProps {\n className?: string;\n size: string;\n progressInfo: ProgressObject;\n icon: string;\n inProgressMessage?: JSX.Element | undefined;\n progressCompleteMessage?: JSX.Element | undefined;\n progressFailureMessage?: JSX.Element | undefined;\n children: React.ReactNode;\n onSuccess?: () => JSX.Element;\n onFailure?: () => JSX.Element;\n hidden?: boolean;\n}\n\nexport interface ProgressIndicatorState {\n wait: boolean,\n interval: number\n}\n\nconst STROKE_COLOR: any = {\n \"IN_PROGRESS\": \"#007FAD\",\n \"SUCCESS\": \"#0A870A\",\n \"FAILURE\": \"#CC313D\",\n \"DEFAULT\": \"#007FAD\"\n};\n\nconst SIZE_MAP: any = {\n \"large\": {\n \"ringHeight\": 220,\n \"ringWidth\": 220,\n \"iconHeight\": 100,\n \"iconWidth\": 120\n },\n \"small\": {\n \"ringHeight\": 140,\n \"ringWidth\": 140,\n \"iconHeight\": 50,\n \"iconWidth\": 50\n }\n};\n\nconst CLASS_NAME_FOR_STATUS: any = {\n \"SUCCESS_small\": \"pi-custom-green-check-sm\"\n};\n\nexport default class ProgressIndicator extends Component {\n iconHeight: number;\n iconWidth: number;\n ringHeight: number;\n ringWidth: number;\n\n ProgressRingContainer: any;\n ProgressRingIcon: any;\n\n constructor(props: any) {\n super(props);\n\n this.iconHeight = SIZE_MAP[props.size].iconHeight;\n this.iconWidth = SIZE_MAP[props.size].iconWidth;\n this.ringHeight = SIZE_MAP[props.size].ringHeight;\n this.ringWidth = SIZE_MAP[props.size].ringWidth;\n\n this.ProgressRingContainer = styled.div`\n position: relative;\n display: block;\n margin: auto;\n margin-top: 56px;\n width: ${this.ringWidth}px;\n height: ${this.ringHeight}px;\n `;\n\n this.setDelayedState = this.setDelayedState.bind(this);\n\n this.state = {\n wait: false,\n interval: 0\n };\n }\n\n componentWillUpdate(nextProps: ProgressIndicatorProps, nextState: ProgressIndicatorState) {\n if (this.state.wait && !nextState.wait) {\n this.triggerSuccessAnimation();\n }\n }\n\n getProgressIndicator(status: string, message: JSX.Element | undefined, icon: string, color?: string) {\n return (\n
\n
\n \n \n \n \n
{message}
\n
\n
\n )\n };\n\n setDelayedState() {\n this.setState({\n wait: true,\n interval: window.setTimeout(() => {\n this.setState({\n wait: false\n })\n }, 3000)\n });\n }\n\n renderOnSuccess(props: ProgressIndicatorProps){\n if (!props.onSuccess) {\n return this.getProgressIndicator(\n props.progressInfo.status,\n props.progressCompleteMessage,\n successIcon,\n STROKE_COLOR[props.progressInfo.status]\n );\n } else {\n if (this.state.interval === 0) {\n this.setDelayedState();\n return this.getProgressIndicator(props.progressInfo.status, props.progressCompleteMessage, props.icon);\n } else {\n if (!this.state.wait) {\n clearInterval(this.state.interval);\n return props.onSuccess();\n }\n return this.getProgressIndicator(props.progressInfo.status, props.progressCompleteMessage, props.icon);\n }\n }\n }\n\n triggerSuccessAnimation() {\n }\n\n\n getRenderedContent(props: ProgressIndicatorProps) {\n if (!this.props.hidden) {\n switch (props.progressInfo.status) {\n case 'IN_PROGRESS':\n return this.getProgressIndicator(\n props.progressInfo.status,\n this.props.inProgressMessage,\n this.props.icon\n );\n case 'SUCCESS':\n return this.renderOnSuccess(props);\n case 'FAILURE':\n return this.getProgressIndicator(\n props.progressInfo.status,\n this.props.progressFailureMessage,\n errorIcon,\n STROKE_COLOR[props.progressInfo.status],\n );\n default:\n return this.props.children\n }\n }\n return this.props.children\n }\n\n render() {\n return this.getRenderedContent(this.props)\n }\n\n}\n","import React, {Component} from \"react\";\nimport ProgressIndicator from \"./ProgressIndicator\";\nimport {Icon} from \"@vitalsource/vstui\";\nimport {Button} from \"@vitalsource/vstui\";\nimport conversionIcon from \"../../../img/conversion.svg\"\n\n\nexport interface ProductProgressIndicatorProps {\n children: React.ReactNode;\n actionType: string,\n status: string,\n progress: number\n}\n\nexport interface ProductProgressIndicatorState {\n isHidden: boolean,\n isTransitioning: boolean\n}\n\nexport default class ProductProgressIndicator extends Component {\n constructor(props: any) {\n super(props);\n\n this.state = {\n isHidden: false,\n isTransitioning: false\n };\n\n this.setHiddenState = this.setHiddenState.bind(this);\n this.setIsTransitioningState = this.setIsTransitioningState.bind(this);\n }\n\n componentWillUpdate(nextProps: ProductProgressIndicatorProps, nextState: ProductProgressIndicatorState) {\n if ( this.state === nextState && this.props.actionType && !nextProps.actionType ) {\n this.triggerSuccessAnimation()\n }\n }\n\n setHiddenState(isHidden: boolean): void {\n this.setState({\n isHidden: isHidden\n });\n }\n\n setIsTransitioningState(isTransitioning: boolean): void {\n this.setState({\n isTransitioning: isTransitioning\n })\n }\n\n triggerSuccessAnimation(): void {\n this.setIsTransitioningState(true);\n setTimeout( () => {\n this.setHiddenState(true);\n this.setIsTransitioningState(false);\n }, 2500)\n }\n\n\n render() {\n return ;\n }\n}\n","import React from \"react\";\nimport {connect} from \"react-redux\";\nimport {State} from \"../reducers\";\nimport {Icon} from \"@vitalsource/vstui\";\nimport {Button} from \"@vitalsource/vstui\";\nimport ProductProgressIndicator from \"../components/progressIndicator/ProductProgressIndicator\";\nimport {ProductDataItem} from \"../types/StudioAPITypes\";\n\nexport interface OwnProps {\n children: React.ReactNode;\n id: string;\n}\n\nconst derivePropertyInfo = (type: string, status: string, progress?: number) => {\n return {\n actionType: type,\n status: status,\n progress: progress\n }\n}\n\nconst getProgressInfo = (productId: string, productStatus: string, progressPct: number | undefined) => {\n const PRODUCT_STATUS = {\n ACTIVE: \"Active\",\n DUPLICATION_IN_PROGRESS: \"Duplication In Progress\",\n CONVERSION_IN_PROGRESS: \"Conversion In Progress\",\n CONVERSION_FAILED: \"Conversion Failed\"\n };\n\n switch (productStatus) {\n case PRODUCT_STATUS.CONVERSION_FAILED:\n return derivePropertyInfo(\"CONVERSION\", \"FAILURE\", 100);\n case PRODUCT_STATUS.CONVERSION_IN_PROGRESS:\n return derivePropertyInfo(\"CONVERSION\",\"IN_PROGRESS\", progressPct, );\n /*\n * TODO uncomment this when implementing duplication indicator\n case PRODUCT_STATUS.DUPLICATION_IN_PROGRESS:\n return derivePropertyInfo(\"DUPLICATION\", 100, \"IN_PROGRESS\");\n */\n case PRODUCT_STATUS.ACTIVE:\n return derivePropertyInfo(\"\", \"SUCCESS\", 100);\n default:\n return derivePropertyInfo(\"\", \"\", 0);\n }\n}\n\nconst mapStateToProps = (state: State, ownProps: OwnProps) => {\n let item = state.products.items.find((product: any) => {\n return ownProps.id === product.id;\n }) as ProductDataItem;\n\n let progressInfo = getProgressInfo(item.id, item.status, item.progressPct);\n return {\n actionType: progressInfo.actionType,\n status: progressInfo.status,\n progress: progressInfo.progress\n }\n};\n\nexport default connect(mapStateToProps)(ProductProgressIndicator);\n","import React, { SyntheticEvent, useEffect, useState } from \"react\"\nimport '../../../styles/ProductCard.css';\nimport {Card} from \"@vitalsource/vstui\";\nimport {ICircle} from \"@vitalsource/vstui-icons\";\nimport {Popover} from \"@vitalsource/vstui/labs\"\nimport {angularRouterHost} from \"../../utils/angularManagerUtils\";\nimport Tooltip from \"@vitalsource/vstui/Tooltip\";\nimport styled from \"styled-components\";\nimport Dotdotdot from \"react-dotdotdot\";\nimport ProductEditPanel from \"../ProductEditPanel\";\nimport ProductCtrlPanel from \"./ProductCtrlPanel\";\nimport {ProductData} from \"../../types/StudioAPITypes\";\nimport LoadingSpinner from \"../LoadingSpinner\"\nimport {PRODUCT_STATUS, COLORS} from \"../../utils/constants\";\nimport {checkTitleDupAndModify} from \"../../utils/helperUtils\";\nimport ProductProgressIndicatorContainer from \"../../containers/ProductProgressIndicatorContainer\";\n\nlet ProductTitle = styled.div`\n position: relative;\n font-family: \"Roboto\";\n width:192px;\n height: 38px;\n font-weight: bold;\n font-size: 16px;\n color: #1B1B26;\n text-align: left;\n min-width: 0; \n `;\n\nlet ProductLastEdited = styled.div`\n font-family: \"Roboto\";\n font-size: 16px;\n color: #757575;\n text-align: left;\n padding-top: 8px;\n cursor: default;`;\n\nlet ProductCardElem = styled(Card)`\n width: 224px;\n height: 394px;\n margin: 16px;\n border-radius: 4px;\n position: relative;\n overflow: visible;\n `;\n\nlet ICircleCustom = styled(ICircle)` \n position: relative;\n top: calc(50% - 50px);\n height: 100px; \n width: 100px;\n`;\n\nconst coverContainerAspectRatio = 0.823; // -- width of the cover container / height of the cover container\n\nconst spinnerStyles: React.CSSProperties = {\n position: 'absolute',\n color: 'white',\n zIndex: 1\n};\n\nexport interface ProductCardProps {\n id: string;\n projectId: string;\n name: string;\n coverUrl: string\n modifiedDate: string;\n status: string;\n products: string[];\n inEditMode: boolean;\n numberOfScreens: number;\n publishDate: string;\n deleteProduct: (projectId: string, productId: string) => void;\n updateProduct: (projectId: string, productId: string, data: ProductData) => void;\n editProduct: (productId: string) => void;\n duplicateProduct: (productId: string, data: ProductData) => void;\n}\n\ninterface WithLinkProps {\n children: React.ReactNode;\n className: string;\n link: string;\n status: string;\n}\ninterface Product {\n id: string;\n status: string;\n}\n\nconst WithLink = (props: WithLinkProps) => {\n if (props.status !== PRODUCT_STATUS.ACTIVE) {\n return (\n
\n {props.children}\n
\n )\n }\n\n return (\n \n {props.children}\n \n );\n}\n\nconst ProductCard = (props: ProductCardProps) => {\n\n//#region FLOE-5919 and 6842\n\nconst [loading, setLoading] = useState(props.status !== PRODUCT_STATUS.ACTIVE && props.status !== PRODUCT_STATUS.CONVERSION_FAILED);\n const [currentStatus, setCurrentStatus] = useState(props.status);\n const showCardStatus = props.status == PRODUCT_STATUS.TOC_LOCKED ? currentStatus : props.status\n let intervalId: NodeJS.Timeout | undefined;\n const processInProgress = loading && (currentStatus === PRODUCT_STATUS.TOC_LOCKED || currentStatus === PRODUCT_STATUS.CONVERSION_FAILED);\n \n useEffect(() => {\n if (intervalId) clearInterval(intervalId);\n if (currentStatus === PRODUCT_STATUS.TOC_LOCKED || currentStatus === PRODUCT_STATUS.CONVERSION_FAILED) {\n intervalId = setInterval(() => {\n getProductDetails();\n }, 10000);\n }\n return () => {\n if (intervalId) clearInterval(intervalId);\n };\n });\n\n const getProductDetails = async () => {\n try {\n const url = new URL(`/api/projects/${props.projectId}`, window.location.origin);\n url.searchParams.append('automatedRequest', 'true');\n const response = await fetch(url.toString(), {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const data = await response.json();\n if (data && data.data && Array.isArray(data.data.products)) {\n const productIndex = data.data.products.findIndex((p: { id: string; }) => p.id === props.id);\n if (productIndex !== -1) {\n const product = data.data.products[productIndex];\n setCurrentStatus(product.status);\n setLoading(product.status !== PRODUCT_STATUS.ACTIVE && product.status !== PRODUCT_STATUS.CONVERSION_FAILED);\n } else {\n console.log(`Product with id ${props.id} not found in the response.`);\n }\n } else {\n console.log('Products array is missing.');\n }\n } catch (error) {\n console.error('Fetch error:', error);\n }\n };\n//#endregion FLOE-5919 and 6842\n\n const getFormattedDate = (dateString: string, showFullDate?: boolean): string => {\n // returns the date in string format MMM DD ?(YYYY). The year will be displayed if it is before the current year.\n var currentYear = new Date().getFullYear();\n var modifiedDate = new Date(dateString);\n\n if ((currentYear === modifiedDate.getFullYear()) && !showFullDate) {\n return modifiedDate.toLocaleDateString(\"en-us\", {month: \"short\", day: \"numeric\"}).toString();\n } else {\n return modifiedDate.toLocaleDateString(\"en-us\", {month: \"short\", day: \"numeric\", year:\"numeric\"}).toString();\n\n }\n };\n\n const renderCoverImage = function(coverUrl: string, productStatus: string) {\n if (productStatus === PRODUCT_STATUS.CONVERSION_FAILED) {\n return (\n
\n \n
\n )\n } else {\n return (\n
\n \n \n
\n )\n }\n }\n\n const getProductCloneName = (productName: string, products: any[]) => {\n\n var cpyReg = `(\\\\s)(Copy)(\\\\s\\\\d*)?$`;\n var cpyRegOpt = `(\\\\s?)(Copy)?(\\\\s\\\\d*)?`;\n\n var cpyRegExp = RegExp(cpyReg);\n\n\n // Check to see if this is formatted as a copy already\n productName = cpyRegExp.test(productName)? productName.replace(cpyRegExp, '') : productName;\n\n var similarTitlesReg = RegExp(`^(${productName})${cpyRegOpt}$`,'i');\n\n var matchingTitles = products.filter( (productName) => {\n return similarTitlesReg.test(productName);\n });\n\n // The length may not match the current copy iteration in the case of a delete. Double check to see if\n // the product exist - increment if it does.\n return checkTitleDupAndModify(productName, 'Copy', matchingTitles.length, matchingTitles);\n };\n\n const getInProgressMessage = (status: string) => {\n if (status)\n return status\n .replace(\"Conversion\", \"Import\") // Replace if needed\n .replace(PRODUCT_STATUS.TOC_LOCKED, PRODUCT_STATUS.IMPORT_IN_PROGRESS) //FLOE-5918\n .concat(\"...\");\n };\n\n const updateCoverPosition = function(e: SyntheticEvent) {\n let coverImage = e.target as HTMLImageElement;\n if (coverImage) {\n\n let naturalHeight = coverImage.naturalHeight || 1; // If natualHeight is undefined, aspect ratio width will be 0\n let naturalWidth = coverImage.naturalWidth || 0;\n let coverAspectRatio = naturalWidth/naturalHeight;\n\n // Cover is centered horizontally by default. Center vertically if the aspect ratio is flipped\n if (coverAspectRatio > coverContainerAspectRatio) {\n coverImage.setAttribute(\"class\", coverImage.getAttribute(\"class\") + \" cover-center__vertical\");\n }\n }\n };\n\n if (!props.id) {\n return (\n \n
\n
\n
\n
\n
\n
\n \n )\n }\n \nreturn (\n \n
\n \n \n \n {renderCoverImage(props.coverUrl, currentStatus)}\n \n \n \n
\n
\n \n {\n if (props.status === PRODUCT_STATUS.ACTIVE) {\n props.editProduct(props.id)\n }}}>\n {props.name.trim().includes(\" \") ?\n \n {props.name}\n :\n props.name}\n \n \n \n Edited {getFormattedDate(props.modifiedDate)}\n \n
\n {props.inEditMode ? \"\" : props.deleteProduct(props.projectId, props.id)}\n editProduct={() => props.editProduct(props.id)}\n duplicateProduct={() => props.duplicateProduct(props.projectId, {\n name: getProductCloneName(props.name, props.products),\n clone: {\n srcProduct: props.id,\n srcProject: props.projectId\n }\n }\n )}\n />}\n {props.inEditMode ? props.updateProduct(props.projectId, props.id, data)}\n name={props.name}\n products={props.products}/> : \"\"}\n
\n )\n}\n\nexport default ProductCard;\n","import {connect} from \"react-redux\";\nimport {State} from \"../reducers/index\";\nimport {deleteProduct, updateProduct, duplicateProduct, addProduct} from \"../middleware/productActions\";\nimport {updateItemInEditMode} from \"../actions/products\";\nimport ProductCard from \"../components/productCard/ProductCard\";\nimport {GenericThunkDispatch} from \"../types/Types\";\nimport {ProductData, ProjectDataItem} from \"../types/StudioAPITypes\";\nimport {scrollToObject} from \"../utils/helperUtils\";\n\ninterface OwnProps {\n id: string;\n}\n\nconst mapStateToProps = (state: State, ownProps: OwnProps) => ({\n inEditMode: state.products.itemInEditMode === ownProps.id,\n products: state.products.items.map((product) => product.name)\n});\n\nconst callback = (productData: void | {}) => {\n if (productData) {\n const typedData = productData as ProjectDataItem;\n scrollToObject(typedData.id, \"pageContainer\");\n }\n};\n\nconst mapDispatchToProps = (dispatch: GenericThunkDispatch) => {\n return {\n deleteProduct: (projectId: string, productId: string) => {\n dispatch(deleteProduct(projectId, productId));\n },\n editProduct: (productId: string) => {\n dispatch(updateItemInEditMode(productId));\n },\n updateProduct: (projectId: string, productId: string, data: ProductData) => {\n return dispatch>(updateProduct(projectId, productId, data)).then(callback);\n },\n duplicateProduct: (projectId: string, data: ProductData) => {\n return dispatch>(duplicateProduct(projectId, data)).then(callback);\n }\n }\n};\nexport default connect(mapStateToProps, mapDispatchToProps)(ProductCard);\n","import React, { useState, useEffect } from \"react\";\nimport styled from \"styled-components\";\nimport {Button, Select, TextField} from \"@vitalsource/vstui\";\nimport {Search as SearchIcon} from \"@vitalsource/vstui-icons\";\nimport {SORT_ATTRIBUTE} from \"../utils/constants\";\nimport '../../styles/Layouts.css';\n\nexport interface ToolbarProps {\n onUpdateFilter: (e: Event) => void;\n onUpdateSort: (e: Event) => void;\n filter: string;\n sort: string;\n btnAction: (e: MouseEvent) => void;\n addButtonRefCb: (ref: any) => void;\n emptyFilterState: boolean;\n hidden?: boolean;\n}\n\nconst SearchField = styled(TextField)`\n position: relative;\n height: 40px;\n width: 522px;\n display: inline-block;\n > input[type=\"search\"] {\n min-height: 0px;\n height: 100%;\n width: 100%;\n }\n`;\n\nconst SearchIconOverLay = styled(SearchIcon)`\n position: relative;\n display: inline-block;\n height: 16px;\n width: 16px;\n`;\n\nconst SelectDropDown = styled(Select)`\n position: relative;\n padding: auto 8px auto 8px;\n display: inline-block;\n width: 150px;\n > select {\n min-height: 0px;\n min-width: 0px;\n width: 150px;\n height: 40px;\n max-width: 100%;\n }\n`;\n\nconst CustomButton = styled(Button)<{ disabledStyle: boolean }>`\n position: relative;\n width: 128px;\n height: 40px;\n font-weight: 700;\n min-height: 40px;\n > div {\n min-height: 0px;\n height: 100%;\n }\n background-color: ${({ disabledStyle }) => (disabledStyle ? \"#ccc\" : \"rgb(0, 127, 173)\")}; /* Styling disabled state */\n cursor: ${({ disabledStyle }) => (disabledStyle ? \"not-allowed\" : \"pointer\")}; /* Show disabled cursor */\n border: ${({ disabledStyle }) => (disabledStyle ? \"none\" : \"1px solid rgb(0, 127, 173)\")}; /* Remove border if disabled */\n opacity: ${({ disabledStyle }) => (disabledStyle ? \"0.6\" : \"1\")};\n`;\n\nconst ToolbarUtility = (props: ToolbarProps) => {\n const [showTooltip, setShowTooltip] = useState(false);\n\n const handleClick = (e: MouseEvent) => {\n if (props.filter.length > 0) {\n setShowTooltip(true);\n } else {\n props.btnAction(e);\n }\n };\n\n useEffect(() => {\n if (showTooltip) {\n const timer = setTimeout(() => {\n setShowTooltip(false);\n }, 1000);\n\n return () => clearTimeout(timer);\n }\n }, [showTooltip]);\n\n return (\n
\n
\n
\n \n
\n {!props.filter.length ? : \"\"}\n
\n
\n
\n \n \n \n \n \n
\n {/* FLOE-6822 */}\n
\n 0 ? \"add-dialog-close-disable\" : \"add-dialog-close\"}\n fullWidth\n size=\"large\"\n onClick={handleClick}\n ref={props.addButtonRefCb}\n disabledStyle={props.filter.length > 0}\n >\n Add\n \n {showTooltip && (\n
\n {props.hidden\n ? \"\"\n : \"Disabled until filter is removed\"}\n
\n )}\n
\n {/* FLOE-6822 */}\n
\n
\n {props.emptyFilterState ? \"No results found\" : \"\"}\n
\n
\n );\n};\n\nexport default ToolbarUtility;\n","import React from \"react\";\nimport \"../../styles/EmptyItemsPlaceholder.css\";\nimport {Button} from \"@vitalsource/vstui\";\nimport styled from \"styled-components\";\nimport Svg from \"react-inlinesvg\";\nimport emptyStateDeskSvg from \"../../img/EmptyStateDesk.svg\";\n\nconst CustomButton = styled(Button) `\n position: relative;\n padding: 8px;\n width: 128px;\n height: 40px;\n font-weight: 700;\n min-height: 40px;\n font-size: 16px;\n > div {\n min-height: 0px;\n height: 100%;\n }\n margin: 16px auto 16px auto;\n`;\n\nexport interface EmptyItemsPlaceholderProps {\n buttonOnClick: (e: MouseEvent) => void;\n}\n\nconst EmptyItemsPlaceholder = (props: EmptyItemsPlaceholderProps) => {\n return (\n
\n
\n
Nothing here
\n
Add your first EPUB now.
\n Add\n
\n
\n
\n {\"Desk\n
\n
\n
\n
)\n};\n\nexport default EmptyItemsPlaceholder;\n","import React, {Component} from \"react\";\nimport ProgressIndicator from \"./ProgressIndicator\";\nimport {ExternalWindow as ExternalWindowSvg} from \"@vitalsource/vstui-icons\";\nimport styled from \"styled-components\";\nimport {Icon} from \"@vitalsource/vstui\";\nimport LinkWithGATracker from \"../LinkWithGATracker\";\nimport {Button} from \"@vitalsource/vstui\";\nimport uploadIcon from \"../../../img/arrow-upload.svg\"\nimport {ProgressObject} from \"../../reducers\";\nimport { ErrorResponse } from \"../../types/StudioAPITypes\";\nimport \"../../../styles/FileImportProgressIndicator.css\"\nimport {\n DUPLICATE_PRODUCT_NAME_API_ERROR,\n FILE_SIZE_EXCEEDS_LIMIT_ERROR,\n INVALID_FILE_CONTENT_TYPE_ERROR\n} from \"../../utils/constants\";\n\nexport interface FileImportProgressIndicatorProps {\n children: React.ReactNode;\n progressInfo: ProgressObject;\n handleClose: () => void;\n handleUploadRetry: () => void;\n resetImportProcess: () => void;\n error: ErrorResponse\n}\n\nconst LearnMoreIcon = styled(Icon)`\n position: relative;\n top: 2px;\n left: 5px;\n`;\n\nconst ErrorButton = styled(Button)`\n margin: 16px auto 16px auto;\n position: relative;\n display: block;\n`;\n\nexport default class FileImportProgressIndicator extends Component {\n constructor(props: any) {\n super(props);\n\n this.renderOnSuccess = this.renderOnSuccess.bind(this);\n }\n\n componentWillUnmount() {\n this.props.resetImportProcess()\n }\n\n getInProgressMessage() {\n return (\n <>\n
Uploading your file...
\n
Refreshing or navigating away will interrupt file upload.
\n )\n };\n\n getProgressCompleteMessage() {\n return (\n
Upload complete!
\n )\n };\n\n generateFailureMessageFromServer() {\n if (this.props.error) {\n if (this.props.error.messageid === FILE_SIZE_EXCEEDS_LIMIT_ERROR) {\n return \"File exceeds 750 MB limit.\"\n } else if (this.props.error.messageid === INVALID_FILE_CONTENT_TYPE_ERROR) {\n return \"Unsupported file type\"\n } else if (this.props.error.messageid === DUPLICATE_PRODUCT_NAME_API_ERROR) {\n return (

Product name exists...
\n
Change file name and try again.

)\n } else {\n return \"File upload failed... Try again.\"\n }\n }\n return \"\"\n }\n\n getFailureMessage() {\n return (
\n
{this.generateFailureMessageFromServer()}
\n
\n {\n this.props.resetImportProcess();\n this.props.handleUploadRetry();\n }}>Select File...\n {\n this.props.resetImportProcess();\n this.props.handleClose();\n }}>Cancel\n
\n
)\n }\n\n renderOnSuccess() {\n return (
\n
Import Content
\n

This may take a few minutes. Content will continue importing while you work elsewhere.


\n

We recommend a thorough review of your content after the import.

\n {\n e.stopPropagation()\n }}\n target=\"_blank\"><>Learn More\n \n \n \n
)\n }\n\n render() {\n return {this.props.children};\n }\n}\n","import React from \"react\";\nimport {connect} from \"react-redux\";\nimport {State} from \"../reducers\";\nimport {Icon} from \"@vitalsource/vstui\";\nimport {Button} from \"@vitalsource/vstui\";\nimport FileImportProgressIndicator from \"../components/progressIndicator/FileImportProgressIndicator\";\nimport {GenericThunkDispatch} from \"../types/Types\";\nimport {importFileResetProcess} from \"../actions/products\";\n\nexport interface OwnProps {\n children: React.ReactNode;\n handleClose: () => void;\n handleUploadRetry: () => void;\n}\n\nconst mapStateToProps = (state: State, ownProps: OwnProps) => ({\n progressInfo: state.products.fileImport,\n error: state.error[\"IMPORT_FILE\"],\n ...ownProps\n});\n\nconst mapDispatchToProps = (dispatch: GenericThunkDispatch) => {\n return {\n resetImportProcess: () => {\n dispatch(importFileResetProcess());\n }\n }\n};\n\n\nexport default connect(mapStateToProps, mapDispatchToProps)(FileImportProgressIndicator);\n","import React, {Component} from \"react\";\nimport {Button, Dialog, Icon, Select, TextField} from '@vitalsource/vstui';\nimport {ProductDataItem, ProjectDataItem} from \"../types/StudioAPITypes\";\nimport {sortBy} from \"../utils/sortCompUtils\";\nimport {RouteComponentProps} from \"react-router\";\nimport \"../../styles/ProductList.css\";\nimport '../../styles/Layouts.css';\nimport FullscreenDialog from \"./FullscreenDialog\";\nimport AddProductWizard from \"./addProductWizard/AddProductWizard\";\nimport {ProductCardType, ProjectConfigType} from \"../types/Types\";\nimport ProductCardContainer from \"../containers/ProductCardContainer\";\nimport {checkTitleDupAndModify, scrollToObject} from \"../utils/helperUtils\";\nimport importIconAnim from \"../../img/import.gif\";\nimport createIconAnim from \"../../img/create.gif\";\nimport ToolbarUtility from \"./ToolbarUtility\";\nimport {FILE_EXTENSIONS, PRODUCT_FILTER_PREFIX,SORT_ATTRIBUTE} from \"../utils/constants\";\nimport EmptyItemsPlaceholder from \"./EmptyItemsPlaceholder\";\nimport PollingManager from \"../utils/PollingManager\";\nimport FileImportProgressIndicatorContainer from \"../containers/FileImportProgressIndicatorContainer\";\n\nconst STUDIO_PRODUCT_SORT_VALUE = \"STUDIO_PRODUCT_SORT_VALUE\";\nconst PAGE_CONTAINER_ID = \"pageContainer\";\n\ninterface RouteParams {\n projectId: string;\n}\n\ninterface ProductsListState {\n addDialogVisible: boolean;\n sort: string;\n projectConfig: ProjectConfigType;\n productCreatedFromFileImport: string;\n disableDialogInteraction: boolean;\n}\n\nexport interface ProductsListProps extends RouteComponentProps {\n items: ProductDataItem[],\n projectId: string;\n loading: boolean;\n fetchData: (projectId: string) => Promise;\n updateProductsFilter: (e: any) => void;\n addProduct: (projectId: string, name: string) => Promise;\n importFile: (projectId: string, file: File) => Promise;\n resetProducts: () => void;\n filter: string;\n isLoading: boolean;\n}\n\nexport default class ProductsList extends Component {\n\n private addButton: React.RefObject;\n private fileInputSelector: React.RefObject;\n\n constructor(props: ProductsListProps) {\n super(props);\n\n this.state = {\n addDialogVisible: false,\n sort: localStorage.getItem(STUDIO_PRODUCT_SORT_VALUE) || SORT_ATTRIBUTE.lastEdited.key,\n projectConfig: {\n allowPdfImport: false,\n allowXmlZipImport: false\n },\n productCreatedFromFileImport: \"\",\n disableDialogInteraction: false\n };\n\n this.addButton = React.createRef();\n this.fileInputSelector = React.createRef();\n\n this.clickAdd = this.clickAdd.bind(this);\n this.addDialogRequestClose = this.addDialogRequestClose.bind(this);\n this.productTypeSelected = this.productTypeSelected.bind(this);\n this.handleInputFileSelectedChanged = this.handleInputFileSelectedChanged.bind(this);\n this.handleRetrySelectFile = this.handleRetrySelectFile.bind(this);\n this.onUpdateFilter = this.onUpdateFilter.bind(this);\n this.onUpdateSort = this.onUpdateSort.bind(this);\n this.setRefAddButton = this.setRefAddButton.bind(this);\n this.setProductCreatedFromFileImport = this.setProductCreatedFromFileImport.bind(this);\n }\n\n componentDidMount() {\n\n // If data in the model is for a different project, reset the model before requesting new data\n if (this.props.projectId !== this.props.match.params.projectId) {\n this.props.resetProducts();\n }\n\n this.props.fetchData(this.props.match.params.projectId).then((data: void | {}) => {\n if (data) {\n const projectData = data as ProjectDataItem;\n this.setState({\n projectConfig: {\n allowPdfImport: projectData.allowPdfImport,\n allowXmlZipImport: projectData.allowXmlZipImport\n }\n });\n }\n });\n }\n \n componentWillUnmount(): void {\n\n // Disable any polls for product data in this view\n this.props.items.forEach((item) => {\n PollingManager.remove(PollingManager.createKey(this.props.projectId, item.id));\n });\n }\n\n clickAdd(e: MouseEvent) {\n this.setState({\n addDialogVisible: true\n });\n }\n\n addDialogRequestClose() {\n this.setState({\n addDialogVisible: false\n });\n\n if (this.addButton) {\n const elem = document.querySelector(\"#add-dialog-close\");\n if (elem) {\n elem.focus();\n }\n }\n }\n\n applyFilterAndSortToProducts(products: any[], filter: string, sort: string) {\n let filteredProducts = products.filter((product) => {\n return product.name.toLowerCase().indexOf(filter.toLowerCase()) !== -1\n });\n\n return sortBy(sort, filteredProducts);\n };\n\n handleInputFileSelectedChanged(event: React.FormEvent) {\n if (event.currentTarget && event.currentTarget.files) {\n if (event.currentTarget.files.length === 1) {\n let fileToImport = event.currentTarget.files[0] as File;\n this.props.importFile(this.props.projectId, fileToImport)\n .then((productData: void | {}) => {\n const typedData = productData as ProjectDataItem;\n this.setProductCreatedFromFileImport(typedData.id);\n this.setState({\n disableDialogInteraction: false\n })\n }, (err ) => {\n this.setState({\n disableDialogInteraction: false\n });\n })\n }\n }\n this.setState({\n disableDialogInteraction: true\n });\n }\n\n handleRetrySelectFile() {\n this.setState({\n addDialogVisible: true,\n });\n }\n\n mapProductsToProductCard(products: any[]): any[] {\n let productContainerList = products.map( (product) => {\n return \n });\n\n if (productContainerList.length) {\n return productContainerList;\n } else {\n scrollToObject(\"toolbar\", PAGE_CONTAINER_ID);\n return Array.apply(null, Array(8)).map( (i: any, j: number) => {\n return (\n \n )\n });\n }\n }\n\n setProductCreatedFromFileImport(id: string) {\n this.setState({\n productCreatedFromFileImport: id\n });\n }\n\n productTypeSelected(type: ProductCardType) {\n\n const createUntitledName = () => {\n const titles = this.props.items.map((item) => item.name);\n return checkTitleDupAndModify(\"Untitled\",\"\", 0, titles);\n };\n\n switch (type) {\n case ProductCardType.EPUB:\n this.props.addProduct(this.props.projectId, createUntitledName())\n .then((productData: void | {}) => {\n this.addDialogRequestClose();\n if (productData) {\n const typedData = productData as ProjectDataItem;\n scrollToObject(typedData.id, PAGE_CONTAINER_ID);\n }\n });\n break;\n case ProductCardType.Import:\n if (this.fileInputSelector && this.fileInputSelector.current) {\n this.fileInputSelector.current.click();\n }\n break;\n default:\n // Do nothing\n }\n }\n\n onUpdateSort(e: any) {\n localStorage.setItem(STUDIO_PRODUCT_SORT_VALUE, e.currentTarget.value || \"\");\n this.setState({\n sort: e.currentTarget.value\n });\n }\n\n onUpdateFilter(e: any) {\n localStorage.setItem(PRODUCT_FILTER_PREFIX + this.props.projectId, e.currentTarget.value || \"\");\n this.props.updateProductsFilter(e)\n }\n\n setRefAddButton(ref: any) {\n this.addButton = ref;\n }\n\n getAcceptedFileFormats(): string {\n\n let fileExts = [FILE_EXTENSIONS.PDF];\n\n if (this.state.projectConfig.allowXmlZipImport) {\n fileExts.push(FILE_EXTENSIONS.ZIP);\n }\n return fileExts.toString();\n };\n\n render() {\n let filteredAndSortedProducts = this.applyFilterAndSortToProducts(this.props.items, this.props.filter, this.state.sort);\n let acceptableFileFormats = this.getAcceptedFileFormats();\n\n let dialog;\n if (this.state.addDialogVisible) {\n dialog = (\n \n \n {\n this.addDialogRequestClose();\n scrollToObject(this.state.productCreatedFromFileImport, PAGE_CONTAINER_ID);\n }}\n handleUploadRetry={ () => {\n this.productTypeSelected(ProductCardType.Import);\n }}>\n \n \n \n )\n }\n\n return (\n
\n {/** Preload gifs for add product wizard */}\n \n \n {!this.props.isLoading && !this.props.items.length? :\n
\n \n
\n {this.mapProductsToProductCard(filteredAndSortedProducts)}\n
\n
\n }\n {dialog}\n
\n )\n }\n}\n","import React from 'react';\nimport {connect} from \"react-redux\";\nimport {State} from \"../reducers\";\nimport {fetchProject} from '../middleware/projectsActions';\nimport {addProduct, importFile} from '../middleware/productActions';\nimport ProductsList from \"../components/ProductsList\";\nimport {withRouter} from \"react-router\";\nimport {GenericThunkDispatch} from \"../types/Types\";\nimport {updateProducts, updateProductsFilter} from \"../actions/products\";\nimport {FETCH_PRODUCTS_BASE} from \"../actions/products\";\n\nconst mapDispatchToProps = (dispatch: GenericThunkDispatch) => ({\n fetchData: (projectId: string) => {\n return dispatch>(fetchProject(projectId))\n },\n addProduct: (projectId: string, name: string) => {\n return dispatch>(addProduct(projectId, name))\n },\n updateProductsFilter: (e: any) => {\n if (e.target) {\n return dispatch(updateProductsFilter(e.target.value || \"\"))\n }\n },\n importFile: (projectId: string, file: File) => {\n return dispatch>(importFile(projectId, file))\n },\n resetProducts: () => {\n return dispatch(updateProducts([]));\n }\n});\n\nconst isFetchingProducts = (state: State) => {\n return !state.loading[FETCH_PRODUCTS_BASE] || state.loading[FETCH_PRODUCTS_BASE].showLoader\n};\n\nconst mapStateToProps = (state: State) => ({\n items: state.products.items,\n projectId: state.products.projectId,\n filter: state.products.filter,\n isLoading: isFetchingProducts(state)\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withRouter(ProductsList));\n","import React from \"react\";\nimport \"../../styles/Header.css\";\nimport classNames from \"classnames\";\n\nexport interface HeaderNavProps {\n breadcrumb?: React.ReactNode;\n activeItem?: number;\n children?: React.ReactChildren;\n title?: string;\n}\n\nfunction createTabs(tabs: React.ReactChildren, activeItem: number): React.ReactNode[] {\n return React.Children.map( tabs, (tab, index) => {\n const classes = classNames(\"Item header-nav-link header-nav-tab\", {\n \"header-nav-link--active\": activeItem === index\n });\n\n return (\n
\n {tab}\n
\n )\n })\n}\n\nfunction createHeaderTitle(title: string) {\n return (
{title}
)\n}\n\nconst HeaderNav = (props: HeaderNavProps) => {\n return (\n
\n
{props.breadcrumb}
\n {props.title !== undefined ? createHeaderTitle(props.title) : \"\"}\n {props.children && props.activeItem !== undefined ? createTabs(props.children, props.activeItem) : \"\"}\n
\n )\n};\n\nexport default HeaderNav;\n","import {connect} from \"react-redux\";\nimport {State} from \"../reducers\";\nimport HeaderNav from \"../components/HeaderNav\";\n\nconst mapStateToProps = (state: State) => ({\n title: state.products.projectName\n});\n\nexport default connect(mapStateToProps)(HeaderNav);\n","import React from \"react\";\nimport ProductsContainer from \"../containers/ProductsContainer\";\nimport HeaderContainer from \"../containers/HeaderContainer\";\nimport HeaderNavContainer from \"../containers/HeaderNavContainer\";\nimport {buildRoute} from \"../utils/routerUtils.ts\";\nimport {angularRouterHost} from \"../utils/angularManagerUtils\";\nimport {ROUTES, STUDIO_DISABLE_LIBRARIES_LINK} from \"../utils/constants\";\nimport {NavLink, Link, withRouter} from \"react-router-dom\";\nimport \"../../styles/Header.css\"\n\nconst setBreadCrumb = () => {\n if (localStorage.getItem(STUDIO_DISABLE_LIBRARIES_LINK) === \"true\") {\n return <>\n } else {\n return (Libraries);\n }\n};\n\nconst Products = (props) => {\n\n return (\n
\n \n \n Products\n Templates\n \n \n \n
\n )\n}\n\nexport default withRouter(Products);\n","import React from 'react';\nimport {ROUTES} from \"../utils/constants\";\nimport HeaderContainer from \"../containers/HeaderContainer\"\nimport {Link} from \"react-router-dom\";\n\nconst Error500 = (props) => {\n return (\n
\n \n
\n
\n
Uh oh! An error has occurred. Please contact studio.support@vitalsource.com.
\n
Return Home
\n
\n
\n
\n );\n};\n\nexport default Error500;\n","import React from \"react\";\nimport '../../styles/FeatureUpdates.css';\nimport hideShowIcon from \"../../img/features-hide-show.svg\";\nimport hideShowPic from \"../../img/features-hide-show.png\";\nimport hotspotIcon from \"../../img/features-hotspot.svg\";\nimport hotspotPic from \"../../img/features-image-hotspot.png\";\nimport screenBreakIcon from \"../../img/features-split-icon.svg\";\nimport screenBreakPic1 from \"../../img/features-break-1.png\";\nimport screenBreakPic2 from \"../../img/features-break-2.png\";\nimport pdfImportIcon from \"../../img/features-import.svg\";\nimport pdfImportPic from \"../../img/features-pdf-import.png\";\nimport HeaderContainer from \"../containers/HeaderContainer\";\n\nclass FeatureUpdates extends React.Component {\n render() {\n return (\n
\n \n
\n\n {/* fifth section */}\n
\n
\n
\n
\n \"PDF\n
\n
\n
\n

PDF Import

\n

Feb 20, 2019

\n

Are you still delivering PDF content to your learners\n that is static, difficult to view on mobile devices, incompatible with assistive\n technologies, and more tailored to a print experience than digital consumption?\n Now you can take that PDF content, upload it into Studio, and re-purpose the text\n and images in a new EPUB 3 file that can be enhanced with a wide range of\n interactive content--video, audio, interactive images, interactive questions, and\n hide/show text blocks.\n

\n

NOTE: Given the high variability of PDF files, content\n extraction results will vary.\n

\n {\"A\n
\n
\n
\n\n {/* fourth section */}\n
\n
\n
\n
\n \"Insert\n
\n
\n
\n

Screen Break and Screen Merge

\n

Feb 5, 2019

\n

After you’ve entered your content into Studio, you may\n change your mind about the amount of content displayed on each screen. With Screen\n Break and Screen Merge, you now have the tools you need to easily make these\n adjustments.\n

\n

While viewing the table of contents, select Merge\n with Previous to append that screen’s contents to the previous screen:\n

\n {\"There\n

When viewing a screen, click the Screen Break button\n to move all subsequent blocks to a new screen:\n

\n {\"There\n
\n
\n
\n\n {/* third section */}\n
\n
\n
\n
\n \"PDF\n
\n
\n
\n

PDF Import

\n

COMING SOON MARCH 2019

\n

Jan 20, 2019

\n

Soon you’ll be able to upload your own PDF file into\n Studio for the extraction\n of text and images into Studio blocks. Once the content is in Studio, you can add\n interactivity,\n optimize the content for a digital experience, and publish as an EPUB 3 file.\n You’ll gain all the great\n benefits of the EPUB 3 format: Accessibility, responsive design on mobile devices,\n and a full range of\n interactivity. NOTE: Given the high variability of PDF files, content extraction\n results will vary.

\n
\n
\n
\n\n {/* second section */}\n
\n
\n
\n
\n \"Hide/Show\n
\n
\n
\n

Hide/Show Block

\n

Dec 10, 2018

\n

Create ebook pages that are less overwhelming with the\n new hide/show block.\n This block allows you to add content that is hidden behind a content bar until\n students click or tap to\n reveal the additional information. Once revealed, students can click or tap to\n collapse the expanded panel.

\n \"An\n
\n
\n
\n\n {/* first section */}\n
\n
\n
\n
\n \"Hotspot\n
\n
\n
\n

Image Hotspot Block

\n

Dec 3, 2018

\n

Create images with hotspots that students tap or click to\n reveal more\n information about the labeled item or region of the image.

\n \"An\n
\n
\n
\n
\n
\n )\n }\n}\n\nexport default FeatureUpdates;\n","import React, { Component } from 'react';\n\nimport {\n Router,\n Switch,\n Route\n} from \"react-router-dom\";\n\nimport PrivateRoute from './components/PrivateRoute';\n\nimport Login from './pages/Login';\nimport Error404 from './pages/Error404';\nimport Projects from './pages/Projects';\nimport history from \"./utils/history\";\nimport {ROUTES} from \"./utils/constants\";\nimport Products from './pages/Products';\nimport Error500 from './pages/Error500';\nimport FeatureUpdates from \"./pages/FeatureUpdates\";\nimport {scrollToObject} from './utils/helperUtils';\nimport ReactGA from 'react-ga';\n\nhistory.listen((location) => {\n scrollToObject();\n if (window.hasOwnProperty(\"ga\")) {\n ReactGA.pageview(location.pathname);\n }\n});\n\nexport default class Routes extends Component {\n render() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n )\n }\n};\n","import {connect} from \"react-redux\";\nimport {State} from \"../reducers\";\nimport LoadingSpinner from \"../components/LoadingSpinner\";\nimport {createLoadingUnselector} from \"../utils/selectors\";\nimport {DELETE_SESSION_BASE, POST_SESSION_BASE} from \"../actions/login\";\nimport {IMPORT_FILE_BASE, UPDATE_PRODUCT_BASE} from \"../actions/products\";\n\n\nconst loadingSelector = createLoadingUnselector([\n POST_SESSION_BASE,\n DELETE_SESSION_BASE,\n UPDATE_PRODUCT_BASE,\n IMPORT_FILE_BASE\n]);\nconst mapStateToProps = (state: State) => ({\n loading: loadingSelector(state)\n});\n\nexport default connect(mapStateToProps)(LoadingSpinner);\n","import React from \"react\";\nimport {\n Button,\n Form,\n TextField,\n Dialog\n} from '@vitalsource/vstui';\nimport \"../../styles/Error.css\";\nimport {ErrorResponse} from \"../types/StudioAPITypes\";\n\nexport interface ErrorDialogProps {\n error: ErrorResponse | null;\n children: React.ReactNode;\n}\n\nconst ErrorDialog = (props: ErrorDialogProps) => {\n\n function getDialog() {\n return (\n {\n location.reload(true);\n }\n }}\n >\n

A quick reload should correct the issue.

\n

If the problem persists, please contact studio.support@vitalsource.com

\n
\n )\n }\n\n return(\n
\n {props.error ? getDialog(): \"\"}\n {props.children}\n
\n )\n}\n\nexport default ErrorDialog;\n","import {connect} from \"react-redux\";\nimport {State} from \"../reducers\";\nimport ErrorDialog from \"../components/ErrorDialog\";\nimport {createErrorUnselector} from \"../utils/selectors\";\nimport {DELETE_SESSION_BASE, POST_SESSION_BASE} from \"../actions/login\";\nimport {IMPORT_FILE_BASE} from \"../actions/products\";\n\nconst errorSelector = createErrorUnselector([\n POST_SESSION_BASE,\n DELETE_SESSION_BASE,\n IMPORT_FILE_BASE\n]);\n\nconst mapStateToProps = (state: State) => ({\n error: errorSelector(state)\n});\n\nexport default connect(mapStateToProps)(ErrorDialog)\n","import React, { Component } from 'react';\nimport { Provider } from 'react-redux'\nimport { createLogger } from 'redux-logger'\nimport thunkMiddleware, {ThunkMiddleware} from 'redux-thunk'\nimport { createStore, applyMiddleware } from 'redux'\nimport foundryApp from './reducers'\nimport {\n ocean,\n cheddar\n} from '@vitalsource/vstui/colors';\nimport {\n createTheme,\n ThemeProvider\n} from \"@vitalsource/vstui/themes\";\nimport { CookiesProvider } from 'react-cookie';\nimport Routes from \"./Routes\"\nimport {State} from \"./reducers/index\";\nimport LoadingContainer from './containers/LoadingContainer';\nimport GenericErrorContainer from './containers/GenericErrorContainer';\nimport {RecaptchaWindow} from \"./types/Types\";\nimport ReactGA from \"react-ga\";\n\nconst VITALSOURCE_BASEURL = \"studio.vitalsource.com\";\nconst GA_TRACKING_ID = \"UA-113627382-1\";\n\n\nif (window.location.host !== VITALSOURCE_BASEURL) {\n ReactGA.initialize(GA_TRACKING_ID);\n ReactGA.pageview(window.location.pathname + window.location.hash);\n}\n\nconst theme = createTheme({\n color: {\n primary: ocean,\n secondary: cheddar\n }\n});\n\nconst loggerMiddleware = createLogger()\n\nconst store = createStore(\n foundryApp,\n applyMiddleware(\n thunkMiddleware as ThunkMiddleware,\n loggerMiddleware\n )\n)\n\nclass Foundry extends Component {\n render() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n )\n }\n};\n\nexport default Foundry;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './styles/index.css';\nimport Foundry from './js/Foundry';\n\nReactDOM.render(, document.getElementById('foundry'));\n","module.exports = __webpack_public_path__ + \"static/media/create.0750f8ae.gif\";","module.exports = __webpack_public_path__ + \"static/media/import.2ecea64d.gif\";","module.exports = __webpack_public_path__ + \"static/media/import.d4c925fc.svg\";","module.exports = __webpack_public_path__ + \"static/media/features-import.07b32d03.svg\";","module.exports = __webpack_public_path__ + \"static/media/vst_logo_signin.1f68a920.svg\";"],"sourceRoot":""}