{"version":3,"sources":["features/appBar/AppBar.module.scss","features/publishSite/ServerBackend.module.scss","features/diff/diff-styles.module.scss","features/editor/Editor.module.scss","features/publishSite/publishSite.module.scss","lib/apiClient.ts","features/documentClassList/documentClassApi.ts","features/documentClassList/documentClassListSlice.ts","features/appBar/views.tsx","features/documentClassList/DocumentClassList.tsx","features/documentList/documentApi.ts","features/documentList/documentListSlice.ts","features/documentList/DocumentList.tsx","app/hooks.ts","features/editionPicker/editionPickerApi.ts","features/editionPicker/editionPicker.Slice.ts","features/editionPicker/editionPickert.autocomplete.tsx","features/editionPicker/editionPicker.tsx","features/editionPicker/views.tsx","features/editionAssets/editionAssetsApi.ts","features/editionAssets/editionAssets.Slice.ts","features/editionAssets/views.tsx","features/templates/template.api.ts","features/templates/template.slice.ts","features/templates/views.tsx","features/home/Home.tsx","lib/day.ts","features/publishSite/ServerBackend.tsx","lib/pages.ts","features/diff/DiffSite.tsx","features/publishSite/PublishSite.tsx","features/editor/editorAPI.ts","features/editor/editorSlice.ts","features/editor/jsonView.tsx","features/editor/markdown.ts","features/editionImagePicker/editionImagePickerApi.ts","features/editionImagePicker/editionImagePicker.Slice.ts","features/editionImagePicker/editionImagePicker.tsx","features/editor/formState.Slice.ts","features/editor/widgets/phaidonArticleBodyMarkdownEditor.tsx","features/editor/widgets/guid.tsx","features/editor/widgets/EditionPickerWidget.tsx","features/editor/widgets/editionImagePickerWidget.tsx","features/editor/widgets/hiddenWhenBlank.tsx","features/editor/widgets/htmlEditor.tsx","features/editor/Editor.tsx","features/editor/editNewView.tsx","features/editor/editExitingView.tsx","App.tsx","features/counter/counterAPI.ts","features/counter/counterSlice.ts","app/store.ts","serviceWorker.ts","index.tsx","features/editionPicker/editionPicker.module.scss","features/home/Home.module.scss"],"names":["module","exports","defaults","api","localStorage","getItem","apiKey","getBearerToken","date","Date","setDate","getDate","fetch","toISOString","credentials","method","redirect","request","json","ret","success","data","token","Error","getRoles","headers","console","log","url","URL","window","location","href","searchParams","has","set","toString","get","relUri","error","code","message","getRaw","post","body","getList","refreshAsync","createAsyncThunk","documentClassListSlice","createSlice","name","initialState","status","classes","reducers","extraReducers","builder","addCase","pending","state","fulfilled","action","payload","hardNavigate","destination","ToolBar","navigate","useNavigate","React","useState","anchorEl","setAnchorEl","handleClose","AppBar","position","Toolbar","IconButton","onClick","Typography","variant","component","className","title","event","currentTarget","Menu","id","keepMounted","open","Boolean","onClose","MenuItem","padRight","WrappedComponent","DocumentClassList","this","props","dispatch","refresh","document","Container","maxWidth","Box","m","Paper","elevation","p","renderList","renderLoading","Button","CircularProgress","length","List","map","i","ListItem","button","ListItemText","primary","Component","connector","connect","documentClassList","withNavigate","documentClass","documentListSlice","filter","listing","renderedListing","DocumentList","handleInput","value","setState","filterOnAnyProp","handleInputThrottled","debounce","keys","Object","TableContainer","Table","stickyHeader","TableHead","TableRow","TableCell","TableBody","slice","documentId","k","idx","renderValue","Math","min","params","TextField","style","width","label","onChange","e","target","v","Checkbox","checked","disabled","list","toLowerCase","row","indexOf","push","func","timeout","timer","args","clearTimeout","setTimeout","withRouter","useParams","documentList","useAppDispatch","useDispatch","useAppSelector","useSelector","refreshSummaryAsync","editionSlice","isbn","editions","errorMessage","editionSelected","editionCleared","rejected","selectEditionPicker","editionPicker","EditionAutocomplete","current","summary","selected","currentEdition","setCurrentEdition","summaryState","setSummaryState","renderAutocompleteImg","option","md5","alt","styles","autocomplete","src","noimg","useEffect","Autocomplete","d","reason","details","options","getOptionLabel","language","getOptionSelected","renderInput","placeholder","ListboxComponent","clearOnBlur","blurOnSelect","clearOnEscape","renderOption","Grid","alignItems","container","Chip","ml5","renderRow","index","cloneElement","top","OuterElementContext","createContext","OuterElementType","forwardRef","ref","outerProps","useContext","children","other","itemData","Children","toArray","itemCount","getChildSize","child","gridRef","useRef","resetAfterIndex","useResetCache","Provider","overflowX","height","reduce","a","b","outerElementType","innerElementType","itemSize","overscanCount","editionPickerReducer","oldState","type","assign","arr","oldEdition","edition","editionChanged","EditionPicker","useReducer","localDispatch","LinearProgress","progressPlaceholder","EditionSearchView","asset","hash","path","assetPath","getAssetsAsync","getEditionSummaryAsync","publishAssetAsync","editionAssetSlice","imageUri","assets","selectEditionAssets","editionAssets","EditionAssetsView","sku","publish","Alert","zIndex","severity","padding","display","gridGap","gridTemplateColumns","groupBy","group","assetTypeDisplayName","uri","published","minHeight","justify","icon","CloudDone","color","startIcon","CloudUpload","key","source","nonMetaProperties","includes","humanKey","replace","trim","word","first","toUpperCase","minWidth","renderMetaEntry","renderAsset","property","array","values","engine","Liquid","templateUri","dataUri","template$","data$","Promise","all","template","parseAndRender","liquid","registerFilter","JSON","parse","stringify","getDataAndTemplateAsync","templateSlice","rendered","selectTemplate","TemplateView","dangerouslySetInnerHTML","__html","links","link","description","requiredRoles","HomeView","roles","setRoles","nav","setNav","r","matchRole","centerMiddle","gutterBottom","root","Card","card","CardContent","fillHeight","CardActions","size","dayjs","extend","localizedFormat","relativeTime","nodeOptions","draggable","selectable","edgeOptions","animated","stroke","diagramStore","create","nodes","linkWords","connection","Position","Left","x","y","Right","edges","connectedTo","targets","sourceHandle","setHashData","hashData","n","split","format","ServerBackend","nodeTypes","useMemo","backend","Backend","server","Webserver","fitView","defaultEdgeOptions","defaultNodes","defaultEdges","useNodes","s","Skeleton","webserver","useDiffStore","loaded","productionManifest","stagingManifest","newPages","updatedPages","removedPages","stagingPage","productionPage","listMode","previewMode","diff","selectKey","iframe","querySelector","updateIframe","setListMode","setPreviewMode","contentWindow","write","close","HtmlDiff","execute","ex","injectStyle","startsWith","Set","endsWith","ppk","delete","Array","from","DiffSummary","pb","pl","DiffSite","renderDiffList","diffs","a11yProps","Tabs","tabIndex","Tab","getStatusTimeout","resetStatusUpdate","useStore","getState","getStatus","builds","temp","latestQuickBuildStatus","latestArticleBuildStatus","mostRecentSuccessfulBuild","mostRecentSuccessfulArticleBuild","buildRequested","buildInProgress","buildPaused","unpauseModal","buildArticles","mode","buildWebsite","unpauseBuilds","buildPause","switchStagingWithProduction","as","publishedAt","catch","statusReq","ok","result","dStore","currentBuild","DATA_HASHES","PRODUCTION_BACKENDS","STAGING_BACKENDS","githubBuilds","BUILD_REQUESTED","BUILD_IN_PROGRESS","BUILD_PAUSE","qs","conclusion","updated_at","fromNow","localTime","setUnpauseModal","show","PublishSite","permissionButton","requiredPermission","comp","spacing","item","xs","md","getBuildStatus","inline","Warning","ml","Modal","center","getBuildTag","buildstatus","lh24","formData","getEmptyAsync","saveAsync","editorSlice","readonly","keyPath","jsonSchema","jsonUiSchema","dirtyState","setJson","setDirtyState","serverRendition","errors","hasLineInfo","kind","lineNumber","linePosition","join","selectEditor","actions","editor","JsonView","setStatus","setErrorMessage","ArrowBack","theme","main","string","boolean","marked","setOptions","baseUrl","renderer","Renderer","pedantic","gfm","breaks","sanitize","smartLists","smartypants","xhtml","rootImageRegex","rep","match","p1","offset","previewRendererFactory","plainText","replacedImageAssets","html","DOMPurify","editionImagePickerSlice","editionImagePicker","useStyles","makeStyles","createStyles","fiftySquare","EditionImagePickerDialog","selectedValue","propsIsbn","setIsbn","builtStyles","Dialog","fullWidth","justifyContent","Link","formStateSlice","changedState","selectFormState","formState","defaultMdeOptions","previewRender","spellChecker","nativeSpellcheck","toolbar","dispatchMarkdown","mutate","pickerOpen","setupTemplate","warn","tImage","titleImage","customTemplate","replaceAll","titleImageDescription","titleDescription","mdeOptions","inputStyle","lamda","newState","phaidonArticleBodyMarkdownEditorReducer","ns","codemirrorInstance","startPoint","getCursor","endPoint","text","getLine","line","start","ch","end","replaceRange","filename","setSelection","focus","uta","codemirrorRefreshed","noPadding","margin","flexDirection","felxGrow","widgets","PhaidonArticleBodyMarkdownEditor","initialized","formContext","lineAndCursor","relatedSku","getCodemirrorInstance","j","HtmlEditorWidget","rawErrors","marginTop","marginBottom","lineNumbers","wordWrap","scrollBeyondLastLine","GuidWidget","guid","setGuid","uuidv4","helperText","EditionPickerWidget","_isbn","EditionImagePickerWidget","setOpen","handleClickOpen","useCallback","flexGrow","HiddenWhenBlankWidget","dirty","_oldState","undefined","setCleanState","changeState","unblock","saving","Editor","setJsonSchema","setJsonUiSchema","navigator","NavigationContext","blocker","tx","changed","deepEqual","checkIfDirty","retry","confirm","block","save","progressPlaceHolder","schema","uiSchema","onSubmit","evt","nstate","EditNewView","cls","EditExitingView","App","element","fetchCount","amount","resolve","incrementAsync","response","counterSlice","increment","decrement","incrementByAmount","store","configureStore","reducer","counter","counterReducer","editorReducer","documentClassListReducer","documentListReducer","editionImagePickerReducer","editionAssetsReducer","templateReducer","hostname","ReactDOM","render","StrictMode","getElementById","serviceWorker","ready","then","registration","unregister"],"mappings":"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","file":"static/js/main.c6bf6c4d.chunk.js","sourcesContent":["// extracted by mini-css-extract-plugin\nmodule.exports = {\"title\":\"AppBar_title__1UGFm\",\"padRight\":\"AppBar_padRight__IpEUG\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"backend\":\"ServerBackend_backend__2YGWe\",\"webserver\":\"ServerBackend_webserver__-Su7C\",\"hash\":\"ServerBackend_hash__1CfC-\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"pb\":\"diff-styles_pb__ytwZD\",\"pl\":\"diff-styles_pl__1qAX0\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"editor\":\"Editor_editor__k8PhM\",\"progressPlaceHolder\":\"Editor_progressPlaceHolder__3Os4G\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"pb\":\"publishSite_pb__2h5tb\",\"ml\":\"publishSite_ml__b_myu\",\"buildstatus\":\"publishSite_buildstatus__VXpYs\",\"centerMiddle\":\"publishSite_centerMiddle__uz4Fl\",\"alert\":\"publishSite_alert__2eeXl\",\"card\":\"publishSite_card__rQUDg\",\"lh24\":\"publishSite_lh24__uid3t\",\"inline\":\"publishSite_inline__hM7JV\",\"center\":\"publishSite_center__1CFgQ\",\"text-updater-node\":\"publishSite_text-updater-node__2yiax\"};","//const api = \"https://test.zephan.dev\"\r\n\r\nconst defaults = {\r\n api: localStorage.getItem('api') || \"https://data.phaidon.com\",\r\n apiKey: localStorage.getItem('apikey') || \"\"\r\n}\r\n\r\nconst api = defaults.api\r\nlet apiKey = defaults.apiKey\r\n\r\nexport interface ApiResponse {\r\n success: boolean\r\n error?: {\r\n code: number,\r\n message: number\r\n }\r\n data: T\r\n}\r\n\r\nasync function getBearerToken(){\r\n if (apiKey) return apiKey;\r\n const date = new Date()\r\n date.setDate(date.getDate() + 1);\r\n const request = await fetch(`${api}/account/issue/${date.toISOString()}/all`,\r\n {\r\n credentials: \"same-origin\",\r\n method: 'POST',\r\n redirect: 'error'\r\n });\r\n const ret = await request.json() as ApiResponse<{token: string}>\r\n if(ret.success){\r\n apiKey = ret.data.token\r\n return apiKey\r\n }\r\n throw new Error('Failed to get authorization token!')\r\n}\r\nexport async function getRoles(): Promise{\r\n try {\r\n let request = await fetch(`${api}/account/get-roles`,\r\n {\r\n headers: {\"X-Api-Key\": await getBearerToken()},\r\n method: 'GET'\r\n });\r\n const ret = await request.json() as ApiResponse\r\n if (ret.success) {\r\n return ret.data\r\n }\r\n\r\n } catch (e) {\r\n console.log(`ERROR - ${e}`)\r\n }\r\n const url = new URL(window.location.href)\r\n if (!url.searchParams.has('reattempt')) {\r\n url.searchParams.set('reattempt', 'true')\r\n window.location.href = url.toString()\r\n }\r\n\r\n throw new Error('Failed to get use roles!')\r\n}\r\n\r\n\r\n\r\nexport async function get(relUri: string): Promise {\r\n const request = await fetch(`${api}/${relUri}`, {\r\n headers: {\r\n \"X-Api-Key\": await getBearerToken()\r\n }\r\n })\r\n\r\n const ret = await request.json() as ApiResponse;\r\n if (!ret.success)\r\n throw new Error(`ApiError: ${ret.error?.code}: ${ret.error?.message}`)\r\n\r\n\r\n return ret.data\r\n}\r\n\r\nexport async function getRaw(relUri: string): Promise> {\r\n const request = await fetch(`${api}/${relUri}`, {\r\n headers: {\r\n \"X-Api-Key\": await getBearerToken()\r\n }\r\n })\r\n\r\n return await request.json() as ApiResponse;\r\n}\r\n\r\n\r\nexport async function post(relUri: string, body: string): Promise {\r\n const request = await fetch(`${api}/${relUri}`, {\r\n method: 'POST',\r\n body: body,\r\n headers: {\r\n \"X-Api-Key\": await getBearerToken()\r\n }\r\n })\r\n\r\n const ret = await request.json() as ApiResponse;\r\n if (!ret.success)\r\n throw new Error(`ApiError: ${ret.error?.code}: ${ret.error?.message}`)\r\n\r\n\r\n return ret.data\r\n}\r\n","import {get} from '../../lib/apiClient'\r\n\r\n\r\nexport async function getList(): Promise {\r\n return get('json-documents/document-classes')\r\n}\r\n","import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';\r\nimport { RootState } from '../../app/store';\r\nimport { getList } from './documentClassApi';\r\n\r\nexport interface DocumentListState {\r\n status: 'init' | 'loading' | 'ready'\r\n classes: string[]\r\n}\r\n\r\nconst initialState: DocumentListState = {\r\n status: 'init',\r\n classes: []\r\n}\r\n\r\nexport const refreshAsync = createAsyncThunk(\r\n 'documentClassList/refresh',\r\n async () => {\r\n return await getList();\r\n }\r\n);\r\n\r\nexport const documentClassListSlice = createSlice({\r\n name: 'documentClassList',\r\n initialState,\r\n // The `reducers` field lets us define reducers and generate associated actions\r\n reducers: { },\r\n // The `extraReducers` field lets the slice handle actions defined elsewhere,\r\n // including actions generated by createAsyncThunk or in other slices.\r\n extraReducers: (builder) => {\r\n builder\r\n .addCase(refreshAsync.pending, (state) => {\r\n state.status = 'loading';\r\n })\r\n .addCase(refreshAsync.fulfilled, (state, action) => {\r\n state.status = 'ready';\r\n state.classes = action.payload\r\n });\r\n },\r\n});\r\n\r\nexport const selectDocumentListSlice = (state: RootState) => state.documentClassList;\r\nexport default documentClassListSlice.reducer;\r\n","import AppBar from '@material-ui/core/AppBar';\r\nimport {IconButton, Menu, MenuItem, Toolbar} from \"@material-ui/core\";\r\nimport PersonIcon from '@material-ui/icons/Person';\r\nimport React from \"react\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport HomeIcon from \"@material-ui/icons/Home\";\r\nimport {useNavigate} from \"react-router-dom\";\r\nimport classes from \"./AppBar.module.scss\";\r\nimport ExitToAppIcon from '@material-ui/icons/ExitToApp';\r\nimport SettingsIcon from '@material-ui/icons/Settings';\r\n\r\nfunction hardNavigate(destination: string){\r\n window.location.href = destination\r\n}\r\n\r\nexport function ToolBar(){\r\n const navigate = useNavigate();\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const handleClick = (event: React.MouseEvent) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n\r\n return <>\r\n \r\n \r\n navigate('/')}>\r\n \r\n \r\n \r\n Phaidon\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n { handleClose(); hardNavigate('/account') }}>\r\n \r\n Account\r\n \r\n { handleClose(); hardNavigate('/account/logout') }}>\r\n \r\n Logout\r\n \r\n \r\n \r\n\r\n}","import React, {Component} from \"react\";\r\nimport {DocumentListState, refreshAsync, selectDocumentListSlice} from \"./documentClassListSlice\";\r\nimport Button from '@material-ui/core/Button'\r\nimport CircularProgress from '@material-ui/core/CircularProgress'\r\nimport {connect, ConnectedProps} from \"react-redux\";\r\nimport {Container, Paper, List, ListItem, ListItemText, Typography, Box} from \"@material-ui/core\";\r\nimport {useNavigate} from \"react-router-dom\";\r\nimport {ToolBar} from \"../appBar/views\";\r\n\r\ntype PropsFromRedux = ConnectedProps\r\ninterface Props extends PropsFromRedux, DocumentListState {\r\n navigate: (uri: string) => void\r\n}\r\n\r\n\r\nexport class DocumentClassList extends Component {\r\n\r\n refresh() {\r\n console.log('DocumentClassList: refresh', this)\r\n this.props.dispatch(refreshAsync() as any)\r\n }\r\n componentWillMount() {\r\n this.refresh();\r\n }\r\n componentDidMount() {\r\n // After the component did mount\r\n document.title = `Phaidon Editor`\r\n }\r\n static getDerivedStateFromError(error: any) {\r\n console.log('DocumentClassList:getDerivedStateFromError', error)\r\n return { classes: [], state: 'init' };\r\n }\r\n\r\n render() {\r\n return <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n Document Classes:\r\n \r\n {this.props.status === 'ready' ? this.renderList() : this.renderLoading() }\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n renderLoading(){\r\n return \r\n }\r\n renderList(){\r\n if (!this.props.classes || this.props.classes.length === 0)\r\n return this.renderLoading()\r\n return \r\n {this.props.classes.map(i =>\r\n this.props.navigate(`/json-editor/${i}`)}>\r\n \r\n \r\n )}\r\n \r\n }\r\n}\r\n\r\nconst withNavigate = (WrappedComponent: any) => {\r\n return (props: any) => {\r\n return (\r\n \r\n );\r\n }\r\n};\r\n\r\n\r\nconst connector = connect(selectDocumentListSlice)\r\nexport default withNavigate(connector(DocumentClassList))\r\n","import {get} from '../../lib/apiClient'\r\n\r\n\r\nexport async function getList(documentClass: string): Promise {\r\n return get(`json-documents/${documentClass}`)\r\n}\r\n","import {createAsyncThunk, createSlice} from '@reduxjs/toolkit';\r\nimport { RootState } from '../../app/store';\r\nimport { getList } from './documentApi';\r\n\r\nexport interface DocumentListState {\r\n status: 'init' | 'loading' | 'ready'\r\n filter: string\r\n documentClass: string\r\n listing: any[]\r\n renderedListing: any[]\r\n}\r\n\r\nconst initialState: DocumentListState = {\r\n status: 'init',\r\n filter: '',\r\n documentClass: 'init',\r\n listing: [],\r\n renderedListing: []\r\n}\r\nexport const refreshAsync = createAsyncThunk('documentList/refresh', getList);\r\nexport const documentListSlice = createSlice({\r\n name: 'documentList',\r\n initialState,\r\n // The `reducers` field lets us define reducers and generate associated actions\r\n reducers: {\r\n\r\n },\r\n // The `extraReducers` field lets the slice handle actions defined elsewhere,\r\n // including actions generated by createAsyncThunk or in other slices.\r\n extraReducers: (builder) => {\r\n builder\r\n .addCase(refreshAsync.pending, (state) => {\r\n state.status = 'loading';\r\n })\r\n .addCase(refreshAsync.fulfilled, (state, action) => {\r\n state.status = 'ready';\r\n state.listing = action.payload\r\n state.renderedListing = action.payload\r\n state.filter = ''\r\n });\r\n },\r\n});\r\n\r\nexport const selectDocumentListSlice = (state: RootState) => state.documentList;\r\nexport default documentListSlice.reducer;\r\n","import {Component} from \"react\";\r\nimport {DocumentListState, refreshAsync, selectDocumentListSlice} from \"./documentListSlice\";\r\nimport Button from '@material-ui/core/Button'\r\nimport CircularProgress from '@material-ui/core/CircularProgress'\r\nimport {connect, ConnectedProps} from \"react-redux\";\r\nimport {Container, Paper, Box, Checkbox} from \"@material-ui/core\";\r\nimport {useNavigate} from \"react-router-dom\";\r\nimport {useParams} from \"react-router-dom\";\r\n\r\nimport Table from '@material-ui/core/Table';\r\nimport TableBody from '@material-ui/core/TableBody';\r\nimport TableCell from '@material-ui/core/TableCell';\r\nimport TableContainer from '@material-ui/core/TableContainer';\r\nimport TableHead from '@material-ui/core/TableHead';\r\nimport TableRow from '@material-ui/core/TableRow';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport {ToolBar} from \"../appBar/views\";\r\n\r\ntype PropsFromRedux = ConnectedProps\r\ninterface Props extends PropsFromRedux, DocumentListState {\r\n params: any\r\n navigate: (uri: string) => void\r\n}\r\n\r\nexport class DocumentList extends Component {\r\n refresh() {\r\n console.log('DocumentList: refresh', this)\r\n this.props.dispatch(refreshAsync(this.props.params.documentClass) as any)\r\n }\r\n UNSAFE_componentWillMount() {\r\n this.refresh();\r\n }\r\n componentDidMount() {\r\n document.title = `${this.props.params.documentClass} List - Phaidon Editor`\r\n }\r\n handleInput = (value: string) => {\r\n this.setState({renderedListing: filterOnAnyProp(this.props.listing, value)})\r\n }\r\n handleInputThrottled = debounce(this.handleInput, 300)\r\n render() {\r\n return <>\r\n \r\n \r\n \r\n \r\n {this.setState({filter: e.target.value}); this.handleInputThrottled(e.target.value)}} />\r\n \r\n \r\n \r\n {this.props.status === 'ready' ? this.renderList() : this.renderLoading() }\r\n\r\n \r\n \r\n \r\n \r\n }\r\n renderLoading() {\r\n return \r\n }\r\n renderValue(v:any){\r\n if(typeof v === 'boolean') {\r\n if(v)\r\n return \r\n return \r\n }\r\n return <>{v}\r\n }\r\n renderList = () => {\r\n const listing = this.state ? this.state.renderedListing : this.props.renderedListing || []\r\n\r\n if (!listing || listing.length === 0 )\r\n return
No Results Found.
\r\n\r\n const keys = Object\r\n .keys(listing[0])\r\n .filter(i => i !== 'documentId' && i !== 'documentClass')\r\n const max = 200;\r\n\r\n return <>\r\n \r\n \r\n \r\n \r\n \r\n { keys.map(i => {i}) }\r\n \r\n \r\n \r\n { listing.slice(0, max).map(i => \r\n \r\n \r\n \r\n \r\n {keys.map((k,idx) => {this.renderValue(i[k])})}\r\n )}\r\n \r\n
\r\n
\r\n \r\n Showing: {Math.min(listing.length, max)} of {listing.length}\r\n \r\n \r\n \r\n }\r\n}\r\n\r\nconst withRouter = (WrappedComponent: any) => {\r\n return (props: any) => {\r\n const params = useParams();\r\n return (\r\n \r\n );\r\n }\r\n};\r\nfunction filterOnAnyProp(list: any[], filter: string){\r\n if (!filter)\r\n return list\r\n filter = filter.toLowerCase()\r\n const keys = Object.keys(list[0])\r\n const ret = []as any[]\r\n for (const row of list) {\r\n for (const k of keys) {\r\n if (typeof(row[k]) === 'string' && row[k].toLowerCase().indexOf(filter) !== -1) {\r\n ret.push(row)\r\n break\r\n }\r\n }\r\n }\r\n return ret\r\n}\r\nfunction debounce(\r\n func: (...args: Params) => any,\r\n timeout: number,\r\n): (...args: Params) => void {\r\n let timer: any\r\n return (...args: Params) => {\r\n clearTimeout(timer)\r\n timer = setTimeout(() => {\r\n func(...args)\r\n }, timeout)\r\n }\r\n}\r\nconst connector = connect(selectDocumentListSlice)\r\nexport default withRouter(connector(DocumentList))\r\n","import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\nimport type { RootState, AppDispatch } from './store';\n\n// Use throughout your app instead of plain `useDispatch` and `useSelector`\nexport const useAppDispatch = () => useDispatch();\nexport const useAppSelector: TypedUseSelectorHook = useSelector;\n","import {get} from '../../lib/apiClient'\r\n\r\nexport interface EditionSummary {\r\n edition_Id: string\r\n isbn: string\r\n title: string\r\n md5: string\r\n language: string\r\n}\r\n\r\nexport async function getEditionSummary(): Promise {\r\n return get(`query/EditionPicker`)\r\n}\r\n\r\n","import {createAsyncThunk, createSlice, PayloadAction} from '@reduxjs/toolkit';\r\nimport { RootState } from '../../app/store';\r\nimport {EditionSummary, getEditionSummary} from \"./editionPickerApi\";\r\n\r\nexport interface EditionPickerState {\r\n status: 'init' | 'loading' | 'ready' | 'saving' | 'error'\r\n isbn: string,\r\n editions: EditionSummary[],\r\n errorMessage: string\r\n}\r\n\r\nconst initialState: EditionPickerState = {\r\n status: 'init',\r\n isbn: '',\r\n editions: [],\r\n errorMessage: '',\r\n}\r\n\r\nexport const refreshSummaryAsync = createAsyncThunk('editionSlice/refreshSummary', getEditionSummary);\r\n\r\n\r\nexport const editionSlice = createSlice({\r\n name: 'editionPicker',\r\n initialState,\r\n // The `reducers` field lets us define reducers and generate associated actions\r\n reducers: {\r\n editionSelected: (state, action: PayloadAction) => {\r\n console.log('EDITION SELECTED', action)\r\n state.isbn = action.payload.isbn\r\n },\r\n editionCleared: (state) => {\r\n state.isbn = ''\r\n }\r\n },\r\n // The `extraReducers` field lets the slice handle actions defined elsewhere,\r\n // including actions generated by createAsyncThunk or in other slices.\r\n extraReducers: (builder) => {\r\n builder\r\n .addCase(refreshSummaryAsync.pending, (state) => {\r\n state.status = 'loading';\r\n })\r\n .addCase(refreshSummaryAsync.rejected, (state, action) => {\r\n state.status = 'error';\r\n state.errorMessage = action.error.message ?? 'ERROR!'\r\n })\r\n .addCase(refreshSummaryAsync.fulfilled, (state, action) => {\r\n state.status = 'ready';\r\n state.editions = action.payload\r\n })\r\n },\r\n});\r\n\r\n//export const { editionSelected, editionCleared } = editionSlice.actions;\r\nexport const selectEditionPicker = (state: RootState) => state.editionPicker;\r\nexport default editionSlice.reducer;\r\n","import {\r\n Chip,\r\n Grid,\r\n TextField\r\n} from \"@material-ui/core\";\r\nimport {Autocomplete, AutocompleteChangeDetails, AutocompleteChangeReason} from \"@material-ui/lab\";\r\nimport { VariableSizeList, ListChildComponentProps } from 'react-window';\r\nimport styles from \"./editionPicker.module.scss\"\r\nimport {EditionSummary} from \"./editionPickerApi\";\r\nimport React, {ChangeEvent, useEffect, useState} from \"react\";\r\n\r\nexport function EditionAutocomplete(props: {label: string, current: EditionSummary | null, summary: EditionSummary[], selected: (summary: EditionSummary | null) => void}){\r\n const {label, current, summary, selected} = props;\r\n const [currentEdition, setCurrentEdition] = useState(current)\r\n const [summaryState, setSummaryState] = useState(summary)\r\n console.log(`EditionAutocomplete: ${current?.title ?? '- none -'}`, summaryState.length)\r\n function renderAutocompleteImg(option: EditionSummary){\r\n if (option.md5)\r\n return \"\"\r\n return
\r\n }\r\n const change = (e:ChangeEvent<{}>, d:EditionSummary|null, reason:AutocompleteChangeReason, details?:AutocompleteChangeDetails) => {\r\n //setCurrentEdition(d)\r\n console.log('EditionAutocomplete change', d)\r\n selected(d)\r\n }\r\n useEffect(()=> {\r\n selected(currentEdition)\r\n }, [currentEdition])\r\n\r\n useEffect(()=>{\r\n setSummaryState(summary)\r\n },[summary])\r\n\r\n useEffect(()=>{\r\n setCurrentEdition(current)\r\n },[current])\r\n\r\n return <>\r\n `${option.isbn}: ${option.title} [${option.language}]` }\r\n getOptionSelected={(option:any, value:any) => option.isbn === value.isbn}\r\n style={{ width: '100%' }}\r\n renderInput={(params) => }\r\n ListboxComponent={ListboxComponent as React.ComponentType>}\r\n clearOnBlur\r\n blurOnSelect\r\n clearOnEscape\r\n renderOption={(option) => \r\n {renderAutocompleteImg(option)}\r\n {option.isbn}: {option.title}\r\n \r\n }\r\n />\r\n \r\n}\r\n\r\n\r\n\r\nconst LISTBOX_PADDING = 8; // px\r\n\r\nfunction renderRow(props: ListChildComponentProps) {\r\n const { data, index, style } = props;\r\n return React.cloneElement(data[index], {\r\n style: {\r\n ...style,\r\n top: (style.top as number) + LISTBOX_PADDING,\r\n },\r\n });\r\n}\r\n\r\nconst OuterElementContext = React.createContext({});\r\n\r\nconst OuterElementType = React.forwardRef((props, ref) => {\r\n const outerProps = React.useContext(OuterElementContext);\r\n return
;\r\n});\r\n\r\nfunction useResetCache(data: any) {\r\n const ref = React.useRef(null);\r\n React.useEffect(() => {\r\n if (ref.current != null) {\r\n ref.current.resetAfterIndex(0, true);\r\n }\r\n }, [data]);\r\n return ref;\r\n}\r\n\r\n// Adapter for react-window\r\nconst ListboxComponent = React.forwardRef(function ListboxComponent(props, ref) {\r\n const { children, ...other } = props;\r\n const itemData = React.Children.toArray(children);\r\n const itemCount = itemData.length;\r\n const itemSize = 48;\r\n\r\n const getChildSize = (child: React.ReactNode) => itemSize\r\n const getHeight = () => {\r\n if (itemCount > 8) {\r\n return 8 * itemSize;\r\n }\r\n return itemData.map(getChildSize).reduce((a, b) => a + b, 0);\r\n };\r\n\r\n const gridRef = useResetCache(itemCount);\r\n\r\n return (\r\n
\r\n \r\n getChildSize(itemData[index])}\r\n overscanCount={5}\r\n itemCount={itemCount}\r\n >\r\n {renderRow}\r\n \r\n \r\n
\r\n );\r\n});\r\n\r\n","import { useAppDispatch, useAppSelector} from \"../../app/hooks\";\r\nimport {Grid, LinearProgress} from \"@material-ui/core\";\r\nimport React, { useEffect, useReducer} from \"react\";\r\nimport {refreshSummaryAsync, selectEditionPicker} from \"./editionPicker.Slice\";\r\n\r\nimport styles from \"./editionPicker.module.scss\"\r\nimport {EditionSummary} from \"./editionPickerApi\";\r\nimport {EditionAutocomplete} from \"./editionPickert.autocomplete\";\r\nimport {Action} from \"@reduxjs/toolkit\";\r\n\r\n\r\ninterface EditionPickerLocalAction extends Action{\r\n isbn?: string|null\r\n editions?: EditionSummary[]\r\n}\r\ninterface EditionPickerLocalState{\r\n isbn: string|null,\r\n edition: EditionSummary|null\r\n editions: EditionSummary[]\r\n\r\n editionChanged: ((edition: EditionSummary | null) => void)|null;\r\n}\r\nfunction firstOrNull(arr: T[]): T|null{\r\n if(arr && arr.length > 0)\r\n return arr[0]\r\n return null\r\n}\r\nfunction editionPickerReducer(state: EditionPickerLocalState, action: EditionPickerLocalAction): EditionPickerLocalState{\r\n console.log('editionPickerReducer', action)\r\n const oldState = state\r\n switch(action.type){\r\n case 'setIsbn':\r\n if (state.isbn !== action.isbn!)\r\n state = Object.assign({}, state,{isbn: action.isbn}) as any\r\n break\r\n case 'setEditions':\r\n if (state.editions !== action.editions!)\r\n state = Object.assign({}, state,{editions: action.editions || []}) as any\r\n break\r\n }\r\n if(oldState === state)\r\n return state\r\n\r\n console.log('editionPickerReducer - state has changed')\r\n const oldEdition = state.edition\r\n let e = state.edition\r\n if(state.isbn && state.editions && state.editions.length > 0)\r\n e = firstOrNull(state.editions.filter(i => i.isbn === state.isbn))\r\n else\r\n e = null\r\n state = Object.assign({}, state, {edition: e})\r\n\r\n if(state.editionChanged && e !== oldEdition) {\r\n setTimeout(() => {\r\n if (state.editionChanged)\r\n state.editionChanged(e)\r\n }, 1)\r\n }\r\n\r\n return state\r\n}\r\n\r\nexport function EditionPicker(props: any) {\r\n const e = useAppSelector(selectEditionPicker)\r\n const dispatch = useAppDispatch();\r\n const label = props.label || 'Search editions...'\r\n\r\n\r\n const [state, localDispatch] = useReducer(editionPickerReducer, {\r\n isbn: props.isbn,\r\n edition: null,\r\n editions: [],\r\n editionChanged: props.editionSelected\r\n } as EditionPickerLocalState)\r\n console.log('EditionPicker', props, state)\r\n\r\n useEffect(()=> {\r\n console.log('---> setEditions', e.editions)\r\n\r\n localDispatch({type: 'setEditions', editions: e.editions})\r\n }, [e.editions])\r\n\r\n useEffect(()=> {\r\n console.log('---> setIsbn',props.isbn)\r\n localDispatch({type: 'setIsbn', isbn: props.isbn})\r\n }, [props.isbn])\r\n\r\n useEffect(() => {\r\n console.log('---> refreshSummaryAsync')\r\n dispatch(refreshSummaryAsync());\r\n }, [dispatch])\r\n\r\n return (\r\n \r\n { e.status === 'loading' ? :
}\r\n localDispatch({type: 'setIsbn', isbn: edition ? edition.isbn : null})}\r\n />\r\n \r\n )\r\n}","import {useNavigate} from \"react-router-dom\";\r\nimport {EditionPicker} from \"./editionPicker\";\r\nimport {Box} from \"@material-ui/core\";\r\nimport {ToolBar} from \"../appBar/views\";\r\nimport {EditionSummary} from \"./editionPickerApi\";\r\n\r\nexport function EditionSearchView(props: any){\r\n const navigate = useNavigate();\r\n\r\n return <>\r\n \r\n \r\n navigate(`/edition-assets/${i.isbn}`)} />\r\n \r\n \r\n\r\n\r\n}","import {get, post} from '../../lib/apiClient'\r\n\r\nexport interface EditionAsset {\r\n edition_Id: string\r\n isbn: string\r\n title: string\r\n md5: string\r\n language: string\r\n published: string\r\n assetPath:string\r\n}\r\n\r\nexport async function getAllEditionAssets(isbn?: string): Promise {\r\n if (!isbn)\r\n return []\r\n return get(`query/EditionImageAssets?isbn=${isbn}`)\r\n}\r\n\r\n// export async function getEditionAssets(isbn?: string): Promise {\r\n// if (!isbn)\r\n// return []\r\n// return get(`query/EditionPublishedAssetsByIsbn?isbn=${isbn}`)\r\n// }\r\n\r\nexport async function publishAsset(asset: EditionAsset): Promise {\r\n if (!asset)\r\n return\r\n\r\n const hash = asset.md5\r\n const path = `${asset.isbn}/a/${asset.assetPath}`\r\n await post(`assets/publish/${hash}/${path}`, '')\r\n}\r\n\r\n\r\nexport interface EditionSummary {\r\n edition_Id: string\r\n isbn: string\r\n title: string\r\n md5: string\r\n language: string\r\n}\r\n\r\nexport async function getEditionSummary(isbn?: string): Promise {\r\n if (!isbn)\r\n return null\r\n const summary = await get(`query/EditionSummaryByIsbn?isbn=${isbn}`)\r\n if (summary && summary.length === 1)\r\n return summary[0]\r\n return null\r\n}\r\n","import {createAsyncThunk, createSlice } from '@reduxjs/toolkit';\r\nimport { RootState } from '../../app/store';\r\nimport {EditionAsset, getAllEditionAssets, getEditionSummary, publishAsset} from \"./editionAssetsApi\";\r\n\r\nexport interface EditionAssetState {\r\n status: 'init' | 'loading' | 'ready' | 'saving' | 'error'\r\n isbn: string | null,\r\n title: string,\r\n imageUri: string | null\r\n errorMessage: string\r\n assets: EditionAsset[]\r\n}\r\n\r\nconst initialState: EditionAssetState = {\r\n status: 'init',\r\n isbn: null,\r\n title: '',\r\n imageUri: null,\r\n assets: [],\r\n errorMessage: ''\r\n}\r\n\r\nexport const getAssetsAsync = createAsyncThunk('editionAssetState/getAssetsAsync', getAllEditionAssets);\r\nexport const getEditionSummaryAsync = createAsyncThunk('editionAssetState/getEditionSummary', getEditionSummary);\r\nexport const publishAssetAsync = createAsyncThunk('editionImagePickerSlice/publishAssetAsync', publishAsset);\r\n\r\nexport const editionAssetSlice = createSlice({\r\n name: 'editionAssetSlice',\r\n initialState,\r\n reducers: {\r\n },\r\n extraReducers: (builder) => {\r\n builder\r\n .addCase(getAssetsAsync.pending, (state) => {\r\n state.status = 'loading';\r\n state.errorMessage = '';\r\n })\r\n .addCase(getAssetsAsync.rejected, (state, action) => {\r\n state.status = 'error';\r\n state.errorMessage = action.error.message ?? 'ERROR!'\r\n })\r\n .addCase(getAssetsAsync.fulfilled, (state, action) => {\r\n state.status = 'ready';\r\n state.assets = action.payload\r\n })\r\n .addCase(publishAssetAsync.pending, (state) => {\r\n state.status = 'loading';\r\n })\r\n .addCase(publishAssetAsync.rejected, (state, action) => {\r\n state.status = 'error';\r\n state.errorMessage = action.error.message ?? 'ERROR!'\r\n })\r\n .addCase(publishAssetAsync.fulfilled, (state, action) => {\r\n state.status = 'ready';\r\n\r\n })\r\n .addCase(getEditionSummaryAsync.fulfilled, (state, action) => {\r\n state.title = action.payload?.title ?? ''\r\n state.imageUri = action.payload?.md5 ? `/image-assets/${action.payload?.md5}?width=180&height=180&rmode=pad&bgcolor=ffffff&clean=1` : null\r\n })\r\n },\r\n});\r\n\r\nexport const selectEditionAssets = (state: RootState) => state.editionAssets;\r\nexport default editionAssetSlice.reducer;\r\n","import {useAppDispatch, useAppSelector} from \"../../app/hooks\";\r\nimport {useEffect} from \"react\";\r\nimport { useParams} from \"react-router-dom\";\r\nimport {Box, Button, Chip, Grid, Paper} from \"@material-ui/core\";\r\nimport {\r\n EditionAssetState,\r\n getAssetsAsync,\r\n getEditionSummaryAsync,\r\n publishAssetAsync,\r\n selectEditionAssets\r\n} from \"./editionAssets.Slice\";\r\nimport {Alert} from \"@material-ui/lab\";\r\nimport {EditionAsset} from \"./editionAssetsApi\";\r\nimport {ToolBar} from \"../appBar/views\";\r\nimport {CloudDone, CloudUpload} from \"@material-ui/icons\";\r\n\r\nexport function EditionAssetsView(){\r\n const params = useParams();\r\n const {sku} = params;\r\n const e = useAppSelector(selectEditionAssets)\r\n const dispatch = useAppDispatch();\r\n\r\n async function publish(a: EditionAsset) {\r\n await dispatch(publishAssetAsync(a))\r\n dispatch(getAssetsAsync(sku))\r\n }\r\n useEffect(() => {\r\n document.title = `${e.title} - Edition Assets - Phaidon Editor`\r\n }, [e.title]);\r\n\r\n useEffect(() => {\r\n dispatch(getAssetsAsync(sku))\r\n dispatch(getEditionSummaryAsync(sku))\r\n },[sku, dispatch])\r\n\r\n\r\n return <>\r\n \r\n \r\n {e.status === 'error' && e.errorMessage && {e.errorMessage}}\r\n \r\n \r\n \r\n {e.imageUri ? \"\" : ''}\r\n
\r\n

