{"version":3,"file":"proofreader-rkKQDkG1.js","sources":["../../../client/app/bundles/Proofreader/helpers/getParameterByName.ts","../../../client/app/bundles/Proofreader/actions/actionTypes.ts","../../../client/app/bundles/Proofreader/lib/sessions_api.ts","../../../client/app/bundles/Proofreader/actions/session.ts","../../../client/app/bundles/Proofreader/components/Header.tsx","../../../client/app/bundles/Proofreader/components/PageLayout.tsx","../../../client/app/bundles/Proofreader/lib/proofreader_activities_api.ts","../../../client/app/bundles/Proofreader/actions/proofreaderActivities.ts","../../../client/app/bundles/Proofreader/components/admin/tabLink.tsx","../../../client/app/bundles/Proofreader/actions/concepts.ts","../../../client/app/bundles/Proofreader/components/concepts/concepts.tsx","../../../client/app/bundles/Proofreader/components/lessons/editGenerator.tsx","../../../client/app/bundles/Proofreader/components/lessons/lessonForm.tsx","../../../client/node_modules/sbd/lib/sanitize-html-browser.js","../../../client/node_modules/sbd/lib/stringHelper.js","../../../client/node_modules/sbd/lib/Match.js","../../../client/node_modules/sbd/lib/tokenizer.js","../../../client/app/bundles/Proofreader/components/proofreaderActivities/earlySubmitModal.tsx","../../../client/app/bundles/Proofreader/components/proofreaderActivities/followupModal.tsx","../../../client/app/bundles/Proofreader/components/proofreaderActivities/formatInitialPassage.ts","../../../client/app/bundles/Proofreader/components/proofreaderActivities/editInput.tsx","../../../client/app/bundles/Proofreader/components/proofreaderActivities/paragraph.tsx","../../../client/app/bundles/Proofreader/helpers/determineUnnecessaryEditType.ts","../../../client/app/bundles/Proofreader/components/proofreaderActivities/editTooltip.tsx","../../../client/app/bundles/Proofreader/components/proofreaderActivities/edit.tsx","../../../client/app/bundles/Proofreader/components/proofreaderActivities/sharedRegexes.ts","../../../client/app/bundles/Proofreader/components/proofreaderActivities/passageReviewer.tsx","../../../client/app/bundles/Proofreader/components/proofreaderActivities/progressBar.tsx","../../../client/app/bundles/Proofreader/components/proofreaderActivities/resetModal.tsx","../../../client/app/bundles/Proofreader/components/proofreaderActivities/reviewModal.tsx","../../../client/app/bundles/Proofreader/components/proofreaderActivities/welcomePage.tsx","../../../client/app/bundles/Proofreader/helpers/EditCaretPositioning.ts","../../../client/app/bundles/Proofreader/components/shared/loading_spinner.tsx","../../../client/app/bundles/Proofreader/components/proofreaderActivities/container.tsx","../../../client/app/bundles/Proofreader/components/lessons/lesson.tsx","../../../client/app/bundles/Proofreader/components/shared/linkListItem.tsx","../../../client/app/bundles/Proofreader/components/lessons/lessons.tsx","../../../client/app/bundles/Proofreader/components/admin/admin.tsx","../../../client/app/bundles/Proofreader/routes.tsx","../../../client/app/bundles/Proofreader/actions/actions.ts","../../../client/app/bundles/Proofreader/reducers/conceptsReducer.ts","../../../client/app/bundles/Proofreader/reducers/proofreaderActivitiesReducer.ts","../../../client/app/bundles/Proofreader/reducers/sessionReducer.ts","../../../client/app/bundles/Proofreader/reducers/rootReducer.ts","../../../client/app/bundles/Proofreader/store/configStore.ts","../../../client/app/bundles/Proofreader/App.tsx","../../../client/app/bundles/Proofreader/clientRegistration.js"],"sourcesContent":["export default function getParameterByName(name: string, url: string) {\n if (!url) { url = window.location.href; }\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\n const regex = new RegExp(`[?&]${name}(=([^&#]*)|&|#|$)`),\n results = regex.exec(url);\n if (!results) { return null; }\n if (!results[2]) { return ''; }\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n}\n","export const ActionTypes = {\n // INIT STORE\n INIT_STORE: 'INIT_STORE',\n\n // PROOFREADER ACTIVITIES\n RECEIVE_PROOFREADER_ACTIVITY_DATA: 'RECEIVE_PROOFREADER_ACTIVITY_DATA',\n NO_PROOFREADER_ACTIVITY_FOUND: 'NO_PROOFREADER_ACTIVITY_FOUND',\n RECEIVE_PROOFREADER_ACTIVITIES_DATA: 'RECEIVE_PROOFREADER_ACTIVITIES_DATA',\n NO_PROOFREADER_ACTIVITIES_FOUND: 'NO_PROOFREADER_ACTIVITIES_FOUND',\n TOGGLE_LESSON_FORM: 'TOGGLE_LESSON_FORM',\n AWAIT_NEW_LESSON_RESPONSE: 'AWAIT_NEW_LESSON_RESPONSE',\n RECEIVE_NEW_LESSON_RESPONSE: 'RECEIVE_NEW_LESSON_RESPONSE',\n START_LESSON_EDIT: 'START_LESSON_EDIT',\n SUBMIT_LESSON_EDIT: 'SUBMIT_LESSON_EDIT',\n FINISH_LESSON_EDIT: 'FINISH_LESSON_EDIT',\n EDITING_LESSON: 'EDITING_LESSON',\n SUBMITTING_LESSON: 'SUBMITTING_LESSON',\n\n // QUESTIONS\n SUBMIT_EDIT: 'SUBMIT_RESPONSE',\n\n // SESSIONS\n SET_FIREBASE_PASSAGE: 'SET_FIREBASE_PASSAGE',\n SET_PASSAGE: 'SET_PASSAGE',\n SET_TIMETRACKING: 'SET_TIMETRACKING',\n\n // CONCEPTS,\n RECEIVE_CONCEPTS_DATA: 'RECEIVE_CONCEPTS_DATA',\n\n // DISPLAY\n DISPLAY_ERROR: 'DISPLAY_ERROR',\n DISPLAY_MESSAGE: 'DISPLAY_MESSAGE',\n CLEAR_DISPLAY_MESSAGE_AND_ERROR: 'CLEAR_DISPLAY_MESSAGE_AND_ERROR',\n};\n","import { requestGet, requestPut } from '../../../modules/request/index';\n\nconst sessionApiBaseUrl = `${window.postbuildEnv.DEFAULT_URL}/api/v1/active_activity_sessions`;\n\nclass SessionApi {\n static get(uid: string): Promise {\n return requestGet(`${sessionApiBaseUrl}/${uid}.json`, null, (error) => {throw(error)});\n }\n\n static update(uid: string, data: object): Promise {\n return requestPut(`${sessionApiBaseUrl}/${uid}.json`, {active_activity_session: data}, null, (error) => {throw(error)});\n }\n}\n\nexport {\n SessionApi,\n sessionApiBaseUrl\n};\n\n","import { v4 as uuid } from 'uuid';\n\nimport { ActionTypes } from './actionTypes';\n\nimport { ConceptResultObject, WordObject } from '../interfaces/proofreaderActivities';\nimport { SessionApi } from '../lib/sessions_api';\n\nexport const updateSessionOnFirebase = (sessionID: string, session: { passage: Array>|undefined, timeTracking: { [key:string]: number } }, callback: Function) => {\n return (dispatch: Function) => {\n SessionApi.update(sessionID, session).then(() => {\n dispatch(setSessionReducerToSavedSession(sessionID))\n if (callback) {\n callback()\n }\n })\n }\n}\n\nexport const updateConceptResultsOnFirebase = (sessionID: string|null, activityUID: string, sessionObj: { conceptResults: ConceptResultObject[], timeTracking: {[key:string]: number} } ) => {\n if (!sessionID) {\n sessionID = uuid()\n }\n SessionApi.update(sessionID, { ...sessionObj, activityUID, anonymous: !sessionID })\n return sessionID\n}\n\nexport const setSessionReducerToSavedSession = (sessionID: string, initialLoad?: boolean) => {\n return (dispatch: Function) => {\n SessionApi.get(sessionID).then((session) => {\n handleSession(session, initialLoad, sessionID, dispatch)\n })\n }\n}\n\nconst handleSession = (session, initialLoad, sessionID, dispatch) => {\n if (session && !session.error) {\n if (session.conceptResults && initialLoad) {\n window.location.href = `${window.postbuildEnv.QUILL_GRAMMAR_URL}/play/sw?proofreaderSessionId=${sessionID}`\n } else {\n dispatch(setSessionReducer(session.passage))\n dispatch(updateTimeTracking(session.timeTracking))\n }\n }\n}\n\nexport const setSessionReducer = (passage: string) => {\n return (dispatch: Function) => {\n dispatch({ type: ActionTypes.SET_FIREBASE_PASSAGE, passage})\n }\n}\n\nexport const setPassage = (passage: Array>) => {\n return (dispatch: Function) => {\n dispatch({ type: ActionTypes.SET_PASSAGE, passage})\n }\n}\n\nexport const updateTimeTracking = (timeTracking: {[key:string]: number}) => {\n return (dispatch: Function) => {\n dispatch({ type: ActionTypes.SET_TIMETRACKING, timeTracking})\n }\n}\n","import * as React from \"react\";\nimport { connect } from \"react-redux\";\nimport * as Redux from \"redux\";\nimport '../styles/headerStyling.scss';\n\nimport getParameterByName from '../helpers/getParameterByName';\n\nconst quillLogoSrc = `${window.postbuildEnv.CDN_URL}/images/logos/quill-logo-white-2022.svg`\n\nimport {\n updateSessionOnFirebase,\n} from \"../actions/session\";\n\nclass Header extends React.Component {\n constructor(props: any) {\n super(props)\n\n this.state = {\n firebaseSessionID: getParameterByName('student', window.location.href)\n }\n }\n\n goToLMS = () => {\n window.location.href = `${window.postbuildEnv.DEFAULT_URL}`\n }\n\n handleSaveAndExitClick = () => {\n const { session, dispatch, } = this.props\n const { firebaseSessionID, } = this.state\n if (firebaseSessionID) {\n const { passage, timeTracking, } = session\n dispatch(updateSessionOnFirebase(firebaseSessionID, { passage, timeTracking, }, this.goToLMS))\n } else {\n this.goToLMS()\n }\n }\n\n render() {\n return (\n
\n
\n \"Quill\n \n
\n
\n );\n }\n};\n\nconst mapStateToProps = (state: any) => {\n return {\n session: state.session\n };\n};\n\nconst mapDispatchToProps = (dispatch: Redux.Dispatch) => {\n return {\n dispatch\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Header)\n","import * as React from \"react\";\nimport { renderRoutes } from \"react-router-config\";\nimport { routes } from \"../routes\";\nimport Header from \"./Header\";\n\nimport { ScreenreaderInstructions, } from '../../Shared/index';\n\nexport default class PageLayout extends React.Component {\n constructor(props: any) {\n super(props)\n\n this.state = { showFocusState: false }\n }\n\n componentDidMount() {\n document.addEventListener('keydown', this.handleKeyDown)\n }\n\n componentWillUnmount() {\n document.removeEventListener('keydown', this.handleKeyDown)\n }\n\n handleKeyDown = (e: any) => {\n if (e.key !== 'Tab') { return }\n\n const { showFocusState, } = this.state\n\n if (showFocusState) { return }\n\n this.setState({ showFocusState: true })\n }\n\n handleSkipToMainContentClick = () => {\n const element = document.getElementById(\"main-content\")\n if (!element) { return }\n element.focus()\n element.scrollIntoView()\n }\n\n handleSkipToPassageButtonsClick = () => {\n const element = document.getElementById(\"button-container\")\n if (!element) { return }\n element.focus()\n element.scrollIntoView(false)\n }\n\n render() {\n const { showFocusState, } = this.state\n let className = \"ant-layout activity-container \"\n className += showFocusState ? '' : 'hide-focus-outline'\n const header = window.location.href.includes('play') ?
: null\n return (\n
\n
\n \n \n \n {header}\n
{renderRoutes(routes)}
\n
\n
\n );\n }\n};\n","import { requestDelete, requestGet, requestPost, requestPut } from '../../../modules/request/index';\nimport { ProofreaderActivities, ProofreaderActivity } from '../interfaces/proofreaderActivities';\n\nconst PROOFREADER_PASSAGE_TYPE = 'proofreader_passage'\n\nconst lessonApiBaseUrl = `${window.postbuildEnv.DEFAULT_URL}/api/v1/lessons`;\n\nclass ProofreaderPassageApi {\n static getAll(): Promise> {\n return requestGet(`${lessonApiBaseUrl}.json?lesson_type=${PROOFREADER_PASSAGE_TYPE}`, null, (error) => {throw(error)});\n }\n\n static get(uid: string): Promise {\n return requestGet(`${lessonApiBaseUrl}/${uid}.json`, null, (error) => {throw(error)});\n }\n\n static create(data: ProofreaderActivity): Promise {\n return requestPost(`${lessonApiBaseUrl}.json?lesson_type=${PROOFREADER_PASSAGE_TYPE}`, {lesson: data}, null, (error) => {throw(error)});\n }\n\n static update(uid: string, data: ProofreaderActivity): Promise {\n return requestPut(`${lessonApiBaseUrl}/${uid}.json`, {lesson: data}, null, (error) => {throw(error)});\n }\n\n static remove(uid: string): Promise {\n return requestDelete(`${lessonApiBaseUrl}/${uid}.json`, null, null, (error) => {throw(error)});\n }\n}\n\nexport {\n PROOFREADER_PASSAGE_TYPE, ProofreaderPassageApi, lessonApiBaseUrl\n};\n\n","import * as _ from 'lodash';\nimport { push } from 'react-router-redux';\n\nimport { ActionTypes } from './actionTypes';\n\nimport { ProofreaderActivity } from '../interfaces/proofreaderActivities';\nimport { ProofreaderPassageApi } from '../lib/proofreader_activities_api';\n\nexport const startListeningToActivities = () => {\n return (dispatch: Function) => {\n ProofreaderPassageApi.getAll().then((activities) => {\n if (activities) {\n dispatch({ type: ActionTypes.RECEIVE_PROOFREADER_ACTIVITIES_DATA, data: activities, });\n } else {\n dispatch({ type: ActionTypes.NO_PROOFREADER_ACTIVITIES_FOUND })\n }\n });\n }\n}\n\nexport const getActivity = (activityUID: string) => {\n return (dispatch: Function) => {\n ProofreaderPassageApi.get(activityUID).then((activity) => {\n if (activity) {\n dispatch({ type: ActionTypes.RECEIVE_PROOFREADER_ACTIVITY_DATA, data: activity, });\n } else {\n dispatch({ type: ActionTypes.NO_PROOFREADER_ACTIVITY_FOUND })\n }\n });\n\n }\n}\n\nexport const toggleLessonForm = (value?: boolean) => {\n return { type: ActionTypes.TOGGLE_LESSON_FORM, showForm: value };\n}\n\nexport const submitNewLesson = (content: ProofreaderActivity) => {\n const cleanedContent = _.pickBy(content)\n return (dispatch: Function) => {\n dispatch({ type: ActionTypes.AWAIT_NEW_LESSON_RESPONSE, });\n ProofreaderPassageApi.create(cleanedContent).then((activity) => {\n const UID = Object.keys(question)[0];\n dispatch({ type: ActionTypes.RECEIVE_NEW_LESSON_RESPONSE, });\n dispatch({ type: ActionTypes.DISPLAY_MESSAGE, message: 'Submission successfully saved!', });\n const action = push(`/admin/lessons/${UID}`);\n dispatch(action);\n dispatch(startListeningToActivities());\n }).catch((error) => {\n dispatch({ type: ActionTypes.RECEIVE_NEW_LESSON_RESPONSE, });\n dispatch({ type: ActionTypes.DISPLAY_ERROR, error: `Submission failed! ${error}`, });\n })\n };\n}\n\nexport const startLessonEdit = (cid: string) => {\n return { type: ActionTypes.START_LESSON_EDIT, cid, };\n}\n\nexport const cancelLessonEdit = (cid: string) => {\n return { type: ActionTypes.FINISH_LESSON_EDIT, cid, };\n}\n\nexport const submitLessonEdit = (cid: string, content: ProofreaderActivity) => {\n return (dispatch: Function) => {\n dispatch({ type: ActionTypes.SUBMIT_LESSON_EDIT, cid, });\n const cleanedContent = _.pickBy(content)\n ProofreaderPassageApi.update(cid, cleanedContent).then((activity) => {\n dispatch({ type: ActionTypes.FINISH_LESSON_EDIT, cid, });\n dispatch({ type: ActionTypes.DISPLAY_MESSAGE, message: 'Update successfully saved!', });\n dispatch(startListeningToActivities());\n }).catch((error) => {\n dispatch({ type: ActionTypes.FINISH_LESSON_EDIT, cid, });\n dispatch({ type: ActionTypes.DISPLAY_ERROR, error: `Update failed! ${error}`, });\n })\n };\n}\n\nexport const deleteLesson = (cid: string) => {\n return (dispatch: Function) => {\n dispatch({ type: ActionTypes.SUBMIT_LESSON_EDIT, cid, });\n ProofreaderPassageApi.remove(cid).then((result) => {\n dispatch({ type: ActionTypes.FINISH_LESSON_EDIT, cid, });\n dispatch({ type: ActionTypes.DISPLAY_MESSAGE, message: 'Lesson successfully deleted!', });\n const action = push(`/admin/lessons`)\n dispatch(action)\n dispatch(startListeningToActivities());\n }).catch((error) => {\n dispatch({ type: ActionTypes.FINISH_LESSON_EDIT, cid, });\n dispatch({ type: ActionTypes.DISPLAY_ERROR, error: `Deletion failed! ${error}`, });\n })\n };\n}\n","import * as React from 'react';\nimport { NavLink } from 'react-router-dom';\n\nimport * as actions from '../../actions/proofreaderActivities';\n\nconst TabLink = ({ dispatch, to, children}) => {\n function handleClick (e) {\n if(e) {\n dispatch(actions.toggleLessonForm(false));\n }\n }\n return(\n
  • \n {children}\n
  • \n )\n};\n\nexport default TabLink\n","import * as _ from 'underscore';\n\nimport { ActionTypes } from './actionTypes';\n\nimport { requestGet, } from '../../../modules/request/index';\nimport { Concept } from '../interfaces/concepts';\n\nconst conceptsEndpoint = `${window.postbuildEnv.DEFAULT_URL}/api/v1/concepts.json`;\n\nfunction splitInLevels(concepts: Concept[]) {\n return _.groupBy(concepts, 'level');\n}\n\nfunction getParentName(concept: Concept, concepts: Concept[][]): string|void {\n const parent: Concept|undefined = concepts[1].find(c => c.id === concept.parent_id)\n if (parent) {\n const grandParent: Concept|undefined = concepts[2].find(c => c.id === parent.parent_id)\n if (grandParent) {\n return `${grandParent.name} | ${parent.name}`;\n }\n }\n}\nexport const startListeningToConcepts = () => {\n return (dispatch: Function) => {\n requestGet(conceptsEndpoint, (body) => {\n const concepts = splitInLevels(body.concepts);\n concepts['0'] = concepts['0'].map((concept: Concept) => {\n concept.displayName = `${getParentName(concept, concepts)} | ${concept.name}`;\n return concept;\n });\n dispatch({ type: ActionTypes.RECEIVE_CONCEPTS_DATA, data: concepts, });\n });\n };\n}\n","import * as React from 'react';\nimport { connect } from 'react-redux';\n// import LinkListItem from '../shared/linkListItem'\nimport { Concept } from '../../interfaces/concepts';\nimport { ConceptReducerState } from '../../reducers/conceptsReducer';\n\ninterface ConceptsProps {\n concepts: ConceptReducerState;\n}\n\nclass Concepts extends React.Component {\n constructor(props: ConceptsProps) {\n super(props)\n }\n\n renderConcepts() {\n const data = this.props.concepts.data[\"0\"];\n // const keys = _.keys(data[\"0\"]);\n if (data) {\n return data.sort((a: Concept, b: Concept) => a.displayName.localeCompare(b.displayName)).map((concept: Concept) =>\n (
  • {concept.displayName}
  • )\n )\n }\n }\n\n render() {\n return (\n
    \n
    \n \n
    \n
    \n )\n }\n}\n\nfunction select(state: any) {\n return {\n concepts: state.concepts,\n routing: state.routing\n }\n}\n\nfunction mergeProps(stateProps: Object, dispatchProps: Object, ownProps: Object) {\n return {...ownProps, ...stateProps, ...dispatchProps}\n}\n\nexport default connect(select, dispatch => ({dispatch}), mergeProps)(Concepts)\n","import * as React from 'react'\n\nimport { ConceptSelector, } from '../../../Shared/index'\n\nexport default class EditGenerator extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n displayText: '',\n correctText: '',\n }\n\n this.changeDisplayText = this.changeDisplayText.bind(this)\n this.changeCorrectText = this.changeCorrectText.bind(this)\n this.onClickSubmit = this.onClickSubmit.bind(this)\n this.changeConcept = this.changeConcept.bind(this)\n this.renderGeneratedEditTag = this.renderGeneratedEditTag.bind(this)\n }\n\n onClickSubmit() {\n const { correctText, displayText, conceptUID } = this.state\n const edit = `{+${correctText}-${displayText}|${conceptUID}}`\n this.setState({ generatedEdit: edit })\n }\n\n changeDisplayText(e) {\n this.setState({ displayText: e.target.value })\n }\n\n changeCorrectText(e) {\n this.setState({ correctText: e.target.value })\n }\n\n changeConcept(e) {\n this.setState({ conceptUID: e.value} )\n }\n\n renderGeneratedEditTag() {\n if (this.state.generatedEdit) {\n return (\n

    \n \n {this.state.generatedEdit}\n

    \n )\n }\n }\n\n render() {\n return (\n
    \n \n Fill in the inputs and press submit to generate a formatted edit tag you can copy and paste into the passage.\n
    \n

    \n \n \n

    \n

    \n \n If there are multiple correct edits, type them into the following field separated by a tilde (~). Example: if \"loves\" and \"adores\" are both correct, you would enter loves~adores.\n \n

    \n

    \n \n \n

    \n \n
    \n {this.renderGeneratedEditTag()}\n
    \n )\n }\n\n}\n","import * as React from 'react';\nimport { connect } from 'react-redux';\n\nimport EditGenerator from './editGenerator';\n\nimport { TextEditor, } from '../../../Shared/index';\nimport { ConceptReducerState } from '../../reducers/conceptsReducer';\n\ninterface LessonFormState {\n title: string;\n description: string;\n flag?: string;\n underlineErrorsInProofreader: boolean;\n passage: string;\n readingLevel?: string;\n}\n\ninterface LessonFormProps {\n submit: Function;\n concepts: ConceptReducerState;\n stateSpecificClass?: string;\n currentValues?: LessonFormState;\n lesson?: LessonFormState;\n returnToView: (e) => void;\n}\n\nexport class LessonForm extends React.Component {\n\n constructor(props: LessonFormProps) {\n super(props)\n\n const { currentValues, } = props\n\n this.state = {\n title: currentValues ? currentValues.title : '',\n description: currentValues ? currentValues.description || '' : '',\n flag: currentValues ? currentValues.flag : 'alpha',\n passage: currentValues ? currentValues.passage : '',\n underlineErrorsInProofreader: currentValues ? currentValues.underlineErrorsInProofreader : false,\n readingLevel: currentValues ? currentValues.readingLevel : ''\n }\n }\n\n handleSubmit = () => {\n const { submit } = this.props\n const { title, description, flag, passage, underlineErrorsInProofreader, readingLevel } = this.state\n const formattedPassage = passage.replace(/\\n/g, '
    ')\n submit({\n title,\n description,\n flag,\n passage: formattedPassage,\n underlineErrorsInProofreader,\n readingLevel\n });\n }\n\n handleTitleChange = (e: React.ChangeEvent<{value: string}>) => {\n this.setState({ title: e.target.value, });\n }\n\n handleReadingLevelChange = (e: React.ChangeEvent<{value: string}>) => {\n this.setState({ readingLevel: e.target.value, });\n }\n\n handleFlagSelect = (e: React.ChangeEvent<{value: string}>) => {\n this.setState({ flag: e.target.value, });\n }\n\n handleToggleUnderline = () => {\n const { underlineErrorsInProofreader } = this.state;\n this.setState({ underlineErrorsInProofreader: !underlineErrorsInProofreader });\n }\n\n onHandleDescriptionChange = (e: string) => {\n this.setState({ description: e, });\n }\n\n handlePassageChange = (e: React.ChangeEvent<{value: string}>) => {\n this.setState({ passage: e.target.value, });\n }\n\n render() {\n const { currentValues, returnToView, stateSpecificClass } = this.props;\n const { title, readingLevel, description, flag, underlineErrorsInProofreader, passage } = this.state;\n const addOrEdit = currentValues ? 'Edit' : 'Add';\n const buttonText = currentValues ? 'Return To Activity' : 'Return To Activities';\n return (\n
    \n
    \n \n
    \n

    {addOrEdit} Activity

    \n

    \n \n \n

    \n

    \n \n \n

    \n

    \n \n

    \n \n
    \n

    \n \n \n \n \n

    \n

    \n \n \n

    \n \n

    \n \n \n

    \n

    \n \n

    \n
    \n );\n }\n}\n\nfunction select(state) {\n return {\n concepts: state.concepts\n };\n}\n\nexport default connect(select)(LessonForm);\n","\r\nmodule.exports = function sanitizeHtml(text, opts) {\r\n // Strip HTML from Text using browser HTML parser\r\n if ((typeof text == 'string' || text instanceof String) && typeof document !== \"undefined\") {\r\n var $div = document.createElement(\"DIV\");\r\n $div.innerHTML = text;\r\n text = ($div.textContent || '').trim();\r\n }\r\n //DOM Object\r\n else if (typeof text === 'object' && text.textContent) {\r\n text = (text.textContent || '').trim();\r\n }\r\n\r\n return text;\r\n};\r\n","\r\nexports.endsWithChar = function ends_with_char(word, c) {\r\n if (c.length > 1) {\r\n return c.indexOf(word.slice(-1)) > -1;\r\n }\r\n\r\n return word.slice(-1) === c;\r\n};\r\n\r\nexports.endsWith = function ends_with(word, end) {\r\n return word.slice(word.length - end.length) === end;\r\n};","var abbreviations;\r\n\r\nvar englishAbbreviations = [\r\n \"al\",\r\n \"adj\",\r\n \"assn\",\r\n \"Ave\",\r\n \"BSc\", \"MSc\",\r\n \"Cell\",\r\n \"Ch\",\r\n \"Co\",\r\n \"cc\",\r\n \"Corp\",\r\n \"Dem\",\r\n \"Dept\",\r\n \"ed\",\r\n \"eg\",\r\n \"Eq\",\r\n \"Eqs\",\r\n \"est\",\r\n \"est\",\r\n \"etc\",\r\n \"Ex\",\r\n \"ext\", // + number?\r\n \"Fig\",\r\n \"fig\",\r\n \"Figs\",\r\n \"figs\",\r\n \"i.e\",\r\n \"ie\",\r\n \"Inc\",\r\n \"inc\",\r\n \"Jan\",\"Feb\",\"Mar\",\"Apr\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Sept\",\"Oct\",\"Nov\",\"Dec\",\r\n \"jr\",\r\n \"mi\",\r\n \"Miss\", \"Mrs\", \"Mr\", \"Ms\",\r\n \"Mol\",\r\n \"mt\",\r\n \"mts\",\r\n \"no\",\r\n \"Nos\",\r\n \"PhD\", \"MD\", \"BA\", \"MA\", \"MM\",\r\n \"pl\",\r\n \"pop\",\r\n \"pp\",\r\n \"Prof\", \"Dr\",\r\n \"pt\",\r\n \"Ref\",\r\n \"Refs\",\r\n \"Rep\",\r\n \"repr\",\r\n \"rev\",\r\n \"Sec\",\r\n \"Secs\",\r\n \"Sgt\", \"Col\", \"Gen\", \"Rep\", \"Sen\",'Gov', \"Lt\", \"Maj\", \"Capt\",\"St\",\r\n \"Sr\", \"sr\", \"Jr\", \"jr\", \"Rev\",\r\n \"Sun\",\"Mon\",\"Tu\",\"Tue\",\"Tues\",\"Wed\",\"Th\",\"Thu\",\"Thur\",\"Thurs\",\"Fri\",\"Sat\",\r\n \"trans\",\r\n \"Univ\",\r\n \"Viz\",\r\n \"Vol\",\r\n \"vs\",\r\n \"v\",\r\n];\r\n\r\nexports.setAbbreviations = function(abbr) {\r\n if (abbr) {\r\n abbreviations = abbr;\r\n } else {\r\n abbreviations = englishAbbreviations;\r\n }\r\n}\r\n\r\nvar isCapitalized = exports.isCapitalized = function(str) {\r\n return /^[A-Z][a-z].*/.test(str) || isNumber(str);\r\n}\r\n\r\n// Start with opening quotes or capitalized letter\r\nexports.isSentenceStarter = function(str) {\r\n return isCapitalized(str) || /``|\"|'/.test(str.substring(0,2));\r\n}\r\n\r\nexports.isCommonAbbreviation = function(str) {\r\n var noSymbols = str.replace(/[-'`~!@#$%^&*()_|+=?;:'\",.<>\\{\\}\\[\\]\\\\\\/]/gi, \"\");\r\n\r\n return ~abbreviations.indexOf(noSymbols);\r\n}\r\n\r\n// This is going towards too much rule based\r\nexports.isTimeAbbreviation = function(word, next) {\r\n if (word === \"a.m.\" || word === \"p.m.\") {\r\n var tmp = next.replace(/\\W+/g, '').slice(-3).toLowerCase();\r\n\r\n if (tmp === \"day\") {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexports.isDottedAbbreviation = function(word) {\r\n var matches = word.replace(/[\\(\\)\\[\\]\\{\\}]/g, '').match(/(.\\.)*/);\r\n return matches && matches[0].length > 0;\r\n}\r\n\r\n// TODO look for next words, if multiple are capitalized,\r\n// then it's probably not a sentence ending\r\nexports.isCustomAbbreviation = function(str) {\r\n if (str.length <= 3) {\r\n return true;\r\n }\r\n\r\n return isCapitalized(str);\r\n}\r\n\r\n// Uses current word count in sentence and next few words to check if it is\r\n// more likely an abbreviation + name or new sentence.\r\nexports.isNameAbbreviation = function(wordCount, words) {\r\n if (words.length > 0) {\r\n if (wordCount < 5 && words[0].length < 6 && isCapitalized(words[0])) {\r\n return true;\r\n }\r\n\r\n var capitalized = words.filter(function(str) {\r\n return /[A-Z]/.test(str.charAt(0));\r\n });\r\n\r\n return capitalized.length >= 3;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nvar isNumber = exports.isNumber = function(str, dotPos) {\r\n if (dotPos) {\r\n str = str.slice(dotPos-1, dotPos+2);\r\n }\r\n\r\n return !isNaN(str);\r\n};\r\n\r\n// Phone number matching\r\n// http://stackoverflow.com/a/123666/951517\r\nexports.isPhoneNr = function(str) {\r\n return str.match(/^(?:(?:\\+?1\\s*(?:[.-]\\s*)?)?(?:\\(\\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\\s*\\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\\s*(?:[.-]\\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\\s*(?:[.-]\\s*)?([0-9]{4})(?:\\s*(?:#|x\\.?|ext\\.?|extension)\\s*(\\d+))?$/);\r\n};\r\n\r\n// Match urls / emails\r\n// http://stackoverflow.com/a/3809435/951517\r\nexports.isURL = function(str) {\r\n return str.match(/[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)/);\r\n};\r\n\r\n// Starting a new sentence if beginning with capital letter\r\n// Exception: The word is enclosed in brackets\r\nexports.isConcatenated = function(word) {\r\n var i = 0;\r\n\r\n if ((i = word.indexOf(\".\")) > -1 ||\r\n (i = word.indexOf(\"!\")) > -1 ||\r\n (i = word.indexOf(\"?\")) > -1)\r\n {\r\n var c = word.charAt(i + 1);\r\n\r\n // Check if the next word starts with a letter\r\n if (c.match(/[a-zA-Z].*/)) {\r\n return [word.slice(0, i), word.slice(i+1)];\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexports.isBoundaryChar = function(word) {\r\n return word === \".\" ||\r\n word === \"!\" ||\r\n word === \"?\";\r\n};\r\n","/*jshint node:true, laxcomma:true */\r\n\r\nvar sanitizeHtml = require(\"sanitize-html\");\r\n\r\nvar stringHelper = require(\"./stringHelper\");\r\nvar Match = require(\"./Match\");\r\n\r\nvar newline_placeholder = \" @~@ \";\r\nvar newline_placeholder_t = newline_placeholder.trim();\r\n\r\n\r\nvar whiteSpaceCheck = new RegExp(\"\\\\S\", \"\");\r\nvar addNewLineBoundaries = new RegExp(\"\\\\n+|[-#=_+*]{4,}\", \"g\");\r\nvar splitIntoWords = new RegExp(\"\\\\S+|\\\\n\", \"g\");\r\n\r\n\r\n// Split the entry into sentences.\r\nexports.sentences = function(text, user_options) {\r\n if (!text || typeof text !== \"string\" || !text.length) {\r\n return [];\r\n }\r\n\r\n if (!whiteSpaceCheck.test(text)) {\r\n // whitespace-only string has no sentences\r\n return [];\r\n }\r\n\r\n var options = {\r\n \"newline_boundaries\" : false,\r\n \"html_boundaries\" : false,\r\n \"html_boundaries_tags\": [\"p\",\"div\",\"ul\",\"ol\"],\r\n \"sanitize\" : false,\r\n \"allowed_tags\" : false,\r\n \"preserve_whitespace\" : false,\r\n \"abbreviations\" : null\r\n };\r\n\r\n if (typeof user_options === \"boolean\") {\r\n // Deprecated quick option\r\n options.newline_boundaries = true;\r\n }\r\n else {\r\n // Extend options\r\n for (var k in user_options) {\r\n options[k] = user_options[k];\r\n }\r\n }\r\n\r\n Match.setAbbreviations(options.abbreviations);\r\n\r\n if (options.newline_boundaries) {\r\n text = text.replace(addNewLineBoundaries, newline_placeholder);\r\n }\r\n\r\n if (options.html_boundaries) {\r\n var html_boundaries_regexp = \"(|<\\\\/(\" + options.html_boundaries_tags.join(\"|\") + \")>)\";\r\n var re = new RegExp(html_boundaries_regexp, \"g\");\r\n text = text.replace(re, \"$1\" + newline_placeholder);\r\n }\r\n\r\n if (options.sanitize || options.allowed_tags) {\r\n if (! options.allowed_tags) {\r\n options.allowed_tags = [\"\"];\r\n }\r\n\r\n text = sanitizeHtml(text, { \"allowedTags\" : options.allowed_tags });\r\n }\r\n\r\n\r\n // Split the text into words\r\n var words;\r\n var tokens;\r\n\r\n // Split the text into words\r\n if (options.preserve_whitespace) {\r\n //
    tags are the odd man out, as whitespace is allowed inside the tag\r\n tokens = text.split(/(|\\S+|\\n+)/);\r\n\r\n // every other token is a word\r\n words = tokens.filter(function (token, ii) {\r\n return ii % 2;\r\n });\r\n }\r\n else {\r\n // - see http://blog.tompawlak.org/split-string-into-tokens-javascript\r\n words = text.trim().match(splitIntoWords);\r\n }\r\n\r\n\r\n var wordCount = 0;\r\n var index = 0;\r\n var temp = [];\r\n var sentences = [];\r\n var current = [];\r\n\r\n // If given text is only whitespace (or nothing of \\S+)\r\n if (!words || !words.length) {\r\n return [];\r\n }\r\n\r\n for (var i=0, L=words.length; i < L; i++) {\r\n wordCount++;\r\n\r\n // Add the word to current sentence\r\n current.push(words[i]);\r\n\r\n // Sub-sentences, reset counter\r\n if (~words[i].indexOf(\",\")) {\r\n wordCount = 0;\r\n }\r\n\r\n if (Match.isBoundaryChar(words[i]) || stringHelper.endsWithChar(words[i], \"?!\") || words[i] === newline_placeholder_t) {\r\n if ((options.newline_boundaries || options.html_boundaries) && words[i] === newline_placeholder_t) {\r\n current.pop();\r\n }\r\n\r\n sentences.push(current);\r\n\r\n wordCount = 0;\r\n current = [];\r\n\r\n continue;\r\n }\r\n\r\n\r\n if (stringHelper.endsWithChar(words[i], \"\\\"\") || stringHelper.endsWithChar(words[i], \"”\")) {\r\n words[i] = words[i].slice(0, -1);\r\n }\r\n\r\n // A dot might indicate the end sentences\r\n // Exception: The next sentence starts with a word (non abbreviation)\r\n // that has a capital letter.\r\n if (stringHelper.endsWithChar(words[i], \".\")) {\r\n // Check if there is a next word\r\n // This probably needs to be improved with machine learning\r\n if (i+1 < L) {\r\n // Single character abbr.\r\n if (words[i].length === 2 && isNaN(words[i].charAt(0))) {\r\n continue;\r\n }\r\n\r\n // Common abbr. that often do not end sentences\r\n if (Match.isCommonAbbreviation(words[i])) {\r\n continue;\r\n }\r\n\r\n // Next word starts with capital word, but current sentence is\r\n // quite short\r\n if (Match.isSentenceStarter(words[i+1])) {\r\n if (Match.isTimeAbbreviation(words[i], words[i+1])) {\r\n continue;\r\n }\r\n\r\n // Dealing with names at the start of sentences\r\n if (Match.isNameAbbreviation(wordCount, words.slice(i, 6))) {\r\n continue;\r\n }\r\n\r\n if (Match.isNumber(words[i+1])) {\r\n if (Match.isCustomAbbreviation(words[i])) {\r\n continue;\r\n }\r\n }\r\n }\r\n else {\r\n // Skip ellipsis\r\n if (stringHelper.endsWith(words[i], \"..\")) {\r\n continue;\r\n }\r\n\r\n //// Skip abbreviations\r\n // Short words + dot or a dot after each letter\r\n if (Match.isDottedAbbreviation(words[i])) {\r\n continue;\r\n }\r\n\r\n if (Match.isNameAbbreviation(wordCount, words.slice(i, 5))) {\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n sentences.push(current);\r\n current = [];\r\n wordCount = 0;\r\n\r\n continue;\r\n }\r\n\r\n // Check if the word has a dot in it\r\n if ((index = words[i].indexOf(\".\")) > -1) {\r\n if (Match.isNumber(words[i], index)) {\r\n continue;\r\n }\r\n\r\n // Custom dotted abbreviations (like K.L.M or I.C.T)\r\n if (Match.isDottedAbbreviation(words[i])) {\r\n continue;\r\n }\r\n\r\n // Skip urls / emails and the like\r\n if (Match.isURL(words[i]) || Match.isPhoneNr(words[i])) {\r\n continue;\r\n }\r\n }\r\n\r\n if (temp = Match.isConcatenated(words[i])) {\r\n current.pop();\r\n current.push(temp[0]);\r\n sentences.push(current);\r\n\r\n current = [];\r\n wordCount = 0;\r\n current.push(temp[1]);\r\n }\r\n }\r\n\r\n if (current.length) {\r\n sentences.push(current);\r\n }\r\n\r\n\r\n // Clear \"empty\" sentences\r\n sentences = sentences.filter(function(s) {\r\n return s.length > 0;\r\n });\r\n\r\n var result = sentences.slice(1).reduce(function (out, sentence) {\r\n var lastSentence = out[out.length - 1];\r\n\r\n // Single words, could be \"enumeration lists\"\r\n if (lastSentence.length === 1 && /^.{1,2}[.]$/.test(lastSentence[0])) {\r\n // Check if there is a next sentence\r\n // It should not be another list item\r\n if (!/[.]/.test(sentence[0])) {\r\n out.pop()\r\n out.push(lastSentence.concat(sentence));\r\n return out;\r\n }\r\n }\r\n\r\n out.push(sentence);\r\n\r\n return out;\r\n }, [ sentences[0] ]);\r\n\r\n // join tokens back together\r\n return result.map(function (sentence, ii) {\r\n if (options.preserve_whitespace && !options.newline_boundaries && !options.html_boundaries) {\r\n // tokens looks like so: [leading-space token, non-space token, space\r\n // token, non-space token, space token... ]. In other words, the first\r\n // item is the leading space (or the empty string), and the rest of\r\n // the tokens are [non-space, space] token pairs.\r\n var tokenCount = sentence.length * 2;\r\n\r\n if (ii === 0) {\r\n tokenCount += 1;\r\n }\r\n\r\n return tokens.splice(0, tokenCount).join(\"\");\r\n }\r\n\r\n return sentence.join(\" \");\r\n });\r\n};\r\n","import * as React from 'react'\n\ninterface EarlySubmitModalProps {\n closeModal: any,\n requiredEditCount: number\n}\n\nexport default class EarlySubmitModal extends React.Component {\n componentDidMount() {\n this.modal.focus()\n }\n\n render() {\n const { requiredEditCount, closeModal, } = this.props\n return (\n
    this.modal = node} tabIndex={-1}>\n
    \n
    \n
    \n

    Keep looking! You must make at least {requiredEditCount} edits.

    \n \n
    \n
    \n
    \n )\n }\n}\n","import * as React from 'react'\n\ninterface FollowupModalProps {\n goToLMS: any,\n goToFollowupPractice: any\n}\n\nexport default class FollowupModal extends React.Component {\n componentDidMount() {\n this.modal.focus()\n }\n\n render() {\n const { goToLMS, goToFollowupPractice, } = this.props\n return (\n
    this.modal = node} tabIndex={-1}>\n
    \n
    \n
    \n

    That's the end of this passage! Now let's do some follow-up practice.

    \n
    \n
    \n \n \n
    \n
    \n
    \n )\n }\n}\n","import * as _ from 'lodash';\n\nconst formatInitialPassage = (passage: string) => {\n passage = passage.replace(/'/g, \"'\").replace(/"/g, '\"')\n const necessaryEdits = passage.match(/{\\+[^-]+-[^|]+\\|[^}]*}/g)\n const necessaryEditRegex = /\\+[^-]+-[^|]+\\|[^}]*/\n const correctEditRegex = /\\+([^-]+)-/m\n const originalTextRegex = /\\-([^|]+)\\|/m\n const conceptUIDRegex = /\\|([^}]+)/m\n const paragraphs = passage.replace('

    ', '
    ').replace(/

    |<\\/p>/g, '').split('
    ')\n let necessaryEditCounter = 0\n let paragraphIndex = 0\n const passageArray = paragraphs.map((paragraph: string) => {\n if (paragraph.length === 0) {\n return null\n }\n let i = 0\n const paragraphArray = paragraph.split(/{|}/).map((text) => {\n let wordObj, wordArray\n if (necessaryEditRegex.test(text)) {\n wordObj = {\n originalText: text.match(originalTextRegex) ? text.match(originalTextRegex)[1] : '',\n currentText: text.match(originalTextRegex) ? text.match(originalTextRegex)[1] : '',\n necessaryEditIndex: necessaryEditCounter,\n conceptUID: text.match(conceptUIDRegex) ? text.match(conceptUIDRegex)[1] : '',\n correctText: text.match(correctEditRegex) ? text.match(correctEditRegex)[1] : '',\n underlined: true,\n wordIndex: i,\n paragraphIndex\n }\n wordArray = [wordObj]\n necessaryEditCounter+=1\n i+=1\n } else {\n wordArray = text.split(/\\s+/).map(word => {\n if (word.length === 0) {\n return null\n }\n wordObj = {\n originalText: word,\n currentText: word,\n correctText: word,\n underlined: false,\n wordIndex: i,\n paragraphIndex\n }\n i+=1\n return wordObj\n })\n }\n return wordArray.filter(Boolean)\n })\n paragraphIndex+=1\n return _.flatten(paragraphArray)\n })\n return {passage: passageArray.filter(Boolean), necessaryEdits}\n}\n\nexport default formatInitialPassage\n","import * as React from 'react';\nimport ContentEditable from 'react-contenteditable';\n\nimport { WordObject } from '../../interfaces/proofreaderActivities';\n\ntype EditInputProps = WordObject & { onWordChange: Function, numberOfResets: number, underlineErrors: boolean }\n\nexport default class EditInput extends React.Component {\n handleWordChange = (e: any) => {\n const { wordIndex, onWordChange } = this.props\n const stripHTML = e.target.value.replace(/<\\/?[^>]+(>|$)/g, '').replace(/ /g, ' ')\n onWordChange(stripHTML, wordIndex, this.editInput)\n }\n\n setEditInputRef = node => this.editInput = node\n\n render() {\n const { currentText, originalText, underlined, wordIndex, paragraphIndex, numberOfResets, underlineErrors} = this.props\n const beforeElements = []\n const afterElements = []\n let className = 'edit-input'\n if (underlined && underlineErrors) {\n className += ' underlined'\n // disabling tabIndex rule because this is a non-standard use case - since screenreader users will likely be using tab keys to navigate the passage, it is important that this information is discoverable in that mode\n /* eslint-disable jsx-a11y/no-noninteractive-tabindex */\n beforeElements.push((underlined text begins here))\n afterElements.push((underlined text ends here))\n /* eslint-enable jsx-a11y/no-noninteractive-tabindex */\n }\n if (currentText.trim() !== originalText) {\n className += ' bolded'\n // disabling tabIndex rule because this is a non-standard use case - since screenreader users will likely be using tab keys to navigate the passage, it is important that this information is discoverable in that mode\n /* eslint-disable jsx-a11y/no-noninteractive-tabindex */\n beforeElements.push((bolded text begins here))\n afterElements.push((bolded text ends here))\n /* eslint-enable jsx-a11y/no-noninteractive-tabindex */\n }\n const key = `${paragraphIndex}-${wordIndex}-${numberOfResets}`\n return (\n \n {beforeElements}\n \n {afterElements}\n \n )\n }\n}\n","import * as _ from 'lodash'\nimport * as React from 'react'\n\nimport EditInput from './editInput'\nimport { startsWithPunctuationRegex } from './sharedRegexes'\n\nimport { WordObject } from '../../interfaces/proofreaderActivities'\n\ninterface ParagraphProps {\n words: Array;\n handleParagraphChange: Function;\n numberOfResets: number;\n underlineErrors: Boolean;\n index: number;\n}\n\nexport default class Paragraph extends React.Component {\n constructor(props: ParagraphProps) {\n super(props)\n\n this.handleWordChange = this.handleWordChange.bind(this)\n this.renderInputFields = this.renderInputFields.bind(this)\n }\n\n handleWordChange(text: string, i: number, editInput: any) {\n const { words, handleParagraphChange, index } = this.props\n const newWords = _.cloneDeep(words)\n newWords[i]['currentText'] = text\n handleParagraphChange(newWords, index, editInput)\n }\n\n renderInputFields() {\n const { words, underlineErrors, numberOfResets, } = this.props\n let className = 'paragraph'\n if (!underlineErrors) {\n className += ' no-underline'\n }\n const inputs = words.map((word: WordObject, i: number) => {\n return (\n \n )})\n return

    {inputs}
    \n }\n\n render() {\n return this.renderInputFields()\n }\n}\n","interface UnnecessaryEditTypeResponse {\n matched: boolean,\n unnecessaryEditType: string,\n}\n\ntype UnnecessaryEditType = (originalText: string, editedText: string) => UnnecessaryEditTypeResponse;\n\nconst typeMatchers: UnnecessaryEditType[] = [\n unnecessarySpaceMatch,\n unnecessaryDeletionMatch,\n unnecessaryAdditionMatch\n];\n\nexport const UNNECESSARY_SPACE = 'unnecessarySpace'\nexport const MULTIPLE_UNNECESSARY_DELETION = 'multipleUnnecessaryDeletion'\nexport const SINGLE_UNNECESSARY_DELETION = 'singleUnnecessaryDeletion'\nexport const MULTIPLE_UNNECESSARY_ADDITION = 'multipleUnnecessaryAddition'\nexport const SINGLE_UNNECESSARY_ADDITION = 'singleUnnecessaryAddition'\nexport const UNNECESSARY_CHANGE = 'unnecessaryChange'\n\nexport default function determineUnnecessaryEditType(originalText: string, editedText: string): string {\n for (const t of typeMatchers) {\n const r = t(originalText, editedText)\n if (r.matched) {\n return r.unnecessaryEditType\n }\n }\n return UNNECESSARY_CHANGE\n}\n\nexport function unnecessarySpaceMatch(originalText: string, editedText: string): UnnecessaryEditTypeResponse {\n const response = { unnecessaryEditType: UNNECESSARY_SPACE, matched: false }\n const spaceRemovedOriginalText = removeSpaces(originalText)\n const spaceRemovedEditedText = removeSpaces(editedText)\n response.matched = ((spaceRemovedOriginalText === spaceRemovedEditedText) && (editedText.length > originalText.length))\n return response\n}\n\nexport function unnecessaryAdditionMatch(originalText: string, editedText: string): UnnecessaryEditTypeResponse {\n const response = { unnecessaryEditType: SINGLE_UNNECESSARY_ADDITION, matched: false }\n const editedTextWords = editedText.split(' ')\n const originalTextWords = originalText.split(' ')\n const editedTextContainsMoreWords = editedTextWords.length > originalTextWords.length\n const editedTextContainsAllOriginalWords = originalTextWords.every(word => editedTextWords.includes(word))\n if (editedTextContainsMoreWords && editedTextContainsAllOriginalWords) {\n response.matched = true\n response.unnecessaryEditType = editedTextWords.length - originalTextWords.length > 1 ? MULTIPLE_UNNECESSARY_ADDITION : SINGLE_UNNECESSARY_ADDITION\n }\n return response\n}\n\nexport function unnecessaryDeletionMatch(originalText: string, editedText: string): UnnecessaryEditTypeResponse {\n const response = { matched: false, unnecessaryEditType: SINGLE_UNNECESSARY_DELETION }\n const editedTextWords = editedText.split(' ').filter(word => word.length)\n const originalTextWords = originalText.split(' ').filter(word => word.length)\n const originalTextContainsMoreWords = editedTextWords.length < originalTextWords.length\n const originalTextContainsAllEditedWords = editedTextWords.every(word => originalTextWords.includes(word))\n if (originalTextContainsMoreWords && originalTextContainsAllEditedWords) {\n response.matched = true\n response.unnecessaryEditType = originalTextWords.length - editedTextWords.length > 1 ? MULTIPLE_UNNECESSARY_DELETION : SINGLE_UNNECESSARY_DELETION\n }\n return response\n}\n\nfunction removeSpaces(str: string) {\n return str.replace(/\\s+/g, '')\n}\n\nexport function unnecessarySpaceSplitResponse(originalText: string, editedText: string): string[] {\n const words = []\n let currentWord = ''\n // have to set index manually rather than using the built in one in `forEach` because sometimes we want to increase it by more than one\n let index = 0\n editedText.split('').forEach((letter, iteration) => {\n if (letter === originalText[index]) {\n currentWord+= letter\n index+=1\n // if we are on the last iteration, we should push in the current word\n iteration === editedText.length - 1 ? words.push(currentWord) : null\n return\n }\n\n if (currentWord.length) {\n words.push(currentWord)\n currentWord = ''\n }\n words.push(`{+- |${UNNECESSARY_SPACE}}`)\n })\n return words\n}\n","import * as React from 'react'\n\nimport useFocus from '../../../Shared/hooks/useFocus'\nimport {\n MULTIPLE_UNNECESSARY_ADDITION,\n MULTIPLE_UNNECESSARY_DELETION,\n SINGLE_UNNECESSARY_ADDITION,\n SINGLE_UNNECESSARY_DELETION,\n UNNECESSARY_CHANGE,\n UNNECESSARY_SPACE\n} from '../../helpers/determineUnnecessaryEditType'\n\nconst notNecessaryIconSrc = `${window.postbuildEnv.CDN_URL}/images/icons/review-not-necessary.svg`\nconst incorrectIconSrc = `${window.postbuildEnv.CDN_URL}/images/icons/review-incorrect.svg`\nconst correctIconSrc = `${window.postbuildEnv.CDN_URL}/images/icons/review-correct.svg`\n\nconst renderConceptExplanation = (concept) => {\n if (!(concept && concept.explanation)) { return }\n return (\n
    \n

    Explanation

    \n

    \n

    \n )\n}\n\nconst renderCorrectAnswers = (displayText) => {\n if (!displayText) { return }\n\n const correctAnswerArray = displayText ? displayText.split('~') : []\n const correctAnswers = correctAnswerArray.map(ca => {ca})\n const correctAnswerHTML =

    {correctAnswers}

    \n return (\n
    \n

    Correct

    \n {correctAnswerHTML}\n
    \n )\n}\n\nconst renderNotNecessaryExplanation = (state) => {\n const unnecessaryArray = [UNNECESSARY_SPACE, MULTIPLE_UNNECESSARY_DELETION, SINGLE_UNNECESSARY_DELETION, MULTIPLE_UNNECESSARY_ADDITION, SINGLE_UNNECESSARY_ADDITION, UNNECESSARY_CHANGE]\n if (!unnecessaryArray.includes(state)) { return }\n let explanation\n\n switch (state) {\n case UNNECESSARY_SPACE:\n explanation = 'You added an unnecessary space.'\n break\n case MULTIPLE_UNNECESSARY_DELETION:\n explanation = \"You took out words that weren't part of an error.\"\n break\n case SINGLE_UNNECESSARY_DELETION:\n explanation = \"You took out a word that wasn't part of an error.\"\n break\n case MULTIPLE_UNNECESSARY_ADDITION:\n explanation = \"You added unnecessary words.\"\n break\n case SINGLE_UNNECESSARY_ADDITION:\n explanation = \"You added an unnecessary word.\"\n break\n case SINGLE_UNNECESSARY_ADDITION:\n explanation = \"You added an unnecessary word.\"\n break\n case UNNECESSARY_CHANGE:\n explanation = 'You made an unnecessary change.'\n break\n }\n\n return

    {explanation}

    \n}\n\n\nconst EditTooltip = ({ state, id, tooltipHeight, back, numberOfEdits, next, index, displayText, concept, incorrectText, }) => {\n const [containerRef, setContainerFocus] = useFocus()\n\n React.useEffect(() => {\n setContainerFocus()\n }, [])\n\n let src, headerText\n switch (state) {\n case 'correct':\n src = correctIconSrc\n headerText = \"Correct\"\n break\n case 'incorrect':\n src = incorrectIconSrc\n headerText = \"Incorrect\"\n break\n case UNNECESSARY_SPACE:\n case MULTIPLE_UNNECESSARY_DELETION:\n case SINGLE_UNNECESSARY_DELETION:\n case MULTIPLE_UNNECESSARY_ADDITION:\n case SINGLE_UNNECESSARY_ADDITION:\n case UNNECESSARY_CHANGE:\n src = notNecessaryIconSrc\n headerText = \"Not necessary\"\n break\n }\n const parentElement = document.getElementById(id)\n const style = parentElement ? { top: `${parentElement.offsetTop + 5}px`, height: tooltipHeight } : {}\n const backButton = back ? :
    \n const nextButton = \n return (\n
    \n
    \n \"\"\n

    {headerText}

    \n
    \n
    \n {renderNotNecessaryExplanation(state)}\n

    The correct text was {displayText}. {incorrectText && `You submitted ${incorrectText === ' ' ? 'An empty space.' : incorrectText}.`}

    \n {renderCorrectAnswers(displayText)}\n {renderConceptExplanation(concept)}\n
    \n
    \n {backButton}\n
    {index + 1} of {numberOfEdits}
    \n {nextButton}\n
    \n
    \n )\n\n}\n\nexport default EditTooltip\n","import * as React from 'react';\n\nimport EditTooltip from './editTooltip';\n\nimport {\n MULTIPLE_UNNECESSARY_ADDITION,\n MULTIPLE_UNNECESSARY_DELETION,\n SINGLE_UNNECESSARY_ADDITION,\n SINGLE_UNNECESSARY_DELETION,\n UNNECESSARY_CHANGE,\n UNNECESSARY_SPACE\n} from '../../helpers/determineUnnecessaryEditType';\nimport { Concept } from '../../interfaces/concepts';\n\ninterface EditProps {\n displayText: string;\n state: string;\n concept: Concept|undefined;\n activeIndex: number;\n index: number;\n numberOfEdits: number;\n next: any;\n back?: Function;\n incorrectText: string|null;\n id: string;\n}\n\nconst OFFSET_FROM_TOP = 74\n\nfunction calculateHeight() {\n if (window.innerWidth > 800) {\n return '400px'\n }\n\n return `${window.innerHeight - OFFSET_FROM_TOP}px`\n}\n\nexport default class Edit extends React.Component {\n constructor(props: EditProps) {\n super(props)\n\n this.state = { mounting: true, tooltipHeight: calculateHeight() }\n }\n\n componentDidMount() {\n this.handleComponentBeingMounted()\n\n window.addEventListener('resize', this.handleResize)\n }\n\n handleResize = () => {\n this.setState({ tooltipHeight: calculateHeight() })\n }\n\n handleComponentBeingMounted = () => this.setState({ mounting: false, })\n\n renderTooltip() {\n const { mounting, tooltipHeight, } = this.state\n const { activeIndex, index, state, numberOfEdits, next, back, id, displayText, incorrectText, concept, } = this.props\n if (mounting || activeIndex !== index) { return }\n\n return (\n \n )\n }\n\n editClassName() {\n const { activeIndex, index, state, } = this.props\n let className = activeIndex === index ? 'active' : ''\n switch (state) {\n case 'correct':\n className += ' correct'\n break\n case 'incorrect':\n className += ' incorrect'\n break\n case UNNECESSARY_SPACE:\n case MULTIPLE_UNNECESSARY_DELETION:\n case SINGLE_UNNECESSARY_DELETION:\n case MULTIPLE_UNNECESSARY_ADDITION:\n case SINGLE_UNNECESSARY_ADDITION:\n case UNNECESSARY_CHANGE:\n className += ' unnecessary'\n break\n }\n return className\n }\n\n render() {\n const { id, incorrectText, displayText, } = this.props\n const tooltip = this.renderTooltip()\n return (\n
    \n {incorrectText || displayText}\n {tooltip}\n
    \n )\n }\n}\n","export const startsWithPunctuationRegex = /^[.,\\/#!$%\\^&\\*;:=\\-_`~)]/\n\nexport const isAnEditRegex = /{\\+([^|}]*)-([^|]*)\\|([^}]*)}/g\n\nexport const negativeMatchRegex = /\\-(.+)\\|/m\n","import * as React from 'react';\n\nimport Edit from './edit';\nimport { isAnEditRegex, negativeMatchRegex } from './sharedRegexes';\n\nimport {\n MULTIPLE_UNNECESSARY_ADDITION,\n MULTIPLE_UNNECESSARY_DELETION,\n SINGLE_UNNECESSARY_ADDITION,\n SINGLE_UNNECESSARY_DELETION,\n UNNECESSARY_CHANGE,\n UNNECESSARY_SPACE\n} from '../../helpers/determineUnnecessaryEditType';\nimport { Concept } from '../../interfaces/concepts';\n\nconst unnecessaryArray = [UNNECESSARY_SPACE, MULTIPLE_UNNECESSARY_DELETION, SINGLE_UNNECESSARY_DELETION, MULTIPLE_UNNECESSARY_ADDITION, SINGLE_UNNECESSARY_ADDITION, UNNECESSARY_CHANGE]\n\ninterface PassageReviewerProps {\n text: string;\n concepts: Concept[];\n finishReview: Function;\n}\n\ninterface PassageReviewerState {\n activeIndex: number;\n numberOfEdits: number;\n}\n\nexport default class PassageReviewer extends React.Component {\n constructor(props: PassageReviewerProps) {\n super(props)\n\n const matches = props.text ? props.text.match(isAnEditRegex) : []\n const numberOfEdits = matches ? matches.length : 0\n\n this.state = {\n activeIndex: 0,\n numberOfEdits\n }\n }\n\n componentDidMount() {\n this.scrollToActiveIndex()\n }\n\n next = () => {\n const { activeIndex, numberOfEdits } = this.state\n const { finishReview, } = this.props\n if (activeIndex + 1 === numberOfEdits) {\n finishReview()\n } else {\n this.setState(prevState => ({ activeIndex: prevState.activeIndex + 1}), this.scrollToActiveIndex)\n }\n }\n\n back = () => {\n const { activeIndex, } = this.state\n if (activeIndex === 0) { return }\n\n this.setState(prevState => ({ activeIndex: prevState.activeIndex - 1}), this.scrollToActiveIndex)\n }\n\n scrollToActiveIndex() {\n const { activeIndex, } = this.state\n const el = document.getElementById(String(activeIndex))\n if (el) {\n window.scrollTo(0, window.pageYOffset + el.getBoundingClientRect().top - 34)\n }\n }\n\n renderFormattedText() {\n const { text, concepts } = this.props\n const paragraphs = text.split('

    ')\n const { activeIndex, numberOfEdits } = this.state\n let index = 0\n return paragraphs.map((paragraph: string, paragraphIndex: number) => {\n const parts: Array = paragraph.replace(/

    |<\\/p>/g, '').split(/{|}/g)\n for (let i = 0; i < parts.length; i +=1) {\n if (typeof parts[i] === \"string\" && parts[i][0] === '+') {\n const plusMatch = parts[i].match(/\\+([^-]+)-/m)\n const plus = plusMatch ? plusMatch[1] : ''\n const conceptUIDMatch = parts[i].match(/\\|(.+)/m)\n const conceptUID = conceptUIDMatch ? conceptUIDMatch[1] : ''\n const negativeMatch = parts[i].match(negativeMatchRegex)\n const negative = negativeMatch ? negativeMatch[1] : null\n const concept = concepts.find(c => c.uid === conceptUID)\n const indexToPass = index\n let state = 'correct'\n if (unnecessaryArray.includes(conceptUID)) {\n state = conceptUID\n } else if (negative) {\n state = 'incorrect'\n }\n index+=1\n parts[i] = ()\n parts[i + 1] = `${parts[i + 1]}`\n }\n }\n return

    {parts}

    \n })\n }\n\n render() {\n const { text, } = this.props\n\n if (text) {\n return (\n
    \n
    \n {this.renderFormattedText()}\n
    \n
    \n )\n } else {\n return

    No passage

    \n }\n }\n\n}\n","import * as React from 'react';\n\ninterface ProgressBarProps {\n percent: number;\n answeredQuestionCount: number;\n questionCount: number;\n}\n\nconst ProgressBar = ({ percent, answeredQuestionCount, questionCount, }: ProgressBarProps) => (\n
    \n \n

    {answeredQuestionCount} of {questionCount} edits made

    \n
    )\n\nexport default ProgressBar\n","import * as React from 'react'\n\ninterface ResetModalProps {\n closeModal: any,\n reset: any\n}\n\nexport default class ResetModal extends React.Component {\n componentDidMount() {\n this.modal.focus()\n }\n\n render() {\n const { reset, closeModal, } = this.props\n return (\n
    this.modal = node} tabIndex={-1}>\n
    \n
    \n
    \n

    Reset the passage?

    \n

    This will undo all the edits you made and reset the passage to its original state.

    \n
    \n
    \n \n \n
    \n
    \n
    \n )\n }\n}\n","import * as React from 'react'\n\ninterface ReviewModalProps {\n closeModal: any,\n numberOfErrors: number,\n numberOfCorrectChanges: number\n}\n\nexport default class ReviewModal extends React.Component {\n componentDidMount() {\n this.modal.focus()\n }\n\n render() {\n const { closeModal, numberOfErrors, numberOfCorrectChanges, } = this.props\n const highScoreMessage = numberOfCorrectChanges > numberOfErrors / 2 ? \"Good work! \" : null\n return (\n
    this.modal = node} tabIndex={-1}>\n
    \n
    \n
    \n

    {highScoreMessage} You found {numberOfCorrectChanges} of {numberOfErrors} errors. Let's review your edits.

    \n \n
    \n
    \n
    \n )\n }\n}\n","import * as React from 'react'\n\nconst readExampleSrc = `${window.postbuildEnv.CDN_URL}/images/illustrations/proofreader-example-proofread.svg`\nconst reviewExampleSrc = `${window.postbuildEnv.CDN_URL}/images/illustrations/proofreader-example-review.svg`\nconst practiceExampleSrc = `${window.postbuildEnv.CDN_URL}/images/illustrations/proofreader-example-practice.svg`\n\nconst WelcomePage = ({onNextClick}) => {\n return (\n
    \n
    \n

    Welcome to Quill Proofreader!

    \n
    \n
    \n
    \n
    1
    \n

    Read

    \n

    Read the passage and correct the grammar and punctuation errors you find.

    \n \"Proofreader\n
    \n
    \n
    2
    \n

    Review

    \n

    Get feedback on each correction you made.

    \n \"Proofreader\n
    \n
    \n
    3
    \n

    Improve

    \n

    Work on a follow-up activity that focuses on one of the errors from the passage.

    \n \"Follow-up\n
    \n
    \n
    \n \n
    \n
    \n )\n}\n\nexport default WelcomePage\n","// code courtesy of https://stackoverflow.com/questions/13949059/persisting-the-changes-of-range-objects-after-selection-in-html/13950376#13950376\n\nconst TEXT_TYPE = 3\n\nconst saveSelection = (containerEl) => {\n if (window.getSelection && document.createRange) {\n return saveSelectionForWindowSelection(containerEl)\n } else if (document.selection && document.body.createTextRange) {\n return saveSelectionForDocumentSelection(containerEl)\n }\n}\n\nconst saveSelectionForWindowSelection = (containerEl) => {\n const range = window.getSelection().getRangeAt(0);\n const preSelectionRange = range.cloneRange();\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n const start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n }\n};\n\nconst saveSelectionForDocumentSelection = (containerEl) => {\n const selectedTextRange = document.selection.createRange();\n const preSelectionTextRange = document.body.createTextRange();\n preSelectionTextRange.moveToElementText(containerEl);\n preSelectionTextRange.setEndPoint(\"EndToStart\", selectedTextRange);\n const start = preSelectionTextRange.text.length;\n\n return {\n start: start,\n end: start + selectedTextRange.text.length\n }\n}\n\nconst restoreSelection = (containerEl, savedSel) => {\n if (window.getSelection && document.createRange) {\n return restoreSelectionForWindowSelection(containerEl, savedSel)\n } else if (document.selection && document.body.createTextRange) {\n return restoreSelectionForDocumentSelection(containerEl, savedSel)\n }\n}\n\nconst restoreSelectionForWindowSelection = (containerEl, savedSel) => {\n let charIndex = 0\n const range = document.createRange();\n range.setStart(containerEl, 0);\n range.collapse(true);\n const nodeStack = [containerEl]\n let node\n let foundStart = false\n let stop = false;\n\n while (!stop && (node = nodeStack.pop())) {\n if (node.nodeType === TEXT_TYPE) {\n const nextCharIndex = charIndex + node.length;\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n let i = node.childNodes.length;\n while (i--) { // eslint-disable-line no-plusplus\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n\nconst restoreSelectionForDocumentSelection = (containerEl, savedSel) => {\n const textRange = document.body.createTextRange();\n textRange.moveToElementText(containerEl);\n textRange.collapse(true);\n textRange.moveEnd(\"character\", savedSel.end);\n textRange.moveStart(\"character\", savedSel.start);\n textRange.select();\n};\n\nexport default { saveSelection, restoreSelection };\n","import React from 'react';\n\nconst LoadingSpinner: React.SFC = () => {\n return (\n
    \n \"\"\n
    \n );\n\n}\n\nexport default LoadingSpinner\n","import * as _ from 'lodash';\nimport { stringNormalize } from 'quill-string-normalizer';\nimport * as React from \"react\";\nimport { connect } from \"react-redux\";\nimport * as Redux from \"redux\";\nimport { sentences } from 'sbd';\nimport Pusher from 'pusher-js';\n\nconst directionSrc = `${window.postbuildEnv.CDN_URL}/images/icons/direction.svg`\n\nimport EarlySubmitModal from './earlySubmitModal';\nimport FollowupModal from './followupModal';\nimport formatInitialPassage from './formatInitialPassage';\nimport Paragraph from './paragraph';\nimport PassageReviewer from './passageReviewer';\nimport ProgressBar from './progressBar';\nimport ResetModal from './resetModal';\nimport ReviewModal from './reviewModal';\nimport { isAnEditRegex, negativeMatchRegex, startsWithPunctuationRegex } from './sharedRegexes';\nimport WelcomePage from './welcomePage';\n\nimport { requestPost, requestPut, } from '../../../../modules/request/index';\nimport {\n CLICK,\n KEYDOWN,\n KEYPRESS,\n MOUSEDOWN,\n MOUSEMOVE,\n SCROLL,\n VISIBILITYCHANGE,\n roundValuesToSeconds,\n} from '../../../Shared/index';\nimport { startListeningToConcepts } from \"../../actions/concepts\";\nimport { getActivity } from \"../../actions/proofreaderActivities\";\nimport {\n setPassage,\n setSessionReducerToSavedSession,\n updateConceptResultsOnFirebase,\n updateSessionOnFirebase,\n updateTimeTracking\n} from \"../../actions/session\";\nimport EditCaretPositioning from '../../helpers/EditCaretPositioning';\nimport determineUnnecessaryEditType, { UNNECESSARY_SPACE, unnecessarySpaceSplitResponse, } from '../../helpers/determineUnnecessaryEditType';\nimport getParameterByName from '../../helpers/getParameterByName';\nimport { ConceptResultObject, WordObject } from '../../interfaces/proofreaderActivities';\nimport { ProofreaderActivityState } from '../../reducers/proofreaderActivitiesReducer';\nimport { SessionState } from '../../reducers/sessionReducer';\nimport LoadingSpinner from '../shared/loading_spinner';\n\ninterface PlayProofreaderContainerProps {\n proofreaderActivities: ProofreaderActivityState;\n session: SessionState;\n dispatch: Function;\n admin?: Boolean;\n activityUID?: string;\n}\n\ninterface PlayProofreaderContainerState {\n edits: number;\n reviewing: boolean;\n numberOfResets: number;\n showEarlySubmitModal: boolean;\n showReviewModal: boolean;\n showResetModal: boolean;\n showFollowupModal: boolean;\n showWelcomePage: boolean;\n firebaseSessionID: string | null;\n loadingFirebaseSession: boolean;\n currentActivity: any;\n necessaryEdits?: RegExpMatchArray | null;\n numberOfCorrectChanges?: number;\n originalPassage?: Array>;\n reviewablePassage?: string;\n conceptResultsObjects?: ConceptResultObject[];\n startTime: number;\n isIdle: boolean;\n}\n\nconst FIREBASE_SAVE_INTERVAL = 30000 // 30 seconds\n\nconst editCount = (paragraphs: Array>) => {\n let editCount = 0\n paragraphs.forEach((p: Array) => {\n const changedWords = p.filter(word => word.currentText !== word.originalText)\n editCount += changedWords.length\n })\n return editCount\n}\n\nexport const findSentence = (paragraphSentences: string[], wordIndex: number, word: string) => {\n let cumulativeWordIndex = 0;\n\n for (const paragraphSentence of paragraphSentences) {\n const wordsInSentence = paragraphSentence.split(/\\s+/);\n const sentenceWordCount = wordsInSentence.length;\n const indexOfFirstWordInSentence = cumulativeWordIndex;\n const indexOfLastWordInSentence = cumulativeWordIndex + sentenceWordCount - 1;\n\n if (wordIndex >= indexOfFirstWordInSentence && wordIndex <= indexOfLastWordInSentence && paragraphSentence.includes(word)) {\n return paragraphSentence.replace(word, `${word}`);\n }\n\n cumulativeWordIndex += sentenceWordCount;\n }\n\n return '';\n};\n\n\nconst joinParagraph = (paragraph: Array) => {\n const normalizedWords = paragraph.map(w => stringNormalize(w.originalText))\n return joinWords(normalizedWords)\n}\n\nconst joinWords = (wordArray: string[]) => {\n let paragraphString = ''\n wordArray.forEach((word: string, i: number) => {\n paragraphString += word\n\n const nextWord = wordArray[i + 1]\n if (!nextWord) { return }\n\n const nextWordIsAnEdit = nextWord.match(isAnEditRegex)\n\n if (nextWordIsAnEdit) {\n const negativeMatch = nextWord.match(negativeMatchRegex)\n if (negativeMatch && negativeMatch[1].match(startsWithPunctuationRegex)) { return }\n } else if (nextWord.match(startsWithPunctuationRegex)) {\n return\n }\n\n paragraphString += ' '\n })\n return paragraphString\n}\n\nexport class PlayProofreaderContainer extends React.Component {\n static getDerivedStateFromProps(nextProps: PlayProofreaderContainerProps, prevState: PlayProofreaderContainerState) {\n const { proofreaderActivities, session, dispatch, } = nextProps\n const theCurrentActivityHasNotChanged = _.isEqual(proofreaderActivities.currentActivity, prevState.currentActivity)\n if ((session.passage && theCurrentActivityHasNotChanged && prevState.necessaryEdits) || !proofreaderActivities.currentActivity) { return null }\n\n const { passage } = proofreaderActivities.currentActivity\n const initialPassageData = formatInitialPassage(passage)\n const formattedPassage = initialPassageData.passage\n let currentPassage = formattedPassage\n if (session.passageFromFirebase && typeof session.passageFromFirebase !== 'string' && session.passageFromFirebase.length) {\n currentPassage = session.passageFromFirebase\n }\n dispatch(setPassage(currentPassage))\n return { originalPassage: _.cloneDeep(formattedPassage), necessaryEdits: initialPassageData.necessaryEdits, edits: editCount(currentPassage), currentActivity: proofreaderActivities.currentActivity, loadingFirebaseSession: false }\n }\n\n private interval: any // eslint-disable-line react/sort-comp\n\n constructor(props: any) {\n super(props);\n\n this.passageContainer = null\n\n const { proofreaderActivities, admin, } = props\n\n const { currentActivity, } = proofreaderActivities\n\n const firebaseSessionID = getParameterByName('student', window.location.href)\n\n if (firebaseSessionID) {\n props.dispatch(setSessionReducerToSavedSession(firebaseSessionID, true))\n this.interval = setInterval(() => {\n this.saveEditedSessionToFirebase(firebaseSessionID)\n }, FIREBASE_SAVE_INTERVAL)\n }\n\n this.state = {\n edits: 0,\n reviewing: false,\n showEarlySubmitModal: false,\n showReviewModal: false,\n showResetModal: false,\n showFollowupModal: false,\n showWelcomePage: !admin,\n numberOfResets: 0,\n loadingFirebaseSession: !!firebaseSessionID,\n firebaseSessionID,\n currentActivity,\n startTime: Date.now(),\n isIdle: false,\n }\n }\n\n componentDidMount() {\n const { activityUID, dispatch, } = this.props\n const activityUIDToUse = getParameterByName('uid', window.location.href) || activityUID\n\n dispatch(startListeningToConcepts())\n\n if (activityUIDToUse) {\n dispatch(getActivity(activityUIDToUse))\n }\n\n window.addEventListener(KEYDOWN, this.resetTimers)\n window.addEventListener(MOUSEMOVE, this.resetTimers)\n window.addEventListener(MOUSEDOWN, this.resetTimers)\n window.addEventListener(CLICK, this.resetTimers)\n window.addEventListener(KEYPRESS, this.resetTimers)\n window.addEventListener(SCROLL, this.resetTimers)\n window.addEventListener(VISIBILITYCHANGE, this.setIdle)\n }\n\n componentDidUpdate(prevProps) {\n const { proofreaderActivities } = this.props\n const { currentActivity, hasreceiveddata } = proofreaderActivities\n\n if (prevProps.proofreaderActivities.hasreceiveddata !== hasreceiveddata && hasreceiveddata) {\n document.title = `Quill.org | ${currentActivity.title}`\n }\n }\n\n componentWillUnmount() {\n if (this.interval) {\n clearInterval(this.interval)\n }\n\n window.removeEventListener(KEYDOWN, this.resetTimers)\n window.removeEventListener(MOUSEMOVE, this.resetTimers)\n window.removeEventListener(MOUSEDOWN, this.resetTimers)\n window.removeEventListener(CLICK, this.resetTimers)\n window.removeEventListener(KEYPRESS, this.resetTimers)\n window.removeEventListener(SCROLL, this.resetTimers)\n window.removeEventListener(VISIBILITYCHANGE, this.setIdle)\n }\n\n resetTimers = (e = null) => {\n const { session, dispatch, } = this.props\n\n if (!session) { return }\n\n const now = Date.now()\n this.setState((prevState, props) => {\n const { timeTracking, } = props.session\n\n const { startTime, isIdle, inactivityTimer, } = prevState\n\n if (inactivityTimer) { clearTimeout(inactivityTimer) }\n\n let elapsedTime = now - startTime\n\n if (isIdle) {\n elapsedTime = 0\n }\n dispatch(updateTimeTracking({ ...timeTracking, 'proofreading_the_passage': (timeTracking && timeTracking['proofreading_the_passage'] || 0) + elapsedTime }))\n const newInactivityTimer = setTimeout(this.setIdle, 30000); // time is in milliseconds (1000 is 1 second)\n\n return { isIdle: false, inactivityTimer: newInactivityTimer, startTime: now, }\n })\n\n return Promise.resolve(true);\n }\n\n setIdle = () => { this.resetTimers().then(() => this.setState({ isIdle: true })) }\n\n saveEditedSessionToFirebase = (sessionID: string) => {\n const { dispatch, session, } = this.props\n const { passageFromFirebase, passage, timeTracking, } = session\n if (!_.isEqual(passage, passageFromFirebase)) {\n dispatch(updateSessionOnFirebase(sessionID, { passage, timeTracking, }))\n }\n }\n\n saveCompletedSessionToFirebase = () => {\n const { firebaseSessionID, conceptResultsObjects, } = this.state\n const { session, } = this.props\n const { passage, timeTracking, } = session\n const activityUID = getParameterByName('uid', window.location.href)\n const newOrSetFirebaseSessionID = updateConceptResultsOnFirebase(firebaseSessionID, activityUID, { conceptResults: conceptResultsObjects, timeTracking, passage, })\n this.setState({ firebaseSessionID: newOrSetFirebaseSessionID })\n }\n\n defaultInstructions = () => {\n return 'Find and correct the errors in the passage. To edit a word, click on it and re-type it.'\n }\n\n saveToLMS = () => {\n const { firebaseSessionID, conceptResultsObjects, } = this.state\n const { session, } = this.props\n\n const sessionID = getParameterByName('student', window.location.href)\n const results: ConceptResultObject[] | undefined = conceptResultsObjects;\n if (results) {\n const score = this.calculateScoreForLesson();\n const activityUID = getParameterByName('uid', window.location.href)\n\n const data = { time_tracking: roundValuesToSeconds(session.timeTracking), }\n\n if (sessionID) {\n this.handleCheckWorkClickSession(sessionID, results, score, data);\n } else if (activityUID) {\n this.createAnonActivitySession(activityUID, results, score, firebaseSessionID, data);\n }\n }\n }\n\n calculateScoreForLesson = () => {\n const { numberOfCorrectChanges, necessaryEdits } = this.state\n if (numberOfCorrectChanges && necessaryEdits && necessaryEdits.length) {\n return numberOfCorrectChanges / necessaryEdits.length\n } else {\n return 0\n }\n }\n\n initializeSubscription(activitySessionUid) {\n if (window.postbuildEnv.NODE_ENV === 'development') {\n Pusher.logToConsole = true;\n }\n if (!window.pusher) {\n window.pusher = new Pusher(window.postbuildEnv.PUSHER_KEY, { cluster: window.postbuildEnv.PUSHER_CLUSTER });\n }\n const channel = window.pusher.subscribe(activitySessionUid);\n channel.bind('concept-results-saved', () => {\n document.location.href = `${window.postbuildEnv.DEFAULT_URL}/activity_sessions/${activitySessionUid}`;\n });\n\n channel.bind('concept-results-partially-saved', () => {\n document.location.href = window.postbuildEnv.DEFAULT_URL;\n });\n }\n\n handleCheckWorkClickSession = (sessionID: string, results: ConceptResultObject[], score: number, data) => {\n this.initializeSubscription(sessionID)\n requestPut(\n `${window.postbuildEnv.DEFAULT_URL}/api/v1/activity_sessions/${sessionID}`,\n {\n state: 'finished',\n concept_results: results,\n percentage: score,\n data\n },\n (body) => {\n // not doing anything here because Pusher should handle the redirect once the concept results are saved\n }\n )\n }\n\n createAnonActivitySession = (lessonID: string, results: ConceptResultObject[], score: number, sessionID: string | null, data) => {\n requestPost(\n `${window.postbuildEnv.DEFAULT_URL}/api/v1/activity_sessions/`,\n {\n state: 'finished',\n activity_uid: lessonID,\n concept_results: results,\n percentage: score,\n data\n },\n (body) => {\n this.initializeSubscription(body.activity_session.uid)\n }\n )\n\n }\n\n checkWork = (): { reviewablePassage: string, numberOfCorrectChanges: number, conceptResultsObjects: ConceptResultObject[] } => {\n const { session, proofreaderActivities, } = this.props\n const { passage } = session\n const { currentActivity } = proofreaderActivities\n const { necessaryEdits, } = this.state\n let numberOfCorrectChanges = 0\n const conceptResultsObjects: ConceptResultObject[] = []\n if (passage && necessaryEdits) {\n let reviewablePassage = ''\n passage.forEach((paragraph: Array) => {\n const originalParagraphString = joinParagraph(paragraph)\n const paragraphSentences = sentences(originalParagraphString, {})\n const words: Array = []\n paragraph.forEach((word: any) => {\n const { necessaryEditIndex, correctText, conceptUID, originalText, currentText, wordIndex } = word\n const stringNormalizedCurrentText = stringNormalize(currentText).trim()\n const stringNormalizedCorrectText = stringNormalize(correctText)\n const stringNormalizedOriginalText = stringNormalize(originalText)\n const prompt = findSentence(paragraphSentences, wordIndex, stringNormalizedOriginalText)\n if (necessaryEditIndex || necessaryEditIndex === 0) {\n if (stringNormalizedCorrectText.split('~').includes(stringNormalizedCurrentText)) {\n numberOfCorrectChanges += 1\n conceptResultsObjects.push({\n metadata: {\n answer: stringNormalizedCurrentText,\n correct: 1,\n instructions: currentActivity.description || this.defaultInstructions(),\n prompt,\n questionNumber: necessaryEditIndex + 1,\n unchanged: false,\n question_concept_uid: conceptUID\n },\n concept_uid: conceptUID,\n question_type: \"passage-proofreader\"\n })\n words.push(`{+${stringNormalizedCurrentText}-|${conceptUID}}`)\n } else {\n conceptResultsObjects.push({\n metadata: {\n answer: stringNormalizedCurrentText,\n correct: 0,\n instructions: currentActivity.description || this.defaultInstructions(),\n prompt,\n questionNumber: necessaryEditIndex + 1,\n unchanged: stringNormalizedCurrentText === stringNormalizedOriginalText,\n question_concept_uid: conceptUID\n },\n concept_uid: conceptUID,\n question_type: \"passage-proofreader\"\n })\n words.push(`{+${correctText}-${stringNormalizedCurrentText}|${conceptUID}}`)\n }\n } else if (stringNormalizedOriginalText !== stringNormalizedCurrentText) {\n const displayedCurrentText = stringNormalizedCurrentText.length ? stringNormalizedCurrentText : ' '\n const unnecessaryEditType = determineUnnecessaryEditType(stringNormalizedOriginalText, stringNormalizedCurrentText)\n if (unnecessaryEditType === UNNECESSARY_SPACE) {\n const wordsToPush = unnecessarySpaceSplitResponse(stringNormalizedOriginalText, stringNormalizedCurrentText)\n wordsToPush.forEach(w => words.push(w))\n } else {\n words.push(`{+${stringNormalizedOriginalText}-${displayedCurrentText}|${unnecessaryEditType}}`)\n }\n } else {\n words.push(stringNormalizedCurrentText)\n }\n })\n reviewablePassage = reviewablePassage.concat('

    ').concat(joinWords(words.filter(word => word.length))).concat('

    ')\n })\n return { reviewablePassage, numberOfCorrectChanges, conceptResultsObjects }\n } else {\n return { reviewablePassage: '', numberOfCorrectChanges: 0, conceptResultsObjects: [] }\n }\n }\n\n handleCheckWorkClick = () => {\n const { edits, necessaryEdits } = this.state\n const requiredEditCount = necessaryEdits && necessaryEdits.length ? Math.floor(necessaryEdits.length / 2) : 5\n if (necessaryEdits && necessaryEdits.length && edits === 0 || edits < requiredEditCount) {\n this.setState({ showEarlySubmitModal: true })\n } else {\n const { reviewablePassage, numberOfCorrectChanges, conceptResultsObjects } = this.checkWork()\n this.setState({ reviewablePassage, showReviewModal: true, numberOfCorrectChanges, conceptResultsObjects }, this.saveCompletedSessionToFirebase)\n }\n }\n\n goToFollowupPractice = () => {\n const { firebaseSessionID, } = this.state\n window.location.href = `${window.postbuildEnv.QUILL_GRAMMAR_URL}/play/sw?proofreaderSessionId=${firebaseSessionID}`\n }\n\n goToLMS = () => window.location.href = `${window.postbuildEnv.DEFAULT_URL}`\n\n finishReview = () => {\n const { firebaseSessionID, originalPassage, conceptResultsObjects, necessaryEdits, numberOfCorrectChanges, } = this.state\n const { admin, dispatch, } = this.props\n const activityUID = getParameterByName('uid', window.location.href)\n const newPassage = _.cloneDeep(originalPassage)\n if (admin) {\n this.setState({\n edits: 0,\n reviewing: false,\n showEarlySubmitModal: false,\n showReviewModal: false,\n numberOfCorrectChanges: undefined,\n reviewablePassage: undefined,\n conceptResultsObjects: undefined\n })\n dispatch(setPassage(newPassage))\n } else if (conceptResultsObjects && activityUID) {\n if (necessaryEdits && (necessaryEdits.length === numberOfCorrectChanges)) {\n this.saveToLMS()\n } else if (firebaseSessionID) {\n this.setState({ showFollowupModal: true, })\n }\n }\n }\n\n onParagraphChange = (value: Array, i: number, editInput: JSX.Element) => {\n const { session, dispatch, } = this.props\n let newParagraphs = session.passage\n if (newParagraphs) {\n newParagraphs[i] = value\n const caretPosition = EditCaretPositioning.saveSelection(editInput)\n dispatch(setPassage(newParagraphs))\n this.setState({ edits: editCount(newParagraphs), }, () => EditCaretPositioning.restoreSelection(editInput, caretPosition))\n }\n }\n\n handleNextClick = () => {\n this.setState({ showWelcomePage: false }, () => {\n window.scrollTo(0, 0)\n this.passageContainer && this.passageContainer.focus()\n })\n }\n\n handleResetClick = () => {\n this.setState({ showResetModal: true })\n }\n\n closeResetModal = () => {\n this.setState({ showResetModal: false })\n }\n\n closeEarlySubmitModal = () => {\n this.setState({ showEarlySubmitModal: false })\n }\n\n closeReviewModal = () => {\n this.setState({ showReviewModal: false, reviewing: true })\n }\n\n reset = () => {\n const { dispatch, } = this.props\n const { originalPassage, } = this.state\n const newPassage = _.cloneDeep(originalPassage)\n dispatch(setPassage(newPassage))\n this.setState(prevState => ({\n edits: 0,\n numberOfResets: prevState.numberOfResets + 1,\n showResetModal: false\n }))\n }\n\n renderShowEarlySubmitModal = (): JSX.Element | void => {\n const { showEarlySubmitModal, necessaryEdits } = this.state\n const requiredEditCount = necessaryEdits && necessaryEdits.length ? Math.floor(necessaryEdits.length / 2) : 5\n if (showEarlySubmitModal) {\n return (\n \n )\n }\n }\n\n renderShowResetModal = (): JSX.Element | void => {\n const { showResetModal, } = this.state\n if (showResetModal) {\n return (\n \n )\n }\n }\n\n renderFollowupModal = (): JSX.Element | void => {\n const { showFollowupModal, } = this.state\n if (!showFollowupModal) { return }\n return (\n \n )\n }\n\n renderShowReviewModal = (): JSX.Element | void => {\n const { showReviewModal, necessaryEdits, numberOfCorrectChanges } = this.state\n const numberOfErrors = necessaryEdits && necessaryEdits.length ? necessaryEdits.length : 0\n if (showReviewModal) {\n return (\n \n )\n }\n }\n\n renderPassage = (): JSX.Element | void => {\n const { session, proofreaderActivities, concepts, } = this.props\n const { passage } = session\n const { reviewing, reviewablePassage, numberOfResets, } = this.state\n const { underlineErrorsInProofreader } = proofreaderActivities.currentActivity\n if (reviewing) {\n const text = reviewablePassage ? reviewablePassage : ''\n return (\n \n )\n } else if (passage) {\n const paragraphs = passage.map((p, i) => {\n return (\n \n )\n })\n return
    {paragraphs}
    \n }\n }\n\n renderCheckWorkButton = (): JSX.Element | void => {\n const { reviewing, edits, } = this.state\n if (reviewing) { return }\n\n let className = \"quill-button-archived large primary contained focus-on-light\"\n if (edits) {\n return \n }\n\n className += ' disabled'\n return \n }\n\n renderResetButton = (): JSX.Element | void => {\n const { reviewing, edits, } = this.state\n if (reviewing) { return }\n\n let className = \"quill-button-archived large secondary outlined focus-on-light\"\n if (edits) {\n return \n }\n\n className += ' disabled'\n return \n }\n\n render(): JSX.Element {\n const { proofreaderActivities, session, } = this.props\n const { edits, necessaryEdits, loadingFirebaseSession, showWelcomePage, } = this.state\n const { currentActivity } = proofreaderActivities\n\n if (showWelcomePage) { return }\n\n if (loadingFirebaseSession || !currentActivity) { return
    }\n\n if (session.error) { return
    {session.error}
    }\n\n const className = currentActivity.underlineErrorsInProofreader ? 'underline-errors' : ''\n const necessaryEditsLength = necessaryEdits ? necessaryEdits.length : 1\n const meterWidth = edits / necessaryEditsLength * 100\n return (\n
    \n
    \n \n
    \n

    {currentActivity.title}

    \n
    \n
    \n \"Directions\n

    \n

    Screenreader users: once you have finished reading the passage, use the tab keys to navigate between words and make changes to ones that have errors. {currentActivity.underlineErrorsInProofreader && 'Words that contain errors will be described as underlined.'} Words that you have already changed will be described as bolded. There are {necessaryEditsLength} errors to find and fix. When you are done, navigate to the "Get Feedback" button after the passage and select it.

    \n
    \n
    \n
    \n
    \n {this.renderShowEarlySubmitModal()}\n {this.renderShowResetModal()}\n {this.renderShowReviewModal()}\n {this.renderFollowupModal()}\n
    \n {this.renderPassage()}\n
    \n
    \n
    \n {this.renderResetButton()}\n {this.renderCheckWorkButton()}\n
    \n
    \n
    \n )\n }\n}\n\nconst mapStateToProps = (state: any) => {\n return {\n proofreaderActivities: state.proofreaderActivities,\n session: state.session,\n concepts: state.concepts\n };\n};\n\nconst mapDispatchToProps = (dispatch: Redux.Dispatch) => {\n return {\n dispatch\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PlayProofreaderContainer);\n","import * as React from 'react';\nimport { connect } from 'react-redux';\nimport { Link } from 'react-router-dom';\n\nimport EditLessonForm from './lessonForm';\n\nimport { ActionTypes } from '../../actions/actionTypes';\nimport * as lessonActions from '../../actions/proofreaderActivities';\nimport { ProofreaderActivity } from '../../interfaces/proofreaderActivities';\nimport { ConceptReducerState } from '../../reducers/conceptsReducer';\nimport { ProofreaderActivityState } from '../../reducers/proofreaderActivitiesReducer';\nimport ProofreaderActivityContainer from '../proofreaderActivities/container';\n\ninterface LessonProps {\n dispatch: Function;\n match: any;\n lessons: ProofreaderActivityState;\n concepts: ConceptReducerState;\n}\n\nexport class Lesson extends React.Component {\n\n componentDidMount() {\n window.scrollTo(0, 0)\n }\n\n handleDeleteLesson = (): void => {\n const { dispatch, match } = this.props;\n const { params } = match;\n const { lessonID } = params;\n if (lessonID && confirm('do you want to do this?')) {\n dispatch(lessonActions.deleteLesson(lessonID));\n }\n }\n\n cancelEditingLesson = (): void => {\n const { dispatch, match } = this.props;\n const { params } = match;\n const { lessonID } = params;\n if (lessonID) {\n dispatch(lessonActions.cancelLessonEdit(lessonID));\n }\n }\n\n saveLessonEdits = (vals: ProofreaderActivity): void => {\n const { dispatch, match } = this.props;\n const { params } = match;\n const { lessonID } = params;\n if (lessonID) {\n dispatch(lessonActions.submitLessonEdit(lessonID, vals));\n }\n }\n\n handleEditLesson = (): void => {\n const { dispatch, match } = this.props;\n const { params } = match;\n const { lessonID } = params;\n if (lessonID) {\n dispatch(lessonActions.startLessonEdit(lessonID));\n }\n }\n\n renderActivity = () => {\n const { match } = this.props;\n const { params } = match;\n const { lessonID } = params;\n return (\n
    \n \n
    \n )\n }\n\n render() {\n const { match, lessons } = this.props;\n const { data, states, hasreceiveddata } = lessons\n const { params } = match;\n const { lessonID } = params;\n if(!hasreceiveddata) {\n return (

    Loading...

    );\n } else if (data && lessonID && data[lessonID]) {\n const lesson = data[lessonID];\n if(states && states[lessonID] === ActionTypes.EDITING_LESSON) {\n return(\n \n );\n }\n return (\n
    \n Return to All Activities\n
    \n
    \n

    {data[lessonID].title}

    \n
    Flag: {data[lessonID].flag}
    \n
    \n
    Play Proofreader Activity
    \n

    \n \n \n

    \n

    Note: the activity below functions exactly like the real activity, except that you will not be directed to a results page or to a Grammar activity upon finishing the review. Instead, the activity will reset.

    \n {this.renderActivity()}\n
    \n );\n }\n return (\n

    404: No Concept Found

    \n );\n }\n\n}\n\nfunction select(state: any) {\n return {\n lessons: state.proofreaderActivities,\n routing: state.routing,\n concepts: state.concepts\n };\n}\n\nexport default connect(select)(Lesson);\n","import * as React from 'react';\nimport { Link } from 'react-router-dom';\n\n// interface LinkListProps {\n// basePath: string;\n// itemKey: string;\n// text: string;\n// activeClassName?: string;\n// className?: string;\n// }\n\nexport const LinkListItem = (props: any) => (\n
  • \n \n {props.text}\n \n
  • \n)\n\nexport default LinkListItem\n","import * as React from 'react';\nimport { connect } from 'react-redux';\nimport _ from 'underscore';\n\nimport EditLessonForm from './lessonForm';\n\nimport { FlagDropdown } from '../../../Shared/index';\nimport * as actions from '../../actions/proofreaderActivities';\nimport { ProofreaderActivity } from '../../interfaces/proofreaderActivities';\nimport LinkListItem from '../shared/linkListItem';\n\ninterface LessonsProps {\n dispatch: Function;\n lessons: {\n data: any;\n showLessonForm: boolean;\n submittingnew: boolean;\n };\n}\n\ninterface LessonsState {\n lessonFlags: string;\n}\n\nexport class Lessons extends React.Component {\n state = { lessonFlags: 'production' }\n\n handleToggle = (e) => {\n if(e) {\n const { dispatch } = this.props;\n dispatch(actions.toggleLessonForm());\n }\n }\n\n submitNewLesson = (data: ProofreaderActivity) => {\n const { dispatch } = this.props;\n dispatch(actions.submitNewLesson(data));\n }\n\n renderLessons = () => {\n const { lessonFlags } = this.state;\n const { lessons } = this.props;\n const { data } = lessons;\n let keys = _.keys(data);\n if (lessonFlags !== 'All Flags') {\n keys = keys.filter((key: string) => data[key].flag === lessonFlags);\n }\n return keys.sort((a, b) => {\n const aTitle = data[a].title\n const bTitle = data[b].title\n if (aTitle && bTitle) {\n return aTitle.localeCompare(bTitle)\n } else {\n return a\n }\n }).map((key: string) => (\n \n ));\n }\n\n onHandleSelect = (e) => {\n this.setState({ lessonFlags: e.target.value, });\n }\n\n render() {\n const { lessonFlags } = this.state;\n const { lessons } = this.props;\n const { showLessonForm, submittingnew } = lessons;\n const stateSpecificClass = submittingnew ? 'is-loading' : '';\n if (showLessonForm) {\n return (\n \n );\n }\n return (\n
    \n
    \n

    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n\n );\n }\n}\n\nfunction select(state) {\n return {\n lessons: state.proofreaderActivities,\n routing: state.routing,\n questions: state.questions,\n };\n}\n\nexport default connect(select)(Lessons);\n","import * as React from 'react';\nimport { connect } from 'react-redux';\nimport { Route, RouteComponentProps, Switch, withRouter } from \"react-router-dom\";\n\nimport TabLink from './tabLink';\n\nimport * as conceptsActions from '../../actions/concepts';\nimport * as proofreaderActivitiesActions from '../../actions/proofreaderActivities';\nimport Concepts from '../concepts/concepts';\nimport Lesson from '../lessons/lesson';\nimport Lessons from '../lessons/lessons';\n\nconst usersEndpoint = `${window.postbuildEnv.DEFAULT_URL}/api/v1/users.json`;\nconst newSessionEndpoint = `${window.postbuildEnv.DEFAULT_URL}/session/new`;\n\ninterface PathParamsType {\n [key: string]: string,\n}\n\ntype AdminContainerProps = RouteComponentProps & { dispatch: Function }\n\nclass AdminContainer extends React.Component {\n componentDidMount() {\n const { dispatch, } = this.props\n this.fetchUser().then(userData => {\n if (userData.user === null || (userData.hasOwnProperty('role') && userData.user.role !== 'staff')) {\n window.location.href = newSessionEndpoint;\n }\n }\n );\n dispatch(proofreaderActivitiesActions.startListeningToActivities());\n dispatch(conceptsActions.startListeningToConcepts());\n }\n\n async fetchUser() {\n return fetch(usersEndpoint, {\n method: 'GET',\n mode: 'cors',\n credentials: 'include',\n }).then((response) => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response.json();\n });\n }\n\n render() {\n const { children, dispatch } = this.props\n return (\n
    \n
    \n \n
    \n {children}\n
    \n
    \n \n \n \n \n \n
    \n );\n }\n}\n\nfunction select(state) {\n return {\n };\n}\n\nfunction mergeProps(stateProps: Object, dispatchProps: Object, ownProps: Object) {\n return {...ownProps, ...stateProps, ...dispatchProps}\n}\n\nexport default withRouter(connect(select, dispatch => ({dispatch}), mergeProps)(AdminContainer));\n","import * as React from \"react\";\nimport { RouteConfig } from \"react-router-config\";\nimport { Route, Switch } from \"react-router-dom\";\nimport PageLayout from \"./components/PageLayout\";\nimport Admin from \"./components/admin/admin\";\nimport PlayProofreader from \"./components/proofreaderActivities/container\";\n\nexport const routes: RouteConfig[] = [\n {\n path: \"/play/pf\",\n component: () => ()\n },\n {\n path: \"/admin\",\n component: () => ()\n }\n];\n\nexport const route = (\n \n \n \n);\n","import { ActionTypes, IInitStoreAction } from './actionTypes'\n\nexport const initStoreAction = (): IInitStoreAction => {\n return {type: ActionTypes.INIT_STORE}\n}\n","import { Action } from \"redux\";\nimport { ActionTypes } from \"../actions/actionTypes\";\nimport { Concept } from '../interfaces/concepts';\n\ntype ConceptReducerAction = Action & {data: Concept[][]}\nexport interface ConceptReducerState {\n hasreceiveddata: boolean;\n submittingnew: boolean;\n states: any;\n data: Concept[][]\n}\nconst initialState = {\n concepts: {\n hasreceiveddata: false,\n submittingnew: false,\n states: {}, // this will store per quote id if we're reading, editing or awaiting DB response\n data: {} // this will contain firebase data\n }\n}\nexport default function(currentstate: ConceptReducerState, action: ConceptReducerAction) {\n switch (action.type) {\n case ActionTypes.RECEIVE_CONCEPTS_DATA:\n return Object.assign({}, currentstate, {\n hasreceiveddata: true,\n data: action.data\n });\n default: return currentstate || initialState.concepts;\n }\n};\n","import { Action } from \"redux\";\n\nimport { ActionTypes } from \"../actions/actionTypes\";\nimport { ProofreaderActivities, ProofreaderActivity } from '../interfaces/proofreaderActivities';\n\nexport interface ProofreaderActivityState {\n hasreceiveddata: boolean;\n currentActivity: ProofreaderActivity;\n data: ProofreaderActivities;\n error?: string;\n states: {[key: string]: string}\n showLessonForm?: boolean\n}\n\ntype ProofreaderActivityAction = Action & { data: ProofreaderActivity } & { cid: string } & { showForm: boolean }\n\nexport default (\n currentState = { hasreceiveddata: false, states: {}, showLessonForm: false },\n action: ProofreaderActivityAction,\n data: {}\n) => {\n const statesObj: {[key: string]: string} = currentState.states\n switch (action.type) {\n case ActionTypes.RECEIVE_PROOFREADER_ACTIVITY_DATA:\n return Object.assign({}, currentState, { currentActivity: action.data }, {hasreceiveddata: true});\n case ActionTypes.NO_PROOFREADER_ACTIVITY_FOUND:\n return Object.assign({}, currentState, { error: 'No activity found.'})\n case ActionTypes.RECEIVE_PROOFREADER_ACTIVITIES_DATA:\n return Object.assign({}, currentState, { data: action.data}, {hasreceiveddata: true})\n case ActionTypes.NO_PROOFREADER_ACTIVITIES_FOUND:\n return Object.assign({}, currentState, { error: 'No activities found.'})\n case ActionTypes.TOGGLE_LESSON_FORM:\n return Object.assign({}, currentState, {\n showLessonForm: action.showForm !== undefined ? action.showForm : !currentState.showLessonForm\n });\n case ActionTypes.AWAIT_NEW_LESSON_RESPONSE:\n return Object.assign({}, currentState, {\n submittingnew: true\n });\n case ActionTypes.RECEIVE_NEW_LESSON_RESPONSE:\n return Object.assign({}, currentState, {\n submittingnew: false,\n showLessonForm: false\n });\n case ActionTypes.START_LESSON_EDIT:\n statesObj[action.cid] = ActionTypes.EDITING_LESSON\n return Object.assign({}, currentState, statesObj)\n case ActionTypes.FINISH_LESSON_EDIT:\n delete statesObj[action.cid];\n return Object.assign({}, currentState, statesObj)\n case ActionTypes.SUBMIT_LESSON_EDIT:\n statesObj[action.cid] = ActionTypes.SUBMITTING_LESSON\n return Object.assign({}, currentState, statesObj)\n default:\n return currentState;\n }\n};\n","import { Action } from \"redux\";\nimport { ActionTypes } from \"../actions/actionTypes\";\nimport { WordObject } from '../interfaces/proofreaderActivities';\n\nexport interface SessionState {\n passage: Array>;\n passageFromFirebase?: Array>;\n timeTracking?: {[key:string]: number};\n error?: string;\n}\n\ntype SessionAction = Action & { passage?: Array>, timeTracking?: { [key:string]: number } }\n\nexport default (\n currentState: SessionState = { passage: [], timeTracking: {} },\n action: SessionAction,\n): SessionState => {\n switch (action.type) {\n case ActionTypes.SET_FIREBASE_PASSAGE:\n return Object.assign({}, currentState, {passageFromFirebase: action.passage})\n case ActionTypes.SET_PASSAGE:\n return Object.assign({}, currentState, {passage: action.passage})\n case ActionTypes.SET_TIMETRACKING:\n return Object.assign({}, currentState, {timeTracking: action.timeTracking})\n default:\n return currentState;\n }\n};\n","import { combineReducers } from \"redux\";\nimport { IState } from \"../store/configStore\";\n// import { todos } from \"./todosReducer\";\nimport concepts from './conceptsReducer';\nimport proofreaderActivities from './proofreaderActivitiesReducer';\nimport session from './sessionReducer';\n\nexport const initState: IState = {\n proofreaderActivities: {},\n session: {}\n};\n\nexport const rootReducer = combineReducers({\n proofreaderActivities,\n session,\n concepts\n});\n","import { Dispatch, applyMiddleware, createStore } from \"redux\";\nimport { composeWithDevTools } from \"redux-devtools-extension/developmentOnly\";\nimport thunk from \"redux-thunk\";\n// import { TodoItem } from \"../model/TodoItem\";\nimport { initStoreAction } from \"../actions/actions\";\nimport { rootReducer } from \"../reducers/rootReducer\";\n\nexport interface IState {\n questions: any;\n grammarActivities: any;\n}\n\nexport const initStore = () => {\n return (dispatch: Dispatch<{}>) => {\n const initialState = {\n questions: {},\n grammarActivities: {}\n }\n return dispatch(initStoreAction(initialState));\n };\n};\n\nexport const configureStore = () => {\n if (window.postbuildEnv.NODE_ENV === \"production\") {\n return createStore(\n rootReducer,\n applyMiddleware(thunk),\n );\n } else {\n return createStore(\n rootReducer,\n composeWithDevTools(\n applyMiddleware(thunk),\n ),\n );\n }\n};\n","import * as React from \"react\";\nimport { Provider } from \"react-redux\";\nimport { HashRouter } from \"react-router-dom\";\nimport { CompatRouter } from \"react-router-dom-v5-compat\";\n\nimport { route } from \"./routes\";\nimport { configureStore, initStore } from \"./store/configStore\";\n\nconst store = configureStore();\nstore.dispatch(initStore());\n\nclass App extends React.Component<{}, {}> {\n componentDidMount() {\n document.title = 'Quill Proofreader'\n }\n\n public render(): JSX.Element {\n return (\n \n \n \n {route}\n \n \n \n );\n }\n}\n\nexport default App;\n","import ReactOnRails from 'react-on-rails';\nimport App from './App.tsx';\n\nReactOnRails.register({ App, });\n"],"names":["getParameterByName","name","url","regex","results","ActionTypes","sessionApiBaseUrl","SessionApi","uid","requestGet","error","data","requestPut","updateSessionOnFirebase","sessionID","session","callback","dispatch","setSessionReducerToSavedSession","updateConceptResultsOnFirebase","activityUID","sessionObj","uuid","initialLoad","handleSession","setSessionReducer","updateTimeTracking","passage","setPassage","timeTracking","quillLogoSrc","Header","React.Component","props","firebaseSessionID","React.createElement","mapStateToProps","state","mapDispatchToProps","Header$1","connect","PageLayout","e","showFocusState","element","className","header","ScreenreaderInstructions","renderRoutes","routes","PROOFREADER_PASSAGE_TYPE","lessonApiBaseUrl","ProofreaderPassageApi","requestPost","requestDelete","startListeningToActivities","activities","getActivity","activity","toggleLessonForm","value","submitNewLesson","content","cleanedContent","_.pickBy","UID","action","push","startLessonEdit","cid","cancelLessonEdit","submitLessonEdit","deleteLesson","result","TabLink","to","children","handleClick","actions.toggleLessonForm","NavLink","conceptsEndpoint","splitInLevels","concepts","_.groupBy","getParentName","concept","parent","c","grandParent","startListeningToConcepts","body","Concepts","a","b","select","mergeProps","stateProps","dispatchProps","ownProps","Concepts$1","EditGenerator","correctText","displayText","conceptUID","edit","ConceptSelector","LessonForm","submit","title","description","flag","underlineErrorsInProofreader","readingLevel","formattedPassage","currentValues","returnToView","stateSpecificClass","addOrEdit","buttonText","TextEditor","EditLessonForm","sanitizeHtmlBrowser","text","opts","$div","stringHelper","word","end","abbreviations","englishAbbreviations","Match","abbr","isCapitalized","str","isNumber","noSymbols","next","tmp","matches","wordCount","words","capitalized","dotPos","i","sanitizeHtml","require$$0","require$$1","require$$2","newline_placeholder","newline_placeholder_t","whiteSpaceCheck","addNewLineBoundaries","splitIntoWords","sentences","user_options","options","k","html_boundaries_regexp","re","tokens","token","ii","index","temp","current","L","s","out","sentence","lastSentence","tokenCount","EarlySubmitModal","requiredEditCount","closeModal","node","FollowupModal","goToLMS","goToFollowupPractice","formatInitialPassage","necessaryEdits","necessaryEditRegex","correctEditRegex","originalTextRegex","conceptUIDRegex","paragraphs","necessaryEditCounter","paragraphIndex","paragraph","paragraphArray","wordObj","wordArray","_.flatten","EditInput","wordIndex","onWordChange","stripHTML","currentText","originalText","underlined","numberOfResets","underlineErrors","beforeElements","afterElements","key","React.Fragment","ContentEditable","Paragraph","editInput","handleParagraphChange","newWords","_.cloneDeep","inputs","typeMatchers","unnecessarySpaceMatch","unnecessaryDeletionMatch","unnecessaryAdditionMatch","UNNECESSARY_SPACE","MULTIPLE_UNNECESSARY_DELETION","SINGLE_UNNECESSARY_DELETION","MULTIPLE_UNNECESSARY_ADDITION","SINGLE_UNNECESSARY_ADDITION","UNNECESSARY_CHANGE","determineUnnecessaryEditType","editedText","r","response","spaceRemovedOriginalText","removeSpaces","spaceRemovedEditedText","editedTextWords","originalTextWords","editedTextContainsMoreWords","editedTextContainsAllOriginalWords","originalTextContainsMoreWords","originalTextContainsAllEditedWords","unnecessarySpaceSplitResponse","currentWord","letter","iteration","notNecessaryIconSrc","incorrectIconSrc","correctIconSrc","renderConceptExplanation","renderCorrectAnswers","correctAnswers","ca","correctAnswerHTML","renderNotNecessaryExplanation","explanation","EditTooltip","id","tooltipHeight","back","numberOfEdits","incorrectText","containerRef","setContainerFocus","useFocus","React.useEffect","src","headerText","parentElement","style","backButton","nextButton","OFFSET_FROM_TOP","calculateHeight","Edit","mounting","activeIndex","tooltip","startsWithPunctuationRegex","isAnEditRegex","negativeMatchRegex","unnecessaryArray","PassageReviewer","finishReview","prevState","el","parts","plusMatch","plus","conceptUIDMatch","negativeMatch","negative","indexToPass","ProgressBar","percent","answeredQuestionCount","questionCount","ResetModal","reset","ReviewModal","numberOfErrors","numberOfCorrectChanges","highScoreMessage","readExampleSrc","reviewExampleSrc","practiceExampleSrc","WelcomePage","onNextClick","TEXT_TYPE","saveSelection","containerEl","saveSelectionForWindowSelection","saveSelectionForDocumentSelection","range","preSelectionRange","start","selectedTextRange","preSelectionTextRange","restoreSelection","savedSel","restoreSelectionForWindowSelection","restoreSelectionForDocumentSelection","charIndex","nodeStack","foundStart","stop","nextCharIndex","sel","textRange","EditCaretPositioning","LoadingSpinner","React","directionSrc","FIREBASE_SAVE_INTERVAL","editCount","p","changedWords","findSentence","paragraphSentences","cumulativeWordIndex","paragraphSentence","sentenceWordCount","indexOfFirstWordInSentence","indexOfLastWordInSentence","joinParagraph","normalizedWords","stringNormalize","w","joinWords","paragraphString","nextWord","PlayProofreaderContainer","now","startTime","isIdle","inactivityTimer","elapsedTime","passageFromFirebase","_.isEqual","conceptResultsObjects","newOrSetFirebaseSessionID","score","roundValuesToSeconds","lessonID","proofreaderActivities","currentActivity","reviewablePassage","originalParagraphString","necessaryEditIndex","stringNormalizedCurrentText","stringNormalizedCorrectText","stringNormalizedOriginalText","prompt","displayedCurrentText","unnecessaryEditType","edits","originalPassage","admin","newPassage","newParagraphs","caretPosition","showEarlySubmitModal","showResetModal","showFollowupModal","showReviewModal","reviewing","nextProps","theCurrentActivityHasNotChanged","initialPassageData","currentPassage","activityUIDToUse","KEYDOWN","MOUSEMOVE","MOUSEDOWN","CLICK","KEYPRESS","SCROLL","VISIBILITYCHANGE","prevProps","hasreceiveddata","activitySessionUid","Pusher","channel","loadingFirebaseSession","showWelcomePage","necessaryEditsLength","meterWidth","PlayProofreader","Lesson","match","params","lessonActions.deleteLesson","lessonActions.cancelLessonEdit","vals","lessonActions.submitLessonEdit","lessonActions.startLessonEdit","ProofreaderActivityContainer","lessons","states","lesson","Link","Lesson$1","LinkListItem","Lessons","actions.submitNewLesson","lessonFlags","keys","_","aTitle","bTitle","showLessonForm","submittingnew","FlagDropdown","Lessons$1","usersEndpoint","newSessionEndpoint","AdminContainer","userData","proofreaderActivitiesActions.startListeningToActivities","conceptsActions.startListeningToConcepts","Switch","Route","Admin","withRouter","route","initStoreAction","initialState","currentstate","currentState","statesObj","rootReducer","combineReducers","initStore","configureStore","createStore","applyMiddleware","thunk","composeWithDevTools","store","App","Provider","HashRouter","CompatRouter","ReactOnRails"],"mappings":"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","x_google_ignoreList":[13,14,15,16]}