{"version":3,"sources":["services/history.js","services/State.js","services/coa-authorization.js","components/AppSkeleton/PressReleaseLists.js","components/AppSkeleton/index.js","pages/Home.js","pages/404.js","pages/List.js","services/cmsImageUploader.js","components/useInputHiddenEvent/index.js","components/FileManagement-Input/index.js","components/ADUser-View/index.js","components/ADUser-Input/index.js","pages/Edit.js","App.js","serviceWorker.js","index.js"],"names":["history","createBrowserHistory","StateContext","createContext","reducer","prevState","state","Object","objectSpread","StateProvider","_ref","initFn","initialState","children","_useReducer","useReducer","_useReducer2","slicedToArray","dispatch","asyncInitilizer","useCallback","asyncToGenerator","regenerator_default","a","mark","_callee","wrap","_context","prev","next","sent","stop","useEffect","react_default","createElement","Provider","value","useStateStore","attr","_useContext","useContext","_useContext2","defineProperty","userLogin","_callee2","handleNoAuth","fetchUserProfile","_context2","navigator","onLine","localStorage","removeItem","redirect","window","location","href","concat","timeout","user","setTimeout","fetch","method","credentials","headers","Content-Type","then","response","clearTimeout","json","_unused","email","setItem","JSON","stringify","catch","abrupt","apply","this","arguments","userLogout","document","PressReleaseLists","props","_useStateStore","_useStateStore2","pressReleaseLists","setPressReleaseLists","_useStateStore3","_useState","useState","_useState2","newListName","setNewListName","_useState3","currentPath","_useState4","setCurrentPath","List_default","component","Divider_default","ListSubheader_default","map","list","i","ListItem_default","key","id","button","selected","process","onClick","event","index","route","newPath","push","handleListItemClick","name","canPublish","Fragment","FormControl","className","InputLabel_default","htmlFor","Input_default","type","onChange","e","target","endAdornment","InputAdornment_default","position","IconButton_default","body","Name","ok","result","Add_default","withStyles","theme","app","flexGrow","zIndex","overflow","grow","navIconHideSm","breakpoints","down","display","navIconHideLg","up","menuButton","marginLeft","marginRight","appBar","drawer","textAlign","drawerPaper","width","transitionDuration","drawerDocked","height","toolbar","mixins","content","backgroundColor","palette","background","default","padding","spacing","unit","minWidth","boxSizing","overflowY","contentShift","classes","setDrawer","persistDrawer","setPersistDrawer","_useState5","pathname","_useState6","_useState7","_useState8","accountIcon","setAccountIcon","listen","addEventListener","which","globalPersistDrawer","drawerContents","index_es","AppSkeleton_PressReleaseLists","classNames","color","aria-label","Menu_default","aria-owns","aria-haspopup","currentTarget","AccountCircle_default","anchorEl","anchorOrigin","vertical","horizontal","transformOrigin","open","Boolean","onClose","mdUp","onOpen","paper","ModalProps","keepMounted","smDown","implementation","variant","anchor","docked","CACHED_ITEMS","HomePage","newPressReleaseName","setNewPressReleaseName","parse","getItem","activePressReleases","setActivePressReleases","items","onSubmit","preventDefault","item","placeholder","required","Link","tabIndex","to","NotFound","React","Component","ListPage","listID","match","params","setList","activeItems","setActiveItems","focusedID","setFocusedID","webpage","setWebpage","data","sitePageID","Authorization","page","Path","length","getElementById","findIndex","childElementCount","focus","decrementPriority","itemID","priority","equalItem","find","lowerItem","setItemPriority","incrementPriority","togglePinnedPriority","joinID","title","rel","onKeyUp","prID","keyboardControl","pressReleaseID","fill","d","alt","pressRelease","fn","withDefaults","imageDialog","imageTypes","currentDir","webPath","path","replace","handleRootDir","_ref2","dirs","setDirectories","handleLoadImagesOfDir","_ref3","_callee4","_context4","_ref4","_callee3","files","_context3","filter","file","isDirectory","includes","fileType","toLowerCase","Promise","all","_ref5","_x2","setCurrentFiles","_x","selectElem","optionsHTML","dir","join","innerHTML","filesHTML","switchToImageSelect","selectView","html","template","trim","firstChild","htmlToElement","srcElement","tagName","img","w","Math","max","documentElement","clientWidth","innerWidth","iw","min","round","imgSize","naturalWidth","naturalHeight","save","src","data-ce-max-width","_domView","style","parentElement","insertBefore","caption","detail","fileName","formData","FormData","append","mode","alert","ContentTools","FlashUI","imgSrc","Image","onload","application","userHomeDirectory","options","bind","dispathInputHiddenEvent","nativeInputValueSetter","getOwnPropertyDescriptor","HTMLInputElement","prototype","set","input","call","ev2","Event","bubbles","dispatchEvent","withMobileDialog","defaults","dialogTitle","docTypes","styles","root","alignItems","flexDirection","label","alignSelf","imgList","listStyle","margin","flexWrap","imgListItem","flex","minHeight","imgListImg","uploadInput","top","left","uploadLabel","right","bottom","justifyContent","uploadIcon","uploadProgress","_defaults$props","userProfile","setValue","isOpen","setIsOpen","isUploading","setIsUploading","currentFile","setCurrentFile","_useState9","department","_useState10","setCurrentDir","_useState11","_useState12","directories","_useState13","_useState14","currentFiles","thumbPathGenerator","str","count","add","lastIndexOf","slice","thumbPath","imgThumbPath","tryThumbFirst","t0","t1","t2","t3","t4","t5","_x3","checkSelectionKey","keyCode","shrink","defaultValue","onInput","size","aria-labelledby","autoFocus","accept","handleFileUpload","loading","ADUserView","SCHEMA","personID","accountName","firstName","lastName","manager","phone","employeeNumber","created","modified","ProfilePic_Generic","enqueueSnackbar","useSnackbar","isFetching","setIsFetching","adUser","setADUser","setImageSrc","Error","profilePic","keys","forEach","itemScope","itemType","CircularProgress_default","itemProp","searchValue","setSearchValue","ID","searchSuggestions","setSearchSuggestions","handleChangeValue","newValue","triggerInputHiddenEvent","odataResults","ADUser_View","fullWidth","suggestion","EditPage","CACHED_SCHEMA","status","adUserID","blurb","coverImage","publishDate","endDate","published","pressContact","pressReleaseListsJoin","CACHED_ITEM","_useSnackbar","closeSnackbar","snackbarKey","setSnackbarKey","parseInt","setPressRelease","computePressReleaseListsJoin","pressReleaseListID","l","setPressReleaseListsJoin","editor","setEditor","handleHTMLSanitize","domRegions","statusText","handleDateTimeToDate","persist","action","IMAGE_UPLOADER","imageUploader","DEFAULT_TOOLS","EditorApp","get","isMounted","init","getEditor","dt","indexOf","substring","handleStartEditor","isEditing","start","stopPropagation","handleFieldChange","elem","Array","from","child","removeAttribute","innerText","handleEditSubmit","updateData","missingRequiredFields","preventDuplicate","del","PressReleaseListID","splice","PressReleaseID","Priority","nativeEvent","pathCount","confirm","Delete_default","Link_default","reportValidity","Save_default","container","xs","md","lg","InputLabelProps","disabled","multiline","rows","multiple","SelectDisplayProps","renderValue","ADUser_Input","FileManagement_Input","data-editable","data-name","dangerouslySetInnerHTML","__html","float","createMuiTheme","typography","useNextVariants","primary","main","secondary","App","STORES","fullName","userPrincipalName","roles","everyoneFinish","lists","undefined","build","State_StateProvider","core_styles","components_AppSkeleton","Router","basename","Switch","Route","exact","NotFoundPage","hostname","ReactDOM","render","src_App","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.02feb5c8.chunk.js","sourcesContent":["import { createBrowserHistory } from 'history';\r\n\r\nexport const history = createBrowserHistory();","import React, {createContext, useContext, useCallback, useReducer, useEffect} from 'react';\r\nexport const StateContext = createContext();\r\nconst reducer = (prevState, state) => {\r\n return {\r\n ...prevState,\r\n ...state\r\n }\r\n}\r\n/** This state provider will be used to handle most data stores in the app\r\n * Desired functions for a data store:\r\n * 1. Loads initially a static/cached value\r\n * 2. Asyncly refresh this static value where needed\r\n * 3. Component useage matches the standard [state, updateState] pattern\r\n * 4. Pushes changes changes, allows changes pushed.\r\n * \r\n * Useage: const [{ trackedObj }, updateState]\r\n * Then: updateState({ trackedObj: trackedObj })\r\n */\r\nexport const StateProvider = ({initFn, initialState, children}) => {\r\n const [ state, dispatch ] = useReducer(reducer, initialState);\r\n //next we'd like to async load our \r\n //can't put async function directly in `useEffect`\r\n //\r\n const asyncInitilizer = useCallback(async () => {\r\n let state = await initFn();\r\n dispatch(state);//merge defaultState with async state fetch\r\n }, [dispatch, initFn]);\r\n useEffect(() => { \r\n asyncInitilizer();\r\n // eslint-disable-next-line\r\n },[]);//run only once\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\nexport const useStateStore = (attr) => {\r\n //if no specific part of the state is defined it can be used as object\r\n //doesn't like conditionally, and I've never used it this way anyways\r\n //if (!attr) return useContext(StateContext); //ex: const trackedObj = [{ trackedObj }, updateState] = getState()\r\n //you can specify a part of the state obj by passing it in\r\n const [state, dispatch] = useContext(StateContext); //ex: const trackedObj = [trackedObj, updateTrackedObj] = getState('trackedObj');\r\n return [state[attr], (value) => { dispatch({ [attr] : value }) }];\r\n}\r\n","//SHOULDNT BE NEEDED IF WE CAN SHARE COOKIE, but right now we need a different cookie per microframework... sooo\r\n//import { useState, useEffect, useCallback } from 'react';\r\n//IE compat (not needed because IE bug: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8680109/)\r\n//import 'whatwg-fetch';\r\n//import Promise from 'promise-polyfill';\r\n//if (!window.Promise) { window.Promise = Promise; }\r\n\r\n/**\r\n * Supports getting user information as well as triggering login when user is not logged in.\r\n *\r\n * @todo Redirecting to login means the potential to lose work if application doesn't saveState / loadState\r\n * @todo Microframeworks share the same cookie/auth but I'd need to create an auth microFramework or share with main apiv2 so we don't need to pass param\r\n * @todo Need to recreate logout (delete localStore and remove cookies)\r\n * @todo Logout timer? You are going to be logged out in? I mean, it already happens based on something from cookie or auth so might as well warn user, perhaps call saveState function\r\n * \r\n * @param {string} microFramework\r\n * @returns {object}\r\n */\r\n// function userAuthStatus(microFramework) {\r\n// const SCHEMA = {\"name\":{\"fullName\":\"\",\"firstName\":\"\",\"lastName\":\"\"},\"email\":\"\",\"phone\":null,\"department\":null,\"title\":null,\"employeeNumber\":null,\"userPrincipalName\":\"\",\"roles\":[]}\r\n// const [accountProfile, setAccountProfile] = useState(SCHEMA);\r\n\r\n// const handleNoAuth = () => {\r\n// //just assume all errors here are for not authorized\r\n// if (navigator.onLine) { // Don't try to redirect to auth server while offline, else user will have a bad time\r\n// //so this works but causes a refresh, we'd need the application to saveState, then update login, then load state. It's possible and likely the best way to handle it.\r\n// let redirect = window.location.href;\r\n// window.location.href = `https://api2.auburnalabama.org/${microFramework}/login?redirect=${redirect}`;\r\n// //However, I'd like to attempt a different solution and see if it's better.\r\n// //iframes and popups just won't set the cookie we need set so we're stuck with plan A till there is some middleware or a better idea\r\n// // let iframe = document.createElement('iframe');\r\n// // iframe.src = `https://api2.auburnalabama.org/${microFramework}/login?redirect=${redirect}`;\r\n// // document.body.appendChild(iframe);\r\n// }\r\n// }\r\n// const fetchUserProfile = () => {\r\n// //if can't get profile in 2.5s, attempt to reauthenticate\r\n// const timeout = setTimeout(handleNoAuth, 2500);\r\n// fetch(`https://api2.auburnalabama.org/${microFramework}/me`, { method: 'GET', credentials: 'include', headers: { 'Content-Type' : 'application/json' }})\r\n// .then((response) => {\r\n// clearTimeout(timeout);\r\n// return response;\r\n// })\r\n// .then((response) => {\r\n// try {\r\n// return response.json();\r\n// } catch { // if we fail to parse json, attempt reauth\r\n// handleNoAuth();\r\n// }\r\n// })\r\n// .then((user) => {\r\n// if (!user.email) { // if user has no email value, attempt reauth\r\n// handleNoAuth();\r\n// }\r\n// // set fetched credentials\r\n// localStorage.setItem('user', JSON.stringify(user));\r\n// setAccountProfile(user);\r\n// })\r\n// .catch(() => {\r\n// clearTimeout(timeout);\r\n// handleNoAuth();\r\n// });\r\n// }\r\n\r\n// //is called anytime a change is made (including load)\r\n// useEffect(() => {\r\n// if (!accountProfile || !accountProfile.email) {\r\n// //go ahead an update, even if credentials are stored in case server auth has timed out\r\n// fetchUserProfile();\r\n// //check for stored creds\r\n// let cached = JSON.parse(localStorage.getItem('user') || '{}');\r\n// if (cached.Email) {\r\n// // set cached credentials\r\n// setAccountProfile(cached);\r\n// }\r\n// }\r\n// },[]);\r\n\r\n// return accountProfile;\r\n// }\r\n\r\n// function userProvider() {\r\n// const SCHEMA = {\"name\":{\"fullName\":\"\",\"firstName\":\"\",\"lastName\":\"\"},\"email\":\"\",\"phone\":null,\"department\":null,\"title\":null,\"employeeNumber\":null,\"userPrincipalName\":\"\",\"roles\":[],\"can\":[],\"logout\":()=>{}}\r\n// const [ user, setUser ] = useState(localStorage.getItem('user') || SCHEMA);\r\n\r\n// const logout = () => {\r\n// localStorage.removeItem('user');\r\n// document.location = 'https://api2.auburnalabama.org/pressrelease/signout';\r\n// }\r\n\r\n// const asyncInitilizer = useCallback(async () => {\r\n// await fetch('https://api2.auburnalabama.org/pressrelease/me', { credentials: 'include' })\r\n// .then((response) => { if (response.ok) return response.json(); else throw new Error(); })\r\n// .then((user) => {\r\n// user.logout = logout;\r\n// //todo CAN permissions\r\n// setUser(user);\r\n// localStorage.setItem('user', user);\r\n// })\r\n// .catch(() => {\r\n// if (navigator.onLine) {\r\n// localStorage.removeItem('user');\r\n// window.location = `https://api2.auburnalabama.org/pressrelease/login?redirect=${window.location.href}`;\r\n// }\r\n// });\r\n// });\r\n\r\n// useEffect(() => {\r\n// if (user.email) {\r\n \r\n// }\r\n// if (navigator.onLine) {\r\n\r\n// }\r\n// }, []);\r\n// }\r\n\r\nasync function userLogin() {\r\n const handleNoAuth = () => {\r\n //just assume all errors here are for not authorized\r\n if (navigator.onLine) { // Don't try to redirect to auth server while offline, else user will have a bad time\r\n localStorage.removeItem('user');\r\n //so this works but causes a refresh, we'd need the application to saveState, then update login, then load state. It's possible and likely the best way to handle it.\r\n let redirect = window.location.href;\r\n window.location.href = `https://api2.auburnalabama.org/pressrelease/login?redirect=${redirect}`;\r\n //However, I'd like to attempt a different solution and see if it's better.\r\n //iframes and popups just won't set the cookie we need set so we're stuck with plan A till there is some middleware or a better idea\r\n // let iframe = document.createElement('iframe');\r\n // iframe.src = `https://api2.auburnalabama.org/${microFramework}/login?redirect=${redirect}`;\r\n // document.body.appendChild(iframe);\r\n }\r\n }\r\n\r\n const fetchUserProfile = async () => {\r\n //if can't get profile in 2.5s, attempt to reauthenticate\r\n const timeout = setTimeout(handleNoAuth, 2500);\r\n let user = await fetch(`https://api2.auburnalabama.org/pressrelease/me`, { method: 'GET', credentials: 'include', headers: { 'Content-Type' : 'application/json' }})\r\n .then((response) => {\r\n clearTimeout(timeout);\r\n return response;\r\n })\r\n .then((response) => {\r\n try {\r\n return response.json();\r\n } catch { // if we fail to parse json, attempt reauth\r\n handleNoAuth();\r\n }\r\n })\r\n .then((user) => {\r\n if (!user.email) { // if user has no email value, attempt reauth\r\n handleNoAuth();\r\n }\r\n // set fetched credentials\r\n localStorage.setItem('user', JSON.stringify(user));\r\n return user;\r\n })\r\n .catch(() => {\r\n clearTimeout(timeout);\r\n handleNoAuth();\r\n });\r\n if (user && user.email) return user;\r\n }\r\n\r\n //const SCHEMA = {\"name\":{\"fullName\":\"\",\"firstName\":\"\",\"lastName\":\"\"},\"email\":\"\",\"phone\":null,\"department\":null,\"title\":null,\"employeeNumber\":null,\"userPrincipalName\":\"\",\"roles\":[]};\r\n //let userProfile = localStorage.getItem('user') || SCHEMA;\r\n \r\n return await fetchUserProfile();\r\n}\r\n\r\nfunction userLogout() {\r\n localStorage.removeItem('user');\r\n //document.cookie = \"MICROAPI_AUTH= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\"; //cookies are secured so I can't mess with them, send it to server instead\r\n //document.location = 'https://www.auburnalabama.org/';\r\n document.location = 'https://api2.auburnalabama.org/pressrelease/signout';\r\n}\r\n\r\nexport { userLogout, userLogin };","import React, { useState, useEffect } from 'react';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport InputAdornment from '@material-ui/core/InputAdornment';\r\nimport Input from '@material-ui/core/Input';\r\nimport InputLabel from '@material-ui/core/InputLabel';\r\nimport List from '@material-ui/core/List';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListSubheader from '@material-ui/core/ListSubheader';\r\n\r\nimport Add from '@material-ui/icons/Add';\r\n\r\nimport { history } from '../../services/history';\r\nimport { useStateStore } from '../../services/State';\r\nimport './PressReleaseLists.css';\r\n\r\n//const CACHED_LISTS = 'pressReleaseLists';\r\n/**\r\n * Nav Lists for PressReleaseLists and entry to add a new one, provided user-permissions\r\n *\r\n * @returns List\r\n */\r\nfunction PressReleaseLists(props) {\r\n const [pressReleaseLists, setPressReleaseLists] = useStateStore('pressReleaseLists');\r\n const [user] = useStateStore('userProfile');\r\n const [newListName, setNewListName] = useState('');\r\n const [currentPath, setCurrentPath] = useState(props.currentPath);\r\n\r\n const handleNewListClick = () => {\r\n if (!newListName) return; //error-check : required field\r\n // TODO - wrap in a service? Set global configs?\r\n fetch(`https://api2.auburnalabama.org/pressrelease/list`, { method: 'POST', credentials : 'include', headers: { 'Content-Type': 'application/json'}, body: JSON.stringify({ Name: newListName })})\r\n .then((response) => { if (response.ok) return response.json(); }) //check insert, successful\r\n .then((result) => { \r\n //update list\r\n setPressReleaseLists(pressReleaseLists.concat(result));\r\n //clear form\r\n setNewListName('');\r\n });\r\n }\r\n\r\n /** Syncs menu highlight */\r\n useEffect(() => {\r\n setCurrentPath(props.currentPath);\r\n },[props.currentPath]);\r\n \r\n const handleListItemClick = (event, index, route) => {\r\n let newPath = `${process.env.PUBLIC_URL}${route}`;\r\n history.push(newPath);\r\n };\r\n\r\n return (\r\n \r\n \r\n Press Release Lists\r\n \r\n {pressReleaseLists.map((list, i) => {\r\n return handleListItemClick(event, i, `/list/${list.id}`)}>{list.name}\r\n })}\r\n {user.canPublish &&\r\n \r\n \r\n \r\n Enter New List\r\n setNewListName(e.target.value)}\r\n endAdornment={}>\r\n \r\n \r\n }\r\n \r\n )\r\n}\r\n\r\nexport default PressReleaseLists;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useStateStore } from '../../services/State';\r\nimport { history } from '../../services/history';\r\nimport { userLogout } from '../../services/coa-authorization';\r\nimport PressReleaseLists from './PressReleaseLists';\r\nimport classNames from 'classnames'; //TODO - don't use, \"withStyles\" or \"classNames\"\r\nimport { Menu, MenuItem, List, ListItem, AppBar, Toolbar, IconButton, Hidden, SwipeableDrawer, Drawer, withStyles } from '@material-ui/core';\r\nimport AccountCircle from '@material-ui/icons/AccountCircle';\r\nimport MenuIcon from '@material-ui/icons/Menu';\r\n//Layout styles\r\nconst drawerWidth = 240;\r\n\r\nconst styles = theme => ({\r\n app: {\r\n flexGrow: 1,\r\n zIndex: 1,\r\n overflow: 'hidden',\r\n position: 'relative',\r\n },\r\n grow: {\r\n flexGrow: 1,\r\n },\r\n navIconHideSm: {\r\n [theme.breakpoints.down('sm')]: {\r\n display: 'none',\r\n },\r\n },\r\n navIconHideLg: {\r\n [theme.breakpoints.up('md')]: {\r\n display: 'none',\r\n },\r\n },\r\n menuButton: {\r\n marginLeft: -12,\r\n marginRight: 20,\r\n },\r\n appBar: {\r\n position: 'absolute',\r\n zIndex: theme.zIndex.drawer + 1,\r\n textAlign: 'center',\r\n },\r\n drawerPaper: {\r\n position: 'relative',\r\n width: drawerWidth,\r\n transitionDuration: '0ms !important',\r\n },\r\n drawerDocked: {\r\n height: '100%',\r\n },\r\n toolbar: theme.mixins.toolbar,\r\n list: {\r\n },\r\n content: {\r\n flexGrow: 1,\r\n backgroundColor: theme.palette.background.default,\r\n padding: theme.spacing.unit * 3,\r\n minWidth: 0, // So the Typography noWrap works\r\n height: '100%',\r\n boxSizing: 'border-box',\r\n overflowY: 'auto',\r\n },\r\n contentShift: {\r\n [theme.breakpoints.up('md')]: {\r\n marginLeft: -drawerWidth,\r\n },\r\n },\r\n});\r\n\r\nfunction AppSkeleton({ classes, children }) {\r\n const [drawer, setDrawer] = useState(false);\r\n const [persistDrawer, setPersistDrawer] = useState(true);\r\n const [currentPath, setCurrentPath] = useState(history.location.pathname);\r\n const [accountIcon, setAccountIcon] = useState(null);\r\n const [user] = useStateStore('userProfile');// userAuthStatus(\"pressrelease\");\r\n\r\n useEffect(() => {\r\n history.listen(() => {\r\n setDrawer(false);\r\n setCurrentPath(history.location.pathname);\r\n });\r\n \r\n //can't get current state, only initial state\r\n document.body.addEventListener('keyup', (event) => {\r\n if (event.which === 27) {\r\n setPersistDrawer(!window.globalPersistDrawer)\r\n }\r\n });\r\n }, [])\r\n\r\n useEffect(() => {\r\n window.globalPersistDrawer = persistDrawer;\r\n }, [persistDrawer]);\r\n\r\n const handleListItemClick = (event, index, route) => {\r\n history.push(`${process.env.PUBLIC_URL}${route}`);\r\n };\r\n\r\n /** Side Navigation */\r\n var drawerContents = (\r\n \r\n \r\n handleListItemClick(event, 0, '/')}\r\n >\r\n Home\r\n \r\n \r\n \r\n \r\n )\r\n \r\n return (\r\n \r\n \r\n \r\n { setDrawer(!drawer)}} className={classNames(classes.menuButton, classes.navIconHideLg)} color=\"inherit\" aria-label=\"Menu\">\r\n \r\n \r\n { setPersistDrawer(!persistDrawer)}} className={classNames(classes.menuButton, classes.navIconHideSm)} color=\"inherit\" aria-label=\"Menu\">\r\n \r\n \r\n

Press Release Editor

\r\n
\r\n { setAccountIcon(event.currentTarget)}}\r\n color=\"inherit\"\r\n >\r\n \r\n \r\n { setAccountIcon(null)}}\r\n >\r\n { setAccountIcon(null)}}>{user.email}\r\n Logout\r\n \r\n
\r\n
\r\n
\r\n \r\n { setDrawer(!drawer)}}\r\n onOpen={() => { setDrawer(!drawer)}}\r\n classes={{\r\n paper: classes.drawerPaper,\r\n }}\r\n ModalProps={{\r\n keepMounted: true, // Better open performance on mobile.\r\n }}\r\n >\r\n
\r\n {drawerContents}\r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n {drawerContents}\r\n
\r\n \r\n \r\n
\r\n
\r\n {children}\r\n
\r\n \r\n );\r\n}\r\n\r\nexport default withStyles(styles)(AppSkeleton);","import React, { useState, useEffect } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport List from '@material-ui/core/List';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport { history } from '../services/history';\r\nimport './Home.css';\r\n\r\nconst CACHED_ITEMS = 'pressReleaseItems';\r\nfunction HomePage() {\r\n const [ newPressReleaseName, setNewPressReleaseName ] = useState('');\r\n const [ activePressReleases, setActivePressReleases ] = useState(JSON.parse(localStorage.getItem(CACHED_ITEMS)) || []);\r\n\r\n useEffect(() => {\r\n // TODO - wrap as a service? \r\n fetch('https://api2.auburnalabama.org/pressrelease/active', { credentials: 'include' })\r\n .then((response) => { \r\n if (response.ok) return response.json(); \r\n })\r\n .then((items) => {\r\n localStorage.setItem(CACHED_ITEMS, JSON.stringify(items));\r\n setActivePressReleases(items); //could do a check so it doesn't rerender when cached list is the same as returned list...\r\n });\r\n }, []);//empty array will only run this once, rather than every render\r\n\r\n const handleCreatePressRelease = (event) => {\r\n event.preventDefault();\r\n\r\n // TODO - wrap as a service? \r\n fetch(`https://api2.auburnalabama.org/pressrelease/`, { method: 'POST', credentials: 'include', headers: { 'Content-Type' : 'application/json' }, body: JSON.stringify({ Name: newPressReleaseName }) })\r\n .then((response) => {\r\n if (response.ok) { return response.json(); }\r\n // TODO - handle exception/error\r\n }).then((item) => { \r\n history.push(`${process.env.PUBLIC_URL}/${item.id}`);\r\n });\r\n }\r\n\r\n return (\r\n
\r\n
\r\n

Home

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

Create New Press Release

\r\n
\r\n
\r\n
\r\n \r\n setNewPressReleaseName(event.target.value)}>\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n

Active Press Releases

\r\n
\r\n
\r\n \r\n {activePressReleases.map((item) => {\r\n return {item.name}\r\n })}\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nexport { HomePage };\r\n","import React from 'react'\r\n\r\nclass NotFound extends React.Component {\r\n render() {\r\n return
404: Not Found
\r\n }\r\n}\r\n\r\nexport { NotFound as NotFoundPage };","import React, { useEffect, useState } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { history } from '../services/history';\r\nimport { IconButton, SvgIcon } from '@material-ui/core';\r\n\r\nfunction ListPage({ match }) {\r\n const listID = match.params.id;\r\n const [list, setList] = useState({});\r\n const [activeItems, setActiveItems] = useState([]);\r\n const [focusedID, setFocusedID] = useState(0);\r\n const [webpage, setWebpage] = useState('');\r\n\r\n useEffect(() => {\r\n fetch(`https://api2.auburnalabama.org/pressrelease/list/${listID}`, {credentials: 'include'})\r\n .then((response) => { if (response.ok) return response.json(); })\r\n .then((data) => {\r\n if (data.sitePageID) // HACK - shouldn't be using secured API to get URL of webpage!!!\r\n fetch(`https://api.auburnalabama.org/cms/site/1/page/${data.sitePageID}`, { headers: { 'Authorization': 'BEARER eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6bnVsbH0.eyJyb2xlIjpbIldFQiBERVZFTE9QRVIiLDE0XSwidW5pcXVlX25hbWUiOiJHUklGRklOLCBDSFJJU1RPUEhFUiBTIiwiZW1haWwiOiJjZ3JpZmZpbkBhdWJ1cm5hbGFiYW1hLm9yZyIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL21vYmlsZXBob25lIjoiMzM0NTAxNzIwOSIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvdXNlcmRhdGEiOiJodHRwczovL3N0YXRpYy5hdWJ1cm5hbGFiYW1hLm9yZy9tZWRpYS9hcHBzL29yZ2FuaXphdGlvbi8zMDc0IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvdXJpIjoiaHR0cHM6Ly9zdGF0aWMuYXVidXJuYWxhYmFtYS5vcmcvbWVkaWEvYXBwcy9vcmdhbml6YXRpb24vZW1wbG95ZWVwaG90by8wNzYxNC5qcGciLCJpc3MiOiJDT0EtQVBJIiwiZXhwIjoxNDUwMjk2NTIwfQ.cWJWXpTM_gFgTPR4kz9BpJFcCNL0smKuRiRaKlKPnC3r7pvci6lDPlV3x10_kGwefmZT28z_dvsv4jXqhpp6fGFJXm8SVzbhY1EJsw_B6MRM9QsDauTOylXezkn-eUzyD5JIhqZ2-5o14h2EMG8a6LF8eErQr0enUalVKwqutk69BwwRuN9bafwMAHw92Bi0EW2rEiz5YwkndWrV_7944JesGWD4dstWph3RrH-uLWGN0TotFdSZqMQ-jp17ypS8YKTr8TaHAsAlVTf_OXd7FWc7rLUdP9r7ZomQAyeZV1YjB2PI8E6QKCOg3RajhFBmQBzxM9RbAVQ7Id7MoPchLg' }})\r\n .then(response => response.json())\r\n .then((page) => setWebpage(`https://www.auburnalabama.org/${page.Path}`))\r\n else\r\n setWebpage('')\r\n return setList(data)\r\n });\r\n fetch(`https://api2.auburnalabama.org/pressrelease/join/list/${listID}/active`, { credentials: 'include' })\r\n .then((response) => { if (response.ok) return response.json(); })\r\n .then((data) => setActiveItems(data) );\r\n },[listID]);\r\n\r\n /** Handles looking at focused element, triggered when activeItems updates as a way to */\r\n useEffect(() => {\r\n if (activeItems.length === 0) return;\r\n const list = document.getElementById('priorityList');\r\n const index = activeItems.findIndex(i => i.id === focusedID);\r\n if (index !== -1 && list.childElementCount > index) list.children[index].focus();\r\n else if (list.children[0]) list.children[0].focus();\r\n // eslint-disable-next-line\r\n }, [activeItems]);\r\n\r\n /**\r\n * Note: Priority sort is ASC, so \"decrementing\" the item position is done by incrementing the priority\r\n */\r\n const decrementPriority = (itemID, priority) => { //check that it's not the lowest\r\n if (priority === 0) return; //disallow \"pinned\" change\r\n setFocusedID(itemID);\r\n //hopefully this'll reduce gaps in priority\r\n if (priority > 1) {\r\n const equalItem = activeItems.find(i => i.priority === priority && i.id !== itemID);\r\n const lowerItem = activeItems.find(i => i.priority > priority && i.id !== itemID); \r\n if (!lowerItem && !equalItem) return; //only if something other than itself shares the current priority or has a 'lower' priority\r\n if (!equalItem) setItemPriority(lowerItem.id, (lowerItem.priority - 1)); //if there is a gap, rearrange the one below it\r\n }\r\n setItemPriority(itemID, (priority + 1));\r\n }\r\n /**\r\n * Note: Priority sort is ASC, so \"incrementing\" the item position is done by decrementing the priority\r\n */\r\n const incrementPriority = (itemID, priority) => {\r\n if (priority <= 1) return; //disallow \"pinned\" change\r\n setFocusedID(itemID);\r\n setItemPriority(itemID, priority - 1)\r\n }\r\n const togglePinnedPriority = (itemID, priority) => {\r\n setFocusedID(itemID);\r\n setItemPriority(itemID, priority ? 0 : 2);\r\n }\r\n const setItemPriority = (joinID, priority) => {\r\n fetch(`https://api2.auburnalabama.org/pressrelease/join/${joinID}/${priority}`, {credentials: 'include', method: 'PUT'})\r\n .then((response) => { if (response.ok) return response.json(); })\r\n .then((data) => setActiveItems(data) );\r\n }\r\n\r\n const keyboardControl = (event, itemID, priority, prID) => {\r\n switch(event.which) {\r\n case 38: //up-arrow\r\n incrementPriority(itemID, priority);\r\n return;\r\n case 40: //down-arrow\r\n decrementPriority(itemID, priority);\r\n return;\r\n case 32: //space (for starring/pinning item)\r\n togglePinnedPriority(itemID, priority);\r\n return;\r\n case 13:\r\n history.push(`${process.env.PUBLIC_URL}/${prID}`);\r\n return;\r\n default:\r\n return;\r\n }\r\n }\r\n\r\n return (\r\n \r\n
\r\n
\r\n

List of Active Releases {list.name}

\r\n {(webpage) && (Public Listing)}\r\n
\r\n
\r\n

You can change the sort order of press releases. Pinned releases will remain at the top and new releases will appear above releases which aren't pinned. Tip: Use keyboard shortcuts (Spacebar, Up Arrow, and Down Arrow) while focused on a press release.

\r\n
    \r\n {activeItems.map((item, i) => {\r\n return (\r\n
  • keyboardControl(event, item.id, item.priority, item.pressReleaseID)}>\r\n
    \r\n {item.priority}\r\n togglePinnedPriority(item.id, item.priority)} title=\"Pin (spacebar)\">\r\n \r\n {(item.priority) ? \r\n \r\n : }\r\n \r\n \r\n incrementPriority(item.id, item.priority)} title=\"Move Up (up)\">\r\n \r\n \r\n decrementPriority(item.id, item.priority)} title=\"Move Down (down)\">\r\n \r\n \r\n
    \r\n {item.pressRelease.name}\r\n
  • \r\n )\r\n })}\r\n
\r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport { ListPage };","/**\r\n * @param {String} HTML representing a single element\r\n * @return {Element}\r\n */\r\nfunction htmlToElement(html) {\r\n var template = document.createElement('template');\r\n html = html.trim(); // Never return a text node of whitespace as the result\r\n template.innerHTML = html;\r\n return template.content.firstChild;\r\n}\r\n\r\nconst imageUploader = ({ app, imageTypes, currentDir }, imageDialog) => {\r\n const webPath = (path) => {\r\n if (!path) return;\r\n return `${'https://static.auburnalabama.org/media/apps/Press-Release-Editor/'}${path.replace(/\\\\/g, '/')}`;\r\n }\r\n\r\n const handleRootDir = async () => {\r\n fetch(`https://api2.auburnalabama.org/filemanagement/app/${app}/root`, { credentials: 'include'})\r\n .then((response) => { if (response.ok) return response.json(); })\r\n .then((dirs) => {\r\n setDirectories(dirs);\r\n });\r\n }\r\n\r\n const handleLoadImagesOfDir = async () => {\r\n fetch(`https://api2.auburnalabama.org/filemanagement/app/${app}/${(!currentDir ? 'home' : '?path=' + currentDir)}`, { credentials: 'include' })\r\n .then((response) => { if (response.ok) return response.json(); })\r\n .then(async (files) => {\r\n //filter files by prop, could do this on server-side but I didn't setup the API like that... for now\r\n files = files.filter((file) => { return file.isDirectory || imageTypes.includes(file.fileType.toLowerCase())});\r\n\r\n files = await Promise.all(files.map(async (file) => {\r\n return {...file, webPath: webPath(file.path) };\r\n }));\r\n setCurrentFiles(files)\r\n });\r\n }\r\n\r\n const setDirectories = (dirs) => {\r\n const selectElem = document.getElementById('dirSelector');\r\n const optionsHTML = dirs.map((dir) => \r\n ``).join('');\r\n selectElem.innerHTML = optionsHTML;\r\n }\r\n\r\n const setCurrentFiles = (files) => {\r\n //could probably do it the old way, this was supposed to work with 'width' but doesn't \r\n //thankfully, HTML5 added \"naturalWidth\" which could just be queried on click\r\n // let docFrag = document.createDocumentFragment();\r\n // files.forEach((file) => {\r\n // let li = document.createElement('li');\r\n // let i = new Image();\r\n // i.onload = () => { i.setAttribute('data-ce-max-width', i.naturalWidth) };\r\n // i.src = file.webPath;\r\n // li.appendChild(i);\r\n // docFrag.appendChild(li);\r\n // });\r\n //document.getElementById('selectImageList').appendChild(docFrag);\r\n let filesHTML = files.map((file) => {\r\n return `
  • \"\"
  • `\r\n }).join('');\r\n document.getElementById('selectImageList').innerHTML = filesHTML;\r\n }\r\n\r\n /* fn to switch dialog from image uploader to image selector */\r\n const switchToImageSelect = () => {\r\n let selectView = htmlToElement(`
      `);\r\n //handles the selection of images\r\n selectView.addEventListener('click', (event) => {\r\n if (event.srcElement.tagName === 'IMG') {\r\n const img = event.srcElement;\r\n const w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\r\n const iw = Math.min(Math.round(w * .8, 0), 600);//80% of screen or 600px, whichever smaller. This is just guessing \r\n const imgSize = img.naturalWidth <= iw ? [img.naturalWidth, img.naturalHeight] : [iw, (iw / img.naturalWidth) * img.naturalHeight];\r\n imageDialog.save(img.src, imgSize, { alt: img.alt, \"data-ce-max-width\": img.naturalWidth });\r\n }\r\n });\r\n imageDialog._domView.style.display = 'none';\r\n imageDialog._domView.parentElement.insertBefore(selectView, imageDialog._domView);\r\n //handles the updating of images when directory changes\r\n document.getElementById('dirSelector').addEventListener('change', (event) => {\r\n if (event.target.value !== currentDir) {\r\n currentDir = event.target.value;\r\n handleLoadImagesOfDir();\r\n }\r\n });\r\n }\r\n\r\n imageDialog.addEventListener('imageuploader.mount', () => {\r\n //caption\r\n imageDialog.caption('Insert/Select Image');\r\n handleRootDir();\r\n handleLoadImagesOfDir();\r\n switchToImageSelect();\r\n //additional action\r\n //let selectButton = htmlToElement(`
      Select
      `);\r\n //selectButton.addEventListener('click', switchToImageSelect);\r\n //imageDialog._domControls.lastElementChild.appendChild(selectButton);\r\n });\r\n\r\n imageDialog.addEventListener('imageuploader.fileready', (event) => {\r\n const file = event.detail().file;\r\n const fileName = file.name.replace(/ /g, '-'); //the server is going to do this to the whole path, including the filename...\r\n let formData = new FormData();//passing in formData will make browser fetch auto-set header to Content-Type: multipart/form-data\r\n formData.append('file', file);//upload this file\r\n formData.append('Path', currentDir);//...to the current directory\r\n fetch(`https://api2.auburnalabama.org/filemanagement/app/${app}/images`, { method: 'POST', mode: 'no-cors', credentials: 'include', body: formData})\r\n .then((response) => {//so, we had to go 'no-cors' because the server response is async streaming upload and we didn't get back the headers for our included credentials to allow-access-origin.\r\n //no-cors, means we can't see ANYTHING... so we have no idea if it worked or not, we only know it's finished, here.\r\n //Step 1 - re-request curDirectory files\r\n //Step 2 - look for uploaded file - if found, select it. If missing, prompt upload error\r\n fetch(`https://api2.auburnalabama.org/filemanagement/app/${app}/?path=${currentDir}`, { credentials: 'include' })\r\n .then((response) => { if (response.ok) return response.json(); })\r\n .then((files) => {\r\n const i = files.findIndex(file => file.name === fileName);\r\n if (i === -1) {\r\n alert('Upload Erorr');\r\n new window.ContentTools.FlashUI('no');\r\n return;\r\n }\r\n const imgSrc = webPath(files[i].path);\r\n //need to get the size\r\n let img = new Image();\r\n img.onload = () => {\r\n const w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\r\n const iw = Math.min(Math.round(w * .8, 0), 600);//80% of screen or 600px, whichever smaller. This is just guessing \r\n const imgSize = img.naturalWidth <= iw ? [img.naturalWidth, img.naturalHeight] : [iw, (iw / img.naturalWidth) * img.naturalHeight];\r\n imageDialog.save(img.src, imgSize, { alt: '', \"data-ce-max-width\": img.naturalWidth });\r\n }\r\n img.src = imgSrc;\r\n });\r\n });\r\n })\r\n}\r\n\r\nconst withDefaults = (fn) => {\r\n return (application, userHomeDirectory) => {\r\n const app = application || 'press-release-manager';\r\n const imageTypes = [\".jpg\", \".jpeg\", \".png\", \".gif\", \".tiff\", \".bmp\", \".svg\", \".dib\", \".webp\", \".svgz\", \".ico\", \".pjpeg\", \".pjg\" ];\r\n let currentDir = userHomeDirectory.replace(/ /g, '-') || 'Information-Technology';\r\n let options = {app, imageTypes, currentDir};\r\n return fn.bind({}, options);\r\n }\r\n}\r\n\r\nexport default withDefaults(imageUploader);\r\n","/**\r\n * Fancy way to trigger a hidden input's INPUT event (hidden inputs don't have update events)... I think\r\n * @param {string} id DOM id of the hidden input element\r\n * @param {string} value updated value input is being set to, value will be propograted through `event.target.value`\r\n */\r\nconst dispathInputHiddenEvent = (id, value) => {\r\n var nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, \"value\").set;\r\n var input = window.document.getElementById(id);\r\n nativeInputValueSetter.call(input, value);\r\n\r\n var ev2 = new Event('input', { bubbles: true});\r\n input.dispatchEvent(ev2);\r\n}\r\n\r\nexport default dispathInputHiddenEvent;","import React, { useState, useEffect } from 'react';\r\n//custom\r\nimport dispathInputHiddenEvent from '../../components/useInputHiddenEvent';\r\nimport { useStateStore } from '../../services/State';\r\n//material-ui\r\nimport { \r\n Button, \r\n CircularProgress,\r\n Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, \r\n InputLabel, \r\n MenuItem, Select, \r\n SvgIcon, \r\n withMobileDialog \r\n} from '@material-ui/core';\r\n\r\nfunction spliceSlice(str, index, count, add) {\r\n // We cannot pass negative indexes directly to the 2nd slicing operation.\r\n if (index < 0) {\r\n index = str.length + index;\r\n if (index < 0) {\r\n index = 0;\r\n }\r\n }\r\n\r\n return str.slice(0, index) + (add || \"\") + str.slice(index + count);\r\n}\r\n\r\n/**\r\n * Form input for selecting and/or uploading a file for public use\r\n * \r\n * @todo Make a list of all the many, many things todo\r\n * \r\n * @param {string} label Label Text\r\n * @param {string} name Hidden input name\r\n * @param {string} id Hidden input id\r\n * @param {string} app The application name, file uploads are segmented by application and a dir structure has to be setup for applications to upload files to\r\n * @param {enum} filter all | image | document\r\n */\r\nconst FileManagementInput = (props) => {\r\n const defaults = {filter: 'all', alt: '', dialogTitle: 'File Management Selector', src: 'https://static.auburnalabama.org/media/apps/press-release-editor/information-technology/missing-image.png'};\r\n const imageTypes = [\".jpg\", \".jpeg\", \".png\", \".gif\", \".tiff\", \".bmp\", \".svg\", \".dib\", \".webp\", \".svgz\", \".ico\", \".pjpeg\", \".pjg\" ];\r\n const docTypes = [\".pdf\" ];\r\n const styles = {\r\n ...{\r\n root: {\r\n display: 'flex',\r\n width: '100%',\r\n alignItems: 'center',\r\n flexDirection: 'column',\r\n overflow: 'hidden',\r\n position: 'relative',\r\n },\r\n label: {\r\n alignSelf: 'flex-start',\r\n },\r\n img: {\r\n height: '225px',\r\n },\r\n imgList: {\r\n listStyle: 'none',\r\n padding: '0',\r\n margin: '4px 0',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n flexWrap: 'wrap',\r\n },\r\n imgListItem: {\r\n position: 'relative',\r\n padding: '0.318rem',\r\n background: 'lightgrey',\r\n flex: '1 1 165px',\r\n minHeight: '110px',\r\n },\r\n imgListImg: {\r\n width: '100%',\r\n },\r\n uploadInput: {position: 'absolute',top: 0,left: 0,height: '100%',width: '100%',padding: '2px',boxSizing:'border-box'},\r\n uploadLabel: {position: 'absolute',background: 'lightgrey',top: '1px',right: '1px',left: '1px',bottom: '1px',display: 'flex',justifyContent: 'center',alignItems: 'center',},\r\n uploadIcon: {height: '68px', width: '68px'},\r\n uploadProgress: { position:'absolute', top: '12.5%', left: '25%', width: '50%', height: 'unset' },\r\n }, ...props.styles };\r\n //read-only\r\n const {label, name, id, alt, onChange, dialogTitle, app, filter} = {...defaults, ...props};\r\n const [ userProfile ] = useStateStore('userProfile');\r\n //vars\r\n const [value, setValue] = useState(props.value);\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [isUploading, setIsUploading] = useState(false);\r\n\r\n const [currentFile, setCurrentFile] = useState('');\r\n const [currentDir, setCurrentDir] = useState(userProfile && userProfile.department ? userProfile.department.replace(/ /g, '-') : 'Information-Technology');\r\n const [directories, setDirectories] = useState([]);\r\n const [currentFiles, setCurrentFiles] = useState([]);\r\n\r\n /** Helper function */\r\n const thumbPathGenerator = (path) => {\r\n if (!path) return;\r\n return spliceSlice(path, path.lastIndexOf('/') + 1, 0, 'thumb.');//prepend 'thumb.' to filename, maintinaing path\r\n }\r\n\r\n const thumbPath = async (path) => {\r\n const thumbPath = thumbPathGenerator(path);\r\n return await fetch(thumbPath, { method: 'HEAD'})\r\n .then((response) => {\r\n if (response.ok) return thumbPath;\r\n return path;\r\n })\r\n .catch(() => { return path; });\r\n }\r\n\r\n /** Syncs changes coming from the form after load */\r\n useEffect(() => {\r\n /** This method attempts to grab the thumbnail version of a file, if it exists it'll set that, if not, it'll fall-back */\r\n const tryThumbFirst = (path) => {\r\n if (!path) { // TODO - account for filter?\r\n setCurrentFile(defaults.src);\r\n return;\r\n }\r\n const imgThumbPath = thumbPathGenerator(path);\r\n fetch(imgThumbPath, { method: 'HEAD'})\r\n .then((response) => {\r\n if (response.ok) setCurrentFile(imgThumbPath);\r\n else setCurrentFile(path);\r\n });\r\n }\r\n\r\n setValue(props.value);\r\n tryThumbFirst(props.value);\r\n //eslint-disable-next-line\r\n }, [props.value]);\r\n\r\n /** Syncs changes coming from this input */\r\n useEffect(() => {\r\n if (props.value !== value)\r\n dispathInputHiddenEvent(id, value);\r\n setIsOpen(false);\r\n //eslint-disable-next-line\r\n }, [value]);\r\n\r\n /** useEffect has to return sync code, so we seperate async code, this is triggered by changing the `currentDir` and fetches directory contents from API */\r\n const handleLoadImagesOfDir = async () => {\r\n fetch(`https://api2.auburnalabama.org/filemanagement/app/${app}/${(!currentDir ? 'home' : '?path=' + currentDir)}`, { credentials: 'include' })\r\n .then((response) => { if (response.ok) return response.json(); })\r\n .then(async (files) => {\r\n //filter files by prop, could do this on server-side but I didn't setup the API like that... for now\r\n switch (filter) {\r\n case 'image':\r\n files = files.filter((file) => { return file.isDirectory || imageTypes.includes(file.fileType.toLowerCase())});\r\n break;\r\n case 'document':\r\n files = files.filter((file) => { return file.isDirectory || docTypes.includes(file.fileType.toLowerCase())});\r\n break;\r\n default:\r\n break;\r\n }\r\n files = await Promise.all(files.map(async (file) => {\r\n return {...file, webPath: webPath(file.path), thumbPath: await thumbPath(webPath(file.path)) };\r\n }));\r\n setCurrentFiles(files)\r\n });\r\n }\r\n\r\n /** Watches directory change, loads available files from directory */\r\n useEffect(() => {\r\n handleLoadImagesOfDir();\r\n //eslint-disable-next-line\r\n },[currentDir]);\r\n\r\n /** Loads root directories, only initially */\r\n useEffect(() => {\r\n fetch(`https://api2.auburnalabama.org/filemanagement/app/${app}/root`, { credentials: 'include'})\r\n .then((response) => { if (response.ok) return response.json(); })\r\n .then((dirs) => {\r\n setDirectories(dirs);\r\n });\r\n //eslint-disable-next-line\r\n }, [])\r\n\r\n /** \r\n * Helper function for accessibility, this triggers false when \"selecting\" a focused element.\r\n * Selection events are \"Enter\" (13), and \"Space\" (32)\r\n * Returns true if no selection so the event continues normally, returns false if selection so we can short-circuit with our own code\r\n * Example Usage: tabIndex=\"0\" onKeyUp={(event) => (checkSelectionKey(event) || doSomething(1))}\r\n */\r\n const checkSelectionKey = (event) => !(event.which === 13 || event.which === 32 || event.keyCode === 13 || event.keyCode === 32);\r\n\r\n const handleFileUpload = (event) => {\r\n setIsUploading(true);\r\n setIsOpen(false);\r\n const file = event.target.files[0];\r\n const fileName = file.name.replace(/ /g, '-'); //the server is going to do this to the whole path, including the filename...\r\n let formData = new FormData();//passing in formData will make browser fetch auto-set header to Content-Type: multipart/form-data\r\n formData.append('file', file);//upload this file\r\n formData.append('Path', currentDir);//...to the current directory\r\n fetch(`https://api2.auburnalabama.org/filemanagement/app/${app}/images`, { method: 'POST', mode: 'no-cors', credentials: 'include', body: formData})\r\n .then((response) => {//so, we had to go 'no-cors' because the server response is async streaming upload and we didn't get back the headers for our included credentials to allow-access-origin.\r\n //no-cors, means we can't see ANYTHING... so we have no idea if it worked or not, we only know it's finished, here.\r\n //Step 1 - re-request curDirectory files\r\n //Step 2 - look for uploaded file - if found, select it. If missing, prompt upload error\r\n fetch(`https://api2.auburnalabama.org/filemanagement/app/${app}/?path=${currentDir}`, { credentials: 'include' })\r\n .then((response) => { if (response.ok) return response.json(); })\r\n .then((files) => {\r\n const i = files.findIndex(file => file.name === fileName);\r\n if (i === -1) {\r\n setIsUploading(false);\r\n alert('Upload Erorr');\r\n return;\r\n }\r\n const newPath = webPath(files[i].path);\r\n setIsUploading(false);\r\n setValue(newPath);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Honestly, no idea why I setup the service such that it returns harddrive path (that's fixed). And really, no idea why it doesn't return web path (that's not)\r\n */\r\n const webPath = (path) => {\r\n if (!path) return;\r\n return `${'https://static.auburnalabama.org/media/apps/Press-Release-Editor/'}${path.replace(/\\\\/g, '/')}`;\r\n }\r\n\r\n return (\r\n \r\n {/* Form Stuff */}\r\n {/* Selected View */} \r\n
      setIsOpen(true)} \r\n tabIndex=\"0\" onKeyUp={(event) => (checkSelectionKey(event) || setIsOpen(true))}>\r\n {label}\r\n {/* Hidden elements don't trigger changes, but do trigger inputs */}\r\n \r\n {alt} setIsOpen(true)} src={currentFile}>\r\n {isUploading && }\r\n
      \r\n {/* Modal */}\r\n setIsOpen(false)}\r\n aria-labelledby=\"responsive-dialog-title\"\r\n >\r\n {dialogTitle}\r\n \r\n \r\n Select file from a directory or upload a new file.\r\n \r\n {/* Directory Selector */}\r\n \r\n {/* File Selector (Images) */}\r\n
        \r\n
      • \r\n handleFileUpload(e)}>\r\n \r\n
      • \r\n {currentFiles.map((file, i) => { return (\r\n
      • (checkSelectionKey(event) || setValue(file.webPath))} \r\n onClick={() => setValue(webPath(file.path))}>\r\n {file.name}
      • \r\n )})}\r\n
      \r\n
      \r\n \r\n \r\n \r\n \r\n
      \r\n );\r\n}\r\n\r\nexport default withMobileDialog()(FileManagementInput);\r\n","import React, { useState, useEffect } from 'react';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport { useSnackbar } from 'notistack';\r\n\r\n/**\r\n * This component is used to display a City of Auburn employee (or at least, network user). It can used in conjunction with ADUser-Input for selecting a person on a form.\r\n * @param {int} id ADUser.ID from the sql database COA.organization.ADUser\r\n * @todo - Remove id, or at least hide it\r\n * @todo - Add loading or transistion styles\r\n * @todo - More of a back-end change but Titles need to come from a different place or get updated/merged with organization.Position data\r\n */\r\nconst ADUserView = (props) => {\r\n const SCHEMA = {\"id\":null,\"personID\":null,\"accountName\":\"\",\"name\":\"\",\"firstName\":\"\",\"lastName\":\"\",\"email\":\"\",\"department\":\"\",\"title\":\"\",\"manager\":\"\",\"phone\":\"\",\"employeeNumber\":\"\",\"created\":\"\",\"modified\":\"\"};\r\n const ProfilePic_Generic = 'https://static.auburnalabama.org/media/apps/organization/employeephoto/Generic_Silhouette.jpg';\r\n const styles = {...props.styles, ...{\r\n root: {\r\n display: 'flex',\r\n width: '100%',\r\n alignItems: 'center',\r\n flexDirection: 'column',\r\n overflow: 'hidden',\r\n position: 'relative',\r\n },\r\n uploadProgress: { position:'absolute', top: '12.5%', left: '37.5%', width: '25%', height: 'unset' },\r\n }};\r\n //Key\r\n const { id } = props;\r\n //Visual feedbacks\r\n const { enqueueSnackbar } = useSnackbar();\r\n const [ isFetching, setIsFetching ] = useState(false);\r\n //Data\r\n const [ adUser, setADUser ] = useState(SCHEMA);\r\n const [ imgSrc, setImageSrc ] = useState(ProfilePic_Generic);\r\n\r\n useEffect(() => {\r\n setImageSrc(ProfilePic_Generic);//would be even better to have a loading indicator\r\n if (!id) return;//don't bother if we don't have an id, yet\r\n fetch(`https://api2.auburnalabama.org/ADUser/${id}`, { credentials: 'include' })\r\n .then((response) => {if (response.ok) return response.json(); else throw new Error(); })\r\n .then((adUser) => {\r\n //check if user has profile pic\r\n const profilePic = `https://static.auburnalabama.org/media/apps/organization/employeephoto/${adUser.employeeNumber}_thumb.jpg`;\r\n fetch(profilePic, { method: 'HEAD' }).then((response) => {\r\n if (response.ok) setImageSrc(profilePic);//if yes, set it to image tag\r\n else setImageSrc(ProfilePic_Generic);//if no, make sure it's set to generic profile\r\n });\r\n //update state\r\n Object.keys(adUser).forEach(key => { if (adUser[key] === null) adUser[key] = '' });//remove null's\r\n setADUser({...SCHEMA, ...adUser});//making\r\n setIsFetching(false);\r\n })\r\n .catch(() => enqueueSnackbar('Press Contact FAIL', { variant: 'error' }));\r\n setIsFetching(true);\r\n // eslint-disable-next-line\r\n }, [id]);//only change if `id` is changed\r\n\r\n return (\r\n
      \r\n {isFetching && }\r\n \"\"\r\n {/* {adUser.id} */}\r\n {adUser.name}\r\n {adUser.title}\r\n {adUser.phone && {adUser.phone}}\r\n {adUser.email && {adUser.email}}\r\n
      \r\n );\r\n};\r\n\r\nexport default ADUserView;\r\n","import React, { useState, useEffect } from 'react';\r\nimport ADUserView from '../../components/ADUser-View';\r\nimport triggerInputHiddenEvent from '../../components/useInputHiddenEvent';\r\n//material-ui\r\nimport { Button, Dialog, DialogTitle, DialogContent, DialogActions, TextField, InputLabel, withMobileDialog } from '@material-ui/core';\r\n\r\n/**\r\n * This form input handles selecting a City of Auburn employee (or more technically, an employee with a computer account)\r\n * \r\n * @todo - Default selection, might not be part of this component but is needed for Press Release Editor project\r\n * @todo - Additional styles, specifically for the suggestion list.\r\n */\r\nconst ADUserInput = (props) => {\r\n //const defaults = {};\r\n const styles = {\r\n ...{\r\n root: {\r\n display: 'flex',\r\n width: '100%',\r\n alignItems: 'center',\r\n flexDirection: 'column',\r\n overflow: 'hidden',\r\n },\r\n label: {\r\n alignSelf: 'flex-start',\r\n },\r\n //make the list max length so it doesn't jump around when there are more/less suggestions\r\n list: {\r\n height: '25em',\r\n listStyle: 'none',\r\n padding: '0',\r\n },\r\n }, ...props.styles};\r\n\r\n const { id, label, name, onChange } = props;\r\n const [ value, setValue ] = useState(props.value);\r\n const [ searchValue, setSearchValue ] = useState('');\r\n const [ searchSuggestions, setSearchSuggestions ] = useState([{ID: 181, Name: 'David D. Dorton'}, {ID: 3, Name: 'Ann Bergman'}, {ID: 27, Name: 'Alison Hall'}, {ID: 560, Name: 'Sara Custer'}, {ID: 143, Name: 'Cari Clecker'}, {ID: 221, Name: 'Elizabeth Kaufman'}, {ID: 421, Name: 'Lorenza Dorsey'}, {ID:515, Name: 'Paul Register'}, {ID:32, Name: 'Ashley J. Brown'}]);\r\n\r\n const [ isOpen, setIsOpen ] = useState(false);\r\n\r\n const handleChangeValue = (newValue) => {\r\n triggerInputHiddenEvent(id, newValue);\r\n setIsOpen(false);\r\n }\r\n\r\n /** Syncs changes coming from the form after load */\r\n useEffect(() => {\r\n setValue(props.value);\r\n },[props.value]);\r\n\r\n /** Listen's for changes to searchValue and triggers lookup */\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n //check min length?\r\n fetch(`https://api2.auburnalabama.org/ADUser/?$filter=contains(tolower(Name), tolower('${searchValue}'))`, { credentials: 'include' })\r\n .then((response) => { if (response.ok) return response.json(); })\r\n .then((odataResults) => setSearchSuggestions(odataResults.value));\r\n // eslint-disable-next-line\r\n }, [searchValue]);\r\n\r\n /** \r\n * Helper function for accessibility, this triggers false when \"selecting\" a focused element.\r\n * Selection events are \"Enter\" (13), and \"Space\" (32)\r\n * Returns true if no selection so the event continues normally, returns false if selection so we can short-circuit with our own code\r\n * Example Usage: tabIndex=\"0\" onKeyUp={(event) => (checkSelectionKey(event) || doSomething(1))}\r\n */\r\n const checkSelectionKey = (event) => !(event.which === 13 || event.which === 32);\r\n\r\n return (\r\n \r\n
      (checkSelectionKey(event) || setIsOpen(true))}\r\n onClick={() => setIsOpen(true)}>\r\n {label}\r\n \r\n {/* View Component */}\r\n \r\n
      \r\n setIsOpen(false)}\r\n aria-labelledby=\"responsive-dialog-title\"\r\n >\r\n Select City User\r\n \r\n setSearchValue(e.target.value)} />\r\n
        \r\n {searchSuggestions.map((suggestion) => { return (\r\n
      • handleChangeValue(suggestion.ID)}\r\n tabIndex=\"0\" onKeyUp={(event) => (checkSelectionKey(event) || handleChangeValue(suggestion.ID))}>{suggestion.Name}
      • \r\n )})}\r\n
      \r\n
      \r\n \r\n \r\n \r\n \r\n
      \r\n );\r\n};\r\n\r\nexport default withMobileDialog()(ADUserInput);\r\n","import React, { useState, useEffect } from 'react';\r\nimport { history } from '../services';\r\nimport imageUploader from '../services/cmsImageUploader';\r\nimport { useStateStore } from '../services/State';\r\n//custom inputs\r\nimport FileManagementInput from '../components/FileManagement-Input';\r\nimport ADUserInput from '../components/ADUser-Input';\r\n//material-ui\r\nimport { Button, Chip, Grid, InputLabel, MenuItem, Select, TextField } from '@material-ui/core';\r\n//material-ui icons\r\nimport SaveIcon from '@material-ui/icons/Save';\r\nimport DeleteIcon from '@material-ui/icons/Delete';\r\nimport LinkIcon from '@material-ui/icons/Link';\r\nimport { useSnackbar } from 'notistack';\r\n\r\n/**\r\n * Main fn for the edit page\r\n *\r\n * @param {*} { match }\r\n * @returns\r\n */\r\nfunction EditPage({ match }) {\r\n /** Vars for caching data, might be overkill but I like the idea, especially if we can work it into the app frameowrk */\r\n const CACHED_NAME = 'pressRelease';\r\n const CACHED_SCHEMA = { \"status\": \"empty\", \"id\": '', \"name\": '', \"adUserID\": '', \"blurb\": '', \"content\": '', \"coverImage\": '', \"publishDate\": '', \"endDate\": '', \"location\": '', \"published\": true, \"pressContact\": '', \"pressReleaseListsJoin\": [] }\r\n //useful for testing\r\n //localStorage.removeItem(CACHED_NAME);\r\n const CACHED_ITEM = JSON.parse(localStorage.getItem(CACHED_NAME)) || CACHED_SCHEMA;\r\n\r\n const styles = {\r\n alignSelfStart: {\r\n alignSelf: 'flex-start',\r\n },\r\n };\r\n const { enqueueSnackbar, closeSnackbar } = useSnackbar();\r\n const [ snackbarKey, setSnackbarKey ] = useState(0);\r\n /** Navigation var, to know which object we're editing */\r\n const itemID = match.params.id;\r\n /** Main Object of the form */\r\n const [pressRelease, setPressRelease] = useState(parseInt(itemID) === CACHED_ITEM.id ? CACHED_ITEM : CACHED_SCHEMA);\r\n /** Publish Permission */\r\n const [userProfile] = useStateStore('userProfile');\r\n /** Array for select list */\r\n const [pressReleaseLists] = useStateStore('pressReleaseLists');\r\n // compute function, merges pressRelease and pressReleaseLists into an object that can be used in a multi-select and add/delete fetches\r\n const computePressReleaseListsJoin = (pressReleaseListsJoin) => {\r\n if (!pressReleaseListsJoin || !pressReleaseListsJoin.map) return [];\r\n let listIDs = pressReleaseListsJoin.map((join) => join.pressReleaseListID);\r\n return listIDs.map((listID) => {\r\n listID = parseInt(listID);\r\n let list = pressReleaseLists.find((l) => l.id === listID) || {};\r\n // HACK - materia-ui select doesn't do well with complex keys so we stringify things here and parse them there\r\n return JSON.stringify({ key: listID, value: list.name });\r\n });\r\n };\r\n const [pressReleaseListsJoin, setPressReleaseListsJoin] = useState(() => computePressReleaseListsJoin(CACHED_ITEM.pressReleaseListsJoin));//Note the fn because otherwise you get a ton of re-renders\r\n //manage ContentTools state\r\n const [editor, setEditor] = useState({});\r\n\r\n const getEditor = () => {\r\n //Content-Tools HTML Editor stuff - oh man, I hate myself\r\n window.ContentTools.IMAGE_UPLOADER = imageUploader('press-release-editor', userProfile && userProfile.department ? userProfile.department.replace(/ /g, '-') : 'Information-Technology');\r\n window.ContentTools.DEFAULT_TOOLS = [\r\n ['bold', 'italic', 'link'],\r\n ['subheading', 'paragraph', 'unordered-list', 'ordered-list', 'table', 'image', 'video'], // TODO - image handler\r\n ['undo', 'redo', 'remove']\r\n ];\r\n var editor = window.ContentTools.EditorApp.get();\r\n if (!editor.isMounted()) {\r\n editor.init('div[id=\"itemContent\"]', 'data-name', null, false); // only one editable region, probably easier way\r\n }\r\n return editor;\r\n }\r\n\r\n //Close CMS editor\r\n history.listen(() => {\r\n try { \r\n if (snackbarKey)\r\n closeSnackbar(snackbarKey);\r\n editor.stop(true);\r\n pressRelease.status = \"recovered\";\r\n pressRelease.content = handleHTMLSanitize(editor.domRegions()[0]);\r\n localStorage.setItem(CACHED_NAME, JSON.stringify(pressRelease));//wait, this won't work as we set the item on load with the database... crap, so I've added status\r\n } catch {}\r\n })\r\n\r\n useEffect(() => {\r\n // TODO - wrap as a service? \r\n if (pressRelease.status !== \"recovered\") {\r\n fetch(`https://api2.auburnalabama.org/pressrelease/${itemID}`, { credentials: 'include' })\r\n .then((response) => {\r\n if (response.ok) return response.json();\r\n throw Error(`${response.status} ${response.statusText}`);\r\n })\r\n .then((item) => {\r\n Object.keys(item).forEach(key => { if (item[key] === null) item[key] = '' });//remove null's (React treats components with value=null as 'uncontrolled' for some reason)\r\n item = { status: 'fetched', ...item, publishDate: handleDateTimeToDate(item.publishDate), endDate: handleDateTimeToDate(item.endDate) };\r\n setPressRelease(item);//set main obj\r\n //set join list now\r\n setPressReleaseListsJoin(computePressReleaseListsJoin(item.pressReleaseListsJoin));\r\n //cache for later, might not should do this, it's pretty expensive\r\n localStorage.setItem(CACHED_NAME, JSON.stringify(item));\r\n })\r\n .catch(() => enqueueSnackbar('Load FAILED', { variant: 'error' }));\r\n } else {\r\n setSnackbarKey(enqueueSnackbar('Recovered! Form may have unsaved work.', { variant: 'info', persist: true, action: (key) => (\r\n \r\n )}));\r\n }\r\n //ContentTools Init\r\n setEditor(getEditor());\r\n //eslint-disable-next-line\r\n }, []);//empty array will only run this once, rather than every render\r\n\r\n const handleDateTimeToDate = (dt) => {\r\n if (!dt) return '';\r\n const i = dt.indexOf('T');\r\n if (i === -1) return dt;\r\n return dt.substring(0, i);\r\n }\r\n const handleStartEditor = event => {\r\n if (!editor.isEditing()) {\r\n editor.start();\r\n event.stopPropagation();\r\n return;\r\n }\r\n }\r\n //handles updating the object since we're using a single object we have to merge changes\r\n const handleFieldChange = event => { setPressRelease({ ...pressRelease, [event.target.name]: event.target.value }) };\r\n //handles updating the select, since it's a multi-select it behaves a bit differently than normal inputs\r\n const handleSelectChange = event => { setPressReleaseListsJoin(event.target.value); };\r\n // fixes issue where HTML was saved with ce-* classes and attributes like 'contenteditable'\r\n const handleHTMLSanitize = (elem) => {\r\n //don't need to recursizely traverse dom as ContentTools only allows editing a root element\r\n Array.from(elem.children).forEach((child) => {\r\n child.removeAttribute('contenteditable');\r\n if (child.tagName !== \"IMG\") {// Trying to keep .align-left and .align-right, for images. Need to handle videos at some point too\r\n child.removeAttribute('class'); // see below if classes are desired at a future point\r\n }\r\n // child.classList.remove('ce-element', 'ce-element--type-text', 'ce-element--focused'); //will need to add to this if we want to remove them all, either that or remove all classes, or write something fancy to loop through classes with regex\r\n });\r\n //it's ugly but they keep saving just a blank paragraph somehow and not sure about cross-browser stuff to check element count so this should hold for a bit\r\n if (elem.innerText) {\r\n return elem.innerHTML;\r\n } else if (elem.innerHTML === `

      \r\n \r\n

      `) { return ''; \r\n }\r\n return elem.innerHTML;\r\n }\r\n\r\n //handles updating data\r\n const handleEditSubmit = (event) => {\r\n if (event) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n\r\n // grab data from inline editor\r\n let updateData = pressRelease;\r\n if (editor.isEditing()) { //if we edited, update the content value, otherwise, leave it be\r\n editor.stop(true);//needed for things like images to be converted back to images\r\n updateData.content = handleHTMLSanitize(editor.domRegions()[0]);\r\n }\r\n \r\n // if published then we need to make sure all required fields are available (\"name\", \"adUserID\", \"blurb\", \"content\", \"coverImage\", \"publishDate\", \"endDate\")\r\n // TODO - need to create error messages\r\n if (pressRelease.publishDate) {\r\n let missingRequiredFields = [];\r\n if (!pressRelease.endDate) missingRequiredFields.push('End Date');\r\n if (!pressRelease.blurb) missingRequiredFields.push('Summary Text');\r\n if (!pressRelease.adUserID) missingRequiredFields.push('Press Contact');\r\n if (!pressRelease.coverImage) missingRequiredFields.push('Cover Image');\r\n if (!pressRelease.content) missingRequiredFields.push('Content');\r\n if (missingRequiredFields.length > 0) {\r\n pressRelease.publishDate = '';\r\n //setPressRelease({...pressRelease, publishDate: ''}); //It's the most clear, but could be annoying to reset the publishdata\r\n setSnackbarKey(enqueueSnackbar(`Publish date requires: ${missingRequiredFields.join(', ')}`, { variant: 'warning', persist: true, preventDuplicate: true, action: (key) => () }));\r\n }\r\n }\r\n\r\n // remove relational data from update\r\n //delete(updateData.pressReleaseListsJoin);\r\n //delete(updateData.pressContact);\r\n fetch(`https://api2.auburnalabama.org/pressrelease/${pressRelease.id}`, { credentials: 'include', headers: { 'Content-Type': 'application/json' }, method: 'PUT', body: JSON.stringify(updateData) })\r\n .then((response) => { if (response.ok) return true; else throw new Error(); }) //no-content expected on successful PUT\r\n .then(() => enqueueSnackbar('Saved', { variant: 'success' }))\r\n .catch((e) => {\r\n //save the work? perhaps we should do this earlier\r\n pressRelease.status = \"recovered\";\r\n localStorage.setItem(CACHED_NAME, JSON.stringify(pressRelease));//wait, this won't work as we set the item on load with the database... crap, so I've added status\r\n setSnackbarKey(enqueueSnackbar('Save FAILED: Work saved locally, try refresh.', { variant: 'error', persist: true, action: (key) => (\r\n \r\n ) }));\r\n })\r\n //need to handle child/join list updates\r\n //don't forget hack where we store the joins as strings so that material-ui select can handle it\r\n let del = [];//joins to be deleted\r\n let add = pressReleaseListsJoin.map((join) => JSON.parse(join).key);//joins to be added (not updating priority on this page so no updates)\r\n pressRelease.pressReleaseListsJoin.forEach((join) => {\r\n //2019-07-11: They are updating the title and not the list, which makes the website retain the old title...\r\n if (pressRelease.publishDate) { // it's not ideal, but we'll just update the list regardless. It's either that or do it on the API side... hmm... choices.\r\n fetch(`https://api2.auburnalabama.org/pressrelease/list/${join.PressReleaseListID}/sitepage`, { method: 'PUT' });\r\n }\r\n let i = add.indexOf(join.pressReleaseListID);\r\n if (i === -1) del.push(join.pressReleaseListID); //if not found, remove\r\n else add.splice(i, 1); //if found, remove from add array\r\n });// what's left should be only the ones that need deleting/adding\r\n add.forEach((id) => {\r\n const body = { PressReleaseID: pressRelease.id, PressReleaseListID: id, Priority: 1 };\r\n fetch(`https://api2.auburnalabama.org/pressrelease/join`, { credentials: 'include', headers: { 'Content-Type': 'application/json' }, method: 'POST', body: JSON.stringify(body) })\r\n .then((response) => { if (response.ok) return true; else throw new Error(); }) //POST will give us the join, should we // TODO update the pressRelease obj?\r\n .catch(() => enqueueSnackbar('List failed'));\r\n // TODO - better error handling?\r\n });\r\n del.forEach((listID) => { //this isn't the id we need to delete, we need the PK and we have both foreign keys instead, doh!\r\n let id = (pressRelease.pressReleaseListsJoin.find((join) => join.pressReleaseListID === listID)).id;\r\n fetch(`https://api2.auburnalabama.org/pressrelease/join/${id}`, { credentials: 'include', method: 'DELETE' })\r\n .then((response) => { if (response.ok) return true; else throw new Error(); }) //no-content expected on successful DELETE\r\n .catch(() => enqueueSnackbar('List failed'));\r\n //TODO - update the pressRelease Object? \r\n // TODO - better error handling?\r\n });\r\n }\r\n\r\n const handleOutsideClick = (event) => {\r\n if (!editor.isEditing()) return;\r\n \r\n if (event.nativeEvent && event.nativeEvent.path) {\r\n const pathCount = event.nativeEvent.path.length;\r\n for (let i = 0; i < pathCount; i++) {\r\n if (event.nativeEvent.path[i].id === 'itemContent') return;\r\n } \r\n } else { //EDGE doesn't have \"path\"\r\n let elem = event.target\r\n do {\r\n if (elem.id === \"itemContent\") return;\r\n elem = elem.parentElement;\r\n } while (elem && elem !== event.currentTarget);\r\n }\r\n \r\n editor.stop(true);\r\n setPressRelease({...pressRelease, content: handleHTMLSanitize(editor.domRegions()[0])});\r\n }\r\n\r\n //handles fake submit button\r\n const submitFormAction = (event) => {\r\n if (document.getElementById('PressReleaseEditForm').reportValidity()) {\r\n handleEditSubmit(event);\r\n } else { \r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n //deletes the article\r\n //only unpublished articles are able to be deleted, by authorized people only, perhaps that shouldn't be required?\r\n const deleteAction = (event) => {\r\n if(window.confirm(\"Are you sure?\")) {\r\n fetch(`https://api2.auburnalabama.org/pressrelease/${pressRelease.id}`, { credentials: 'include', method: 'DELETE' })\r\n .then((response) => { if (response.ok) { history.push(`${process.env.PUBLIC_URL}/`); } else throw new Error(); })\r\n .catch(() => enqueueSnackbar('Delete failed'));\r\n }\r\n }\r\n\r\n return (\r\n
      \r\n {(userProfile.canPublish || !Boolean(pressRelease.publishDate)) &&\r\n
      \r\n

      Edit Press Release

      \r\n
      \r\n {(!Boolean(pressRelease.publishDate)) && \r\n \r\n }\r\n {(Boolean(pressRelease.publishDate)) && \r\n \r\n }\r\n \r\n
      \r\n
      \r\n }\r\n {(!userProfile.canPublish && Boolean(pressRelease.publishDate)) &&\r\n
      \r\n

      View Press Release

      \r\n READ-ONLY\r\n \r\n
      \r\n }\r\n
      \r\n
      \r\n \r\n \r\n {/* Name */}\r\n \r\n \r\n \r\n {/* Publish Date */}\r\n \r\n \r\n \r\n {/* End Date */}\r\n \r\n \r\n \r\n {/* Summary Blurb */}\r\n \r\n \r\n \r\n {/* Geospatial Input */}\r\n {/* List/Category/Tags HACK for the fact that maaterial-ui select doesn't handle obj values well */}\r\n \r\n List(s)\r\n \r\n \r\n {/* Press Contact */}\r\n \r\n \r\n \r\n {/* Cover Image */}\r\n \r\n \r\n \r\n {/* Content */}\r\n \r\n Content\r\n
      \r\n
      \r\n {/* Submit */}\r\n \r\n {(userProfile.canPublish || !Boolean(pressRelease.publishDate)) &&\r\n \r\n }\r\n \r\n
      \r\n
      \r\n
      \r\n
      \r\n )\r\n}\r\n\r\nexport { EditPage };","import React from 'react';\nimport { Router, Switch as SwitchRoute, Route } from 'react-router-dom';\n//Styles\nimport './App.css';\n//Routing/History/Services\nimport { history } from './services/';\nimport { userLogin } from './services/coa-authorization';\nimport { StateProvider } from './services/State'; //should be able to get from NPM but microServices aren't sharing cookie\n//Material-ui layout needs\nimport { MuiThemeProvider, createMuiTheme } from '@material-ui/core/styles';\n//Components\nimport { SnackbarProvider } from 'notistack';\nimport AppSkeleton from './components/AppSkeleton';\n//Content Pages\nimport { NotFoundPage, HomePage, ListPage, EditPage } from './pages';\n\n//Layout styles\nconst theme = createMuiTheme({\n typography: {\n useNextVariants: true,\n },\n palette: {\n primary: { main: '#03a9f4' }, //lightblue from @material-ui/core/colors/\n secondary: { main: '#ff9800' }, //orange\n },\n});\n\nfunction App() {\n // TODO - move out to an appStore.js file?\n // TODO - rewrite `reducer` function in State.js to also update localStorage?\n // TODO - perhaps make a way to update localStorage without saving the data for local timeouts?\n const STORES = {\n CACHED_LISTS: 'pressReleaseLists',\n CACHED_USER: 'userProfile',\n }\n const initialState = {\n pressReleaseLists: JSON.parse(localStorage.getItem(STORES.CACHED_LISTS)) || [],\n userProfile: JSON.parse(localStorage.getItem(STORES.CACHED_USER)) || {\"name\":{\"fullName\":\"\",\"firstName\":\"\",\"lastName\":\"\"},\"email\":\"\",\"phone\":null,\"department\":null,\"title\":null,\"employeeNumber\":null,\"userPrincipalName\":\"\",\"roles\":[]},\n };\n const init = async () => {\n // TODO - make this a service which refreshes localStore items?\n let pressReleaseLists = fetch('https://api2.auburnalabama.org/pressrelease/list', { credentials: 'include' })\n .then((response) => { \n if (response.ok) return response.json(); \n })\n .then((lists) => {\n localStorage.setItem(STORES.CACHED_LISTS, JSON.stringify(lists));\n return lists; //could do a check so it doesn't rerender when cached list is the same as returned list... actually docs say this happens automagically\n });\n let userProfile = userLogin()\n .then((user) => {\n if (user.canPublish === undefined) {\n return fetch('https://api2.auburnalabama.org/pressrelease/canIPublish', { credentials: 'include' })\n .then((response) => { return {...user, canPublish: response.ok}; })\n .catch(() => {return {...user, canPublish: false }; });\n }\n });\n let everyoneFinish = await Promise.all([pressReleaseLists, userProfile]);\n return { pressReleaseLists: everyoneFinish[0], userProfile: everyoneFinish[1] };\n }\n \n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n}\n\nexport default App;\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 http://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.1/8 is 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\nexport function register(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 http://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, 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 http://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, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\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.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\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: http://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}