{e.title}

\r\n
{sku}
\r\n
\r\n
\r\n
\r\n
\r\n {groupBy('assetTypeDisplayName', e.assets).map(group => <>\r\n
\r\n \r\n {group[0].assetTypeDisplayName}\r\n \r\n {group.map((i: any) => renderAsset(i, e, publish))}\r\n )\r\n }\r\n
\r\n \r\n}\r\n\r\n\r\n\r\nfunction renderAsset(a: EditionAsset, e: EditionAssetState, publish: (a: EditionAsset) => void) {\r\n\r\n const uri = a.published === 'True' ? `https://www.phaidon.com/images/${a.isbn}/a/small/${a.assetPath}`\r\n : `/image-assets/${a.md5}?width=180&height=180&rmode=pad&bgcolor=ffffff&clean=1`\r\n\r\n return \r\n \r\n \r\n
\r\n \"\"\r\n \r\n {a.published === \"True\" ? }\r\n label=\"Published\"\r\n color=\"secondary\"\r\n disabled={e.status === 'loading'}\r\n onClick={() => publish(a)}\r\n /> : publish(a)}\r\n startIcon={}>Publish\r\n }\r\n \r\n\r\n
\r\n
\r\n {Object.keys(a)\r\n //.filter(i => !i.startsWith('asset'))\r\n .map(k => renderMetaEntry(k, a))}\r\n
\r\n {/*
{JSON.stringify(a, null, 2)}
*/}\r\n
\r\n
\r\n
\r\n}\r\nconst nonMetaProperties = ['editionId','isbn','assetTypeDisplayName']\r\nfunction renderMetaEntry(key:string, source:any) {\r\n if (!source[key] || nonMetaProperties.includes(key))\r\n return\r\n const humanKey = key.replace(/_/g, ' ')\r\n .trim()\r\n .replace(/\\b[A-Z][a-z]+\\b/g, function(word) {\r\n return word.toLowerCase()\r\n })\r\n .replace(/^[a-z]/g, function(first) {\r\n return first.toUpperCase()\r\n })\r\n\r\n return
{humanKey}: {source[key]}
\r\n}\r\n\r\nfunction groupBy(property: string, array: any[]){\r\n const ret = {} as {[key: string]: any}\r\n for (const i of array){\r\n if (!(i[property] in ret)){\r\n ret[i[property]] = [] as any[]\r\n }\r\n ret[i[property]].push(i)\r\n }\r\n return Object.values(ret);\r\n}","import {get, getRaw} from '../../lib/apiClient'\r\nimport {Liquid} from \"liquidjs\";\r\n\r\nexport interface TemplateAndData {\r\n template: string\r\n data: any\r\n}\r\nconst engine = new Liquid();\r\n\r\nengine.registerFilter(\"parse-json\", (value) => JSON.parse(value))\r\nengine.registerFilter(\"format-json\", (value) => JSON.stringify(value, null, 2))\r\n\r\nexport async function getRenderedTemplate({templateUri, dataUri}: {templateUri?: string, dataUri?: string}):\r\n Promise {\r\n if (!templateUri || !dataUri)\r\n return null\r\n const template$ = get<[{liquid: string}]>(`query/TemplateByUrl?url=${templateUri}`)\r\n const data$ = getRaw(`${dataUri}`)\r\n const [template, data] = await Promise.all([template$, data$])\r\n return await engine.parseAndRender(template[0].liquid, data);\r\n\r\n}\r\n","import {createAsyncThunk, createSlice } from '@reduxjs/toolkit';\r\nimport { RootState } from '../../app/store';\r\nimport {getRenderedTemplate} from \"./template.api\";\r\n\r\nexport interface TemplateState {\r\n status: 'init' | 'loading' | 'ready' | 'saving' | 'error'\r\n errorMessage: string\r\n template: string | null,\r\n data: any,\r\n rendered: string\r\n}\r\n\r\nconst initialState: TemplateState = {\r\n status: 'init',\r\n errorMessage: '',\r\n template: '',\r\n data: {},\r\n rendered: ''\r\n}\r\n\r\nexport const getDataAndTemplateAsync = createAsyncThunk('templateState/getRenderedTemplate', getRenderedTemplate);\r\n\r\nexport const templateSlice = createSlice({\r\n name: 'templateSlice',\r\n initialState,\r\n reducers: {},\r\n extraReducers: (builder) => {\r\n builder\r\n .addCase(getDataAndTemplateAsync.pending, (state) => {\r\n state.status = 'loading';\r\n })\r\n .addCase(getDataAndTemplateAsync.rejected, (state, action) => {\r\n state.status = 'error';\r\n state.errorMessage = action.error.message ?? 'ERROR!';\r\n })\r\n .addCase(getDataAndTemplateAsync.fulfilled, (state, action) => {\r\n state.status = 'ready';\r\n state.rendered = action.payload ?? ''\r\n })\r\n },\r\n});\r\n\r\nexport const selectTemplate = (state: RootState) => state.template;\r\nexport default templateSlice.reducer;\r\n","import {useAppDispatch, useAppSelector} from \"../../app/hooks\";\r\nimport {useEffect} from \"react\";\r\nimport {useParams} from \"react-router-dom\";\r\nimport {Container, LinearProgress} from \"@material-ui/core\";\r\nimport {getDataAndTemplateAsync, selectTemplate} from \"./template.slice\";\r\nimport {Alert} from \"@material-ui/lab\";\r\nimport React from \"react\";\r\nimport { Fragment } from \"react\";\r\n\r\nexport function TemplateView(){\r\n const params = useParams()\r\n const dispatch = useAppDispatch()\r\n const state = useAppSelector(selectTemplate)\r\n useEffect(()=>{\r\n dispatch(getDataAndTemplateAsync({templateUri: params.template, dataUri: params['*']}))\r\n },[dispatch, params])\r\n\r\n function renderStatus() {\r\n if(state.status === 'error')\r\n return {state.errorMessage}\r\n\r\n return \r\n \r\n {state.status}\r\n \r\n }\r\n\r\n return <>\r\n {state.status === 'ready' ?
: renderStatus()}\r\n \r\n}\r\n","import {Button, Card, CardActions, CardContent, Container, Typography} from \"@material-ui/core\";\r\nimport classes from \"./Home.module.scss\";\r\nimport {ToolBar} from \"../appBar/views\";\r\nimport React, {useEffect, useState} from \"react\";\r\nimport {useNavigate} from \"react-router-dom\";\r\nimport {getRoles} from \"../../lib/apiClient\";\r\nimport {Alert} from \"@material-ui/lab\";\r\n\r\ninterface NavConfig{\r\n name: string\r\n link: string\r\n description: string\r\n action:string\r\n requiredRoles: string[]\r\n}\r\nconst links = [\r\n {\r\n name: 'Article Images',\r\n link: '/edition-assets/',\r\n description: 'View and publish images to the public website.',\r\n action:'Manage',\r\n requiredRoles: ['apiPublish', 'apiBuild']\r\n },\r\n {\r\n name: 'Publishing',\r\n link: '/publish-site/',\r\n description: 'Publish website content using latest data',\r\n action:'Publish Site',\r\n requiredRoles: ['apiPublish', 'apiBuild']\r\n },\r\n {\r\n name: 'Article Editor',\r\n link: '/json-editor/Article/',\r\n description: 'View, edit and create new articles',\r\n action:'Editor',\r\n requiredRoles: ['apiArticleR', 'apiArticleF']\r\n },\r\n {\r\n name: 'Books Product Editor',\r\n link: '/json-editor/BooksProduct/',\r\n description: 'Edit additional properties for phaidon.com that do not appear in books',\r\n action:'Editor',\r\n requiredRoles: ['apiPublish']\r\n },\r\n {\r\n name: 'Non-Books Product Editor',\r\n link: '/json-editor/Product/',\r\n description: 'Edit properties for phaidon.com products that do not live in books',\r\n action:'Editor',\r\n requiredRoles: ['apiPublish']\r\n },\r\n {\r\n name: 'Data Document Editor',\r\n link: '/json-editor/',\r\n description: 'For expert users',\r\n action:'Editor',\r\n requiredRoles: []\r\n },\r\n]\r\n\r\nfunction matchRole(roles: string[], requiredRoles: string[]){\r\n if(requiredRoles.length === 0)\r\n return true\r\n\r\n for(const r of roles){\r\n if (requiredRoles.includes(r))\r\n return true\r\n }\r\n return false\r\n}\r\n\r\nexport function HomeView(){\r\n const navigate = useNavigate();\r\n const [roles, setRoles] = useState([] as string[])\r\n const [nav, setNav] = useState([] as NavConfig[])\r\n\r\n useEffect( () => {\r\n (async ()=>{\r\n const roles = await getRoles();\r\n console.log('roles',roles)\r\n setRoles(roles)\r\n })()\r\n }, []);\r\n\r\n useEffect(()=>{\r\n setNav(links.filter(i => matchRole(roles, i.requiredRoles)))\r\n }, [roles])\r\n\r\n if (nav.length === 0) {\r\n return <>\r\n \r\n \r\n \r\n \r\n You don't appear to have access to any options.\r\n
Please contact support for more information.\r\n
\r\n
\r\n
\r\n \r\n }\r\n\r\n return <>\r\n \r\n \r\n {\r\n nav.map(i => \r\n \r\n \r\n {i.name}\r\n \r\n \r\n {i.description}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n \r\n \r\n}","import dayjs from 'dayjs'\r\nimport * as localizedFormat from 'dayjs/plugin/localizedFormat'\r\nimport * as relativeTime from 'dayjs/plugin/relativeTime'\r\ndayjs.extend(localizedFormat as any)\r\ndayjs.extend(relativeTime as any)\r\n\r\nexport default dayjs","import ReactFlow, {Handle, Position, ReactFlowProvider, useNodes} from 'react-flow-renderer';\r\nimport {useMemo, useState} from 'react';\r\nimport classes from \"./ServerBackend.module.scss\";\r\n\r\nimport create from \"zustand\";\r\nimport {Node} from \"react-flow-renderer/dist/esm/types/nodes\";\r\nimport {Edge} from \"react-flow-renderer/dist/esm/types\";\r\nimport {Skeleton} from \"@material-ui/lab\";\r\nimport dayjs from \"dayjs\";\r\n\r\nconst nodeOptions = {\r\n draggable: false,\r\n selectable: false\r\n}\r\nconst edgeOptions = {\r\n animated: true,\r\n style: {\r\n stroke: 'black',\r\n },\r\n};\r\n\r\nexport interface BackendNodeData {\r\n label:string\r\n hash:string|null\r\n date?:string|null\r\n}\r\nexport interface WebserverNodeData {\r\n label:string\r\n url:string\r\n linkWords: string\r\n}\r\nexport interface DiagStore {\r\n nodes: (Node | Node)[],\r\n edges: Edge[],\r\n connectedTo: (source: string, targets: string[]) => void,\r\n setHashData: (hashData: {PinkQuick: string, ArticlesPink: string, QuickOrange: string, ArticlesOrange: string}) => void,\r\n}\r\n\r\nlet id=1000;\r\nfunction nextId(){\r\n return `auto-${++id}`\r\n}\r\nexport const diagramStore = create((set, get) => ({\r\n nodes: [\r\n {...{ type: 'server', id: 'production', data: {label:'Production', url: 'https://www.phaidon.com', linkWords:'www.phaidon.com', connection: Position.Left}, position: {x:320, y:40}}, ...nodeOptions},\r\n {...{ type: 'server', id: 'staging', data: {label:'Staging', url: 'https://staging.phaidon.com', linkWords:'staging.phaidon.com', connection: Position.Right}, position: {x:320, y:120}}, ...nodeOptions},\r\n {...{ type: 'backend', id: 'OrangeQuick', data: {hash: null, label:'Orange', connection: Position.Right}, position: {x:0, y:0}}, ...nodeOptions},\r\n {...{ type: 'backend', id: 'PinkQuick', data: {hash: null, label:'Pink', connection: Position.Left}, position:{x:660, y:0}}, ...nodeOptions},\r\n {...{ type: 'backend', id: 'OrangeArticles', data: {hash: null, label:'Orange Articles', connection: Position.Right}, position: {x:0, y:120}}, ...nodeOptions},\r\n {...{ type: 'backend', id: 'PinkArticles', data: {hash: null, label:'Pink Articles', connection: Position.Left}, position:{x:660, y:120}}, ...nodeOptions},\r\n ],\r\n edges: [\r\n // { id:nextId(), target: 'OrangeQuick', sourceHandle:'production-orange', source: 'production' },\r\n // { id:nextId(), target: 'PinkQuick', sourceHandle:'staging-pink', source: 'staging'},\r\n ],\r\n connectedTo: (source:string, targets: string[]) => {\r\n const edges = [\r\n ...get().edges.filter(i => i.source !== source),\r\n ...targets.map(target => ({id:nextId(), source, target, sourceHandle: `${source}-${target}`}))\r\n ]\r\n set({edges})\r\n },\r\n setHashData: (hashData:{PinkQuick: string, ArticlesPink: string, QuickOrange: string, ArticlesOrange: string}) => {\r\n const nodes = get().nodes as Node[]\r\n for(const n of nodes.filter(i => i.type === 'backend') as Node[]){\r\n const d = (hashData as any)[n.id]\r\n const [hash,data] =(d||\"\\t\").split(\"\\t\") as string[]\r\n n.data.hash = hash\r\n n.data.date = dayjs(data).format('YYYY-MM-DD HH:mm')\r\n }\r\n set({nodes})\r\n }\r\n\r\n}))\r\n\r\n\r\nexport default function ServerBackend() {\r\n const nodeTypes = useMemo(() => ({ backend: Backend, server:Webserver }), []);\r\n const { nodes, edges } = diagramStore();\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\n\r\nfunction Backend(n: any) {\r\n const nodes = useNodes()\r\n const [s, setState ] = useState(n)\r\n\r\n if (s.data.hash !== n.data.hash) {\r\n setState(n)\r\n }\r\n return <>\r\n
\r\n {s.data.label}\r\n
{s.data.hash !== null ? s.data.hash : }\r\n
{s.data.date !== null ? s.data.date : }\r\n
\r\n \r\n \r\n}\r\n\r\nfunction Webserver(n: any) {\r\n const [s, setState] = useState(n)\r\n if (s.data !== n.data) {\r\n setState(s)\r\n }\r\n return <>\r\n
\r\n {s.data.label}\r\n
{s.data.linkWords}\r\n
\r\n \r\n \r\n \r\n \r\n\r\n \r\n}","export const apiKey = '6d0c240f-95cb-4178-9bdd-57e462d6d523'","import React, {useEffect, useRef} from \"react\";\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nimport HtmlDiff from \"htmldiff-js\";\r\nimport create from \"zustand\";\r\nimport {apiKey} from \"../../lib/pages\";\r\nimport classes from \"./diff-styles.module.scss\";\r\nimport {ToolBar} from \"../appBar/views\";\r\nimport {\r\n Badge,\r\n Box,\r\n Container,\r\n Grid,\r\n List,\r\n ListItem,\r\n ListItemText,\r\n Paper,\r\n Tab,\r\n Tabs,\r\n Toolbar,\r\n Typography\r\n} from \"@material-ui/core\";\r\nimport AppBar from \"@material-ui/core/AppBar\";\r\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\r\nimport {FixedSizeList, ListChildComponentProps} from \"react-window\";\r\nimport {useNavigate} from \"react-router-dom\";\r\n\r\ndeclare module 'htmldiff-js'\r\nconst injectStyle = `\r\n\r\n`;\r\nconst previewWaitingHtml = `\r\n\r\n
Select a page from above to preview
\r\n\r\n`\r\ninterface siteDiffStore {\r\n loaded: boolean\r\n selected: string\r\n productionManifest: {[key:string]: string}\r\n stagingManifest: {[key:string]: string}\r\n newPages: string[]\r\n updatedPages: string[]\r\n removedPages: string[]\r\n stagingPage: string|null\r\n productionPage: string|null\r\n listMode:string,\r\n previewMode: string,\r\n diff: string|null,\r\n refresh(): Promise\r\n selectKey(key:string): Promise\r\n updateIframe(): void,\r\n setListMode(m:string):void,\r\n setPreviewMode(m:string):void,\r\n}\r\ninterface TabPanelProps {\r\n children?: React.ReactNode;\r\n index: any;\r\n value: any;\r\n}\r\nfunction TabPanel(props: TabPanelProps) {\r\n const { children, value, index, ...other } = props;\r\n return (\r\n
\r\n );\r\n}\r\n\r\nexport const useDiffStore = create((set, get) => ({\r\n loaded:false,\r\n selected: '',\r\n productionManifest: {},\r\n stagingManifest: {},\r\n newPages: [],\r\n updatedPages: [],\r\n removedPages: [],\r\n stagingPage: null,\r\n productionPage: null,\r\n listMode: 'created',\r\n previewMode: 'created',\r\n diff: null,\r\n async selectKey(key: string) {\r\n const request = await fetch(`https://www.phaidon.com/workers/pages-api/page?apikey=${apiKey}&page=${key}`)\r\n const {productionPage, stagingPage} = await request.json()\r\n let diff, previewMode:string|null = null;\r\n if(productionPage && !stagingPage) {\r\n diff = null\r\n previewMode = 'removed'\r\n }else if (!productionPage && stagingPage) {\r\n diff = null\r\n previewMode = 'created'\r\n }else{\r\n previewMode = 'changed'\r\n\r\n const iframe = document.querySelector('#preview')! as HTMLIFrameElement\r\n if (iframe) {\r\n iframe.src = \"about:blank\";\r\n }\r\n }\r\n set(({selected:key, productionPage, stagingPage, diff, previewMode}))\r\n get().updateIframe()\r\n },\r\n setListMode(m:string):void{\r\n set(({listMode:m, previewMode:m, selected:''}))\r\n get().updateIframe()\r\n },\r\n setPreviewMode(m:string):void{\r\n set(({previewMode:m}))\r\n get().updateIframe()\r\n },\r\n updateIframe(){\r\n const s = get()\r\n const iframe = document.querySelector('#preview')! as HTMLIFrameElement\r\n if (!iframe)\r\n return;\r\n iframe.src = \"about:blank\";\r\n\r\n try {\r\n if (!iframe)\r\n return;\r\n if (s.selected === '') {\r\n iframe.contentWindow!.document.open();\r\n iframe.contentWindow!.document.write(previewWaitingHtml);\r\n iframe.contentWindow!.document.close();\r\n return;\r\n }\r\n switch (s.previewMode) {\r\n case 'created':\r\n iframe.contentWindow!.document.open();\r\n iframe.contentWindow!.document.write((s.stagingPage || '')\r\n .replace('', ''));\r\n iframe.contentWindow!.document.close();\r\n return;\r\n case 'removed':\r\n iframe.contentWindow!.document.open();\r\n iframe.contentWindow!.document.write((s.productionPage || '')\r\n .replace('', ''));\r\n iframe.contentWindow!.document.close();\r\n return;\r\n }\r\n let diff = 'Differences preview failed to build. A page may be broken.'\r\n try {\r\n diff = HtmlDiff.execute(s.productionPage, s.stagingPage) as string\r\n console.log(diff)\r\n } catch (ex) {\r\n diff += 'Error: ' + ex\r\n console.log(s.productionPage?.length, s.stagingPage?.length)\r\n }\r\n\r\n if (!diff)\r\n diff = 'Differences preview failed to build.'\r\n\r\n iframe.contentWindow!.document.open();\r\n iframe.contentWindow!.document.write(diff\r\n .replace('', '')\r\n .replace('', injectStyle + '')\r\n );\r\n iframe.contentWindow!.document.close();\r\n }catch(ex){\r\n if(ex.message.startsWith('Blocked a frame with origin')){\r\n iframe.src = \"about:blank\";\r\n setTimeout(() => {get().updateIframe()}, 100)\r\n return\r\n }\r\n throw new Error(ex)\r\n }\r\n },\r\n async refresh() {\r\n const request = await fetch(`https://www.phaidon.com/workers/pages-api/manifests?apikey=${apiKey}`)\r\n const {productionManifest, stagingManifest} = await request.json()\r\n const newPages = new Set(Object.keys(stagingManifest).filter(i => i.endsWith('/index.html')))\r\n const removedPages = [] as string[]\r\n const updatedPages = [] as string[]\r\n for (const ppk in productionManifest) {\r\n if(!ppk.endsWith('/index.html'))\r\n continue;\r\n if (ppk in stagingManifest) {\r\n newPages.delete(ppk)\r\n if (productionManifest[ppk] !== stagingManifest[ppk]){\r\n updatedPages.push(ppk)\r\n }\r\n } else{\r\n removedPages.push(ppk)\r\n }\r\n }\r\n\r\n (window as any).productionManifest = productionManifest;\r\n (window as any).stagingManifest = stagingManifest;\r\n\r\n set(({\r\n loaded: true,\r\n productionManifest,\r\n stagingManifest,\r\n removedPages,\r\n updatedPages,\r\n newPages: Array.from(newPages),\r\n }))\r\n get().updateIframe()\r\n }\r\n}));\r\n\r\nexport function DiffSummary(){\r\n const state = useDiffStore() as siteDiffStore\r\n\r\n useEffect( () => {\r\n if (!state.loaded) {\r\n console.log('ArticlePublish - init / get data')\r\n state.refresh()\r\n }\r\n }, []);\r\n\r\n return
\r\n New Pages {state.newPages.length},\r\n Changed Pages {state.updatedPages.length},\r\n Removed Pages {state.removedPages.length}\r\n details\r\n
\r\n}\r\n\r\nexport default function DiffSite(){\r\n const [tab, setTab] = React.useState(0);\r\n const state = useDiffStore() as siteDiffStore\r\n const navigate = useNavigate();\r\n\r\n\r\n useEffect( () => {\r\n if (!state.loaded) {\r\n console.log('ArticlePublish - init / get data')\r\n state.refresh()\r\n }\r\n }, []);\r\n\r\n function renderRow(props: ListChildComponentProps) {\r\n const { index, style } = props;\r\n let list = [] as string[];\r\n switch(state.listMode){\r\n case 'created': list = state.newPages; break\r\n case 'changed': list = state.updatedPages; break\r\n case 'removed': list = state.removedPages; break\r\n }\r\n return (\r\n state.selectKey(list[index])}>\r\n \r\n \r\n );\r\n }\r\n\r\n function renderDiffList(diffs: string[]) {\r\n if (diffs.length === 0)\r\n return
\r\n

There are no {state.listMode} pages.

\r\n
\r\n return
\r\n \r\n {renderRow}\r\n \r\n
\r\n }\r\n function a11yProps(index: any) {\r\n return {\r\n id: `simple-tab-${index}`,\r\n 'aria-controls': `simple-tabpanel-${index}`,\r\n };\r\n }\r\n\r\n if (!state.loaded)\r\n return <>\r\n \r\n
\r\n \r\n
\r\n \r\n\r\n function handleListModeSelect(event: React.ChangeEvent<{}>, tabIndex: string){\r\n state.setListMode(tabIndex)\r\n }\r\n\r\n function handlePreviewModeSelect(event: React.ChangeEvent<{}>, tabIndex: string){\r\n state.setPreviewMode(tabIndex)\r\n }\r\n return <>\r\n \r\n \r\n navigate(\"/publish-site\")} />\r\n \r\n \r\n \r\n \r\n\r\n { state.listMode === 'created' ? renderDiffList(state.newPages) : null}\r\n { state.listMode === 'changed' ? renderDiffList(state.updatedPages) : null}\r\n { state.listMode === 'removed' ? renderDiffList(state.removedPages) : null}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n}","import {ToolBar} from \"../appBar/views\";\r\nimport {\r\n Button,\r\n Card,\r\n Chip,\r\n Container,\r\n Grid,\r\n LinearProgress,\r\n Modal,\r\n Paper,\r\n Typography\r\n} from \"@material-ui/core\";\r\nimport classes from \"./publishSite.module.scss\";\r\nimport {Alert, Skeleton} from \"@material-ui/lab\";\r\nimport React, {useEffect} from \"react\";\r\nimport {getRoles} from \"../../lib/apiClient\";\r\nimport create from 'zustand'\r\nimport dayjs from '../../lib/day'\r\nimport ServerBackend, {diagramStore} from \"./ServerBackend\";\r\nimport {Warning} from \"@material-ui/icons\";\r\nimport DiffSite, {DiffSummary, useDiffStore} from \"../diff/DiffSite\";\r\nimport {apiKey} from \"../../lib/pages\";\r\n\r\nlet buildRequestDate: Date|null = null;\r\nlet buildRequestType: string|null = null;\r\n\r\nexport interface BuildStatusResult {\r\n currentBuild: BuildStatus\r\n githubBuilds: GithubBuildSummary[]\r\n}\r\nexport interface BuildStatus {\r\n DATA_HASHES: {PinkQuick: string, ArticlesPink: string, QuickOrange: string, ArticlesOrange: string}\r\n BUILD_REQUESTED: boolean\r\n BUILD_IN_PROGRESS: boolean\r\n BUILD_PAUSE: string\r\n PRODUCTION_BACKENDS: string[]\r\n STAGING_BACKENDS: string[]\r\n}\r\nexport interface GithubBuildSummary {\r\n id: string\r\n name: string\r\n head_branch: string\r\n head_sha: string\r\n event: string\r\n status: string\r\n conclusion: string\r\n updated_at: string\r\n localTime?: string\r\n}\r\ninterface publishStore {\r\n builds: [],\r\n roles: string[],\r\n temp: BuildStatus,\r\n latestQuickBuildStatus: GithubBuildSummary,\r\n latestArticleBuildStatus: GithubBuildSummary,\r\n buildInProgress: boolean,\r\n buildPaused: boolean,\r\n publishedAt: string,\r\n unpauseModal: boolean,\r\n mostRecentSuccessfulBuild: string\r\n mostRecentSuccessfulArticleBuild: string\r\n buildArticles: () => Promise\r\n buildWebsite: () => Promise\r\n getStatus: () => Promise\r\n getRoles: () => Promise\r\n setUnpauseModal(show: boolean): () => void\r\n unpauseBuilds: () => Promise\r\n switchStagingWithProduction: () => Promise\r\n}\r\n\r\nlet getStatusTimeout: NodeJS.Timeout|null = null\r\nfunction resetStatusUpdate(){\r\n if (getStatusTimeout)\r\n clearTimeout(getStatusTimeout)\r\n getStatusTimeout = setTimeout(() => {\r\n (useStore.getState() as publishStore).getStatus();\r\n }, 60000)\r\n}\r\nconst useStore = create((set) => ({\r\n builds: [],\r\n roles: [],\r\n temp: {},\r\n latestQuickBuildStatus: null,\r\n latestArticleBuildStatus: null,\r\n mostRecentSuccessfulBuild: '',\r\n mostRecentSuccessfulArticleBuild: '',\r\n buildRequested: false,\r\n buildInProgress: true,\r\n buildPaused: false,\r\n unpauseModal: false,\r\n getRoles: async () => {\r\n const roles = await getRoles();\r\n set(s => {return {roles}})\r\n },\r\n buildArticles: async () => {\r\n resetStatusUpdate()\r\n set(s => {return {buildRequested:true, buildInProgress:true}})\r\n await fetch(`https://www.phaidon.com/workers/github-api/article-build?apikey=${apiKey}`, {mode: 'cors'})\r\n set(s => ({buildInProgress:true}))\r\n },\r\n buildWebsite: async () => {\r\n resetStatusUpdate()\r\n set(s => {return {buildRequested:true, buildInProgress:true}})\r\n await fetch(`https://www.phaidon.com/workers/github-api/quick-build?apikey=${apiKey}`, {mode: 'cors'})\r\n set(s => ({buildInProgress:true}))\r\n },\r\n unpauseBuilds: async () => {\r\n resetStatusUpdate()\r\n set(s => ({buildInProgress:true, unpauseModal:false}))\r\n await fetch(`https://www.phaidon.com/workers/pages-api/clear-pause-lock?apikey=${apiKey}`, {mode: 'cors'})\r\n set(s => {return {buildPause: false}})\r\n },\r\n switchStagingWithProduction: async () => {\r\n resetStatusUpdate()\r\n set(s => ({buildInProgress:true, buildPause: true}))\r\n await fetch(`https://www.phaidon.com/workers/pages-api/switch-staging-and-production?apikey=${apiKey}`, {mode: 'cors'})\r\n },\r\n getStatus: async () => {\r\n let latestQuickBuildStatus = null as GithubBuildSummary|null\r\n let latestArticleBuildStatus = null as GithubBuildSummary|null\r\n let mostRecentSuccessfulBuild = 'never'\r\n let mostRecentSuccessfulArticleBuild ='never'\r\n let status = [] as GithubBuildSummary[]\r\n let buildRequested = false;\r\n let buildInProgress = true;\r\n let buildPaused = false;\r\n let publishedAt = ''\r\n let temp = {}\r\n try {\r\n\r\n useDiffStore.getState().refresh().catch(i => console.log(`refresh failed.`, i))\r\n const statusReq = await fetch(`https://www.phaidon.com/workers/github-api/build-status?apikey=${apiKey}`, {mode: 'cors'})\r\n if (statusReq.ok) {\r\n const result = await statusReq.json() as BuildStatusResult\r\n\r\n const dStore = diagramStore.getState()\r\n temp = result.currentBuild\r\n dStore.setHashData(result.currentBuild.DATA_HASHES)\r\n dStore.connectedTo('production', result.currentBuild.PRODUCTION_BACKENDS)\r\n dStore.connectedTo('staging', result.currentBuild.STAGING_BACKENDS)\r\n\r\n status = result.githubBuilds\r\n buildRequested = result.currentBuild.BUILD_REQUESTED\r\n buildInProgress = result.currentBuild.BUILD_IN_PROGRESS\r\n buildPaused = !!result.currentBuild.BUILD_PAUSE\r\n if (buildPaused) {\r\n console.log('result.currentBuild.BUILD_PAUSE',result.currentBuild.BUILD_PAUSE, dayjs(result.currentBuild.BUILD_PAUSE))\r\n publishedAt = dayjs(result.currentBuild.BUILD_PAUSE).format('YYYY-MM-DD HH:mm')\r\n }\r\n\r\n const qs = status.filter(i => i.name.indexOf('quick-build') !== -1 && i.conclusion === 'success')[0]\r\n if (qs) {\r\n mostRecentSuccessfulBuild = dayjs(qs.updated_at).fromNow()\r\n }\r\n const as = status.filter(i => i.name.indexOf('article-build') !== -1 && i.conclusion === 'success')[0]\r\n if (as) {\r\n mostRecentSuccessfulArticleBuild = dayjs(as.updated_at).fromNow()\r\n }\r\n console.log(status)\r\n latestQuickBuildStatus = status.filter(i => i.name.indexOf('quick-build') !== -1)[0]\r\n latestArticleBuildStatus = status.filter(i => i.name.indexOf('article-build') !== -1)[0]\r\n\r\n latestQuickBuildStatus.localTime = dayjs(latestQuickBuildStatus.updated_at).format('YYYY-MM-DD HH:mm')\r\n latestArticleBuildStatus.localTime = dayjs(latestArticleBuildStatus.updated_at).format('YYYY-MM-DD HH:mm')\r\n\r\n if (buildRequested && !buildInProgress) {\r\n buildInProgress = true;\r\n }\r\n }\r\n }catch (e){\r\n console.log(e)\r\n }\r\n\r\n set(s => { return {\r\n temp,\r\n mostRecentSuccessfulBuild,\r\n mostRecentSuccessfulArticleBuild,\r\n latestQuickBuildStatus,\r\n latestArticleBuildStatus,\r\n builds: status,\r\n buildInProgress,\r\n buildPaused,\r\n publishedAt\r\n }})\r\n\r\n resetStatusUpdate()\r\n\r\n const r = await fetch('https://www.phaidon.com/workers/github-api/test?apikey=6d0c240f-95cb-4178-9bdd-57e462d6d523')\r\n console.log(await r.json())\r\n },\r\n setUnpauseModal(show: boolean){\r\n set(i => ({unpauseModal:show}))\r\n }\r\n}))\r\n\r\nexport function PublishSite(){\r\n const state = useStore() as publishStore\r\n\r\n useEffect( () => {\r\n console.log('ArticlePublish - init / get data')\r\n // noinspection JSIgnoredPromiseFromCall\r\n state.getStatus()\r\n // noinspection JSIgnoredPromiseFromCall\r\n state.getRoles()\r\n }, []);\r\n\r\n if (state.roles.length === 0)\r\n return <>\r\n \r\n \r\n \r\n Loading...\r\n \r\n \r\n \r\n \r\n\r\n // if (!state.roles.includes('apiBuild'))\r\n // return <>\r\n // \r\n // \r\n // \r\n // You don't appear to have access to this function.\r\n //
Please contact support for more information.\r\n //
\r\n //
\r\n // \r\n\r\n function permissionButton(requiredPermission: string, comp: any){\r\n if(!state.roles.includes(requiredPermission)){\r\n return \r\n }\r\n return comp\r\n }\r\n\r\n function buildButtons(){\r\n return <>\r\n
\r\n \r\n Build Staging Site\r\n \r\n

Building the staging site takes the latest data, builds the site in the cloud and deploys\r\n to staging-ejr4ur.phaidon.com/

\r\n

The build excludes all but the latest 100 articles for speed. If older articles need to be rebuilt\r\n please use the below option.

\r\n

Building takes about 5 - 10 minutes.

\r\n {permissionButton('apiBuild', <>{state.buildInProgress ? :\r\n \r\n })}\r\n
\r\n\r\n
\r\n \r\n Build All Articles\r\n \r\n

Builds the all articles and publish to staging-ejr4ur.phaidon.com/

\r\n

Building can take upto 15 minutes.

\r\n {permissionButton('apiBuild', <>{ state.buildInProgress ? :\r\n \r\n })}\r\n
\r\n \r\n }\r\n\r\n function publishSection() {\r\n return <>\r\n \r\n Publish Staging to Production\r\n \r\n

Once you are happy with staging-ejr4ur.phaidon.com you can publish staging\r\n to the production www.phaidon.com. New builds are suspended for 15min\r\n after a publish to allow rollback if required

\r\n
\r\n \r\n
\r\n {permissionButton('apiPublish', <>{ state.buildInProgress ? :\r\n \r\n })}\r\n \r\n }\r\n\r\n function buildPausedButton(){\r\n return <>\r\n
\r\n \r\n Build Locked\r\n \r\n

The site was recently been published at {state.publishedAt} and new builds are paused in case a rollback is required.\r\n Builds resume automatically 15min after publish\r\n

\r\n {permissionButton('apiPublish', <>\r\n { state.buildInProgress ? :}\r\n { state.buildInProgress ? <> :}\r\n )}\r\n
\r\n state.setUnpauseModal(false)}\r\n aria-labelledby=\"unpauseModal-modal-title\"\r\n aria-describedby=\"unpauseModal-modal-description\"\r\n >\r\n \r\n \r\n

Un-Lock Builds

\r\n

It should not be necessary to unlock builds manually,
\r\n and will remove the ability to undo publishing actions.

\r\n

Are you sure you want to continue?

\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n }\r\n\r\n return <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n Build Status\r\n \r\n {getBuildStatus('Latest Build', state.latestQuickBuildStatus)}\r\n {getBuildStatus('Article Build', state.latestArticleBuildStatus)}\r\n\r\n \r\n \r\n
\r\n \r\n
\r\n\r\n\r\n
\r\n
Last successful quick build: {state.mostRecentSuccessfulBuild || }
\r\n
Last successful all article build: {state.mostRecentSuccessfulArticleBuild || }
\r\n
\r\n\r\n {state.buildPaused ? buildPausedButton() : buildButtons() }\r\n {state.buildPaused ?
:\r\n
\r\n {publishSection()}\r\n
\r\n }\r\n \r\n \r\n \r\n \r\n \r\n
\r\n

Recent Builds

\r\n \r\n \r\n {state.builds.map(getBuildTag)}\r\n \r\n
\r\n
\r\n
\r\n \r\n}\r\n\r\nfunction conclusion(i: GithubBuildSummary){\r\n\r\n switch(i.conclusion) {\r\n case 'success': return \r\n case 'action_required': return \r\n case 'cancelled': return \r\n case 'failure': return \r\n case 'neutral': return \r\n case 'skipped': return \r\n case 'stale': return \r\n case 'timed_out': return \r\n case 'in_progress': return \r\n default:\r\n if (i.status === 'in_progress')\r\n return \r\n return \r\n }\r\n}\r\nfunction getBuildStatus(title: string, i: GithubBuildSummary) {\r\n if (i == null)\r\n return
\r\n {title}\r\n \r\n \r\n
\r\n\r\n return
\r\n
{title} {conclusion(i)}
\r\n
{i.localTime}
\r\n
\r\n}\r\nfunction getBuildTag(i: GithubBuildSummary){\r\n i.localTime = dayjs(i.updated_at).format('YYYY-MM-DD HH:mm')\r\n return \r\n {conclusion(i)}\r\n {i.localTime}\r\n {i.name.indexOf('full-article') !== -1 ? 'Article Build' : 'Quick Build'}\r\n {/*{i.event == 'push' ? 'Data Trigger' : 'Manual Trigger'}*/}\r\n \r\n\r\n}","import {get, post} from '../../lib/apiClient'\r\n\r\nexport interface EditorDocument {\r\n readonly: boolean\r\n keyPath?: string\r\n uri: string\r\n json: string\r\n jsonSchema: string\r\n jsonUiSchema: string\r\n}\r\n\r\nexport interface SaveResponse {\r\n success: boolean\r\n serverRendition: string\r\n errors: JsonValidationError[]\r\n documentClass?: string,\r\n documentId?: string\r\n}\r\n\r\nexport interface JsonValidationError {\r\n kind: string\r\n path: string\r\n property: string\r\n lineNumber: number\r\n linePosition: number\r\n hasLineInfo: boolean\r\n}\r\n\r\nexport async function getDocument({documentClass, documentId}: {documentClass: string, documentId: string}): Promise {\r\n return get(`json-documents/${documentClass}/${documentId}`)\r\n}\r\n\r\nexport async function getEmpty({documentClass}: {documentClass: string}): Promise{\r\n return get(`json-documents/schema/${documentClass}`)\r\n}\r\n\r\nexport async function postDocument({documentClass, documentId, formData}: {documentClass: string, documentId: string, formData: any}): Promise {\r\n console.log('postDocument')\r\n return Object.assign(\r\n {documentClass, documentId, },\r\n await post(`json-documents/${documentClass}/${documentId}`,\r\n JSON.stringify(formData, null, 2)));\r\n}\r\n","import {createAsyncThunk, createSlice, PayloadAction} from '@reduxjs/toolkit';\r\nimport { RootState } from '../../app/store';\r\nimport {getDocument, getEmpty, postDocument} from './editorAPI'\r\n\r\nexport interface EditorState {\r\n readonly: boolean\r\n uri: string\r\n json: any\r\n jsonSchema: any\r\n jsonUiSchema: any\r\n keyPath: string | null,\r\n status: 'init' | 'loading' | 'ready' | 'saving' | 'error'\r\n errorMessage: string,\r\n dirtyState: any\r\n}\r\n\r\nconst initialState: EditorState = {\r\n readonly: true,\r\n uri: '',\r\n keyPath: null,\r\n json: null,\r\n jsonSchema: null,\r\n jsonUiSchema: null,\r\n status: 'init',\r\n errorMessage: '',\r\n dirtyState: null\r\n}\r\n\r\nexport const refreshAsync = createAsyncThunk('editor/refresh', getDocument);\r\nexport const getEmptyAsync = createAsyncThunk('editor/getEmptyAsync', getEmpty);\r\nexport const saveAsync = createAsyncThunk('editor/save', postDocument);\r\n\r\nexport const editorSlice = createSlice({\r\n name: 'editor',\r\n initialState,\r\n // The `reducers` field lets us define reducers and generate associated actions\r\n reducers: {\r\n setJson: (state, action: PayloadAction) => {\r\n state.json = action.payload\r\n },\r\n setDirtyState: (state, action:PayloadAction) => {\r\n state.dirtyState = action.payload.formData\r\n }\r\n },\r\n // The `extraReducers` field lets the slice handle actions defined elsewhere,\r\n // including actions generated by createAsyncThunk or in other slices.\r\n extraReducers: (builder) => {\r\n builder\r\n .addCase(refreshAsync.pending, (state) => {\r\n state.readonly = true;\r\n state.status = 'loading';\r\n })\r\n .addCase(refreshAsync.rejected, (state, action) => {\r\n state.readonly = true;\r\n state.status = 'error';\r\n state.errorMessage = action.error.message ?? 'ERROR!'\r\n })\r\n .addCase(refreshAsync.fulfilled, (state, action) => {\r\n state.status = 'ready';\r\n state.dirtyState = null;\r\n state.readonly = action.payload.readonly;\r\n state.uri = action.payload.uri;\r\n if (action.payload.json)\r\n state.json = JSON.parse(action.payload.json);\r\n\r\n if (action.payload.jsonSchema)\r\n state.jsonSchema = JSON.parse(action.payload.jsonSchema);\r\n\r\n if (action.payload.jsonUiSchema)\r\n state.jsonUiSchema = JSON.parse(action.payload.jsonUiSchema);\r\n })\r\n .addCase(saveAsync.pending, (state) => {\r\n state.readonly = true;\r\n state.status = 'saving';\r\n })\r\n .addCase(saveAsync.fulfilled, (state, action) => {\r\n if (action.payload.success) {\r\n state.readonly = false;\r\n state.dirtyState = null;\r\n state.status = 'ready';\r\n state.json = JSON.parse(action.payload.serverRendition)\r\n const uri = `/json-editor/${action.payload.documentClass}/${action.payload.documentId}`\r\n if (window.location.href !== uri)\r\n window.location.replace(uri)\r\n } else {\r\n state.status = 'error';\r\n state.readonly = false;\r\n state.errorMessage = 'Validation Errors: \\n' + action.payload.errors.map(e => {\r\n if (e.hasLineInfo) {\r\n return ` error: ${e.kind} @ ${e.path} line: ${e.lineNumber} position:${e.linePosition}`\r\n }else {\r\n return ` error: ${e.kind} @ ${e.path} `\r\n }\r\n }).join('\\n')\r\n }\r\n })\r\n .addCase(saveAsync.rejected, (state, action) => {\r\n state.readonly = true;\r\n state.status = 'error';\r\n state.errorMessage = action.error.message ?? 'ERROR!'\r\n })\r\n .addCase(getEmptyAsync.pending, (s) => {\r\n s.status = 'loading'\r\n s.readonly = true\r\n })\r\n .addCase(getEmptyAsync.fulfilled, (state, action) => {\r\n console.log('getEmptyAsync.fulfilled', action)\r\n state.status = 'ready';\r\n state.readonly = action.payload.readonly;\r\n state.uri = action.payload.uri;\r\n if (action.payload.json)\r\n state.json = JSON.parse(action.payload.json);\r\n else\r\n state.json = action.payload.json;\r\n\r\n if (action.payload.jsonSchema)\r\n state.jsonSchema = JSON.parse(action.payload.jsonSchema);\r\n else\r\n state.jsonSchema = action.payload.jsonSchema\r\n\r\n if (action.payload.jsonUiSchema)\r\n state.jsonUiSchema = JSON.parse(action.payload.jsonUiSchema);\r\n else\r\n state.jsonUiSchema = action.payload.jsonUiSchema;\r\n\r\n state.keyPath = action.payload.keyPath ?? null;\r\n })\r\n .addCase(getEmptyAsync.rejected, (state, action, ) =>{\r\n state.status = 'error'\r\n state.errorMessage = action.error.message ?? 'ERROR!'\r\n })\r\n }\r\n});\r\n\r\nexport const {setJson} = editorSlice.actions\r\nexport const selectEditor = (state: RootState) => state.editor;\r\nexport default editorSlice.reducer;\r\n","import {useAppDispatch, useAppSelector} from \"../../app/hooks\";\r\nimport {refreshAsync, selectEditor} from \"./editorSlice\";\r\nimport React, {useEffect, useState} from \"react\";\r\nimport {useNavigate, useParams} from \"react-router-dom\";\r\nimport {ToolBar} from \"../appBar/views\";\r\nimport {Button, IconButton} from \"@material-ui/core\";\r\nimport {ArrowBack} from \"@material-ui/icons\";\r\nimport JSONPretty from \"react-json-pretty\";\r\nimport {Alert} from \"@material-ui/lab\";\r\n\r\nexport function JsonView() {\r\n const e = useAppSelector(selectEditor)\r\n const dispatch = useAppDispatch();\r\n const [status, setStatus] = useState(e.status)\r\n const [errorMessage, setErrorMessage] = useState(e.errorMessage)\r\n const params = useParams();\r\n const {documentClass, documentId} = params;\r\n const navigate = useNavigate();\r\n useEffect(() => {\r\n if (documentClass && documentId) {\r\n dispatch(refreshAsync({documentClass, documentId}));\r\n }\r\n }, [dispatch, documentClass, documentId])\r\n\r\n useEffect(() => {\r\n setStatus(e.status)\r\n setErrorMessage(e.errorMessage)\r\n }, [e.status, e.errorMessage])\r\n\r\n const themes = {\r\n main: 'line-height:1.3;color:#666666;background:#fff;overflow:auto;white-space:pre-wrap;max-width:100vw',\r\n error: 'line-height:1.3;color:#66d9ef;background:#272822;overflow:auto;',\r\n key: 'color:#333;',\r\n string: 'color:#999;',\r\n value: 'color:#a6e22e;filter: brightness(80%)',\r\n boolean: 'color:#ac81fe;filter: brightness(80%)',\r\n }\r\n return <>\r\n \r\n navigate('/json-editor/' + documentClass)}\r\n >\r\n \r\n \r\n \r\n \r\n {status}: {errorMessage}\r\n \r\n}","import DOMPurify from 'dompurify'\r\nimport {marked, Renderer} from 'marked'\r\nconst baseUri = localStorage?.api || 'https://data.phaidon.com'\r\n\r\nmarked.setOptions({\r\n baseUrl: 'https://www.phaidon.com/',\r\n renderer: new Renderer(),\r\n pedantic: false,\r\n gfm: true,\r\n breaks: false,\r\n sanitize: false,\r\n smartLists: true,\r\n smartypants: false,\r\n xhtml: false\r\n});\r\n\r\nconst rootImageRegex = /src=['\"](.*?)['\"]/g\r\n\r\nfunction rep(match:any, p1:string, offset:number, source:string){\r\n if (p1.startsWith('http:') || p1.startsWith('https:'))\r\n return match\r\n return `src=\"https://www.phaidon.com/${p1}\"`\r\n}\r\n\r\n\r\nexport const demonstrationTemplate = `\r\n
\r\n
DEMONSTRATION WRAPPER - HEADER
\r\n $content\r\n
DEMONSTRATION WRAPPER - FOOTER
\r\n
\r\n`\r\n\r\nexport function previewRendererFactory(template: string){\r\n if (template && template.indexOf('$content$') === -1)\r\n throw new Error('previewRendererFactory: template must be a string and contain $content where markdown will be rendered')\r\n\r\n return (plainText: string) =>\r\n {\r\n const replacedImageAssets = plainText\r\n //.replace(/(\\/image-assets\\/[0-9A-Fa-f]{32}\\?)/g, baseUri + '$1width=300&')\r\n .replace(/\\/image-assets\\/[0-9A-Fa-f]{32}\\?path=([^)]+)\\)/g, `https://www.phaidon.com$1)`)\r\n const html = DOMPurify\r\n .sanitize(marked.parse(replacedImageAssets, {baseUrl: 'https://www.phaidon.com/'}));\r\n return template.replace('$content$', html.replace(rootImageRegex, rep))\r\n }\r\n}\r\n","import {get} from '../../lib/apiClient'\r\n\r\nexport interface Asset {\r\n filename: string\r\n alt: string\r\n md5: string\r\n isbn: string\r\n publish: boolean\r\n}\r\n\r\nexport async function getAssets(isbn: string): Promise {\r\n if (!isbn)\r\n return []\r\n return get(`query/EditionPublishedAssetsByIsbn?isbn=${isbn}`)\r\n}\r\n//9781838666040","import {createAsyncThunk, createSlice } from '@reduxjs/toolkit';\r\nimport { RootState } from '../../app/store';\r\nimport {getAssets} from \"./editionImagePickerApi\";\r\n\r\nexport interface EditionImagePickerState {\r\n status: 'init' | 'loading' | 'ready' | 'saving' | 'error'\r\n isbn: string | null,\r\n errorMessage: string\r\n assets: any[]\r\n}\r\n\r\nconst initialState: EditionImagePickerState = {\r\n status: 'init',\r\n isbn: null,\r\n assets: [],\r\n errorMessage: ''\r\n}\r\n\r\nexport const getAssetsAsync = createAsyncThunk('editionImagePickerSlice/getAssetsAsync', getAssets);\r\n\r\nexport const editionImagePickerSlice = createSlice({\r\n name: 'editionImagePicker',\r\n initialState,\r\n reducers: {\r\n },\r\n extraReducers: (builder) => {\r\n builder\r\n .addCase(getAssetsAsync.pending, (state) => {\r\n state.status = 'loading';\r\n })\r\n .addCase(getAssetsAsync.rejected, (state, action) => {\r\n state.status = 'error';\r\n state.errorMessage = action.error.message ?? 'ERROR!'\r\n })\r\n .addCase(getAssetsAsync.fulfilled, (state, action) => {\r\n state.status = 'ready';\r\n state.assets = action.payload\r\n })\r\n },\r\n});\r\n\r\n\r\nexport const selectEditionPicker = (state: RootState) => state.editionImagePicker;\r\nexport default editionImagePickerSlice.reducer;\r\n","import {\r\n Box,\r\n Button, createStyles,\r\n Dialog,\r\n Grid,\r\n LinearProgress, Link,\r\n makeStyles,\r\n Paper, Theme,\r\n Typography\r\n} from '@material-ui/core'\r\nimport React, {useEffect, useState} from \"react\";\r\nimport {EditionPicker} from \"../editionPicker/editionPicker\";\r\nimport {selectEditionPicker, getAssetsAsync} from \"./editionImagePicker.Slice\";\r\nimport {useAppDispatch, useAppSelector} from \"../../app/hooks\";\r\nimport styles from \"../editionPicker/editionPicker.module.scss\";\r\nimport Alert from \"@material-ui/lab/Alert/Alert\";\r\nimport {EditionSummary} from \"../editionPicker/editionPickerApi\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n fiftySquare: {\r\n width: '90px',\r\n height: '90px',\r\n },\r\n }),\r\n);\r\n\r\nexport function EditionImagePickerDialog(props: any) {\r\n const { onClose, selectedValue, open, isbn: propsIsbn } = props;\r\n const e = useAppSelector(selectEditionPicker)\r\n const [isbn, setIsbn] = useState(propsIsbn)\r\n const dispatch = useAppDispatch();\r\n const builtStyles = useStyles()\r\n\r\n const handleClose = () => {\r\n onClose(selectedValue);\r\n };\r\n const imageSelected = (value: string) => {\r\n onClose(value);\r\n };\r\n\r\n useEffect(() => {\r\n dispatch(getAssetsAsync(isbn))\r\n }, [isbn, dispatch])\r\n useEffect(() => {\r\n setIsbn(propsIsbn)\r\n }, [propsIsbn])\r\n\r\n\r\n const renderLoading = () => {\r\n if(e.status === 'loading') {\r\n return \r\n }\r\n return
\r\n }\r\n const renderAlert = () => {\r\n if (e.status === 'error')\r\n return {e.errorMessage}\r\n return <>\r\n }\r\n return (\r\n \r\n {renderLoading()}\r\n {renderAlert()}\r\n \r\n \r\n {\r\n if (e && e.isbn) {\r\n setIsbn(e.isbn)\r\n dispatch(getAssetsAsync(e.isbn))\r\n console.log(`isbn set and dispatched getAssetsAsync`)\r\n }else{\r\n console.log(`EditionPicker returned without edition`)\r\n }\r\n }} />\r\n \r\n\r\n {groupBy('type', e.assets).map(group =>\r\n \r\n {group[0].type}\r\n \r\n {group.map((i:any) => \r\n imageSelected(i)}>\r\n {i.alt}\r\n \r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n {isbn && \r\n You can only select published assets. To publish more click here. (Opens a new tab)\r\n \r\n }\r\n \r\n );\r\n}\r\n//.filter((i:any) => i.published === 'True')\r\n\r\nexport function EditionImagePickerButton() {\r\n const [open, setOpen] = React.useState(false);\r\n const [selectedValue, setSelectedValue] = React.useState('notimportant');\r\n\r\n const handleClickOpen = () => {\r\n setOpen(true);\r\n };\r\n\r\n const handleClose = (value: string) => {\r\n setOpen(false);\r\n setSelectedValue(value);\r\n console.log('selected image:', value)\r\n };\r\n\r\n return (\r\n <>\r\n \r\n
\r\n \r\n \r\n );\r\n}\r\n\r\n\r\nfunction groupBy(property: string, array: any[]){\r\n const ret = {} as {[key: string]: any}\r\n for (const i of array){\r\n if (!(i[property] in ret)){\r\n ret[i[property]] = [] as any[]\r\n }\r\n ret[i[property]].push(i)\r\n }\r\n return Object.values(ret);\r\n}\r\n","import { createSlice, PayloadAction} from '@reduxjs/toolkit';\r\nimport { RootState } from '../../app/store';\r\n\r\nexport interface FormState {\r\n changedState: any\r\n}\r\nconst initialState: FormState = {\r\n changedState: null\r\n}\r\nexport const formStateSlice = createSlice({\r\n name: 'formState',\r\n initialState,\r\n reducers: {\r\n setDirtyState: (state, action:PayloadAction) => {\r\n console.log('FORM STATE SET')\r\n state.changedState = action.payload\r\n\r\n }\r\n }\r\n});\r\n\r\nexport const {setDirtyState} = formStateSlice.actions\r\nexport const selectFormState = (state: RootState) => state.formState;\r\nexport default formStateSlice.reducer;\r\n","import SimpleMdeReact from \"react-simplemde-editor\";\r\nimport React, {useEffect, useReducer, Dispatch} from \"react\";\r\nimport {previewRendererFactory} from \"../markdown\";\r\nimport {Options} from \"easymde\";\r\nimport {EditionImagePickerDialog} from \"../../editionImagePicker/editionImagePicker\";\r\nimport {Asset} from \"../../editionImagePicker/editionImagePickerApi\";\r\nimport {useAppSelector} from \"../../../app/hooks\";\r\nimport {selectFormState} from \"../formState.Slice\";\r\nimport {Action} from \"@reduxjs/toolkit\";\r\n\r\ninterface PhaidonArticleBodyMarkdownEditorState{\r\n value: any\r\n onChange: (avlue:any) => void\r\n documentId: string|null\r\n title: string|null\r\n titleImage: string|null\r\n titleDescription: string|null\r\n titleImageDescription: string|null\r\n sku: string|null\r\n template: string\r\n mdeOptions: Options\r\n pickerOpen: boolean\r\n lineAndCursor: any|null\r\n codemirrorInstance: any|null\r\n}\r\ninterface ScopeAction extends Action{\r\n name: string\r\n type: 'scopeAction'\r\n mutate(state: T): T\r\n}\r\ninterface ImageSelectedAction extends Action{\r\n type:'imageSelected'\r\n asset:Asset\r\n}\r\ninterface UpdateTextAction extends Action{\r\n type:'updateText'\r\n name: string\r\n value:string\r\n}\r\ninterface ValueChangedAction extends Action{\r\n type:'valueChanged'\r\n value:string\r\n}\r\n\r\nconst newArticleTemplate = `
You are creating a new Article - You must save the article to get full preview experience.


$content$`\r\nconst templateBase = `\r\n\r\n
\r\n
\r\n
\r\n
\r\n \"$titleImageDescription$\"\r\n
$titleImageDescription$
\r\n
\r\n
\r\n\r\n

$title$

\r\n

$titleDescription$

\r\n $content$\r\n
\r\n`\r\nconst defaultMdeOptions = {\r\n previewRender: previewRendererFactory(`$content$`),\r\n spellChecker: false,\r\n nativeSpellcheck: true,\r\n toolbar: [\"bold\", \"italic\", \"heading\", \"unordered-list\", \"ordered-list\", \"clean-block\",\r\n \"|\", \"horizontal-rule\", \"link\", {\r\n name: \"insertimage\",\r\n action: () => {\r\n console.log('insertimage invoked')\r\n dispatchMarkdown(mutate('opne picker', i => i.pickerOpen = true))\r\n },\r\n className: \"fa fa-file-image-o\",\r\n title: \"Insert Image\",\r\n }, // \"image\",\r\n \"|\", \"preview\", \"side-by-side\", \"fullscreen\", \"|\", \"guide\",\r\n ]\r\n} as Options\r\nlet dispatchMarkdown: Dispatch = () => {}\r\n\r\nfunction setupTemplate(state: PhaidonArticleBodyMarkdownEditorState){\r\n console.warn('setupTemplate: callback', state)\r\n try {\r\n const tImage = state.titleImage!.replace(/\\/image-assets\\/[0-9A-Fa-f]{32}\\?path=([^)]+)/g, 'https://www.phaidon.com$1');\r\n const customTemplate = templateBase\r\n .replaceAll('$titleImage$', tImage.startsWith('http') ? tImage : `https://www.phaidon.com/${tImage.replace(/^\\/*/, '')}`)\r\n .replaceAll('$titleImageDescription$', state.titleImageDescription!)\r\n .replaceAll('$titleDescription$', state.titleDescription!)\r\n .replaceAll('$title$', state.title!)\r\n state.template = customTemplate\r\n }catch{}\r\n\r\n state.mdeOptions = {\r\n previewRender: previewRendererFactory(state.template),\r\n spellChecker: false,\r\n nativeSpellcheck: true,\r\n inputStyle: 'contenteditable',\r\n toolbar: [\"bold\", \"italic\", \"heading\", \"unordered-list\", \"ordered-list\", \"clean-block\",\r\n \"|\", \"horizontal-rule\", \"link\", {\r\n name: \"insertimage\",\r\n action: () => {\r\n console.log('insertimage invoked')\r\n dispatchMarkdown(mutate('opne picker', i => i.pickerOpen = true))\r\n },\r\n className: \"fa fa-file-image-o\",\r\n title: \"Insert Image\",\r\n }, // \"image\",\r\n \"|\", \"preview\", \"side-by-side\", \"fullscreen\", \"|\", \"guide\",\r\n ]\r\n }\r\n}\r\nfunction mutate(name:string, lamda: (state:PhaidonArticleBodyMarkdownEditorState) => void): ScopeAction {\r\n return {\r\n name,\r\n type: 'scopeAction',\r\n mutate: (state:any) => {\r\n const newState = Object.assign({}, state)\r\n lamda(newState)\r\n for(const key in newState)\r\n if(newState[key] !== state[key])\r\n return newState\r\n return state\r\n }\r\n }\r\n}\r\nfunction phaidonArticleBodyMarkdownEditorReducer(state: PhaidonArticleBodyMarkdownEditorState, action: Action) {\r\n // const oldState = Object.freeze(state)\r\n // console.log('phaidonArticleBodyMarkdownEditorReducer', action)\r\n //console.log('ACTION 45',state,action)\r\n switch (action.type) {\r\n case 'scopeAction':\r\n state = (action as ScopeAction).mutate(state)\r\n break;\r\n case 'imageSelected':\r\n console.log('imageSelected', action)\r\n const ns = Object.assign({}, state, )\r\n const asset = (action as ImageSelectedAction).asset\r\n if (state.value && state.codemirrorInstance && asset) {\r\n const startPoint = Object.assign({}, ns.codemirrorInstance.getCursor('start'))\r\n const endPoint = Object.assign({}, ns.codemirrorInstance.getCursor('end'))\r\n const text = ns.codemirrorInstance.getLine(startPoint.line);\r\n const start = text.slice(0, startPoint.ch);\r\n const end = text.slice(startPoint.ch);\r\n ns.codemirrorInstance.replaceRange(`${start} ![${asset.alt || state.title || ''}](/image-assets/${asset.md5}?path=/images/${asset.isbn}/a/${asset.filename}) ${end}`, {line: startPoint.line, ch: 0,});\r\n ns.codemirrorInstance.setSelection(startPoint, endPoint);\r\n ns.codemirrorInstance.focus();\r\n }\r\n state = ns\r\n setTimeout(() => {dispatchMarkdown(mutate('close picker', i => i.pickerOpen = false))}, 1)\r\n break\r\n case 'updateText':\r\n const a = action as UpdateTextAction\r\n const s = state as any\r\n //console.log(`UPDATE 45: name: ${a.name} new:${a.value} old:${s[a.name]}`)\r\n if (s[a.name] !== a.value){\r\n const n = {} as any\r\n n[a.name] = a.value\r\n state = {...state, ...n}\r\n setupTemplate(state)\r\n }\r\n break\r\n case 'valueChanged':\r\n\r\n const uta = action as UpdateTextAction\r\n state.onChange(uta.value)\r\n // if (uta.value !== state.value) {\r\n // state = Object.assign({}, state, {value: uta.value})\r\n // setTimeout(() => {state.onChange(uta.value)}, 1)\r\n // }\r\n break\r\n }\r\n // if(state !== oldState)\r\n // console.log('phaidonArticleBodyMarkdownEditorReducer complete, state changed?', state !== oldState, action, state)\r\n return state\r\n}\r\n\r\nlet codemirrorRefreshed = false\r\nexport function PhaidonArticleBodyMarkdownEditor(props: any) {\r\n const e = useAppSelector(selectFormState)\r\n const [state, localDispatch] = useReducer(phaidonArticleBodyMarkdownEditorReducer, {\r\n initialized: false,\r\n value: props.value,\r\n onChange: props.onChange,\r\n documentId: props?.formContext?.documentId,\r\n title: props?.formContext?.json?.title,\r\n titleImage: props?.formContext?.json?.titleImage,\r\n titleDescription: props?.formContext?.json?.titleDescription,\r\n titleImageDescription: props?.formContext?.json?.titleImageDescription,\r\n sku: null,\r\n template: newArticleTemplate,\r\n mdeOptions: defaultMdeOptions,\r\n pickerOpen: false,\r\n lineAndCursor: null,\r\n codemirrorInstance: null,\r\n } as PhaidonArticleBodyMarkdownEditorState)\r\n\r\n dispatchMarkdown = localDispatch\r\n useEffect(() => {\r\n //console.log('EFFECT 45', e)\r\n\r\n if (e?.changedState?.formData?.title || e?.changedState?.title)\r\n localDispatch({type: 'updateText', name: 'title', value: e?.changedState?.title || e?.changedState?.formData?.title} as UpdateTextAction)\r\n\r\n if (e?.changedState?.formData?.titleDescription || e?.changedState?.titleDescription)\r\n localDispatch({type: 'updateText', name: 'titleDescription', value:e?.changedState?.titleDescription || e?.changedState?.formData?.titleDescription} as UpdateTextAction)\r\n\r\n if (e?.changedState?.formData?.titleImage || e?.changedState?.titleImage)\r\n localDispatch({type: 'updateText', name: 'titleImage', value: e?.changedState?.titleImage || e?.changedState?.formData?.titleImage} as UpdateTextAction)\r\n\r\n if (e?.changedState?.formData?.titleImageDescription || e?.changedState?.titleImageDescription)\r\n localDispatch({type: 'updateText', name: 'titleImageDescription', value: e?.changedState?.titleImageDescription || e?.changedState?.formData?.titleImageDescription} as UpdateTextAction)\r\n\r\n if (e?.changedState?.formData?.relatedSku || e?.changedState?.relatedSku)\r\n localDispatch({type: 'updateText', name: 'sku', value: e?.changedState?.relatedSku || e?.changedState?.formData?.relatedSku} as UpdateTextAction)\r\n }, [e.changedState])\r\n\r\n useEffect(() => localDispatch(mutate('props changed',i=>i.value = props.value)), [props.value])\r\n\r\n useEffect(() => {\r\n if (!state.codemirrorInstance)\r\n return\r\n if(codemirrorRefreshed)\r\n return\r\n codemirrorRefreshed = true\r\n setupTemplate(state)\r\n }, [state.codemirrorInstance])\r\n\r\n return <> localDispatch({type: 'valueChanged', value} as ValueChangedAction)}\r\n options={state.mdeOptions}\r\n getCodemirrorInstance={(i) => localDispatch(mutate('setCodeMirror',j => j.codemirrorInstance = i))}\r\n //getLineAndCursor={(i) => localDispatch(mutate('setLineAndCursor',j => j.lineAndCursor = i))}\r\n />\r\n localDispatch({type: 'imageSelected', asset} as ImageSelectedAction)}\r\n isbn={state.sku} />\r\n \r\n}\r\n","import {Button, Container, createStyles, makeStyles, TextField, Theme} from \"@material-ui/core\";\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport {useEffect} from \"react\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n noPadding:{\r\n padding:0,\r\n margin:0\r\n },\r\n text: {\r\n margin: 0,\r\n width: '100%'\r\n },\r\n }),\r\n);\r\n\r\nexport function GuidWidget(props: any) {\r\n const {value: guid, onChange: setGuid, rawErrors, id, label} = props;\r\n const classes = useStyles();\r\n function renderGenerate() {\r\n if (!guid)\r\n return \r\n else\r\n return <> //\r\n }\r\n\r\n useEffect(() => {\r\n if(!guid) {\r\n setGuid(uuidv4().toUpperCase())\r\n }\r\n }, [guid, setGuid])\r\n\r\n return \r\n {guid && }\r\n {!guid && renderGenerate()}\r\n \r\n\r\n\r\n}\r\n\r\n\r\n","import {EditionPicker} from \"../../editionPicker/editionPicker\";\r\nimport {EditionSummary} from \"../../editionPicker/editionPickerApi\";\r\nimport {useEffect, useState} from \"react\";\r\n\r\nlet idx= 0\r\nexport function EditionPickerWidget(props: any) {\r\n const {value, onChange, label} = props;\r\n const [isbn, setIsbn] = useState(value)\r\n useEffect(()=> {\r\n //console.log(`EditionPickerWidget[${label}] props.value`, [value], idx++)\r\n setIsbn(value)\r\n }, [value])\r\n\r\n const change = (e:EditionSummary) => {\r\n console.log(`EditionPickerWidget[${label}] change`, e, value, idx++);\r\n const _isbn = e ? e.isbn : null\r\n if (_isbn !== isbn) {\r\n onChange(_isbn)\r\n // setIsbn(_isbn)\r\n }\r\n }\r\n return <>\r\n \r\n \r\n\r\n}\r\n\r\n\r\n\r\n","import {Button, Container, createStyles, makeStyles, TextField, Theme} from \"@material-ui/core\";\r\nimport React, {useCallback, useState} from \"react\";\r\nimport {EditionImagePickerDialog} from \"../../editionImagePicker/editionImagePicker\";\r\nimport {Asset} from \"../../editionImagePicker/editionImagePickerApi\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n noPadding:{\r\n padding:0,\r\n margin:0,\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'bottom',\r\n },\r\n text: {\r\n margin: 0,\r\n width: '100%',\r\n felxGrow: 1,\r\n },\r\n }),\r\n);\r\n\r\nexport function EditionImagePickerWidget(props: any) {\r\n //const {value: guid, onChange: setGuid, rawErrors, id, placeholder, label, required, disabled, readonly, autofocus} = props;\r\n const {value, onChange, rawErrors, id, label} = props;\r\n const classes = useStyles();\r\n\r\n const [open, setOpen] = useState(false)\r\n const handleClickOpen = useCallback(() => {\r\n setOpen(true)\r\n }, [setOpen])\r\n\r\n const handleClose = (value: Asset|string) => {\r\n setOpen(false);\r\n if (typeof value === 'object') {\r\n onChange(`/image-assets/${value.md5}?path=/images/${value.isbn}/a/${value.filename}`)\r\n console.log('selected image:', value)\r\n }\r\n }\r\n\r\n return
\r\n\r\n \r\n \r\n\r\n \r\n
\r\n\r\n\r\n}\r\n\r\n\r\n\r\n","import {createStyles, makeStyles, TextField, Theme} from \"@material-ui/core\";\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n noPadding:{\r\n padding:0,\r\n margin:0\r\n },\r\n text: {\r\n margin: 0,\r\n width: '100%'\r\n },\r\n }),\r\n);\r\nexport function HiddenWhenBlankWidget(props: any) {\r\n const {value, rawErrors, id, label} = props;\r\n const classes = useStyles();\r\n\r\n return <>\r\n {value ? : ''}\r\n \r\n}\r\n","import {Container, createStyles, makeStyles, TextField, Theme} from \"@material-ui/core\";\r\nimport MonacoEditor from '@monaco-editor/react';\r\nimport React from \"react\";\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n noPadding:{\r\n padding:0,\r\n margin:0\r\n },\r\n text: {\r\n margin: 0,\r\n width: '100%'\r\n },\r\n }),\r\n);\r\n\r\nexport function HtmlEditorWidget(props: any) {\r\n const {value, onChange, rawErrors, id, label} = props;\r\n const classes = useStyles();\r\n\r\n const options = {\r\n lineNumbers: \"off\",\r\n wordWrap: \"on\",\r\n scrollBeyondLastLine: \"off\"\r\n };\r\n\r\n function editorOnChange(value:any, event:any) {\r\n onChange(value)\r\n }\r\n\r\n return \r\n {/**/}\r\n \r\n \r\n \r\n\r\n\r\n // return <>\r\n // {value ? : ''}\r\n //\r\n}\r\n","import React, {useCallback, useContext, useEffect, useState} from 'react';\r\nimport { useAppDispatch } from '../../app/hooks';\r\nimport Form from \"@rjsf/material-ui\";\r\nimport styles from './Editor.module.scss'\r\nimport {Box, LinearProgress} from \"@material-ui/core\";\r\nimport Alert from '@material-ui/lab/Alert/Alert';\r\nimport \"easymde/dist/easymde.min.css\";\r\nimport {PhaidonArticleBodyMarkdownEditor} from \"./widgets/phaidonArticleBodyMarkdownEditor\";\r\nimport {GuidWidget} from \"./widgets/guid\";\r\nimport {EditionPickerWidget} from \"./widgets/EditionPickerWidget\";\r\nimport {EditionImagePickerWidget} from \"./widgets/editionImagePickerWidget\";\r\nimport {HiddenWhenBlankWidget} from \"./widgets/hiddenWhenBlank\";\r\nimport {setDirtyState} from \"./formState.Slice\";\r\nimport deepEqual from \"deep-equal\"\r\nimport {UNSAFE_NavigationContext as NavigationContext} from \"react-router\";\r\nimport {HtmlEditorWidget} from \"./widgets/htmlEditor\";\r\n\r\nconst widgets = {\r\n PhaidonArticleBodyMarkdownEditor,\r\n HtmlEditorWidget,\r\n GuidWidget,\r\n EditionPickerWidget,\r\n EditionImagePickerWidget,\r\n HiddenWhenBlankWidget\r\n};\r\nlet dirty = false\r\nlet _oldState = undefined as any\r\nfunction setCleanState(s: any){\r\n console.log('CLEAN STATE SET:', s)\r\n _oldState = s\r\n dirty=false\r\n}\r\nfunction checkIfDirty(newState: any){\r\n if(dirty)return true\r\n const changed = !deepEqual(newState, _oldState)\r\n console.log(`checkIfDirty[${changed}]`,newState, _oldState)\r\n return changed\r\n}\r\nconst defaultChangeState = {\r\n title: null,\r\n titleDescription: null,\r\n titleImage: null,\r\n titleImageDescription: null\r\n}\r\nlet changeState = defaultChangeState;\r\n\r\nlet unblock = null as any;\r\nlet saving = false;\r\nexport function Editor(props: any) {\r\n const dispatch = useAppDispatch()\r\n const [ json, setJson ] = useState(props.json)\r\n const [ jsonSchema, setJsonSchema ] = useState(props.jsonSchema)\r\n const [ jsonUiSchema, setJsonUiSchema ] = useState(props.jsonUiSchema)\r\n const { navigator } = useContext( NavigationContext ) as any;\r\n\r\n const blocker = useCallback(( tx:any ) => {\r\n console.log('blocker', tx, json);\r\n if (!checkIfDirty(json) || saving) {\r\n console.log('blocker - not dirty , unblock and retry');\r\n unblock()\r\n tx.retry();\r\n return\r\n }\r\n\r\n if (window.confirm('There are unsaved changes! Are you sure you want to leave?')){\r\n console.log('blocker - exit confirmed , unblock and retry');\r\n unblock()\r\n tx.retry();\r\n return\r\n }\r\n console.log('KEEP BLOCKING')\r\n },\r\n [json]\r\n );\r\n useEffect(() => console.log('blocker changed'), [blocker])\r\n useEffect(() => {\r\n if(unblock)\r\n unblock()\r\n unblock = navigator.block(blocker)\r\n }, [blocker]);\r\n\r\n const renderAlert = () => {\r\n if (props.status === 'error')\r\n return {props.errorMessage}\r\n return <>\r\n }\r\n const renderLoading = () => {\r\n if (props.status === 'loading')\r\n return \r\n if (props.status === 'saving')\r\n return \r\n return
\r\n }\r\n useEffect(()=> {\r\n if(props.json !== json)\r\n setJson(props.json)\r\n if(props.jsonSchema !== jsonSchema)\r\n setJsonSchema(props.jsonSchema)\r\n if(props.jsonUiSchema !== jsonUiSchema)\r\n setJsonUiSchema(props.jsonUiSchema)\r\n\r\n },[json, jsonSchema, jsonUiSchema, props])\r\n useEffect(() => {\r\n console.log('NEW DOC LOADED', {formData: json})\r\n setTimeout(() => dispatch(setDirtyState({formData: json})), 0)\r\n setCleanState(json)\r\n changeState = {\r\n title: json?.title,\r\n titleDescription: json?.titleDescription,\r\n titleImage: json?.titleImage,\r\n titleImageDescription: json?.titleImageDescription\r\n }\r\n }, [json])\r\n\r\n const change = (evt: any) => {\r\n if (!saving) {\r\n dirty = true\r\n const nstate = {\r\n title: evt.formData.title,\r\n titleDescription: evt.formData.titleDescription,\r\n titleImage: evt.formData.titleImage,\r\n titleImageDescription: evt.formData.titleImageDescription\r\n }\r\n if(!deepEqual(nstate, changeState)) {\r\n changeState = nstate\r\n console.log('FORM CHANGE', evt.formData)\r\n setTimeout(() => dispatch(setDirtyState(nstate)), 0)\r\n }\r\n }\r\n }\r\n const save = async (data:any, event:any) => {\r\n saving = true;\r\n if(unblock)\r\n unblock()\r\n await props.save(data)\r\n setCleanState(data)\r\n saving = false\r\n }\r\n\r\n return <>\r\n { renderLoading() }\r\n
\r\n { renderAlert() }\r\n \r\n \r\n \r\n
\r\n \r\n\r\n}\r\n\r\n\r\n\r\n\r\n","import {useAppDispatch, useAppSelector} from \"../../app/hooks\";\r\nimport {getEmptyAsync, saveAsync, selectEditor} from \"./editorSlice\";\r\nimport React, {useEffect, useState} from \"react\";\r\nimport {useParams} from \"react-router-dom\";\r\nimport {ToolBar} from \"../appBar/views\";\r\nimport {Alert} from \"@material-ui/lab\";\r\nimport {Editor} from \"./Editor\";\r\n\r\nexport function EditNewView() {\r\n const e = useAppSelector(selectEditor)\r\n const dispatch = useAppDispatch();\r\n const [status, setStatus] = useState(e.status)\r\n const [errorMessage, setErrorMessage] = useState(e.errorMessage)\r\n const params = useParams();\r\n const {documentClass} = params;\r\n\r\n const save = async (data: any, event: any) => {\r\n console.log('SAVE', data)\r\n debugger\r\n if (!data || !data.formData) {\r\n setStatus('error')\r\n setErrorMessage('Save failed. No data to save.')\r\n return\r\n }\r\n\r\n let d = data.formData;\r\n for (const p of (e.keyPath ?? '').split('.')) {\r\n if (p in d)\r\n d = d[p]\r\n else {\r\n setStatus('error')\r\n setErrorMessage('Save failed. Cant find key from keyPath')\r\n return\r\n }\r\n }\r\n const cls = documentClass ?? ''\r\n await dispatch(saveAsync({documentClass: cls, documentId: d, formData: data.formData}));\r\n }\r\n\r\n useEffect(() => {\r\n if (e.status === 'ready' && !e.keyPath) {\r\n setStatus('error')\r\n setErrorMessage('No keyPath configured.')\r\n }\r\n }, [e.keyPath, e.status])\r\n\r\n useEffect(() => {\r\n if (documentClass) {\r\n console.log('getEmptyAsync')\r\n dispatch(getEmptyAsync({documentClass}));\r\n }\r\n }, [dispatch, documentClass])\r\n\r\n useEffect(() => {\r\n document.title = `${documentClass} - Phaidon Editor`\r\n }, [documentClass]);\r\n\r\n useEffect(() => {\r\n setStatus(e.status)\r\n setErrorMessage(e.errorMessage)\r\n console.log(e.status, e.errorMessage)\r\n }, [e.status, e.errorMessage])\r\n\r\n\r\n return <>\r\n \r\n You are creating a new {documentClass}\r\n \r\n \r\n}","import {useAppDispatch, useAppSelector} from \"../../app/hooks\";\r\nimport {refreshAsync, saveAsync, selectEditor} from \"./editorSlice\";\r\nimport React, {useEffect, useState} from \"react\";\r\nimport {useParams} from \"react-router-dom\";\r\nimport {ToolBar} from \"../appBar/views\";\r\nimport {Editor} from \"./Editor\";\r\n\r\nexport function EditExitingView() {\r\n const e = useAppSelector(selectEditor)\r\n const dispatch = useAppDispatch();\r\n const [status, setStatus] = useState(e.status)\r\n const [errorMessage, setErrorMessage] = useState(e.errorMessage)\r\n const params = useParams();\r\n const {documentClass, documentId} = params;\r\n\r\n useEffect(() => {\r\n if (documentClass && documentId) {\r\n dispatch(refreshAsync({documentClass, documentId}))\r\n }\r\n }, [dispatch, documentClass, documentId])\r\n\r\n const save = async (data: any, event: any) => {\r\n if (documentClass && documentId) {\r\n console.log('SAVE', data.formData)\r\n await dispatch(saveAsync({documentClass, documentId, formData: data.formData}));\r\n }\r\n };\r\n useEffect(() => {\r\n setStatus(e.status)\r\n setErrorMessage(e.errorMessage)\r\n console.log(e.status, e.errorMessage)\r\n }, [e.status, e.errorMessage])\r\n\r\n return <>\r\n \r\n \r\n \r\n}","import React from 'react';\nimport { Routes, Route } from \"react-router-dom\";\nimport './App.css';\nimport DocumentClassList from \"./features/documentClassList/DocumentClassList\"\nimport DocumentList from \"./features/documentList/DocumentList\"\nimport {EditionSearchView} from \"./features/editionPicker/views\";\nimport {EditionAssetsView} from \"./features/editionAssets/views\";\nimport {TemplateView} from \"./features/templates/views\";\nimport {HomeView} from \"./features/home/Home\";\nimport {PublishSite} from \"./features/publishSite/PublishSite\";\nimport {JsonView} from \"./features/editor/jsonView\";\nimport {EditNewView} from \"./features/editor/editNewView\";\nimport {EditExitingView} from \"./features/editor/editExitingView\";\nimport DiffSite from \"./features/diff/DiffSite\";\n\nfunction App() {\n return (\n \n } />\n } />\n } />\n } />\n } />\n } />\n } />\n } />\n } />\n } />\n } />\n \n );\n}\n\nexport default App;\n","// A mock function to mimic making an async request for data\nexport function fetchCount(amount = 1) {\n return new Promise<{ data: number }>((resolve) =>\n setTimeout(() => resolve({ data: amount }), 500)\n );\n}\n","import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { RootState, AppThunk } from '../../app/store';\nimport { fetchCount } from './counterAPI';\n\nexport interface CounterState {\n value: number;\n status: 'idle' | 'loading' | 'failed';\n}\n\nconst initialState: CounterState = {\n value: 0,\n status: 'idle',\n};\n\n// The function below is called a thunk and allows us to perform async logic. It\n// can be dispatched like a regular action: `dispatch(incrementAsync(10))`. This\n// will call the thunk with the `dispatch` function as the first argument. Async\n// code can then be executed and other actions can be dispatched. Thunks are\n// typically used to make async requests.\nexport const incrementAsync = createAsyncThunk(\n 'counter/fetchCount',\n async (amount: number) => {\n const response = await fetchCount(amount);\n // The value we return becomes the `fulfilled` action payload\n return response.data;\n }\n);\n\nexport const counterSlice = createSlice({\n name: 'counter',\n initialState,\n // The `reducers` field lets us define reducers and generate associated actions\n reducers: {\n increment: (state) => {\n // Redux Toolkit allows us to write \"mutating\" logic in reducers. It\n // doesn't actually mutate the state because it uses the Immer library,\n // which detects changes to a \"draft state\" and produces a brand new\n // immutable state based off those changes\n state.value += 1;\n },\n decrement: (state) => {\n state.value -= 1;\n },\n // Use the PayloadAction type to declare the contents of `action.payload`\n incrementByAmount: (state, action: PayloadAction) => {\n state.value += action.payload;\n },\n },\n // The `extraReducers` field lets the slice handle actions defined elsewhere,\n // including actions generated by createAsyncThunk or in other slices.\n extraReducers: (builder) => {\n builder\n .addCase(incrementAsync.pending, (state) => {\n state.status = 'loading';\n })\n .addCase(incrementAsync.fulfilled, (state, action) => {\n state.status = 'idle';\n state.value += action.payload;\n });\n },\n});\n\nexport const { increment, decrement, incrementByAmount } = counterSlice.actions;\n\n// The function below is called a selector and allows us to select a value from\n// the state. Selectors can also be defined inline where they're used instead of\n// in the slice file. For example: `useSelector((state: RootState) => state.counter.value)`\nexport const selectCount = (state: RootState) => state.counter.value;\n\n// We can also write thunks by hand, which may contain both sync and async logic.\n// Here's an example of conditionally dispatching actions based on current state.\nexport const incrementIfOdd = (amount: number): AppThunk => (\n dispatch,\n getState\n) => {\n const currentValue = selectCount(getState());\n if (currentValue % 2 === 1) {\n dispatch(incrementByAmount(amount));\n }\n};\n\nexport default counterSlice.reducer;\n","import { configureStore, ThunkAction, Action } from '@reduxjs/toolkit';\nimport counterReducer from '../features/counter/counterSlice';\nimport editorReducer from '../features/editor/editorSlice'\nimport documentClassListReducer from '../features/documentClassList/documentClassListSlice'\nimport documentListReducer from '../features/documentList/documentListSlice'\nimport editionPickerReducer from \"../features/editionPicker/editionPicker.Slice\";\nimport editionImagePickerReducer from \"../features/editionImagePicker/editionImagePicker.Slice\";\nimport editionAssetsReducer from \"../features/editionAssets/editionAssets.Slice\";\nimport templateReducer from \"../features/templates/template.slice\";\nimport formState from \"../features/editor/formState.Slice\";\n\nexport const store = configureStore({\n reducer: {\n counter: counterReducer,\n editor: editorReducer,\n documentClassList: documentClassListReducer,\n documentList: documentListReducer,\n editionPicker: editionPickerReducer,\n editionImagePicker: editionImagePickerReducer,\n editionAssets: editionAssetsReducer,\n template: templateReducer,\n formState: formState\n },\n});\n\nexport type AppDispatch = typeof store.dispatch;\nexport type RootState = ReturnType;\nexport type AppThunk = ThunkAction<\n ReturnType,\n RootState,\n unknown,\n Action\n>;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { BrowserRouter } from \"react-router-dom\";\nimport './index.scss';\nimport App from './App';\nimport { store } from './app/store';\nimport { Provider } from 'react-redux';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(\n \n \n \n \n \n \n ,\n document.getElementById('root')\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"autocomplete\":\"editionPicker_autocomplete__t-KBe\",\"noimg\":\"editionPicker_noimg__cpvc_\",\"ml5\":\"editionPicker_ml5__23vgb\",\"progressPlaceholder\":\"editionPicker_progressPlaceholder__5-rNn\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"root\":\"Home_root__1vymK\",\"card\":\"Home_card__1qUpw\",\"fillHeight\":\"Home_fillHeight__2EUvn\",\"centerMiddle\":\"Home_centerMiddle__2rXLM\"};"],"sourceRoot":""}