From e3d8812ecdba53b18f22aeeecd2fa890fd435e85 Mon Sep 17 00:00:00 2001 From: Zaliqa Rosli Date: Wed, 29 Jan 2020 17:10:32 -0500 Subject: [PATCH 1/5] copy cand list module to proj directory --- modules/candidate_list/.gitignore | 4 + modules/candidate_list/README.md | 53 +++ modules/candidate_list/help/candidate_list.md | 66 ++++ .../js/candidateListIndex.js.map | 1 + .../js/candidate_list_helper.js | 38 ++ modules/candidate_list/js/onLoad.js.map | 1 + .../candidate_list/js/openProfileForm.js.map | 1 + .../candidate_list/jsx/candidateListIndex.js | 363 ++++++++++++++++++ modules/candidate_list/jsx/onLoad.js | 11 + modules/candidate_list/jsx/openProfileForm.js | 121 ++++++ .../php/candidate_list.class.inc | 190 +++++++++ modules/candidate_list/php/module.class.inc | 29 ++ .../candidate_list/php/validateids.class.inc | 115 ++++++ .../test/Feedback_BVL_Test_Plan.md | 36 ++ modules/candidate_list/test/TestPlan.md | 35 ++ .../test/candidate_listTest.php | 307 +++++++++++++++ 16 files changed, 1371 insertions(+) create mode 100644 modules/candidate_list/.gitignore create mode 100644 modules/candidate_list/README.md create mode 100644 modules/candidate_list/help/candidate_list.md create mode 100644 modules/candidate_list/js/candidateListIndex.js.map create mode 100644 modules/candidate_list/js/candidate_list_helper.js create mode 100644 modules/candidate_list/js/onLoad.js.map create mode 100644 modules/candidate_list/js/openProfileForm.js.map create mode 100644 modules/candidate_list/jsx/candidateListIndex.js create mode 100644 modules/candidate_list/jsx/onLoad.js create mode 100644 modules/candidate_list/jsx/openProfileForm.js create mode 100644 modules/candidate_list/php/candidate_list.class.inc create mode 100644 modules/candidate_list/php/module.class.inc create mode 100644 modules/candidate_list/php/validateids.class.inc create mode 100644 modules/candidate_list/test/Feedback_BVL_Test_Plan.md create mode 100644 modules/candidate_list/test/TestPlan.md create mode 100755 modules/candidate_list/test/candidate_listTest.php diff --git a/modules/candidate_list/.gitignore b/modules/candidate_list/.gitignore new file mode 100644 index 00000000000..b904e07bcc6 --- /dev/null +++ b/modules/candidate_list/.gitignore @@ -0,0 +1,4 @@ +js/openProfileForm.js +js/columnFormatter.js +js/onLoad.js +js/candidateListIndex.js \ No newline at end of file diff --git a/modules/candidate_list/README.md b/modules/candidate_list/README.md new file mode 100644 index 00000000000..46eb0aab359 --- /dev/null +++ b/modules/candidate_list/README.md @@ -0,0 +1,53 @@ +# Candidate List + +## Purpose + +The candidate list is intended to provide a menu from which users +can access specific candidates while browsing LORIS data. + +It is referred to as "Access Profiles" in the LORIS menus. + +## Intended Users + +The candidate list is primarily used by data entry staff in order +to access the `timepoint_list` module (and `instrument_list` +from there) in order to access the candidate and perform data entry. + +Other user groups may use it for filtering candidate profiles for +reviewing candidate data status. + +## Scope + +The `candidate_list` module provides a list of candidates and links +to other relevant LORIS modules where applicable. + +## Permissions + +Accessing the `candidate_list` module requires either the `data_entry` +permission and at least one study site, or the `access_all_profiles` +permission. + +Users with the `access_all_profiles` permission can see every +candidate in LORIS, while users with only the `data_entry` permission +can exclusively see candidates at study sites where they are affiliated. + +## Configurations + +The `useEDC` configuration variable has a similar function for the +"EDC" ("EDC" stands for "Expected Date Of Confinement" which refers +to the pregnancy due date) column. + +## Interactions with LORIS + +The "Scan Done" column indicates whether or not a scan was performed +for that candidate. When a scan was performed (i.e. it has the value +"Y"), clicking the table cell links to the `imaging_browser` module +prefiltered for that candidate. + +Clicking on the cell in the PSCID column takes the user to the +`timepoint_list` page for that candidate. The link is only clickable +if the user does *not* have the `data_entry` permission. For users +who have the `data_entry` permission, a separate form appears for +the user to type the CandID/PSCID combo in order to access the +candidate. This is intended to prevent data entry errors caused +by accidentally clicking on the wrong row before doing data entry. diff --git a/modules/candidate_list/help/candidate_list.md b/modules/candidate_list/help/candidate_list.md new file mode 100644 index 00000000000..b4863a87df5 --- /dev/null +++ b/modules/candidate_list/help/candidate_list.md @@ -0,0 +1,66 @@ +# Access Profile + +In many cases, the candidate's profile will already be created. The +Access Profile module, also found under the Candidate menu, allows +the user to efficiently search for an existing candidate and access +the related data. + +There are 3 main ways to search for a candidate: + +## Option 1: Using PSCID and DCCID + +A specific candidate profile can be accessed directly by entering +both the PSCID and the DCCID in the white boxes to the right of the +screen and then clicking the button "Open Profile". In a narrow +browser window or mobile device the PSCID and DCCID fields are found +below the selection filter. + +## Option 2: Basic Filter Options + +Users may search for particular candidates by selecting from the +"Basic" filter options. Users may select from drop-down select +boxes, and then click "Show Data" to view a list of candidates. If +only a fragment of the candidate ID is known, the user may search +for the profile by entering the known fragment, and then click show +data to find the appropriate profile. + +For example, searching with "531" under "DCCID" will retrieve the +profile of candidate DCC1107 (with full DCCID 531861). + +## Option 3: Advanced Filter Options + +More detailed filter options can be accessed by clicking on the +"Advanced" button. Users will select from a number of drop-down +select boxes including Site, Project, Subproject, Biological Sex, +etc., and then click "Show Data" to view a list of candidates. To +return to "Basic" selection filters please select "Basic". + +To view a specific candidate's dataset, click on the candidate's +PSCID found in blue text under the "PSCID" column. At the top of +the table, column headings will appear underlined and show a click +icon when the user hovers over the heading title. Data can be sorted +in ascending order according to a given column by clicking on the +column heading (i.e. DCCID, Site, PSCID etc.), and by clicking +again, in descending order. In both standard and mobile view, the +selection filter can be hidden by selecting the upward arrow icon, +allowing easier viewing of the data. Once in this view, users can +click on the downward arrow icon to display the features of the +selection filter once again. This feature applies to all pages that +include a Selection Filter. + +Note that the form remembers previously selected data such that +when the user returns to the "Access Profile" page, the selection +filter will automatically select profiles according to the last +selection settings. Depending on the magnitude of the search, there +may be several pages of search results for the user to look through. +If "No candidates found" appears, this indicates no profiles matched +the information specified by the selection filter(s). + +When on a mobile device or narrow browser window, the table will +have a slider at the bottom of the table, facilitating scrolling +of the data. The user may also hover or click the arrows that flank +the table to see the remainder of the table. When scrolling through +search results, the PSCID column will freeze and remain displayed +on the lefthand side, to allow for easy reference and access to +relevant information. + diff --git a/modules/candidate_list/js/candidateListIndex.js.map b/modules/candidate_list/js/candidateListIndex.js.map new file mode 100644 index 00000000000..363ba62677a --- /dev/null +++ b/modules/candidate_list/js/candidateListIndex.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/prop-types/index.js","webpack:///external \"React\"","webpack:///./jsx/Filter.js","webpack:///./node_modules/sweetalert2/dist/sweetalert2.all.js","webpack:///./jsx/Modal.js","webpack:///./node_modules/prop-types/factoryWithThrowingShims.js","webpack:///./modules/candidate_list/jsx/openProfileForm.js","webpack:///./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack:///./jsx/Loader.js","webpack:///./jsx/Tabs.js","webpack:///./modules/candidate_list/jsx/candidateListIndex.js","webpack:///./jsx/Panel.js","webpack:///./jsx/PaginationLinks.js","webpack:///./jsx/DataTable.js","webpack:///./jsx/FilterableDataTable.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","getDefault","getModuleExports","object","property","prototype","hasOwnProperty","p","s","throwOnDirectAccess","ReactIs","React","_react","_propTypes","Filter","props","_classCallCheck","this","_this","_possibleConstructorReturn","__proto__","getPrototypeOf","onFieldUpdate","renderFilterFields","_this2","searchParams","URLSearchParams","location","search","filter","JSON","fields","find","field","updateFilter","id","type","exactMatch","Array","v","history","_this3","reduce","result","element","_react2","default","createElement","TextboxElement","SelectElement","options","multiple","emptyOption","DateElement","CheckboxElement","cloneElement","label","onUserInput","FormElement","FieldsetElement","columns","legend","title","ButtonElement","clearFilter","Component","console","PropTypes","isRequired","string","global","factory","undefined","_typeof","obj","iterator","constructor","instance","Constructor","TypeError","_defineProperties","target","length","descriptor","configurable","writable","_createClass","protoProps","staticProps","_extends","assign","arguments","source","apply","_inherits","subClass","superClass","_setPrototypeOf","_getPrototypeOf","setPrototypeOf","isNativeReflectConstruct","Reflect","construct","sham","Proxy","Date","toString","e","_construct","Parent","args","Class","a","push","Function","_assertThisInitialized","self","ReferenceError","_superPropBase","_get","receiver","base","desc","getOwnPropertyDescriptor","consolePrefix","uniqueArray","arr","indexOf","toArray","nodeList","slice","formatInputOptions","inputOptions","Map","forEach","keys","warn","message","concat","error","previousWarnOnceMessages","warnOnce","callIfFunction","arg","isPromise","Promise","resolve","DismissReason","freeze","cancel","backdrop","close","esc","timer","argsToParams","params","index","adaptInputValidator","legacyValidator","adaptedInputValidator","inputValue","extraParams","then","validationMessage","swalPrefix","prefix","items","swalClasses","iconTypes","states","previousBodyPadding","hasClass","elem","className","classList","contains","focusInput","input","focus","val","addOrRemoveClass","add","split","Boolean","remove","addClass","removeClass","getChildByClass","childNodes","show","style","opacity","display","content","hide","isVisible","offsetWidth","offsetHeight","getClientRects","haystack","needle","getContainer","document","body","querySelector","container","elementByClass","getPopup","popup","getIcons","querySelectorAll","icon","getTitle","getContent","getImage","image","getProgressSteps","progresssteps","getValidationMessage","getConfirmButton","confirm","getCancelButton","getButtonsWrapper","actions","getActions","getFooter","footer","getCloseButton","getFocusableElements","focusableElementsWithTabindex","sort","b","parseInt","getAttribute","otherFocusableElements","el","isModal","isToast","isLoading","hasAttribute","isNodeEnv","window","sweetHTML","header","question","warning","info","success","file","range","select","radio","checkbox","textarea","replace","init","parentNode","removeChild","documentElement","innerHTML","targetElement","appendChild","rangeOutput","setAttribute","toast","getComputedStyle","direction","rtl","oldInputVal","resetValidationMessage","Swal","oninput","onchange","nextSibling","parseHtmlToContainer","param","HTMLElement","cloneNode","animationEndEvent","testEl","transEndEventNames","WebkitAnimation","OAnimation","animation","measureScrollbar","supportsTouch","navigator","msMaxTouchPoints","scrollDiv","width","height","overflow","scrollbarWidth","clientWidth","renderActions","confirmButton","cancelButton","showConfirmButton","showCancelButton","removeProperty","confirmButtonText","cancelButtonText","confirmButtonAriaLabel","cancelButtonAriaLabel","confirmButtonClass","cancelButtonClass","buttonsStyling","styled","confirmButtonColor","backgroundColor","cancelButtonColor","confirmButtonBackgroundColor","getPropertyValue","borderLeftColor","borderRightColor","renderContent","html","text","textContent","renderIcon","icons","renderImage","imageUrl","imageAlt","imageWidth","removeAttribute","imageHeight","imageClass","renderProgressSteps","progressStepsContainer","currentProgressStep","getQueueStep","progressSteps","step","circle","progresscircle","activeprogressstep","line","progressline","progressStepsDistance","renderTitle","titleText","innerText","join","fixScrollbar","scrollHeight","innerHeight","paddingRight","undoScrollbar","iOSfix","iOS","test","userAgent","MSStream","iosfix","offset","scrollTop","top","undoIOSfix","isIE11","MSInputMethodContext","documentMode","fixVerticalPositionIE","offsetTop","alignItems","IEfix","addEventListener","undoIEfix","removeEventListener","setAriaHidden","bodyChildren","children","unsetAriaHidden","RESTORE_FOCUS_TIMEOUT","globalState","restoreActiveElement","x","scrollX","y","scrollY","restoreFocusTimeout","setTimeout","previousActiveElement","scrollTo","onClose","onAfterClose","removePopupAndResetState","triggerOnAfterClose","keydownTarget","keydownHandler","capture","keydownListenerCapture","keydownHandlerAdded","shown","noanimation","swalCloseEventFinished","isVisible$1","clickConfirm","click","clickCancel","fire","_len","_key","withNoNewKeyword","ParentSwal","NoNewKeywordSwal","defaultParams","customClass","customContainerClass","heightAuto","allowOutsideClick","allowEscapeKey","allowEnterKey","stopKeydownPropagation","preConfirm","reverseButtons","focusConfirm","focusCancel","showCloseButton","closeButtonAriaLabel","showLoaderOnConfirm","padding","background","inputPlaceholder","inputAutoTrim","inputClass","inputAttributes","inputValidator","grow","position","onBeforeOpen","onOpen","useRejections","expectRejections","deprecatedParams","toastIncompatibleParams","isValidParameter","paramName","isDeprecatedParameter","showWarningsForParams","deprecationWarning","defaults","withGlobalDefaults","SwalWithGlobalDefaults","_ParentSwal","_main","setDefaults","resetDefaults","_swalDefaults","mixin","mixinParams","MixinSwal","currentSteps","queue","steps","swal","resetQueue","queueResult","callback","dismiss","insertQueueStep","splice","deleteQueueStep","showLoading","loading","disabled","getTimerLeft","timeout","stopTimer","stop","resumeTimer","start","toggleTimer","running","increaseTimer","increase","isTimerRunning","isRunning","staticMethods","closePopup","closeModal","closeToast","enableLoading","_Symbol","idCounter","Math","floor","random","WeakMap$1","WeakMap","dP","hOP","delete","del","has","set","privateProps","promise","innerParams","domCache","hideLoading","getInput","inputType","enableButtons","disableButtons","enableConfirmButton","disableConfirmButton","enableInput","radiosContainer","radios","disableInput","showValidationMessage","error$$1","popupComputedStyle","marginLeft","marginRight","inputerror","resetValidationError","showValidationError","getProgressSteps$1","setProgressSteps","updatedParams","showProgressSteps","hideProgressSteps","Timer","delay","started","remaining","clearTimeout","defaultInputValidators","email","reject","url","setParameters","oldPopup","popupBackgroundColor","successIconParts","closeButton","center","growClass","modal","openPopup","fade","overflowY","activeElement","userParams","succeedWith","dismissWith","errorWith","getInputValue","checked","files","trim","preConfirmPromise","preConfirmValue","onButtonEvent","targetedConfirm","targetedCancel","validationPromise","checkValidity","buttons","onclick","onmouseover","onmouseout","onmousedown","ignoreOutsideClick","onmouseup","insertBefore","setFocus","increment","focusableElements","_i","stopPropagation","arrowKeys","isComposing","outerHTML","preventDefault","btnIndex","_i2","shiftKey","inputTypes","setInputPlaceholder","placeholder","_i3","inputContainer","j","attributes","attrName","attr","populateInputOptions","rangeInput","selected","inputOption","optionValue","optionLabel","option","radioValue","radioLabel","radioInput","radioLabelElement","checkboxInput","processInputOptions","parseFloat","catch","err","blur","instanceMethods","disableLoading","currentInstance","SweetAlert","outerParams","defineProperties","onFulfilled","onRejected","finally","onFinally","_currentInstance","noop","Sweetalert2","version","sweetAlert","getElementsByTagName","styleSheet","cssText","_sweetalert","Modal","handleClose","throwWarning","_sweetalert2","_props","onSubmit","headerStyle","flexDirection","borderTopRightRadius","fontSize","borderBottom","glyphStyle","cursor","bodyStyle","modalContainer","zIndex","paddingTop","left","visibility","modalContent","borderRadius","margin","border","boxShadow","transition","renderChildren","footerStyle","borderTop","submitStyle","submitButton","onClick","bool","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","propName","componentName","propFullName","secret","Error","getShim","ReactPropTypes","array","func","number","symbol","any","arrayOf","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","OpenProfileForm","state","PSCID","CandID","updateFormElement","validateAndSubmit","formElement","setState","$","loris","data","Loader","size","Tabs","hash","activeTab","updateURL","defaultTab","tabs","handleClick","getTabs","getTabPanes","tabId","onTabChange","scrollDistance","map","tab","tabClass","href","tabID","role","data-toggle","tabPanes","Children","child","tabStyle","marginBottom","VerticalTabs","TabPane","TabId","Title","_Loader","_FilterableDataTable","_Modal","_openProfileForm","CandidateListIndex","isLoaded","hideFilter","profileForm","fetchData","formatColumn","toggleFilters","fetch","dataURL","credentials","resp","json","column","cell","row","hasPermission","baseURL","_url","_this4","_Loader2","fieldOptions","site","subproject","Human","Scanner","Y","N","participantstatus","Male","Female","0","1","2","3","4","Not Started","Screening","Visit","Approval","Recycling Bin","project","_Modal2","openProfile","_openProfileForm2","action","_FilterableDataTable2","Data","getFormattedCell","ReactDOM","BaseURL","userHasPermission","Panel","collapsed","initCollapsed","panelClass","toggleCollapsed","glyphClass","panelHeading","data-target","overflowX","PaginationLinks","changePage","prevProps","Total","onChangePage","evt","rowsPerPage","RowsPerPage","pageLinks","lastPage","startPage","Active","lastShownPage","RPaginationLinks","_PaginationLinks","DataTable","page","rows","ascending","setSortColumn","updateSortColumn","toggleSortOrder","updatePageNumber","updatePageRows","downloadCSV","getFilteredRowIndexes","sortRows","hasFilterKeyword","sate","filteredRowIndexes","csvData","getMappedCell","csvworker","Worker","dataDate","link","headerList","cmd","headers","identifiers","RowNameMap","useKeyword","filterValuesCount","tableData","fieldData","filteredIndexes","hasFilters","keyword","headerCount","keywordMatch","rowIndexes","idx","isString","String","isNumber","isNaN","Number","RowIdx","Value","Content","filterData","opposite","searchKey","searchString","intData","searchArray","toLowerCase","match","CTA","nullTableShow","defaultColumn","rowNumLabel","_loop","colIndex","freezeColumn","filteredCount","currentPageRow","_loop2","rowIndex","rowData","curRow","_loop3","celldata","k","_ret3","rowIndexDisplay","colSpan","rowsPerPageDropdown","onChange","justifyContent","flexWrap","order","_PaginationLinks2","folder","onSort","_Panel","_Tabs","_DataTable","_Filter","FilterableDataTable","_Filter2","dataTable","_DataTable2","filterPresets","preset","active","_Panel2","PureComponent"],"mappings":"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","file":"./modules/candidate_list/js/candidateListIndex.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 58);\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","module.exports = React;","import React, {Component} from 'react';\nimport PropTypes from 'prop-types';\n\n/**\n * Filter component.\n * A wrapper for form elements inside a selection filter.\n *\n * Constructs filter fields based on this.props.fields configuration object\n *\n * Alters the filter object and sends it to parent on every update.\n *\n */\nclass Filter extends Component {\n constructor(props) {\n super(props);\n this.onFieldUpdate = this.onFieldUpdate.bind(this);\n this.renderFilterFields = this.renderFilterFields.bind(this);\n }\n\n componentDidMount() {\n const searchParams = new URLSearchParams(location.search);\n const filter = JSON.parse(JSON.stringify(this.props.filter));\n searchParams.forEach((value, name) => {\n if (this.props.fields.find((field) => (field.filter||{}).name == name)) {\n filter[name] = {value: searchParams.getAll(name)};\n }\n });\n this.props.updateFilter(filter);\n }\n\n /**\n * Sets filter object to reflect values of input fields.\n *\n * @param {string} name - form element type (i.e component name)\n * @param {string} value - the name of the form element\n * @param {string} id - id of the form element\n * @param {string} type - type of the form element\n */\n onFieldUpdate(name, value, id, type) {\n const searchParams = new URLSearchParams(location.search);\n const filter = JSON.parse(JSON.stringify(this.props.filter));\n const exactMatch = (!(type === 'textbox' || type === 'date'));\n if (value === null || value === '' || (value.constructor === Array && value.length === 0)) {\n delete filter[name];\n searchParams.delete(name);\n } else {\n if (value.constructor === Array) {\n searchParams.delete(name);\n value.forEach((v) => searchParams.append(name, v));\n } else {\n searchParams.set(name, value);\n }\n filter[name] = {value, exactMatch};\n }\n this.props.updateFilter(filter);\n history.replaceState(filter, '', `?${searchParams.toString()}`);\n }\n\n renderFilterFields() {\n return this.props.fields.reduce((result, field) => {\n const filter = field.filter;\n if (filter && filter.hide !== true) {\n let element;\n switch (filter.type) {\n case 'text':\n element = ;\n break;\n case 'select':\n element = ;\n break;\n case 'multiselect':\n element = ;\n break;\n case 'date':\n element = ;\n break;\n case 'checkbox':\n element = ;\n break;\n default:\n element = ;\n }\n\n // The value prop has to default to false if the first two options\n // are undefined so that the checkbox component is a controlled input\n // element with a starting default value\n result.push(React.cloneElement(\n element,\n {\n name: filter.name,\n label: field.label,\n value: (this.props.filter[filter.name] || {}).value || false,\n onUserInput: this.onFieldUpdate,\n }\n ));\n }\n\n return result;\n }, []);\n }\n\n render() {\n return (\n \n \n {this.renderFilterFields()}\n \n \n \n );\n }\n}\n\nFilter.defaultProps = {\n id: null,\n clearFilter: function() {\n console.warn('onUpdate() callback is not set!');\n },\n columns: 1,\n};\nFilter.propTypes = {\n filter: PropTypes.object.isRequired,\n clearFilter: PropTypes.func.isRequired,\n id: PropTypes.string,\n name: PropTypes.string,\n columns: PropTypes.string,\n title: PropTypes.string,\n fields: PropTypes.object.isRequired,\n};\n\nexport default Filter;\n","/*!\n* sweetalert2 v7.33.1\n* Released under the MIT License.\n*/\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.Sweetalert2 = factory());\n}(this, (function () { 'use strict';\n\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}\n\nfunction isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n _construct = Reflect.construct;\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) _setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n}\n\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return _assertThisInitialized(self);\n}\n\nfunction _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = _getPrototypeOf(object);\n if (object === null) break;\n }\n\n return object;\n}\n\nfunction _get(target, property, receiver) {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get;\n } else {\n _get = function _get(target, property, receiver) {\n var base = _superPropBase(target, property);\n\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n\n if (desc.get) {\n return desc.get.call(receiver);\n }\n\n return desc.value;\n };\n }\n\n return _get(target, property, receiver || target);\n}\n\nvar consolePrefix = 'SweetAlert2:';\n/**\n * Filter the unique values into a new array\n * @param arr\n */\n\nvar uniqueArray = function uniqueArray(arr) {\n var result = [];\n\n for (var i = 0; i < arr.length; i++) {\n if (result.indexOf(arr[i]) === -1) {\n result.push(arr[i]);\n }\n }\n\n return result;\n};\n/**\n * Convert NodeList to Array\n * @param nodeList\n */\n\nvar toArray = function toArray(nodeList) {\n return Array.prototype.slice.call(nodeList);\n};\n/**\n * Converts `inputOptions` into an array of `[value, label]`s\n * @param inputOptions\n */\n\nvar formatInputOptions = function formatInputOptions(inputOptions) {\n var result = [];\n\n if (typeof Map !== 'undefined' && inputOptions instanceof Map) {\n inputOptions.forEach(function (value, key) {\n result.push([key, value]);\n });\n } else {\n Object.keys(inputOptions).forEach(function (key) {\n result.push([key, inputOptions[key]]);\n });\n }\n\n return result;\n};\n/**\n * Standardise console warnings\n * @param message\n */\n\nvar warn = function warn(message) {\n console.warn(\"\".concat(consolePrefix, \" \").concat(message));\n};\n/**\n * Standardise console errors\n * @param message\n */\n\nvar error = function error(message) {\n console.error(\"\".concat(consolePrefix, \" \").concat(message));\n};\n/**\n * Private global state for `warnOnce`\n * @type {Array}\n * @private\n */\n\nvar previousWarnOnceMessages = [];\n/**\n * Show a console warning, but only if it hasn't already been shown\n * @param message\n */\n\nvar warnOnce = function warnOnce(message) {\n if (!(previousWarnOnceMessages.indexOf(message) !== -1)) {\n previousWarnOnceMessages.push(message);\n warn(message);\n }\n};\n/**\n * If `arg` is a function, call it (with no arguments or context) and return the result.\n * Otherwise, just pass the value through\n * @param arg\n */\n\nvar callIfFunction = function callIfFunction(arg) {\n return typeof arg === 'function' ? arg() : arg;\n};\nvar isPromise = function isPromise(arg) {\n return arg && Promise.resolve(arg) === arg;\n};\n\nvar DismissReason = Object.freeze({\n cancel: 'cancel',\n backdrop: 'overlay',\n close: 'close',\n esc: 'esc',\n timer: 'timer'\n});\n\nvar argsToParams = function argsToParams(args) {\n var params = {};\n\n switch (_typeof(args[0])) {\n case 'object':\n _extends(params, args[0]);\n\n break;\n\n default:\n ['title', 'html', 'type'].forEach(function (name, index) {\n switch (_typeof(args[index])) {\n case 'string':\n params[name] = args[index];\n break;\n\n case 'undefined':\n break;\n\n default:\n error(\"Unexpected type of \".concat(name, \"! Expected \\\"string\\\", got \").concat(_typeof(args[index])));\n }\n });\n }\n\n return params;\n};\n\n/**\n * Adapt a legacy inputValidator for use with expectRejections=false\n */\nvar adaptInputValidator = function adaptInputValidator(legacyValidator) {\n return function adaptedInputValidator(inputValue, extraParams) {\n return legacyValidator.call(this, inputValue, extraParams).then(function () {\n return undefined;\n }, function (validationMessage) {\n return validationMessage;\n });\n };\n};\n\nvar swalPrefix = 'swal2-';\nvar prefix = function prefix(items) {\n var result = {};\n\n for (var i in items) {\n result[items[i]] = swalPrefix + items[i];\n }\n\n return result;\n};\nvar swalClasses = prefix(['container', 'shown', 'height-auto', 'iosfix', 'popup', 'modal', 'no-backdrop', 'toast', 'toast-shown', 'toast-column', 'fade', 'show', 'hide', 'noanimation', 'close', 'title', 'header', 'content', 'actions', 'confirm', 'cancel', 'footer', 'icon', 'icon-text', 'image', 'input', 'file', 'range', 'select', 'radio', 'checkbox', 'label', 'textarea', 'inputerror', 'validation-message', 'progresssteps', 'activeprogressstep', 'progresscircle', 'progressline', 'loading', 'styled', 'top', 'top-start', 'top-end', 'top-left', 'top-right', 'center', 'center-start', 'center-end', 'center-left', 'center-right', 'bottom', 'bottom-start', 'bottom-end', 'bottom-left', 'bottom-right', 'grow-row', 'grow-column', 'grow-fullscreen', 'rtl']);\nvar iconTypes = prefix(['success', 'warning', 'info', 'question', 'error']);\n\nvar states = {\n previousBodyPadding: null\n};\nvar hasClass = function hasClass(elem, className) {\n return elem.classList.contains(className);\n};\nvar focusInput = function focusInput(input) {\n input.focus(); // place cursor at end of text in text input\n\n if (input.type !== 'file') {\n // http://stackoverflow.com/a/2345915\n var val = input.value;\n input.value = '';\n input.value = val;\n }\n};\n\nvar addOrRemoveClass = function addOrRemoveClass(target, classList, add) {\n if (!target || !classList) {\n return;\n }\n\n if (typeof classList === 'string') {\n classList = classList.split(/\\s+/).filter(Boolean);\n }\n\n classList.forEach(function (className) {\n if (target.forEach) {\n target.forEach(function (elem) {\n add ? elem.classList.add(className) : elem.classList.remove(className);\n });\n } else {\n add ? target.classList.add(className) : target.classList.remove(className);\n }\n });\n};\n\nvar addClass = function addClass(target, classList) {\n addOrRemoveClass(target, classList, true);\n};\nvar removeClass = function removeClass(target, classList) {\n addOrRemoveClass(target, classList, false);\n};\nvar getChildByClass = function getChildByClass(elem, className) {\n for (var i = 0; i < elem.childNodes.length; i++) {\n if (hasClass(elem.childNodes[i], className)) {\n return elem.childNodes[i];\n }\n }\n};\nvar show = function show(elem) {\n elem.style.opacity = '';\n elem.style.display = elem.id === swalClasses.content ? 'block' : 'flex';\n};\nvar hide = function hide(elem) {\n elem.style.opacity = '';\n elem.style.display = 'none';\n}; // borrowed from jquery $(elem).is(':visible') implementation\n\nvar isVisible = function isVisible(elem) {\n return elem && (elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);\n};\nvar contains = function contains(haystack, needle) {\n if (typeof haystack.contains === 'function') {\n return haystack.contains(needle);\n }\n};\n\nvar getContainer = function getContainer() {\n return document.body.querySelector('.' + swalClasses.container);\n};\n\nvar elementByClass = function elementByClass(className) {\n var container = getContainer();\n return container ? container.querySelector('.' + className) : null;\n};\n\nvar getPopup = function getPopup() {\n return elementByClass(swalClasses.popup);\n};\nvar getIcons = function getIcons() {\n var popup = getPopup();\n return toArray(popup.querySelectorAll('.' + swalClasses.icon));\n};\nvar getTitle = function getTitle() {\n return elementByClass(swalClasses.title);\n};\nvar getContent = function getContent() {\n return elementByClass(swalClasses.content);\n};\nvar getImage = function getImage() {\n return elementByClass(swalClasses.image);\n};\nvar getProgressSteps = function getProgressSteps() {\n return elementByClass(swalClasses.progresssteps);\n};\nvar getValidationMessage = function getValidationMessage() {\n return elementByClass(swalClasses['validation-message']);\n};\nvar getConfirmButton = function getConfirmButton() {\n return elementByClass(swalClasses.confirm);\n};\nvar getCancelButton = function getCancelButton() {\n return elementByClass(swalClasses.cancel);\n};\n/* @deprecated */\n\n/* istanbul ignore next */\n\nvar getButtonsWrapper = function getButtonsWrapper() {\n warnOnce(\"swal.getButtonsWrapper() is deprecated and will be removed in the next major release, use swal.getActions() instead\");\n return elementByClass(swalClasses.actions);\n};\nvar getActions = function getActions() {\n return elementByClass(swalClasses.actions);\n};\nvar getFooter = function getFooter() {\n return elementByClass(swalClasses.footer);\n};\nvar getCloseButton = function getCloseButton() {\n return elementByClass(swalClasses.close);\n};\nvar getFocusableElements = function getFocusableElements() {\n var focusableElementsWithTabindex = toArray(getPopup().querySelectorAll('[tabindex]:not([tabindex=\"-1\"]):not([tabindex=\"0\"])')) // sort according to tabindex\n .sort(function (a, b) {\n a = parseInt(a.getAttribute('tabindex'));\n b = parseInt(b.getAttribute('tabindex'));\n\n if (a > b) {\n return 1;\n } else if (a < b) {\n return -1;\n }\n\n return 0;\n }); // https://github.com/jkup/focusable/blob/master/index.js\n\n var otherFocusableElements = toArray(getPopup().querySelectorAll('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex=\"0\"], [contenteditable], audio[controls], video[controls]')).filter(function (el) {\n return el.getAttribute('tabindex') !== '-1';\n });\n return uniqueArray(focusableElementsWithTabindex.concat(otherFocusableElements)).filter(function (el) {\n return isVisible(el);\n });\n};\nvar isModal = function isModal() {\n return !isToast() && !document.body.classList.contains(swalClasses['no-backdrop']);\n};\nvar isToast = function isToast() {\n return document.body.classList.contains(swalClasses['toast-shown']);\n};\nvar isLoading = function isLoading() {\n return getPopup().hasAttribute('data-loading');\n};\n\n// Detect Node env\nvar isNodeEnv = function isNodeEnv() {\n return typeof window === 'undefined' || typeof document === 'undefined';\n};\n\nvar sweetHTML = \"\\n
\\n
\\n
    \\n
    \\n \\n
    \\n
    \\n ?\\n
    \\n
    \\n !\\n
    \\n
    \\n i\\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\").replace(/(^|\\n)\\s*/g, '');\n/*\n * Add modal + backdrop to DOM\n */\n\nvar init = function init(params) {\n // Clean up the old popup if it exists\n var c = getContainer();\n\n if (c) {\n c.parentNode.removeChild(c);\n removeClass([document.documentElement, document.body], [swalClasses['no-backdrop'], swalClasses['toast-shown'], swalClasses['has-column']]);\n }\n /* istanbul ignore if */\n\n\n if (isNodeEnv()) {\n error('SweetAlert2 requires document to initialize');\n return;\n }\n\n var container = document.createElement('div');\n container.className = swalClasses.container;\n container.innerHTML = sweetHTML;\n var targetElement = typeof params.target === 'string' ? document.querySelector(params.target) : params.target;\n targetElement.appendChild(container);\n var popup = getPopup();\n var content = getContent();\n var input = getChildByClass(content, swalClasses.input);\n var file = getChildByClass(content, swalClasses.file);\n var range = content.querySelector(\".\".concat(swalClasses.range, \" input\"));\n var rangeOutput = content.querySelector(\".\".concat(swalClasses.range, \" output\"));\n var select = getChildByClass(content, swalClasses.select);\n var checkbox = content.querySelector(\".\".concat(swalClasses.checkbox, \" input\"));\n var textarea = getChildByClass(content, swalClasses.textarea); // a11y\n\n popup.setAttribute('role', params.toast ? 'alert' : 'dialog');\n popup.setAttribute('aria-live', params.toast ? 'polite' : 'assertive');\n\n if (!params.toast) {\n popup.setAttribute('aria-modal', 'true');\n } // RTL\n\n\n if (window.getComputedStyle(targetElement).direction === 'rtl') {\n addClass(getContainer(), swalClasses.rtl);\n }\n\n var oldInputVal; // IE11 workaround, see #1109 for details\n\n var resetValidationMessage = function resetValidationMessage(e) {\n if (Swal.isVisible() && oldInputVal !== e.target.value) {\n Swal.resetValidationMessage();\n }\n\n oldInputVal = e.target.value;\n };\n\n input.oninput = resetValidationMessage;\n file.onchange = resetValidationMessage;\n select.onchange = resetValidationMessage;\n checkbox.onchange = resetValidationMessage;\n textarea.oninput = resetValidationMessage;\n\n range.oninput = function (e) {\n resetValidationMessage(e);\n rangeOutput.value = range.value;\n };\n\n range.onchange = function (e) {\n resetValidationMessage(e);\n range.nextSibling.value = range.value;\n };\n\n return popup;\n};\n\nvar parseHtmlToContainer = function parseHtmlToContainer(param, target) {\n if (!param) {\n return hide(target);\n } // DOM element\n\n\n if (param instanceof HTMLElement) {\n target.appendChild(param); // JQuery element(s)\n } else if (_typeof(param) === 'object') {\n target.innerHTML = '';\n\n if (0 in param) {\n for (var i = 0; i in param; i++) {\n target.appendChild(param[i].cloneNode(true));\n }\n } else {\n target.appendChild(param.cloneNode(true));\n }\n } else if (param) {\n target.innerHTML = param;\n }\n\n show(target);\n};\n\nvar animationEndEvent = function () {\n // Prevent run in Node env\n\n /* istanbul ignore if */\n if (isNodeEnv()) {\n return false;\n }\n\n var testEl = document.createElement('div');\n var transEndEventNames = {\n 'WebkitAnimation': 'webkitAnimationEnd',\n 'OAnimation': 'oAnimationEnd oanimationend',\n 'animation': 'animationend'\n };\n\n for (var i in transEndEventNames) {\n if (transEndEventNames.hasOwnProperty(i) && typeof testEl.style[i] !== 'undefined') {\n return transEndEventNames[i];\n }\n }\n\n return false;\n}();\n\n// Measure width of scrollbar\n// https://github.com/twbs/bootstrap/blob/master/js/modal.js#L279-L286\nvar measureScrollbar = function measureScrollbar() {\n var supportsTouch = 'ontouchstart' in window || navigator.msMaxTouchPoints;\n\n if (supportsTouch) {\n return 0;\n }\n\n var scrollDiv = document.createElement('div');\n scrollDiv.style.width = '50px';\n scrollDiv.style.height = '50px';\n scrollDiv.style.overflow = 'scroll';\n document.body.appendChild(scrollDiv);\n var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;\n document.body.removeChild(scrollDiv);\n return scrollbarWidth;\n};\n\nvar renderActions = function renderActions(params) {\n var actions = getActions();\n var confirmButton = getConfirmButton();\n var cancelButton = getCancelButton(); // Actions (buttons) wrapper\n\n if (!params.showConfirmButton && !params.showCancelButton) {\n hide(actions);\n } else {\n show(actions);\n } // Cancel button\n\n\n if (params.showCancelButton) {\n cancelButton.style.display = 'inline-block';\n } else {\n hide(cancelButton);\n } // Confirm button\n\n\n if (params.showConfirmButton) {\n confirmButton.style.removeProperty('display');\n } else {\n hide(confirmButton);\n } // Edit text on confirm and cancel buttons\n\n\n confirmButton.innerHTML = params.confirmButtonText;\n cancelButton.innerHTML = params.cancelButtonText; // ARIA labels for confirm and cancel buttons\n\n confirmButton.setAttribute('aria-label', params.confirmButtonAriaLabel);\n cancelButton.setAttribute('aria-label', params.cancelButtonAriaLabel); // Add buttons custom classes\n\n confirmButton.className = swalClasses.confirm;\n addClass(confirmButton, params.confirmButtonClass);\n cancelButton.className = swalClasses.cancel;\n addClass(cancelButton, params.cancelButtonClass); // Buttons styling\n\n if (params.buttonsStyling) {\n addClass([confirmButton, cancelButton], swalClasses.styled); // Buttons background colors\n\n if (params.confirmButtonColor) {\n confirmButton.style.backgroundColor = params.confirmButtonColor;\n }\n\n if (params.cancelButtonColor) {\n cancelButton.style.backgroundColor = params.cancelButtonColor;\n } // Loading state\n\n\n var confirmButtonBackgroundColor = window.getComputedStyle(confirmButton).getPropertyValue('background-color');\n confirmButton.style.borderLeftColor = confirmButtonBackgroundColor;\n confirmButton.style.borderRightColor = confirmButtonBackgroundColor;\n } else {\n removeClass([confirmButton, cancelButton], swalClasses.styled);\n confirmButton.style.backgroundColor = confirmButton.style.borderLeftColor = confirmButton.style.borderRightColor = '';\n cancelButton.style.backgroundColor = cancelButton.style.borderLeftColor = cancelButton.style.borderRightColor = '';\n }\n};\n\nvar renderContent = function renderContent(params) {\n var content = getContent().querySelector('#' + swalClasses.content); // Content as HTML\n\n if (params.html) {\n parseHtmlToContainer(params.html, content); // Content as plain text\n } else if (params.text) {\n content.textContent = params.text;\n show(content);\n } else {\n hide(content);\n }\n};\n\nvar renderIcon = function renderIcon(params) {\n var icons = getIcons();\n\n for (var i = 0; i < icons.length; i++) {\n hide(icons[i]);\n }\n\n if (params.type) {\n if (Object.keys(iconTypes).indexOf(params.type) !== -1) {\n var icon = Swal.getPopup().querySelector(\".\".concat(swalClasses.icon, \".\").concat(iconTypes[params.type]));\n show(icon); // Animate icon\n\n if (params.animation) {\n addClass(icon, \"swal2-animate-\".concat(params.type, \"-icon\"));\n }\n } else {\n error(\"Unknown type! Expected \\\"success\\\", \\\"error\\\", \\\"warning\\\", \\\"info\\\" or \\\"question\\\", got \\\"\".concat(params.type, \"\\\"\"));\n }\n }\n};\n\nvar renderImage = function renderImage(params) {\n var image = getImage();\n\n if (params.imageUrl) {\n image.setAttribute('src', params.imageUrl);\n image.setAttribute('alt', params.imageAlt);\n show(image);\n\n if (params.imageWidth) {\n image.setAttribute('width', params.imageWidth);\n } else {\n image.removeAttribute('width');\n }\n\n if (params.imageHeight) {\n image.setAttribute('height', params.imageHeight);\n } else {\n image.removeAttribute('height');\n }\n\n image.className = swalClasses.image;\n\n if (params.imageClass) {\n addClass(image, params.imageClass);\n }\n } else {\n hide(image);\n }\n};\n\nvar renderProgressSteps = function renderProgressSteps(params) {\n var progressStepsContainer = getProgressSteps();\n var currentProgressStep = parseInt(params.currentProgressStep === null ? Swal.getQueueStep() : params.currentProgressStep, 10);\n\n if (params.progressSteps && params.progressSteps.length) {\n show(progressStepsContainer);\n progressStepsContainer.innerHTML = '';\n\n if (currentProgressStep >= params.progressSteps.length) {\n warn('Invalid currentProgressStep parameter, it should be less than progressSteps.length ' + '(currentProgressStep like JS arrays starts from 0)');\n }\n\n params.progressSteps.forEach(function (step, index) {\n var circle = document.createElement('li');\n addClass(circle, swalClasses.progresscircle);\n circle.innerHTML = step;\n\n if (index === currentProgressStep) {\n addClass(circle, swalClasses.activeprogressstep);\n }\n\n progressStepsContainer.appendChild(circle);\n\n if (index !== params.progressSteps.length - 1) {\n var line = document.createElement('li');\n addClass(line, swalClasses.progressline);\n\n if (params.progressStepsDistance) {\n line.style.width = params.progressStepsDistance;\n }\n\n progressStepsContainer.appendChild(line);\n }\n });\n } else {\n hide(progressStepsContainer);\n }\n};\n\nvar renderTitle = function renderTitle(params) {\n var title = getTitle();\n\n if (params.titleText) {\n title.innerText = params.titleText;\n } else if (params.title) {\n if (typeof params.title === 'string') {\n params.title = params.title.split('\\n').join('
    ');\n }\n\n parseHtmlToContainer(params.title, title);\n }\n};\n\nvar fixScrollbar = function fixScrollbar() {\n // for queues, do not do this more than once\n if (states.previousBodyPadding !== null) {\n return;\n } // if the body has overflow\n\n\n if (document.body.scrollHeight > window.innerHeight) {\n // add padding so the content doesn't shift after removal of scrollbar\n states.previousBodyPadding = parseInt(window.getComputedStyle(document.body).getPropertyValue('padding-right'));\n document.body.style.paddingRight = states.previousBodyPadding + measureScrollbar() + 'px';\n }\n};\nvar undoScrollbar = function undoScrollbar() {\n if (states.previousBodyPadding !== null) {\n document.body.style.paddingRight = states.previousBodyPadding;\n states.previousBodyPadding = null;\n }\n};\n\n/* istanbul ignore next */\n\nvar iOSfix = function iOSfix() {\n var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;\n\n if (iOS && !hasClass(document.body, swalClasses.iosfix)) {\n var offset = document.body.scrollTop;\n document.body.style.top = offset * -1 + 'px';\n addClass(document.body, swalClasses.iosfix);\n }\n};\n/* istanbul ignore next */\n\nvar undoIOSfix = function undoIOSfix() {\n if (hasClass(document.body, swalClasses.iosfix)) {\n var offset = parseInt(document.body.style.top, 10);\n removeClass(document.body, swalClasses.iosfix);\n document.body.style.top = '';\n document.body.scrollTop = offset * -1;\n }\n};\n\nvar isIE11 = function isIE11() {\n return !!window.MSInputMethodContext && !!document.documentMode;\n}; // Fix IE11 centering sweetalert2/issues/933\n\n/* istanbul ignore next */\n\n\nvar fixVerticalPositionIE = function fixVerticalPositionIE() {\n var container = getContainer();\n var popup = getPopup();\n container.style.removeProperty('align-items');\n\n if (popup.offsetTop < 0) {\n container.style.alignItems = 'flex-start';\n }\n};\n/* istanbul ignore next */\n\n\nvar IEfix = function IEfix() {\n if (typeof window !== 'undefined' && isIE11()) {\n fixVerticalPositionIE();\n window.addEventListener('resize', fixVerticalPositionIE);\n }\n};\n/* istanbul ignore next */\n\nvar undoIEfix = function undoIEfix() {\n if (typeof window !== 'undefined' && isIE11()) {\n window.removeEventListener('resize', fixVerticalPositionIE);\n }\n};\n\n// Adding aria-hidden=\"true\" to elements outside of the active modal dialog ensures that\n// elements not within the active modal dialog will not be surfaced if a user opens a screen\n// reader’s list of elements (headings, form controls, landmarks, etc.) in the document.\n\nvar setAriaHidden = function setAriaHidden() {\n var bodyChildren = toArray(document.body.children);\n bodyChildren.forEach(function (el) {\n if (el === getContainer() || contains(el, getContainer())) {\n return;\n }\n\n if (el.hasAttribute('aria-hidden')) {\n el.setAttribute('data-previous-aria-hidden', el.getAttribute('aria-hidden'));\n }\n\n el.setAttribute('aria-hidden', 'true');\n });\n};\nvar unsetAriaHidden = function unsetAriaHidden() {\n var bodyChildren = toArray(document.body.children);\n bodyChildren.forEach(function (el) {\n if (el.hasAttribute('data-previous-aria-hidden')) {\n el.setAttribute('aria-hidden', el.getAttribute('data-previous-aria-hidden'));\n el.removeAttribute('data-previous-aria-hidden');\n } else {\n el.removeAttribute('aria-hidden');\n }\n });\n};\n\nvar RESTORE_FOCUS_TIMEOUT = 100;\n\nvar globalState = {};\nvar restoreActiveElement = function restoreActiveElement() {\n return new Promise(function (resolve) {\n var x = window.scrollX;\n var y = window.scrollY;\n globalState.restoreFocusTimeout = setTimeout(function () {\n if (globalState.previousActiveElement && globalState.previousActiveElement.focus) {\n globalState.previousActiveElement.focus();\n globalState.previousActiveElement = null;\n } else if (document.body) {\n document.body.focus();\n }\n\n resolve();\n }, RESTORE_FOCUS_TIMEOUT); // issues/900\n\n if (typeof x !== 'undefined' && typeof y !== 'undefined') {\n // IE doesn't have scrollX/scrollY support\n window.scrollTo(x, y);\n }\n });\n};\n\n/*\n * Global function to close sweetAlert\n */\n\nvar close = function close(onClose, onAfterClose) {\n var container = getContainer();\n var popup = getPopup();\n\n if (!popup) {\n return;\n }\n\n if (onClose !== null && typeof onClose === 'function') {\n onClose(popup);\n }\n\n removeClass(popup, swalClasses.show);\n addClass(popup, swalClasses.hide);\n\n var removePopupAndResetState = function removePopupAndResetState() {\n if (!isToast()) {\n restoreActiveElement().then(function () {\n return triggerOnAfterClose(onAfterClose);\n });\n globalState.keydownTarget.removeEventListener('keydown', globalState.keydownHandler, {\n capture: globalState.keydownListenerCapture\n });\n globalState.keydownHandlerAdded = false;\n } else {\n triggerOnAfterClose(onAfterClose);\n }\n\n if (container.parentNode) {\n container.parentNode.removeChild(container);\n }\n\n removeClass([document.documentElement, document.body], [swalClasses.shown, swalClasses['height-auto'], swalClasses['no-backdrop'], swalClasses['toast-shown'], swalClasses['toast-column']]);\n\n if (isModal()) {\n undoScrollbar();\n undoIOSfix();\n undoIEfix();\n unsetAriaHidden();\n }\n }; // If animation is supported, animate\n\n\n if (animationEndEvent && !hasClass(popup, swalClasses.noanimation)) {\n popup.addEventListener(animationEndEvent, function swalCloseEventFinished() {\n popup.removeEventListener(animationEndEvent, swalCloseEventFinished);\n\n if (hasClass(popup, swalClasses.hide)) {\n removePopupAndResetState();\n }\n });\n } else {\n // Otherwise, remove immediately\n removePopupAndResetState();\n }\n};\n\nvar triggerOnAfterClose = function triggerOnAfterClose(onAfterClose) {\n if (onAfterClose !== null && typeof onAfterClose === 'function') {\n setTimeout(function () {\n onAfterClose();\n });\n }\n};\n\n/*\n * Global function to determine if swal2 popup is shown\n */\n\nvar isVisible$1 = function isVisible() {\n return !!getPopup();\n};\n/*\n * Global function to click 'Confirm' button\n */\n\nvar clickConfirm = function clickConfirm() {\n return getConfirmButton().click();\n};\n/*\n * Global function to click 'Cancel' button\n */\n\nvar clickCancel = function clickCancel() {\n return getCancelButton().click();\n};\n\nfunction fire() {\n var Swal = this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _construct(Swal, args);\n}\n\n/**\n * Extends a Swal class making it able to be instantiated without the `new` keyword (and thus without `Swal.fire`)\n * @param ParentSwal\n * @returns {NoNewKeywordSwal}\n */\nfunction withNoNewKeyword(ParentSwal) {\n var NoNewKeywordSwal = function NoNewKeywordSwal() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (!(this instanceof NoNewKeywordSwal)) {\n return _construct(NoNewKeywordSwal, args);\n }\n\n Object.getPrototypeOf(NoNewKeywordSwal).apply(this, args);\n };\n\n NoNewKeywordSwal.prototype = _extends(Object.create(ParentSwal.prototype), {\n constructor: NoNewKeywordSwal\n });\n\n if (typeof Object.setPrototypeOf === 'function') {\n Object.setPrototypeOf(NoNewKeywordSwal, ParentSwal);\n } else {\n // Android 4.4\n\n /* istanbul ignore next */\n // eslint-disable-next-line\n NoNewKeywordSwal.__proto__ = ParentSwal;\n }\n\n return NoNewKeywordSwal;\n}\n\nvar defaultParams = {\n title: '',\n titleText: '',\n text: '',\n html: '',\n footer: '',\n type: null,\n toast: false,\n customClass: '',\n customContainerClass: '',\n target: 'body',\n backdrop: true,\n animation: true,\n heightAuto: true,\n allowOutsideClick: true,\n allowEscapeKey: true,\n allowEnterKey: true,\n stopKeydownPropagation: true,\n keydownListenerCapture: false,\n showConfirmButton: true,\n showCancelButton: false,\n preConfirm: null,\n confirmButtonText: 'OK',\n confirmButtonAriaLabel: '',\n confirmButtonColor: null,\n confirmButtonClass: null,\n cancelButtonText: 'Cancel',\n cancelButtonAriaLabel: '',\n cancelButtonColor: null,\n cancelButtonClass: null,\n buttonsStyling: true,\n reverseButtons: false,\n focusConfirm: true,\n focusCancel: false,\n showCloseButton: false,\n closeButtonAriaLabel: 'Close this dialog',\n showLoaderOnConfirm: false,\n imageUrl: null,\n imageWidth: null,\n imageHeight: null,\n imageAlt: '',\n imageClass: null,\n timer: null,\n width: null,\n padding: null,\n background: null,\n input: null,\n inputPlaceholder: '',\n inputValue: '',\n inputOptions: {},\n inputAutoTrim: true,\n inputClass: null,\n inputAttributes: {},\n inputValidator: null,\n validationMessage: null,\n grow: false,\n position: 'center',\n progressSteps: [],\n currentProgressStep: null,\n progressStepsDistance: null,\n onBeforeOpen: null,\n onAfterClose: null,\n onOpen: null,\n onClose: null,\n useRejections: false,\n expectRejections: false\n};\nvar deprecatedParams = ['useRejections', 'expectRejections', 'extraParams'];\nvar toastIncompatibleParams = ['allowOutsideClick', 'allowEnterKey', 'backdrop', 'focusConfirm', 'focusCancel', 'heightAuto', 'keydownListenerCapture'];\n/**\n * Is valid parameter\n * @param {String} paramName\n */\n\nvar isValidParameter = function isValidParameter(paramName) {\n return defaultParams.hasOwnProperty(paramName) || paramName === 'extraParams';\n};\n/**\n * Is deprecated parameter\n * @param {String} paramName\n */\n\nvar isDeprecatedParameter = function isDeprecatedParameter(paramName) {\n return deprecatedParams.indexOf(paramName) !== -1;\n};\n/**\n * Show relevant warnings for given params\n *\n * @param params\n */\n\nvar showWarningsForParams = function showWarningsForParams(params) {\n for (var param in params) {\n if (!isValidParameter(param)) {\n warn(\"Unknown parameter \\\"\".concat(param, \"\\\"\"));\n }\n\n if (params.toast && toastIncompatibleParams.indexOf(param) !== -1) {\n warn(\"The parameter \\\"\".concat(param, \"\\\" is incompatible with toasts\"));\n }\n\n if (isDeprecatedParameter(param)) {\n warnOnce(\"The parameter \\\"\".concat(param, \"\\\" is deprecated and will be removed in the next major release.\"));\n }\n }\n};\n\nvar deprecationWarning = \"\\\"setDefaults\\\" & \\\"resetDefaults\\\" methods are deprecated in favor of \\\"mixin\\\" method and will be removed in the next major release. For new projects, use \\\"mixin\\\". For past projects already using \\\"setDefaults\\\", support will be provided through an additional package.\";\nvar defaults = {};\nfunction withGlobalDefaults(ParentSwal) {\n var SwalWithGlobalDefaults =\n /*#__PURE__*/\n function (_ParentSwal) {\n _inherits(SwalWithGlobalDefaults, _ParentSwal);\n\n function SwalWithGlobalDefaults() {\n _classCallCheck(this, SwalWithGlobalDefaults);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(SwalWithGlobalDefaults).apply(this, arguments));\n }\n\n _createClass(SwalWithGlobalDefaults, [{\n key: \"_main\",\n value: function _main(params) {\n return _get(_getPrototypeOf(SwalWithGlobalDefaults.prototype), \"_main\", this).call(this, _extends({}, defaults, params));\n }\n }], [{\n key: \"setDefaults\",\n value: function setDefaults(params) {\n warnOnce(deprecationWarning);\n\n if (!params || _typeof(params) !== 'object') {\n throw new TypeError('SweetAlert2: The argument for setDefaults() is required and has to be a object');\n }\n\n showWarningsForParams(params); // assign valid params from `params` to `defaults`\n\n Object.keys(params).forEach(function (param) {\n if (ParentSwal.isValidParameter(param)) {\n defaults[param] = params[param];\n }\n });\n }\n }, {\n key: \"resetDefaults\",\n value: function resetDefaults() {\n warnOnce(deprecationWarning);\n defaults = {};\n }\n }]);\n\n return SwalWithGlobalDefaults;\n }(ParentSwal); // Set default params if `window._swalDefaults` is an object\n\n\n if (typeof window !== 'undefined' && _typeof(window._swalDefaults) === 'object') {\n SwalWithGlobalDefaults.setDefaults(window._swalDefaults);\n }\n\n return SwalWithGlobalDefaults;\n}\n\n/**\n * Returns an extended version of `Swal` containing `params` as defaults.\n * Useful for reusing Swal configuration.\n *\n * For example:\n *\n * Before:\n * const textPromptOptions = { input: 'text', showCancelButton: true }\n * const {value: firstName} = await Swal({ ...textPromptOptions, title: 'What is your first name?' })\n * const {value: lastName} = await Swal({ ...textPromptOptions, title: 'What is your last name?' })\n *\n * After:\n * const TextPrompt = Swal.mixin({ input: 'text', showCancelButton: true })\n * const {value: firstName} = await TextPrompt('What is your first name?')\n * const {value: lastName} = await TextPrompt('What is your last name?')\n *\n * @param mixinParams\n */\n\nfunction mixin(mixinParams) {\n return withNoNewKeyword(\n /*#__PURE__*/\n function (_this) {\n _inherits(MixinSwal, _this);\n\n function MixinSwal() {\n _classCallCheck(this, MixinSwal);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(MixinSwal).apply(this, arguments));\n }\n\n _createClass(MixinSwal, [{\n key: \"_main\",\n value: function _main(params) {\n return _get(_getPrototypeOf(MixinSwal.prototype), \"_main\", this).call(this, _extends({}, mixinParams, params));\n }\n }]);\n\n return MixinSwal;\n }(this));\n}\n\n// private global state for the queue feature\nvar currentSteps = [];\n/*\n * Global function for chaining sweetAlert popups\n */\n\nvar queue = function queue(steps) {\n var swal = this;\n currentSteps = steps;\n\n var resetQueue = function resetQueue() {\n currentSteps = [];\n document.body.removeAttribute('data-swal2-queue-step');\n };\n\n var queueResult = [];\n return new Promise(function (resolve) {\n (function step(i, callback) {\n if (i < currentSteps.length) {\n document.body.setAttribute('data-swal2-queue-step', i);\n swal(currentSteps[i]).then(function (result) {\n if (typeof result.value !== 'undefined') {\n queueResult.push(result.value);\n step(i + 1, callback);\n } else {\n resetQueue();\n resolve({\n dismiss: result.dismiss\n });\n }\n });\n } else {\n resetQueue();\n resolve({\n value: queueResult\n });\n }\n })(0);\n });\n};\n/*\n * Global function for getting the index of current popup in queue\n */\n\nvar getQueueStep = function getQueueStep() {\n return document.body.getAttribute('data-swal2-queue-step');\n};\n/*\n * Global function for inserting a popup to the queue\n */\n\nvar insertQueueStep = function insertQueueStep(step, index) {\n if (index && index < currentSteps.length) {\n return currentSteps.splice(index, 0, step);\n }\n\n return currentSteps.push(step);\n};\n/*\n * Global function for deleting a popup from the queue\n */\n\nvar deleteQueueStep = function deleteQueueStep(index) {\n if (typeof currentSteps[index] !== 'undefined') {\n currentSteps.splice(index, 1);\n }\n};\n\n/**\n * Show spinner instead of Confirm button and disable Cancel button\n */\n\nvar showLoading = function showLoading() {\n var popup = getPopup();\n\n if (!popup) {\n Swal('');\n }\n\n popup = getPopup();\n var actions = getActions();\n var confirmButton = getConfirmButton();\n var cancelButton = getCancelButton();\n show(actions);\n show(confirmButton);\n addClass([popup, actions], swalClasses.loading);\n confirmButton.disabled = true;\n cancelButton.disabled = true;\n popup.setAttribute('data-loading', true);\n popup.setAttribute('aria-busy', true);\n popup.focus();\n};\n\n/**\n * If `timer` parameter is set, returns number of milliseconds of timer remained.\n * Otherwise, returns undefined.\n */\n\nvar getTimerLeft = function getTimerLeft() {\n return globalState.timeout && globalState.timeout.getTimerLeft();\n};\n/**\n * Stop timer. Returns number of milliseconds of timer remained.\n * If `timer` parameter isn't set, returns undefined.\n */\n\nvar stopTimer = function stopTimer() {\n return globalState.timeout && globalState.timeout.stop();\n};\n/**\n * Resume timer. Returns number of milliseconds of timer remained.\n * If `timer` parameter isn't set, returns undefined.\n */\n\nvar resumeTimer = function resumeTimer() {\n return globalState.timeout && globalState.timeout.start();\n};\n/**\n * Resume timer. Returns number of milliseconds of timer remained.\n * If `timer` parameter isn't set, returns undefined.\n */\n\nvar toggleTimer = function toggleTimer() {\n var timer = globalState.timeout;\n return timer && (timer.running ? timer.stop() : timer.start());\n};\n/**\n * Increase timer. Returns number of milliseconds of an updated timer.\n * If `timer` parameter isn't set, returns undefined.\n */\n\nvar increaseTimer = function increaseTimer(n) {\n return globalState.timeout && globalState.timeout.increase(n);\n};\n/**\n * Check if timer is running. Returns true if timer is running\n * or false if timer is paused or stopped.\n * If `timer` parameter isn't set, returns undefined\n */\n\nvar isTimerRunning = function isTimerRunning() {\n return globalState.timeout && globalState.timeout.isRunning();\n};\n\n\n\nvar staticMethods = Object.freeze({\n\tisValidParameter: isValidParameter,\n\tisDeprecatedParameter: isDeprecatedParameter,\n\targsToParams: argsToParams,\n\tadaptInputValidator: adaptInputValidator,\n\tclose: close,\n\tclosePopup: close,\n\tcloseModal: close,\n\tcloseToast: close,\n\tisVisible: isVisible$1,\n\tclickConfirm: clickConfirm,\n\tclickCancel: clickCancel,\n\tgetContainer: getContainer,\n\tgetPopup: getPopup,\n\tgetTitle: getTitle,\n\tgetContent: getContent,\n\tgetImage: getImage,\n\tgetIcons: getIcons,\n\tgetCloseButton: getCloseButton,\n\tgetButtonsWrapper: getButtonsWrapper,\n\tgetActions: getActions,\n\tgetConfirmButton: getConfirmButton,\n\tgetCancelButton: getCancelButton,\n\tgetFooter: getFooter,\n\tgetFocusableElements: getFocusableElements,\n\tgetValidationMessage: getValidationMessage,\n\tisLoading: isLoading,\n\tfire: fire,\n\tmixin: mixin,\n\tqueue: queue,\n\tgetQueueStep: getQueueStep,\n\tinsertQueueStep: insertQueueStep,\n\tdeleteQueueStep: deleteQueueStep,\n\tshowLoading: showLoading,\n\tenableLoading: showLoading,\n\tgetTimerLeft: getTimerLeft,\n\tstopTimer: stopTimer,\n\tresumeTimer: resumeTimer,\n\ttoggleTimer: toggleTimer,\n\tincreaseTimer: increaseTimer,\n\tisTimerRunning: isTimerRunning\n});\n\n// https://github.com/Riim/symbol-polyfill/blob/master/index.js\n\n/* istanbul ignore next */\nvar _Symbol = typeof Symbol === 'function' ? Symbol : function () {\n var idCounter = 0;\n\n function _Symbol(key) {\n return '__' + key + '_' + Math.floor(Math.random() * 1e9) + '_' + ++idCounter + '__';\n }\n\n _Symbol.iterator = _Symbol('Symbol.iterator');\n return _Symbol;\n}();\n\n// WeakMap polyfill, needed for Android 4.4\n// Related issue: https://github.com/sweetalert2/sweetalert2/issues/1071\n// http://webreflection.blogspot.fi/2015/04/a-weakmap-polyfill-in-20-lines-of-code.html\n/* istanbul ignore next */\n\nvar WeakMap$1 = typeof WeakMap === 'function' ? WeakMap : function (s, dP, hOP) {\n function WeakMap() {\n dP(this, s, {\n value: _Symbol('WeakMap')\n });\n }\n\n WeakMap.prototype = {\n 'delete': function del(o) {\n delete o[this[s]];\n },\n get: function get(o) {\n return o[this[s]];\n },\n has: function has(o) {\n return hOP.call(o, this[s]);\n },\n set: function set(o, v) {\n dP(o, this[s], {\n configurable: true,\n value: v\n });\n }\n };\n return WeakMap;\n}(_Symbol('WeakMap'), Object.defineProperty, {}.hasOwnProperty);\n\n/**\n * This module containts `WeakMap`s for each effectively-\"private property\" that a `swal` has.\n * For example, to set the private property \"foo\" of `this` to \"bar\", you can `privateProps.foo.set(this, 'bar')`\n * This is the approach that Babel will probably take to implement private methods/fields\n * https://github.com/tc39/proposal-private-methods\n * https://github.com/babel/babel/pull/7555\n * Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module*\n * then we can use that language feature.\n */\nvar privateProps = {\n promise: new WeakMap$1(),\n innerParams: new WeakMap$1(),\n domCache: new WeakMap$1()\n};\n\n/**\n * Enables buttons and hide loader.\n */\n\nfunction hideLoading() {\n var innerParams = privateProps.innerParams.get(this);\n var domCache = privateProps.domCache.get(this);\n\n if (!innerParams.showConfirmButton) {\n hide(domCache.confirmButton);\n\n if (!innerParams.showCancelButton) {\n hide(domCache.actions);\n }\n }\n\n removeClass([domCache.popup, domCache.actions], swalClasses.loading);\n domCache.popup.removeAttribute('aria-busy');\n domCache.popup.removeAttribute('data-loading');\n domCache.confirmButton.disabled = false;\n domCache.cancelButton.disabled = false;\n}\n\nfunction getInput(inputType) {\n var innerParams = privateProps.innerParams.get(this);\n var domCache = privateProps.domCache.get(this);\n inputType = inputType || innerParams.input;\n\n if (!inputType) {\n return null;\n }\n\n switch (inputType) {\n case 'select':\n case 'textarea':\n case 'file':\n return getChildByClass(domCache.content, swalClasses[inputType]);\n\n case 'checkbox':\n return domCache.popup.querySelector(\".\".concat(swalClasses.checkbox, \" input\"));\n\n case 'radio':\n return domCache.popup.querySelector(\".\".concat(swalClasses.radio, \" input:checked\")) || domCache.popup.querySelector(\".\".concat(swalClasses.radio, \" input:first-child\"));\n\n case 'range':\n return domCache.popup.querySelector(\".\".concat(swalClasses.range, \" input\"));\n\n default:\n return getChildByClass(domCache.content, swalClasses.input);\n }\n}\n\nfunction enableButtons() {\n var domCache = privateProps.domCache.get(this);\n domCache.confirmButton.disabled = false;\n domCache.cancelButton.disabled = false;\n}\nfunction disableButtons() {\n var domCache = privateProps.domCache.get(this);\n domCache.confirmButton.disabled = true;\n domCache.cancelButton.disabled = true;\n}\nfunction enableConfirmButton() {\n var domCache = privateProps.domCache.get(this);\n domCache.confirmButton.disabled = false;\n}\nfunction disableConfirmButton() {\n var domCache = privateProps.domCache.get(this);\n domCache.confirmButton.disabled = true;\n}\nfunction enableInput() {\n var input = this.getInput();\n\n if (!input) {\n return false;\n }\n\n if (input.type === 'radio') {\n var radiosContainer = input.parentNode.parentNode;\n var radios = radiosContainer.querySelectorAll('input');\n\n for (var i = 0; i < radios.length; i++) {\n radios[i].disabled = false;\n }\n } else {\n input.disabled = false;\n }\n}\nfunction disableInput() {\n var input = this.getInput();\n\n if (!input) {\n return false;\n }\n\n if (input && input.type === 'radio') {\n var radiosContainer = input.parentNode.parentNode;\n var radios = radiosContainer.querySelectorAll('input');\n\n for (var i = 0; i < radios.length; i++) {\n radios[i].disabled = true;\n }\n } else {\n input.disabled = true;\n }\n}\n\nfunction showValidationMessage(error$$1) {\n var domCache = privateProps.domCache.get(this);\n domCache.validationMessage.innerHTML = error$$1;\n var popupComputedStyle = window.getComputedStyle(domCache.popup);\n domCache.validationMessage.style.marginLeft = \"-\".concat(popupComputedStyle.getPropertyValue('padding-left'));\n domCache.validationMessage.style.marginRight = \"-\".concat(popupComputedStyle.getPropertyValue('padding-right'));\n show(domCache.validationMessage);\n var input = this.getInput();\n\n if (input) {\n input.setAttribute('aria-invalid', true);\n input.setAttribute('aria-describedBy', swalClasses['validation-message']);\n focusInput(input);\n addClass(input, swalClasses.inputerror);\n }\n} // Hide block with validation message\n\nfunction resetValidationMessage() {\n var domCache = privateProps.domCache.get(this);\n\n if (domCache.validationMessage) {\n hide(domCache.validationMessage);\n }\n\n var input = this.getInput();\n\n if (input) {\n input.removeAttribute('aria-invalid');\n input.removeAttribute('aria-describedBy');\n removeClass(input, swalClasses.inputerror);\n }\n} // @deprecated\n\n/* istanbul ignore next */\n\nfunction resetValidationError() {\n warnOnce(\"Swal.resetValidationError() is deprecated and will be removed in the next major release, use Swal.resetValidationMessage() instead\");\n resetValidationMessage.bind(this)();\n} // @deprecated\n\n/* istanbul ignore next */\n\nfunction showValidationError(error$$1) {\n warnOnce(\"Swal.showValidationError() is deprecated and will be removed in the next major release, use Swal.showValidationMessage() instead\");\n showValidationMessage.bind(this)(error$$1);\n}\n\nfunction getProgressSteps$1() {\n var innerParams = privateProps.innerParams.get(this);\n return innerParams.progressSteps;\n}\nfunction setProgressSteps(progressSteps) {\n var innerParams = privateProps.innerParams.get(this);\n\n var updatedParams = _extends({}, innerParams, {\n progressSteps: progressSteps\n });\n\n privateProps.innerParams.set(this, updatedParams);\n renderProgressSteps(updatedParams);\n}\nfunction showProgressSteps() {\n var domCache = privateProps.domCache.get(this);\n show(domCache.progressSteps);\n}\nfunction hideProgressSteps() {\n var domCache = privateProps.domCache.get(this);\n hide(domCache.progressSteps);\n}\n\nvar Timer = function Timer(callback, delay) {\n _classCallCheck(this, Timer);\n\n var id,\n started,\n remaining = delay;\n this.running = false;\n\n this.start = function () {\n if (!this.running) {\n this.running = true;\n started = new Date();\n id = setTimeout(callback, remaining);\n }\n\n return remaining;\n };\n\n this.stop = function () {\n if (this.running) {\n this.running = false;\n clearTimeout(id);\n remaining -= new Date() - started;\n }\n\n return remaining;\n };\n\n this.increase = function (n) {\n var running = this.running;\n\n if (running) {\n this.stop();\n }\n\n remaining += n;\n\n if (running) {\n this.start();\n }\n\n return remaining;\n };\n\n this.getTimerLeft = function () {\n if (this.running) {\n this.stop();\n this.start();\n }\n\n return remaining;\n };\n\n this.isRunning = function () {\n return this.running;\n };\n\n this.start();\n};\n\nvar defaultInputValidators = {\n email: function email(string, extraParams) {\n return /^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z0-9-]{2,24}$/.test(string) ? Promise.resolve() : Promise.reject(extraParams && extraParams.validationMessage ? extraParams.validationMessage : 'Invalid email address');\n },\n url: function url(string, extraParams) {\n // taken from https://stackoverflow.com/a/3809435 with a small change from #1306\n return /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\\.[a-z]{2,63}\\b([-a-zA-Z0-9@:%_+.~#?&//=]*)$/.test(string) ? Promise.resolve() : Promise.reject(extraParams && extraParams.validationMessage ? extraParams.validationMessage : 'Invalid URL');\n }\n};\n\n/**\n * Set type, text and actions on popup\n *\n * @param params\n * @returns {boolean}\n */\n\nfunction setParameters(params) {\n // Use default `inputValidator` for supported input types if not provided\n if (!params.inputValidator) {\n Object.keys(defaultInputValidators).forEach(function (key) {\n if (params.input === key) {\n params.inputValidator = params.expectRejections ? defaultInputValidators[key] : Swal.adaptInputValidator(defaultInputValidators[key]);\n }\n });\n } // params.extraParams is @deprecated\n\n\n if (params.validationMessage) {\n if (_typeof(params.extraParams) !== 'object') {\n params.extraParams = {};\n }\n\n params.extraParams.validationMessage = params.validationMessage;\n } // Determine if the custom target element is valid\n\n\n if (!params.target || typeof params.target === 'string' && !document.querySelector(params.target) || typeof params.target !== 'string' && !params.target.appendChild) {\n warn('Target parameter is not valid, defaulting to \"body\"');\n params.target = 'body';\n } // Animation\n\n\n if (typeof params.animation === 'function') {\n params.animation = params.animation.call();\n }\n\n var popup;\n var oldPopup = getPopup();\n var targetElement = typeof params.target === 'string' ? document.querySelector(params.target) : params.target; // If the model target has changed, refresh the popup\n\n if (oldPopup && targetElement && oldPopup.parentNode !== targetElement.parentNode) {\n popup = init(params);\n } else {\n popup = oldPopup || init(params);\n } // Set popup width\n\n\n if (params.width) {\n popup.style.width = typeof params.width === 'number' ? params.width + 'px' : params.width;\n } // Set popup padding\n\n\n if (params.padding) {\n popup.style.padding = typeof params.padding === 'number' ? params.padding + 'px' : params.padding;\n } // Set popup background\n\n\n if (params.background) {\n popup.style.background = params.background;\n }\n\n var popupBackgroundColor = window.getComputedStyle(popup).getPropertyValue('background-color');\n var successIconParts = popup.querySelectorAll('[class^=swal2-success-circular-line], .swal2-success-fix');\n\n for (var i = 0; i < successIconParts.length; i++) {\n successIconParts[i].style.backgroundColor = popupBackgroundColor;\n }\n\n var container = getContainer();\n var closeButton = getCloseButton();\n var footer = getFooter(); // Title\n\n renderTitle(params); // Content\n\n renderContent(params); // Backdrop\n\n if (typeof params.backdrop === 'string') {\n getContainer().style.background = params.backdrop;\n } else if (!params.backdrop) {\n addClass([document.documentElement, document.body], swalClasses['no-backdrop']);\n }\n\n if (!params.backdrop && params.allowOutsideClick) {\n warn('\"allowOutsideClick\" parameter requires `backdrop` parameter to be set to `true`');\n } // Position\n\n\n if (params.position in swalClasses) {\n addClass(container, swalClasses[params.position]);\n } else {\n warn('The \"position\" parameter is not valid, defaulting to \"center\"');\n addClass(container, swalClasses.center);\n } // Grow\n\n\n if (params.grow && typeof params.grow === 'string') {\n var growClass = 'grow-' + params.grow;\n\n if (growClass in swalClasses) {\n addClass(container, swalClasses[growClass]);\n }\n } // Close button\n\n\n if (params.showCloseButton) {\n closeButton.setAttribute('aria-label', params.closeButtonAriaLabel);\n show(closeButton);\n } else {\n hide(closeButton);\n } // Default Class\n\n\n popup.className = swalClasses.popup;\n\n if (params.toast) {\n addClass([document.documentElement, document.body], swalClasses['toast-shown']);\n addClass(popup, swalClasses.toast);\n } else {\n addClass(popup, swalClasses.modal);\n } // Custom Class\n\n\n if (params.customClass) {\n addClass(popup, params.customClass);\n }\n\n if (params.customContainerClass) {\n addClass(container, params.customContainerClass);\n } // Progress steps\n\n\n renderProgressSteps(params); // Icon\n\n renderIcon(params); // Image\n\n renderImage(params); // Actions (buttons)\n\n renderActions(params); // Footer\n\n parseHtmlToContainer(params.footer, footer); // CSS animation\n\n if (params.animation === true) {\n removeClass(popup, swalClasses.noanimation);\n } else {\n addClass(popup, swalClasses.noanimation);\n } // showLoaderOnConfirm && preConfirm\n\n\n if (params.showLoaderOnConfirm && !params.preConfirm) {\n warn('showLoaderOnConfirm is set to true, but preConfirm is not defined.\\n' + 'showLoaderOnConfirm should be used together with preConfirm, see usage example:\\n' + 'https://sweetalert2.github.io/#ajax-request');\n }\n}\n\n/**\n * Open popup, add necessary classes and styles, fix scrollbar\n *\n * @param {Array} params\n */\n\nvar openPopup = function openPopup(params) {\n var container = getContainer();\n var popup = getPopup();\n\n if (params.onBeforeOpen !== null && typeof params.onBeforeOpen === 'function') {\n params.onBeforeOpen(popup);\n }\n\n if (params.animation) {\n addClass(popup, swalClasses.show);\n addClass(container, swalClasses.fade);\n removeClass(popup, swalClasses.hide);\n } else {\n removeClass(popup, swalClasses.fade);\n }\n\n show(popup); // scrolling is 'hidden' until animation is done, after that 'auto'\n\n container.style.overflowY = 'hidden';\n\n if (animationEndEvent && !hasClass(popup, swalClasses.noanimation)) {\n popup.addEventListener(animationEndEvent, function swalCloseEventFinished() {\n popup.removeEventListener(animationEndEvent, swalCloseEventFinished);\n container.style.overflowY = 'auto';\n });\n } else {\n container.style.overflowY = 'auto';\n }\n\n addClass([document.documentElement, document.body, container], swalClasses.shown);\n\n if (params.heightAuto && params.backdrop && !params.toast) {\n addClass([document.documentElement, document.body], swalClasses['height-auto']);\n }\n\n if (isModal()) {\n fixScrollbar();\n iOSfix();\n IEfix();\n setAriaHidden(); // sweetalert2/issues/1247\n\n setTimeout(function () {\n container.scrollTop = 0;\n });\n }\n\n if (!isToast() && !globalState.previousActiveElement) {\n globalState.previousActiveElement = document.activeElement;\n }\n\n if (params.onOpen !== null && typeof params.onOpen === 'function') {\n setTimeout(function () {\n params.onOpen(popup);\n });\n }\n};\n\nfunction _main(userParams) {\n var _this = this;\n\n showWarningsForParams(userParams);\n\n var innerParams = _extends({}, defaultParams, userParams);\n\n setParameters(innerParams);\n Object.freeze(innerParams);\n privateProps.innerParams.set(this, innerParams); // clear the previous timer\n\n if (globalState.timeout) {\n globalState.timeout.stop();\n delete globalState.timeout;\n } // clear the restore focus timeout\n\n\n clearTimeout(globalState.restoreFocusTimeout);\n var domCache = {\n popup: getPopup(),\n container: getContainer(),\n content: getContent(),\n actions: getActions(),\n confirmButton: getConfirmButton(),\n cancelButton: getCancelButton(),\n closeButton: getCloseButton(),\n validationMessage: getValidationMessage(),\n progressSteps: getProgressSteps()\n };\n privateProps.domCache.set(this, domCache);\n var constructor = this.constructor;\n return new Promise(function (resolve, reject) {\n // functions to handle all resolving/rejecting/settling\n var succeedWith = function succeedWith(value) {\n constructor.closePopup(innerParams.onClose, innerParams.onAfterClose); // TODO: make closePopup an *instance* method\n\n if (innerParams.useRejections) {\n resolve(value);\n } else {\n resolve({\n value: value\n });\n }\n };\n\n var dismissWith = function dismissWith(dismiss) {\n constructor.closePopup(innerParams.onClose, innerParams.onAfterClose);\n\n if (innerParams.useRejections) {\n reject(dismiss);\n } else {\n resolve({\n dismiss: dismiss\n });\n }\n };\n\n var errorWith = function errorWith(error$$1) {\n constructor.closePopup(innerParams.onClose, innerParams.onAfterClose);\n reject(error$$1);\n }; // Close on timer\n\n\n if (innerParams.timer) {\n globalState.timeout = new Timer(function () {\n dismissWith('timer');\n delete globalState.timeout;\n }, innerParams.timer);\n } // Get the value of the popup input\n\n\n var getInputValue = function getInputValue() {\n var input = _this.getInput();\n\n if (!input) {\n return null;\n }\n\n switch (innerParams.input) {\n case 'checkbox':\n return input.checked ? 1 : 0;\n\n case 'radio':\n return input.checked ? input.value : null;\n\n case 'file':\n return input.files.length ? input.files[0] : null;\n\n default:\n return innerParams.inputAutoTrim ? input.value.trim() : input.value;\n }\n }; // input autofocus\n\n\n if (innerParams.input) {\n setTimeout(function () {\n var input = _this.getInput();\n\n if (input) {\n focusInput(input);\n }\n }, 0);\n }\n\n var confirm = function confirm(value) {\n if (innerParams.showLoaderOnConfirm) {\n constructor.showLoading(); // TODO: make showLoading an *instance* method\n }\n\n if (innerParams.preConfirm) {\n _this.resetValidationMessage();\n\n var preConfirmPromise = Promise.resolve().then(function () {\n return innerParams.preConfirm(value, innerParams.extraParams);\n });\n\n if (innerParams.expectRejections) {\n preConfirmPromise.then(function (preConfirmValue) {\n return succeedWith(preConfirmValue || value);\n }, function (validationMessage) {\n _this.hideLoading();\n\n if (validationMessage) {\n _this.showValidationMessage(validationMessage);\n }\n });\n } else {\n preConfirmPromise.then(function (preConfirmValue) {\n if (isVisible(domCache.validationMessage) || preConfirmValue === false) {\n _this.hideLoading();\n } else {\n succeedWith(preConfirmValue || value);\n }\n }, function (error$$1) {\n return errorWith(error$$1);\n });\n }\n } else {\n succeedWith(value);\n }\n }; // Mouse interactions\n\n\n var onButtonEvent = function onButtonEvent(e) {\n var target = e.target;\n var confirmButton = domCache.confirmButton,\n cancelButton = domCache.cancelButton;\n var targetedConfirm = confirmButton && (confirmButton === target || confirmButton.contains(target));\n var targetedCancel = cancelButton && (cancelButton === target || cancelButton.contains(target));\n\n switch (e.type) {\n case 'click':\n // Clicked 'confirm'\n if (targetedConfirm && constructor.isVisible()) {\n _this.disableButtons();\n\n if (innerParams.input) {\n var inputValue = getInputValue();\n\n if (innerParams.inputValidator) {\n _this.disableInput();\n\n var validationPromise = Promise.resolve().then(function () {\n return innerParams.inputValidator(inputValue, innerParams.extraParams);\n });\n\n if (innerParams.expectRejections) {\n validationPromise.then(function () {\n _this.enableButtons();\n\n _this.enableInput();\n\n confirm(inputValue);\n }, function (validationMessage) {\n _this.enableButtons();\n\n _this.enableInput();\n\n if (validationMessage) {\n _this.showValidationMessage(validationMessage);\n }\n });\n } else {\n validationPromise.then(function (validationMessage) {\n _this.enableButtons();\n\n _this.enableInput();\n\n if (validationMessage) {\n _this.showValidationMessage(validationMessage);\n } else {\n confirm(inputValue);\n }\n }, function (error$$1) {\n return errorWith(error$$1);\n });\n }\n } else if (!_this.getInput().checkValidity()) {\n _this.enableButtons();\n\n _this.showValidationMessage(innerParams.validationMessage);\n } else {\n confirm(inputValue);\n }\n } else {\n confirm(true);\n } // Clicked 'cancel'\n\n } else if (targetedCancel && constructor.isVisible()) {\n _this.disableButtons();\n\n dismissWith(constructor.DismissReason.cancel);\n }\n\n break;\n\n default:\n }\n };\n\n var buttons = domCache.popup.querySelectorAll('button');\n\n for (var i = 0; i < buttons.length; i++) {\n buttons[i].onclick = onButtonEvent;\n buttons[i].onmouseover = onButtonEvent;\n buttons[i].onmouseout = onButtonEvent;\n buttons[i].onmousedown = onButtonEvent;\n } // Closing popup by close button\n\n\n domCache.closeButton.onclick = function () {\n dismissWith(constructor.DismissReason.close);\n };\n\n if (innerParams.toast) {\n // Closing popup by internal click\n domCache.popup.onclick = function () {\n if (innerParams.showConfirmButton || innerParams.showCancelButton || innerParams.showCloseButton || innerParams.input) {\n return;\n }\n\n dismissWith(constructor.DismissReason.close);\n };\n } else {\n var ignoreOutsideClick = false; // Ignore click events that had mousedown on the popup but mouseup on the container\n // This can happen when the user drags a slider\n\n domCache.popup.onmousedown = function () {\n domCache.container.onmouseup = function (e) {\n domCache.container.onmouseup = undefined; // We only check if the mouseup target is the container because usually it doesn't\n // have any other direct children aside of the popup\n\n if (e.target === domCache.container) {\n ignoreOutsideClick = true;\n }\n };\n }; // Ignore click events that had mousedown on the container but mouseup on the popup\n\n\n domCache.container.onmousedown = function () {\n domCache.popup.onmouseup = function (e) {\n domCache.popup.onmouseup = undefined; // We also need to check if the mouseup target is a child of the popup\n\n if (e.target === domCache.popup || domCache.popup.contains(e.target)) {\n ignoreOutsideClick = true;\n }\n };\n };\n\n domCache.container.onclick = function (e) {\n if (ignoreOutsideClick) {\n ignoreOutsideClick = false;\n return;\n }\n\n if (e.target !== domCache.container) {\n return;\n }\n\n if (callIfFunction(innerParams.allowOutsideClick)) {\n dismissWith(constructor.DismissReason.backdrop);\n }\n };\n } // Reverse buttons (Confirm on the right side)\n\n\n if (innerParams.reverseButtons) {\n domCache.confirmButton.parentNode.insertBefore(domCache.cancelButton, domCache.confirmButton);\n } else {\n domCache.confirmButton.parentNode.insertBefore(domCache.confirmButton, domCache.cancelButton);\n } // Focus handling\n\n\n var setFocus = function setFocus(index, increment) {\n var focusableElements = getFocusableElements(innerParams.focusCancel); // search for visible elements and select the next possible match\n\n for (var _i = 0; _i < focusableElements.length; _i++) {\n index = index + increment; // rollover to first item\n\n if (index === focusableElements.length) {\n index = 0; // go to last item\n } else if (index === -1) {\n index = focusableElements.length - 1;\n }\n\n return focusableElements[index].focus();\n } // no visible focusable elements, focus the popup\n\n\n domCache.popup.focus();\n };\n\n var keydownHandler = function keydownHandler(e, innerParams) {\n if (innerParams.stopKeydownPropagation) {\n e.stopPropagation();\n }\n\n var arrowKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down' // IE11\n ];\n\n if (e.key === 'Enter' && !e.isComposing) {\n if (e.target && _this.getInput() && e.target.outerHTML === _this.getInput().outerHTML) {\n if (['textarea', 'file'].indexOf(innerParams.input) !== -1) {\n return; // do not submit\n }\n\n constructor.clickConfirm();\n e.preventDefault();\n } // TAB\n\n } else if (e.key === 'Tab') {\n var targetElement = e.target;\n var focusableElements = getFocusableElements(innerParams.focusCancel);\n var btnIndex = -1;\n\n for (var _i2 = 0; _i2 < focusableElements.length; _i2++) {\n if (targetElement === focusableElements[_i2]) {\n btnIndex = _i2;\n break;\n }\n }\n\n if (!e.shiftKey) {\n // Cycle to the next button\n setFocus(btnIndex, 1);\n } else {\n // Cycle to the prev button\n setFocus(btnIndex, -1);\n }\n\n e.stopPropagation();\n e.preventDefault(); // ARROWS - switch focus between buttons\n } else if (arrowKeys.indexOf(e.key) !== -1) {\n // focus Cancel button if Confirm button is currently focused\n if (document.activeElement === domCache.confirmButton && isVisible(domCache.cancelButton)) {\n domCache.cancelButton.focus(); // and vice versa\n } else if (document.activeElement === domCache.cancelButton && isVisible(domCache.confirmButton)) {\n domCache.confirmButton.focus();\n } // ESC\n\n } else if ((e.key === 'Escape' || e.key === 'Esc') && callIfFunction(innerParams.allowEscapeKey) === true) {\n e.preventDefault();\n dismissWith(constructor.DismissReason.esc);\n }\n };\n\n if (globalState.keydownHandlerAdded) {\n globalState.keydownTarget.removeEventListener('keydown', globalState.keydownHandler, {\n capture: globalState.keydownListenerCapture\n });\n globalState.keydownHandlerAdded = false;\n }\n\n if (!innerParams.toast) {\n globalState.keydownHandler = function (e) {\n return keydownHandler(e, innerParams);\n };\n\n globalState.keydownTarget = innerParams.keydownListenerCapture ? window : domCache.popup;\n globalState.keydownListenerCapture = innerParams.keydownListenerCapture;\n globalState.keydownTarget.addEventListener('keydown', globalState.keydownHandler, {\n capture: globalState.keydownListenerCapture\n });\n globalState.keydownHandlerAdded = true;\n }\n\n _this.enableButtons();\n\n _this.hideLoading();\n\n _this.resetValidationMessage();\n\n if (innerParams.toast && (innerParams.input || innerParams.footer || innerParams.showCloseButton)) {\n addClass(document.body, swalClasses['toast-column']);\n } else {\n removeClass(document.body, swalClasses['toast-column']);\n } // inputs\n\n\n var inputTypes = ['input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea'];\n\n var setInputPlaceholder = function setInputPlaceholder(input) {\n if (!input.placeholder || innerParams.inputPlaceholder) {\n input.placeholder = innerParams.inputPlaceholder;\n }\n };\n\n var input;\n\n for (var _i3 = 0; _i3 < inputTypes.length; _i3++) {\n var inputClass = swalClasses[inputTypes[_i3]];\n var inputContainer = getChildByClass(domCache.content, inputClass);\n input = _this.getInput(inputTypes[_i3]); // set attributes\n\n if (input) {\n for (var j in input.attributes) {\n if (input.attributes.hasOwnProperty(j)) {\n var attrName = input.attributes[j].name;\n\n if (attrName !== 'type' && attrName !== 'value') {\n input.removeAttribute(attrName);\n }\n }\n }\n\n for (var attr in innerParams.inputAttributes) {\n // Do not set a placeholder for \n // it'll crash Edge, #1298\n if (inputTypes[_i3] === 'range' && attr === 'placeholder') {\n continue;\n }\n\n input.setAttribute(attr, innerParams.inputAttributes[attr]);\n }\n } // set class\n\n\n inputContainer.className = inputClass;\n\n if (innerParams.inputClass) {\n addClass(inputContainer, innerParams.inputClass);\n }\n\n hide(inputContainer);\n }\n\n var populateInputOptions;\n\n switch (innerParams.input) {\n case 'text':\n case 'email':\n case 'password':\n case 'number':\n case 'tel':\n case 'url':\n {\n input = getChildByClass(domCache.content, swalClasses.input);\n\n if (typeof innerParams.inputValue === 'string' || typeof innerParams.inputValue === 'number') {\n input.value = innerParams.inputValue;\n } else if (!isPromise(innerParams.inputValue)) {\n warn(\"Unexpected type of inputValue! Expected \\\"string\\\", \\\"number\\\" or \\\"Promise\\\", got \\\"\".concat(_typeof(innerParams.inputValue), \"\\\"\"));\n }\n\n setInputPlaceholder(input);\n input.type = innerParams.input;\n show(input);\n break;\n }\n\n case 'file':\n {\n input = getChildByClass(domCache.content, swalClasses.file);\n setInputPlaceholder(input);\n input.type = innerParams.input;\n show(input);\n break;\n }\n\n case 'range':\n {\n var range = getChildByClass(domCache.content, swalClasses.range);\n var rangeInput = range.querySelector('input');\n var rangeOutput = range.querySelector('output');\n rangeInput.value = innerParams.inputValue;\n rangeInput.type = innerParams.input;\n rangeOutput.value = innerParams.inputValue;\n show(range);\n break;\n }\n\n case 'select':\n {\n var select = getChildByClass(domCache.content, swalClasses.select);\n select.innerHTML = '';\n\n if (innerParams.inputPlaceholder) {\n var placeholder = document.createElement('option');\n placeholder.innerHTML = innerParams.inputPlaceholder;\n placeholder.value = '';\n placeholder.disabled = true;\n placeholder.selected = true;\n select.appendChild(placeholder);\n }\n\n populateInputOptions = function populateInputOptions(inputOptions) {\n inputOptions.forEach(function (inputOption) {\n var optionValue = inputOption[0];\n var optionLabel = inputOption[1];\n var option = document.createElement('option');\n option.value = optionValue;\n option.innerHTML = optionLabel;\n\n if (innerParams.inputValue.toString() === optionValue.toString()) {\n option.selected = true;\n }\n\n select.appendChild(option);\n });\n show(select);\n select.focus();\n };\n\n break;\n }\n\n case 'radio':\n {\n var radio = getChildByClass(domCache.content, swalClasses.radio);\n radio.innerHTML = '';\n\n populateInputOptions = function populateInputOptions(inputOptions) {\n inputOptions.forEach(function (inputOption) {\n var radioValue = inputOption[0];\n var radioLabel = inputOption[1];\n var radioInput = document.createElement('input');\n var radioLabelElement = document.createElement('label');\n radioInput.type = 'radio';\n radioInput.name = swalClasses.radio;\n radioInput.value = radioValue;\n\n if (innerParams.inputValue.toString() === radioValue.toString()) {\n radioInput.checked = true;\n }\n\n var label = document.createElement('span');\n label.innerHTML = radioLabel;\n label.className = swalClasses.label;\n radioLabelElement.appendChild(radioInput);\n radioLabelElement.appendChild(label);\n radio.appendChild(radioLabelElement);\n });\n show(radio);\n var radios = radio.querySelectorAll('input');\n\n if (radios.length) {\n radios[0].focus();\n }\n };\n\n break;\n }\n\n case 'checkbox':\n {\n var checkbox = getChildByClass(domCache.content, swalClasses.checkbox);\n\n var checkboxInput = _this.getInput('checkbox');\n\n checkboxInput.type = 'checkbox';\n checkboxInput.value = 1;\n checkboxInput.id = swalClasses.checkbox;\n checkboxInput.checked = Boolean(innerParams.inputValue);\n var label = checkbox.querySelector('span');\n label.innerHTML = innerParams.inputPlaceholder;\n show(checkbox);\n break;\n }\n\n case 'textarea':\n {\n var textarea = getChildByClass(domCache.content, swalClasses.textarea);\n textarea.value = innerParams.inputValue;\n setInputPlaceholder(textarea);\n show(textarea);\n break;\n }\n\n case null:\n {\n break;\n }\n\n default:\n error(\"Unexpected type of input! Expected \\\"text\\\", \\\"email\\\", \\\"password\\\", \\\"number\\\", \\\"tel\\\", \\\"select\\\", \\\"radio\\\", \\\"checkbox\\\", \\\"textarea\\\", \\\"file\\\" or \\\"url\\\", got \\\"\".concat(innerParams.input, \"\\\"\"));\n break;\n }\n\n if (innerParams.input === 'select' || innerParams.input === 'radio') {\n var processInputOptions = function processInputOptions(inputOptions) {\n return populateInputOptions(formatInputOptions(inputOptions));\n };\n\n if (isPromise(innerParams.inputOptions)) {\n constructor.showLoading();\n innerParams.inputOptions.then(function (inputOptions) {\n _this.hideLoading();\n\n processInputOptions(inputOptions);\n });\n } else if (_typeof(innerParams.inputOptions) === 'object') {\n processInputOptions(innerParams.inputOptions);\n } else {\n error(\"Unexpected type of inputOptions! Expected object, Map or Promise, got \".concat(_typeof(innerParams.inputOptions)));\n }\n } else if (['text', 'email', 'number', 'tel', 'textarea'].indexOf(innerParams.input) !== -1 && isPromise(innerParams.inputValue)) {\n constructor.showLoading();\n hide(input);\n innerParams.inputValue.then(function (inputValue) {\n input.value = innerParams.input === 'number' ? parseFloat(inputValue) || 0 : inputValue + '';\n show(input);\n input.focus();\n\n _this.hideLoading();\n }).catch(function (err) {\n error('Error in inputValue promise: ' + err);\n input.value = '';\n show(input);\n input.focus();\n\n _this.hideLoading();\n });\n }\n\n openPopup(innerParams);\n\n if (!innerParams.toast) {\n if (!callIfFunction(innerParams.allowEnterKey)) {\n if (document.activeElement && typeof document.activeElement.blur === 'function') {\n document.activeElement.blur();\n }\n } else if (innerParams.focusCancel && isVisible(domCache.cancelButton)) {\n domCache.cancelButton.focus();\n } else if (innerParams.focusConfirm && isVisible(domCache.confirmButton)) {\n domCache.confirmButton.focus();\n } else {\n setFocus(-1, 1);\n }\n } // fix scroll\n\n\n domCache.container.scrollTop = 0;\n });\n}\n\n\n\nvar instanceMethods = Object.freeze({\n\thideLoading: hideLoading,\n\tdisableLoading: hideLoading,\n\tgetInput: getInput,\n\tenableButtons: enableButtons,\n\tdisableButtons: disableButtons,\n\tenableConfirmButton: enableConfirmButton,\n\tdisableConfirmButton: disableConfirmButton,\n\tenableInput: enableInput,\n\tdisableInput: disableInput,\n\tshowValidationMessage: showValidationMessage,\n\tresetValidationMessage: resetValidationMessage,\n\tresetValidationError: resetValidationError,\n\tshowValidationError: showValidationError,\n\tgetProgressSteps: getProgressSteps$1,\n\tsetProgressSteps: setProgressSteps,\n\tshowProgressSteps: showProgressSteps,\n\thideProgressSteps: hideProgressSteps,\n\t_main: _main\n});\n\nvar currentInstance; // SweetAlert constructor\n\nfunction SweetAlert() {\n // Prevent run in Node env\n\n /* istanbul ignore if */\n if (typeof window === 'undefined') {\n return;\n } // Check for the existence of Promise\n\n /* istanbul ignore if */\n\n\n if (typeof Promise === 'undefined') {\n error('This package requires a Promise library, please include a shim to enable it in this browser (See: https://github.com/sweetalert2/sweetalert2/wiki/Migration-from-SweetAlert-to-SweetAlert2#1-ie-support)');\n }\n\n currentInstance = this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var outerParams = Object.freeze(this.constructor.argsToParams(args));\n Object.defineProperties(this, {\n params: {\n value: outerParams,\n writable: false,\n enumerable: true\n }\n });\n\n var promise = this._main(this.params);\n\n privateProps.promise.set(this, promise);\n} // `catch` cannot be the name of a module export, so we define our thenable methods here instead\n\n\nSweetAlert.prototype.then = function (onFulfilled, onRejected) {\n var promise = privateProps.promise.get(this);\n return promise.then(onFulfilled, onRejected);\n};\n\nSweetAlert.prototype.catch = function (onRejected) {\n var promise = privateProps.promise.get(this);\n return promise.catch(onRejected);\n};\n\nSweetAlert.prototype.finally = function (onFinally) {\n var promise = privateProps.promise.get(this);\n return promise.finally(onFinally);\n}; // Assign instance methods from src/instanceMethods/*.js to prototype\n\n\n_extends(SweetAlert.prototype, instanceMethods); // Assign static methods from src/staticMethods/*.js to constructor\n\n\n_extends(SweetAlert, staticMethods); // Proxy to instance methods to constructor, for now, for backwards compatibility\n\n\nObject.keys(instanceMethods).forEach(function (key) {\n SweetAlert[key] = function () {\n if (currentInstance) {\n var _currentInstance;\n\n return (_currentInstance = currentInstance)[key].apply(_currentInstance, arguments);\n }\n };\n});\nSweetAlert.DismissReason = DismissReason;\n/* istanbul ignore next */\n\nSweetAlert.noop = function () {};\n\nvar Swal = withNoNewKeyword(withGlobalDefaults(SweetAlert));\nSwal.default = Swal;\n\nreturn Swal;\n\n})));\nif (typeof window !== 'undefined' && window.Sweetalert2){ window.Sweetalert2.version = '7.33.1'; window.swal = window.sweetAlert = window.Swal = window.SweetAlert = window.Sweetalert2}\n\n\"undefined\"!=typeof document&&function(e,t){var n=e.createElement(\"style\");if(e.getElementsByTagName(\"head\")[0].appendChild(n),n.styleSheet)n.styleSheet.disabled||(n.styleSheet.cssText=t);else try{n.innerHTML=t}catch(e){n.innerText=t}}(document,\"@-webkit-keyframes swal2-show{0%{-webkit-transform:scale(.7);transform:scale(.7)}45%{-webkit-transform:scale(1.05);transform:scale(1.05)}80%{-webkit-transform:scale(.95);transform:scale(.95)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes swal2-show{0%{-webkit-transform:scale(.7);transform:scale(.7)}45%{-webkit-transform:scale(1.05);transform:scale(1.05)}80%{-webkit-transform:scale(.95);transform:scale(.95)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes swal2-hide{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{-webkit-transform:scale(.5);transform:scale(.5);opacity:0}}@keyframes swal2-hide{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{-webkit-transform:scale(.5);transform:scale(.5);opacity:0}}@-webkit-keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.875em;width:1.5625em}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.875em;width:1.5625em}}@-webkit-keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@-webkit-keyframes swal2-rotate-success-circular-line{0%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}5%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}12%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}100%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}}@keyframes swal2-rotate-success-circular-line{0%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}5%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}12%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}100%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}}@-webkit-keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;-webkit-transform:scale(.4);transform:scale(.4);opacity:0}50%{margin-top:1.625em;-webkit-transform:scale(.4);transform:scale(.4);opacity:0}80%{margin-top:-.375em;-webkit-transform:scale(1.15);transform:scale(1.15)}100%{margin-top:0;-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;-webkit-transform:scale(.4);transform:scale(.4);opacity:0}50%{margin-top:1.625em;-webkit-transform:scale(.4);transform:scale(.4);opacity:0}80%{margin-top:-.375em;-webkit-transform:scale(1.15);transform:scale(1.15)}100%{margin-top:0;-webkit-transform:scale(1);transform:scale(1);opacity:1}}@-webkit-keyframes swal2-animate-error-icon{0%{-webkit-transform:rotateX(100deg);transform:rotateX(100deg);opacity:0}100%{-webkit-transform:rotateX(0);transform:rotateX(0);opacity:1}}@keyframes swal2-animate-error-icon{0%{-webkit-transform:rotateX(100deg);transform:rotateX(100deg);opacity:0}100%{-webkit-transform:rotateX(0);transform:rotateX(0);opacity:1}}body.swal2-toast-shown .swal2-container{background-color:transparent}body.swal2-toast-shown .swal2-container.swal2-shown{background-color:transparent}body.swal2-toast-shown .swal2-container.swal2-top{top:0;right:auto;bottom:auto;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{top:0;right:0;bottom:auto;left:auto}body.swal2-toast-shown .swal2-container.swal2-top-left,body.swal2-toast-shown .swal2-container.swal2-top-start{top:0;right:auto;bottom:auto;left:0}body.swal2-toast-shown .swal2-container.swal2-center-left,body.swal2-toast-shown .swal2-container.swal2-center-start{top:50%;right:auto;bottom:auto;left:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{top:50%;right:auto;bottom:auto;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{top:50%;right:0;bottom:auto;left:auto;-webkit-transform:translateY(-50%);transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-left,body.swal2-toast-shown .swal2-container.swal2-bottom-start{top:auto;right:auto;bottom:0;left:0}body.swal2-toast-shown .swal2-container.swal2-bottom{top:auto;right:auto;bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{top:auto;right:0;bottom:0;left:auto}body.swal2-toast-column .swal2-toast{flex-direction:column;align-items:stretch}body.swal2-toast-column .swal2-toast .swal2-actions{flex:1;align-self:stretch;height:2.2em;margin-top:.3125em}body.swal2-toast-column .swal2-toast .swal2-loading{justify-content:center}body.swal2-toast-column .swal2-toast .swal2-input{height:2em;margin:.3125em auto;font-size:1em}body.swal2-toast-column .swal2-toast .swal2-validation-message{font-size:1em}.swal2-popup.swal2-toast{flex-direction:row;align-items:center;width:auto;padding:.625em;box-shadow:0 0 .625em #d9d9d9;overflow-y:hidden}.swal2-popup.swal2-toast .swal2-header{flex-direction:row}.swal2-popup.swal2-toast .swal2-title{flex-grow:1;justify-content:flex-start;margin:0 .6em;font-size:1em}.swal2-popup.swal2-toast .swal2-footer{margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-popup.swal2-toast .swal2-close{position:initial;width:.8em;height:.8em;line-height:.8}.swal2-popup.swal2-toast .swal2-content{justify-content:flex-start;font-size:1em}.swal2-popup.swal2-toast .swal2-icon{width:2em;min-width:2em;height:2em;margin:0}.swal2-popup.swal2-toast .swal2-icon-text{font-size:2em;font-weight:700;line-height:1em}.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-popup.swal2-toast .swal2-actions{height:auto;margin:0 .3125em}.swal2-popup.swal2-toast .swal2-styled{margin:0 .3125em;padding:.3125em .625em;font-size:1em}.swal2-popup.swal2-toast .swal2-styled:focus{box-shadow:0 0 0 .0625em #fff,0 0 0 .125em rgba(50,100,150,.4)}.swal2-popup.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:2em;height:2.8125em;-webkit-transform:rotate(45deg);transform:rotate(45deg);border-radius:50%}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.25em;left:-.9375em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:2em 2em;transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.25em;left:.9375em;-webkit-transform-origin:0 2em;transform-origin:0 2em;border-radius:0 4em 4em 0}.swal2-popup.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-popup.swal2-toast.swal2-show{-webkit-animation:showSweetToast .5s;animation:showSweetToast .5s}.swal2-popup.swal2-toast.swal2-hide{-webkit-animation:hideSweetToast .2s forwards;animation:hideSweetToast .2s forwards}.swal2-popup.swal2-toast .swal2-animate-success-icon .swal2-success-line-tip{-webkit-animation:animate-toast-success-tip .75s;animation:animate-toast-success-tip .75s}.swal2-popup.swal2-toast .swal2-animate-success-icon .swal2-success-line-long{-webkit-animation:animate-toast-success-long .75s;animation:animate-toast-success-long .75s}@-webkit-keyframes showSweetToast{0%{-webkit-transform:translateY(-.625em) rotateZ(2deg);transform:translateY(-.625em) rotateZ(2deg);opacity:0}33%{-webkit-transform:translateY(0) rotateZ(-2deg);transform:translateY(0) rotateZ(-2deg);opacity:.5}66%{-webkit-transform:translateY(.3125em) rotateZ(2deg);transform:translateY(.3125em) rotateZ(2deg);opacity:.7}100%{-webkit-transform:translateY(0) rotateZ(0);transform:translateY(0) rotateZ(0);opacity:1}}@keyframes showSweetToast{0%{-webkit-transform:translateY(-.625em) rotateZ(2deg);transform:translateY(-.625em) rotateZ(2deg);opacity:0}33%{-webkit-transform:translateY(0) rotateZ(-2deg);transform:translateY(0) rotateZ(-2deg);opacity:.5}66%{-webkit-transform:translateY(.3125em) rotateZ(2deg);transform:translateY(.3125em) rotateZ(2deg);opacity:.7}100%{-webkit-transform:translateY(0) rotateZ(0);transform:translateY(0) rotateZ(0);opacity:1}}@-webkit-keyframes hideSweetToast{0%{opacity:1}33%{opacity:.5}100%{-webkit-transform:rotateZ(1deg);transform:rotateZ(1deg);opacity:0}}@keyframes hideSweetToast{0%{opacity:1}33%{opacity:.5}100%{-webkit-transform:rotateZ(1deg);transform:rotateZ(1deg);opacity:0}}@-webkit-keyframes animate-toast-success-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes animate-toast-success-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@-webkit-keyframes animate-toast-success-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@keyframes animate-toast-success-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto!important}body.swal2-no-backdrop .swal2-shown{top:auto;right:auto;bottom:auto;left:auto;background-color:transparent}body.swal2-no-backdrop .swal2-shown>.swal2-modal{box-shadow:0 0 10px rgba(0,0,0,.4)}body.swal2-no-backdrop .swal2-shown.swal2-top{top:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-top-left,body.swal2-no-backdrop .swal2-shown.swal2-top-start{top:0;left:0}body.swal2-no-backdrop .swal2-shown.swal2-top-end,body.swal2-no-backdrop .swal2-shown.swal2-top-right{top:0;right:0}body.swal2-no-backdrop .swal2-shown.swal2-center{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}body.swal2-no-backdrop .swal2-shown.swal2-center-left,body.swal2-no-backdrop .swal2-shown.swal2-center-start{top:50%;left:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-center-end,body.swal2-no-backdrop .swal2-shown.swal2-center-right{top:50%;right:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-bottom{bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-bottom-left,body.swal2-no-backdrop .swal2-shown.swal2-bottom-start{bottom:0;left:0}body.swal2-no-backdrop .swal2-shown.swal2-bottom-end,body.swal2-no-backdrop .swal2-shown.swal2-bottom-right{right:0;bottom:0}.swal2-container{display:flex;position:fixed;top:0;right:0;bottom:0;left:0;flex-direction:row;align-items:center;justify-content:center;padding:10px;background-color:transparent;z-index:1060;overflow-x:hidden;-webkit-overflow-scrolling:touch}.swal2-container.swal2-top{align-items:flex-start}.swal2-container.swal2-top-left,.swal2-container.swal2-top-start{align-items:flex-start;justify-content:flex-start}.swal2-container.swal2-top-end,.swal2-container.swal2-top-right{align-items:flex-start;justify-content:flex-end}.swal2-container.swal2-center{align-items:center}.swal2-container.swal2-center-left,.swal2-container.swal2-center-start{align-items:center;justify-content:flex-start}.swal2-container.swal2-center-end,.swal2-container.swal2-center-right{align-items:center;justify-content:flex-end}.swal2-container.swal2-bottom{align-items:flex-end}.swal2-container.swal2-bottom-left,.swal2-container.swal2-bottom-start{align-items:flex-end;justify-content:flex-start}.swal2-container.swal2-bottom-end,.swal2-container.swal2-bottom-right{align-items:flex-end;justify-content:flex-end}.swal2-container.swal2-grow-fullscreen>.swal2-modal{display:flex!important;flex:1;align-self:stretch;justify-content:center}.swal2-container.swal2-grow-row>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container.swal2-grow-column{flex:1;flex-direction:column}.swal2-container.swal2-grow-column.swal2-bottom,.swal2-container.swal2-grow-column.swal2-center,.swal2-container.swal2-grow-column.swal2-top{align-items:center}.swal2-container.swal2-grow-column.swal2-bottom-left,.swal2-container.swal2-grow-column.swal2-bottom-start,.swal2-container.swal2-grow-column.swal2-center-left,.swal2-container.swal2-grow-column.swal2-center-start,.swal2-container.swal2-grow-column.swal2-top-left,.swal2-container.swal2-grow-column.swal2-top-start{align-items:flex-start}.swal2-container.swal2-grow-column.swal2-bottom-end,.swal2-container.swal2-grow-column.swal2-bottom-right,.swal2-container.swal2-grow-column.swal2-center-end,.swal2-container.swal2-grow-column.swal2-center-right,.swal2-container.swal2-grow-column.swal2-top-end,.swal2-container.swal2-grow-column.swal2-top-right{align-items:flex-end}.swal2-container.swal2-grow-column>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container:not(.swal2-top):not(.swal2-top-start):not(.swal2-top-end):not(.swal2-top-left):not(.swal2-top-right):not(.swal2-center-start):not(.swal2-center-end):not(.swal2-center-left):not(.swal2-center-right):not(.swal2-bottom):not(.swal2-bottom-start):not(.swal2-bottom-end):not(.swal2-bottom-left):not(.swal2-bottom-right):not(.swal2-grow-fullscreen)>.swal2-modal{margin:auto}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-container .swal2-modal{margin:0!important}}.swal2-container.swal2-fade{transition:background-color .1s}.swal2-container.swal2-shown{background-color:rgba(0,0,0,.4)}.swal2-popup{display:none;position:relative;flex-direction:column;justify-content:center;width:32em;max-width:100%;padding:1.25em;border-radius:.3125em;background:#fff;font-family:inherit;font-size:1rem;box-sizing:border-box}.swal2-popup:focus{outline:0}.swal2-popup.swal2-loading{overflow-y:hidden}.swal2-popup .swal2-header{display:flex;flex-direction:column;align-items:center}.swal2-popup .swal2-title{display:block;position:relative;max-width:100%;margin:0 0 .4em;padding:0;color:#595959;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;word-wrap:break-word}.swal2-popup .swal2-actions{flex-wrap:wrap;align-items:center;justify-content:center;margin:1.25em auto 0;z-index:1}.swal2-popup .swal2-actions:not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}.swal2-popup .swal2-actions:not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(0,0,0,.1),rgba(0,0,0,.1))}.swal2-popup .swal2-actions:not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.2))}.swal2-popup .swal2-actions.swal2-loading .swal2-styled.swal2-confirm{width:2.5em;height:2.5em;margin:.46875em;padding:0;border:.25em solid transparent;border-radius:100%;border-color:transparent;background-color:transparent!important;color:transparent;cursor:default;box-sizing:border-box;-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-popup .swal2-actions.swal2-loading .swal2-styled.swal2-cancel{margin-right:30px;margin-left:30px}.swal2-popup .swal2-actions.swal2-loading :not(.swal2-styled).swal2-confirm::after{display:inline-block;width:15px;height:15px;margin-left:5px;border:3px solid #999;border-radius:50%;border-right-color:transparent;box-shadow:1px 1px 1px #fff;content:'';-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal}.swal2-popup .swal2-styled{margin:.3125em;padding:.625em 2em;font-weight:500;box-shadow:none}.swal2-popup .swal2-styled:not([disabled]){cursor:pointer}.swal2-popup .swal2-styled.swal2-confirm{border:0;border-radius:.25em;background:initial;background-color:#3085d6;color:#fff;font-size:1.0625em}.swal2-popup .swal2-styled.swal2-cancel{border:0;border-radius:.25em;background:initial;background-color:#aaa;color:#fff;font-size:1.0625em}.swal2-popup .swal2-styled:focus{outline:0;box-shadow:0 0 0 2px #fff,0 0 0 4px rgba(50,100,150,.4)}.swal2-popup .swal2-styled::-moz-focus-inner{border:0}.swal2-popup .swal2-footer{justify-content:center;margin:1.25em 0 0;padding:1em 0 0;border-top:1px solid #eee;color:#545454;font-size:1em}.swal2-popup .swal2-image{max-width:100%;margin:1.25em auto}.swal2-popup .swal2-close{position:absolute;top:0;right:0;justify-content:center;width:1.2em;height:1.2em;padding:0;transition:color .1s ease-out;border:none;border-radius:0;outline:initial;background:0 0;color:#ccc;font-family:serif;font-size:2.5em;line-height:1.2;cursor:pointer;overflow:hidden}.swal2-popup .swal2-close:hover{-webkit-transform:none;transform:none;color:#f27474}.swal2-popup>.swal2-checkbox,.swal2-popup>.swal2-file,.swal2-popup>.swal2-input,.swal2-popup>.swal2-radio,.swal2-popup>.swal2-select,.swal2-popup>.swal2-textarea{display:none}.swal2-popup .swal2-content{justify-content:center;margin:0;padding:0;color:#545454;font-size:1.125em;font-weight:300;line-height:normal;z-index:1;word-wrap:break-word}.swal2-popup #swal2-content{text-align:center}.swal2-popup .swal2-checkbox,.swal2-popup .swal2-file,.swal2-popup .swal2-input,.swal2-popup .swal2-radio,.swal2-popup .swal2-select,.swal2-popup .swal2-textarea{margin:1em auto}.swal2-popup .swal2-file,.swal2-popup .swal2-input,.swal2-popup .swal2-textarea{width:100%;transition:border-color .3s,box-shadow .3s;border:1px solid #d9d9d9;border-radius:.1875em;font-size:1.125em;box-shadow:inset 0 1px 1px rgba(0,0,0,.06);box-sizing:border-box}.swal2-popup .swal2-file.swal2-inputerror,.swal2-popup .swal2-input.swal2-inputerror,.swal2-popup .swal2-textarea.swal2-inputerror{border-color:#f27474!important;box-shadow:0 0 2px #f27474!important}.swal2-popup .swal2-file:focus,.swal2-popup .swal2-input:focus,.swal2-popup .swal2-textarea:focus{border:1px solid #b4dbed;outline:0;box-shadow:0 0 3px #c4e6f5}.swal2-popup .swal2-file::-webkit-input-placeholder,.swal2-popup .swal2-input::-webkit-input-placeholder,.swal2-popup .swal2-textarea::-webkit-input-placeholder{color:#ccc}.swal2-popup .swal2-file:-ms-input-placeholder,.swal2-popup .swal2-input:-ms-input-placeholder,.swal2-popup .swal2-textarea:-ms-input-placeholder{color:#ccc}.swal2-popup .swal2-file::-ms-input-placeholder,.swal2-popup .swal2-input::-ms-input-placeholder,.swal2-popup .swal2-textarea::-ms-input-placeholder{color:#ccc}.swal2-popup .swal2-file::placeholder,.swal2-popup .swal2-input::placeholder,.swal2-popup .swal2-textarea::placeholder{color:#ccc}.swal2-popup .swal2-range input{width:80%}.swal2-popup .swal2-range output{width:20%;font-weight:600;text-align:center}.swal2-popup .swal2-range input,.swal2-popup .swal2-range output{height:2.625em;margin:1em auto;padding:0;font-size:1.125em;line-height:2.625em}.swal2-popup .swal2-input{height:2.625em;padding:0 .75em}.swal2-popup .swal2-input[type=number]{max-width:10em}.swal2-popup .swal2-file{font-size:1.125em}.swal2-popup .swal2-textarea{height:6.75em;padding:.75em}.swal2-popup .swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;color:#545454;font-size:1.125em}.swal2-popup .swal2-checkbox,.swal2-popup .swal2-radio{align-items:center;justify-content:center}.swal2-popup .swal2-checkbox label,.swal2-popup .swal2-radio label{margin:0 .6em;font-size:1.125em}.swal2-popup .swal2-checkbox input,.swal2-popup .swal2-radio input{margin:0 .4em}.swal2-popup .swal2-validation-message{display:none;align-items:center;justify-content:center;padding:.625em;background:#f0f0f0;color:#666;font-size:1em;font-weight:300;overflow:hidden}.swal2-popup .swal2-validation-message::before{display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center;content:'!';zoom:normal}@supports (-ms-accelerator:true){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@-moz-document url-prefix(){.swal2-close:focus{outline:2px solid rgba(50,100,150,.4)}}.swal2-icon{position:relative;justify-content:center;width:5em;height:5em;margin:1.25em auto 1.875em;border:.25em solid transparent;border-radius:50%;line-height:5em;cursor:default;box-sizing:content-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;zoom:normal}.swal2-icon-text{font-size:3.75em}.swal2-icon.swal2-error{border-color:#f27474}.swal2-icon.swal2-error .swal2-x-mark{position:relative;flex-grow:1}.swal2-icon.swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.swal2-icon.swal2-warning{border-color:#facea8;color:#f8bb86}.swal2-icon.swal2-info{border-color:#9de0f6;color:#3fc3ee}.swal2-icon.swal2-question{border-color:#c9dae1;color:#87adbd}.swal2-icon.swal2-success{border-color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;-webkit-transform:rotate(45deg);transform:rotate(45deg);border-radius:50%}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.4375em;left:-2.0635em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:3.75em 3.75em;transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.6875em;left:1.875em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:0 3.75em;transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}.swal2-icon.swal2-success .swal2-success-ring{position:absolute;top:-.25em;left:-.25em;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%;z-index:2;box-sizing:content-box}.swal2-icon.swal2-success .swal2-success-fix{position:absolute;top:.5em;left:1.625em;width:.4375em;height:5.625em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);z-index:1}.swal2-icon.swal2-success [class^=swal2-success-line]{display:block;position:absolute;height:.3125em;border-radius:.125em;background-color:#a5dc86;z-index:2}.swal2-icon.swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.875em;width:1.5625em;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swal2-icon.swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.swal2-progresssteps{align-items:center;margin:0 0 1.25em;padding:0;font-weight:600}.swal2-progresssteps li{display:inline-block;position:relative}.swal2-progresssteps .swal2-progresscircle{width:2em;height:2em;border-radius:2em;background:#3085d6;color:#fff;line-height:2em;text-align:center;z-index:20}.swal2-progresssteps .swal2-progresscircle:first-child{margin-left:0}.swal2-progresssteps .swal2-progresscircle:last-child{margin-right:0}.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep{background:#3085d6}.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep~.swal2-progresscircle{background:#add8e6}.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep~.swal2-progressline{background:#add8e6}.swal2-progresssteps .swal2-progressline{width:2.5em;height:.4em;margin:0 -1px;background:#3085d6;z-index:10}[class^=swal2]{-webkit-tap-highlight-color:transparent}.swal2-show{-webkit-animation:swal2-show .3s;animation:swal2-show .3s}.swal2-show.swal2-noanimation{-webkit-animation:none;animation:none}.swal2-hide{-webkit-animation:swal2-hide .15s forwards;animation:swal2-hide .15s forwards}.swal2-hide.swal2-noanimation{-webkit-animation:none;animation:none}.swal2-rtl .swal2-close{right:auto;left:0}.swal2-animate-success-icon .swal2-success-line-tip{-webkit-animation:swal2-animate-success-line-tip .75s;animation:swal2-animate-success-line-tip .75s}.swal2-animate-success-icon .swal2-success-line-long{-webkit-animation:swal2-animate-success-line-long .75s;animation:swal2-animate-success-line-long .75s}.swal2-animate-success-icon .swal2-success-circular-line-right{-webkit-animation:swal2-rotate-success-circular-line 4.25s ease-in;animation:swal2-rotate-success-circular-line 4.25s ease-in}.swal2-animate-error-icon{-webkit-animation:swal2-animate-error-icon .5s;animation:swal2-animate-error-icon .5s}.swal2-animate-error-icon .swal2-x-mark{-webkit-animation:swal2-animate-error-x-mark .5s;animation:swal2-animate-error-x-mark .5s}@-webkit-keyframes swal2-rotate-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes swal2-rotate-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@media print{body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow-y:scroll!important}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container{position:initial!important}}\");","/**\n * This file contains the React Component for a Modal Window.\n *\n * @author Henri Rabalais\n * @version 1.1.0\n *\n */\nimport React, {Component} from 'react';\nimport PropTypes from 'prop-types';\nimport swal from 'sweetalert2';\n\n/**\n * Modal Component.\n * React wrapper for a Modal Window. Allows to dynamically toggle a Modal\n * window.\n *\n * ================================================\n * Usage:\n * - Wrap the contents to be displayed by the Modal Window by the\n * Modal Component.\n * - Use the 'title' prop to set a title for the Modal Component.\n * - Use the 'onSubmit' prop to set a submission *promise* object for the\n * Modal's contents.\n * - Use the 'onClose' prop to set a function that triggers upon Modal closure.\n * - Use the 'throwWarning' prop to throw a warning upon closure of the\n * Modal Window.\n * =================================================\n *\n */\nclass Modal extends Component {\n constructor() {\n super();\n this.handleClose = this.handleClose.bind(this);\n }\n\n handleClose() {\n if (this.props.throwWarning) {\n swal({\n title: 'Are You Sure?',\n text: 'Leaving the form will result in the loss of any information ' +\n 'entered.',\n type: 'warning',\n showCancelButton: true,\n confirmButtonText: 'Proceed',\n cancelButtonText: 'Cancel',\n }).then((result) => result.value && this.props.onClose());\n } else {\n this.props.onClose();\n }\n }\n\n render() {\n const {show, children, onSubmit, title} = this.props;\n\n const headerStyle = {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n height: '40px',\n borderTopRightRadius: '10',\n fontSize: 24,\n padding: 35,\n borderBottom: '1px solid #DDDDDD',\n };\n\n const glyphStyle = {\n marginLeft: 'auto',\n cursor: 'pointer',\n };\n\n const bodyStyle = {\n padding: 15,\n };\n\n const modalContainer = {\n display: 'block',\n position: 'fixed',\n zIndex: 9999,\n paddingTop: '100px',\n left: 0,\n top: 0,\n width: '100%',\n height: '100%',\n overflow: 'auto',\n backgroundColor: 'rgba(0,0,0,0.7)',\n visibility: show ? 'visible' : 'hidden',\n };\n\n const modalContent = {\n opacity: show ? 1 : 0,\n top: show ? 0 : '-300px',\n position: 'relative',\n backgroundColor: '#fefefe',\n borderRadius: '7px',\n margin: 'auto',\n padding: 0,\n border: '1px solid #888',\n width: '700px',\n boxShadow: '0 4px 8px 0 rbga(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19)',\n transition: 'top 0.4s, opacity 0.4s',\n };\n\n const renderChildren = () => show && children;\n\n const footerStyle = {\n borderTop: '1px solid #DDDDDD',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n height: '40px',\n padding: '35px 35px 20px 35px',\n };\n\n const submitStyle = {\n marginLeft: 'auto',\n marginRight: '20px',\n };\n\n const submitButton = () => {\n if (onSubmit) {\n return (\n
    \n onSubmit().then(() => this.props.onClose())}\n />\n
    \n );\n }\n };\n\n return (\n
    \n e.stopPropagation()}\n >\n
    \n {title}\n \n ×\n \n
    \n
    \n {renderChildren()}\n
    \n
    \n {submitButton()}\n
    \n
    \n \n );\n }\n}\n\nModal.propTypes = {\n title: PropTypes.string,\n onSubmit: PropTypes.object,\n onClose: PropTypes.func.isRequired,\n show: PropTypes.bool.isRequired,\n throwWarning: PropTypes.bool,\n};\n\nModal.defaultProps = {\n throwWarning: false,\n};\n\nexport default Modal;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","import React, {Component} from 'react';\n\n/**\n * Open Profile Form\n *\n * Module component rendering the Open Profile Form\n *\n */\nclass OpenProfileForm extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n error: {\n message: '',\n className: 'alert alert-danger text-center',\n },\n PSCID: '',\n CandID: '',\n };\n\n this.updateFormElement = this.updateFormElement.bind(this);\n this.validateAndSubmit = this.validateAndSubmit.bind(this);\n }\n\n updateFormElement(formElement, value) {\n let state = this.state;\n state[formElement] = value;\n this.setState(state);\n }\n\n validateAndSubmit() {\n let state = this.state;\n if (this.state.CandID === '') {\n state.error = {\n message: 'You must enter a DCCID!',\n className: 'alert alert-danger text-center',\n };\n this.setState(state);\n return;\n }\n\n if (this.state.PSCID === '') {\n state.error = {\n message: 'You must enter a PSCID!',\n className: 'alert alert-danger text-center',\n };\n this.setState(state);\n return;\n }\n\n // Always include a validating message.. the callback for the ajax request will\n // update it after the ajax call returns.\n state.error = {\n message: 'Validating...',\n className: 'alert alert-info text-center',\n };\n this.setState(state);\n\n $.get(loris.BaseURL + '/candidate_list/validateIDs',\n {\n CandID: state.CandID,\n PSCID: state.PSCID,\n },\n function(data) {\n // ids are valid, submit accessProfileForm form\n if (data === '1') {\n state.error = {\n message: 'Opening profile...',\n className: 'alert alert-info text-center',\n };\n window.location.href = loris.BaseURL + '/' + state.CandID;\n } else {\n // display error message\n state.error = {\n message: 'DCCID or PSCID is not valid',\n className: 'alert alert-danger text-center',\n };\n }\n this.setState(state);\n }.bind(this));\n }\n\n render() {\n let warning;\n\n if (this.state.error.message !== '') {\n warning = (\n
    \n {this.state.error.message}\n
    \n );\n }\n return (\n \n \n \n {warning}\n \n \n );\n }\n}\n\nexport default OpenProfileForm;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","/**\n * This file contains the React component for Loader\n *\n * @author Henri Rabalais\n * @version 1.0.0\n *\n */\n\nimport React, {Component} from 'react';\nimport PropTypes from 'prop-types';\n\n/**\n * Loader component\n */\nclass Loader extends Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n return (\n \n );\n }\n}\n\nLoader.propTypes = {size: PropTypes.string};\nLoader.defaultProps = {size: '120'};\n\nexport default Loader;\n","/**\n * This file contains React components for Tabs component.\n *\n * @author Loris Team\n * @version 1.1.0\n *\n */\n\nimport React, {Component} from 'react';\nimport PropTypes from 'prop-types';\n\n/**\n * Tabs Component.\n * React wrapper for Bootstrap tabs. Allows to dynamically render tabs\n * and corresponding tab panes.\n *\n * ================================================\n * Usage:\n *\n * 1. Define an array of tabs with IDs and labels\n *\n * `let tabList = [{id: \"tab1\", label: \"This is tab title\"}];`\n *\n * 2. Pass tabList as property and as child\n * ```\n * \n * \n * // Tab content goes here\n * \n * \n * ```\n * =================================================\n *\n */\nclass Tabs extends Component {\n constructor(props) {\n super(props);\n\n const hash = window.location.hash;\n let activeTab = '';\n\n /**\n * Determine the initial active tab in this order\n * 1. Try to infer from the URL, otherwise\n * 2. Try to infer from the defaultTab prop, otherwise\n * 3. Set to be the first tab of the list\n */\n if (this.props.updateURL && hash) {\n activeTab = hash.substr(1);\n } else if (this.props.defaultTab) {\n activeTab = this.props.defaultTab;\n } else if (this.props.tabs.length > 0) {\n activeTab = this.props.tabs[0].id;\n }\n\n this.state = {\n activeTab: activeTab,\n };\n\n this.handleClick = this.handleClick.bind(this);\n this.getTabs = this.getTabs.bind(this);\n this.getTabPanes = this.getTabPanes.bind(this);\n }\n\n handleClick(tabId, e) {\n this.setState({activeTab: tabId});\n this.props.onTabChange(tabId);\n\n // Add tab href to URL querystring and scroll the page to top\n if (this.props.updateURL) {\n const scrollDistance = $('body').scrollTop() || $('html').scrollTop();\n window.location.hash = e.target.hash;\n $('html,body').scrollTop(scrollDistance);\n }\n }\n\n getTabs() {\n let tabs = (this.props.tabs).map(function(tab) {\n let tabClass = this.state.activeTab === tab.id ? 'active' : null;\n let href = '#' + tab.id;\n let tabID = 'tab-' + tab.id;\n return (\n \n \n {tab.label}\n \n \n );\n }.bind(this));\n\n return tabs;\n }\n\n getTabPanes() {\n let tabPanes = React.Children.map(this.props.children, function(child, key) {\n if (child) {\n return React.cloneElement(child, {\n activeTab: this.state.activeTab,\n key: key,\n });\n }\n }.bind(this));\n\n return tabPanes;\n }\n\n render() {\n let tabs = this.getTabs();\n let tabPanes = this.getTabPanes();\n let tabStyle = {\n marginLeft: 0,\n marginBottom: '5px',\n };\n\n return (\n
    \n
      \n {tabs}\n
    \n
    \n {tabPanes}\n
    \n
    \n );\n }\n}\nTabs.propTypes = {\n tabs: PropTypes.array.isRequired,\n defaultTab: PropTypes.string,\n updateURL: PropTypes.bool,\n};\nTabs.defaultProps = {\n onTabChange: function() {},\n // Set updateURL to default to true but allow for change\n // Nested tabs should set this variable to false\n updateURL: true,\n};\n\n/**\n * Allows to dynamically render vertical tabs corresponding to tab panes.\n */\n\nclass VerticalTabs extends Component {\n constructor(props) {\n super(props);\n\n const hash = window.location.hash;\n let activeTab = '';\n\n /**\n * Determine the initial active tab in this order\n * 1. Try to infer from the URL, otherwise\n * 2. Try to infer from the defaultTab prop, otherwise\n * 3. Set to be the first tab of the list\n */\n if (this.props.updateURL && hash) {\n activeTab = hash.substr(1);\n } else if (this.props.defaultTab) {\n activeTab = this.props.defaultTab;\n } else if (this.props.tabs.length > 0) {\n activeTab = this.props.tabs[0].id;\n }\n\n this.state = {\n activeTab: activeTab,\n };\n\n this.handleClick = this.handleClick.bind(this);\n this.getTabs = this.getTabs.bind(this);\n this.getTabPanes = this.getTabPanes.bind(this);\n }\n\n handleClick(tabId, e) {\n this.setState({activeTab: tabId});\n this.props.onTabChange(tabId);\n\n // Add tab href to URL querystring and scroll the page to top\n if (this.props.updateURL) {\n const scrollDistance = $('body').scrollTop() || $('html').scrollTop();\n window.location.hash = e.target.hash;\n $('html,body').scrollTop(scrollDistance);\n }\n }\n\n getTabs() {\n let tabs = (this.props.tabs).map(function(tab) {\n let tabClass = this.state.activeTab === tab.id ? 'active' : null;\n let href = '#' + tab.id;\n let tabID = 'tab-' + tab.id;\n return (\n \n \n {tab.label}\n \n \n );\n }.bind(this));\n\n return tabs;\n }\n\n getTabPanes() {\n let tabPanes = React.Children.map(this.props.children, function(child, key) {\n if (child) {\n return React.cloneElement(child, {\n activeTab: this.state.activeTab,\n key: key,\n });\n }\n }.bind(this));\n\n return tabPanes;\n }\n\n render() {\n let tabs = this.getTabs();\n let tabPanes = this.getTabPanes();\n let tabStyle = {\n marginLeft: 0,\n marginBottom: '5px',\n };\n\n return (\n
    \n
    \n
      \n {tabs}\n
    \n
    \n
    \n {tabPanes}\n
    \n
    \n );\n }\n}\nVerticalTabs.propTypes = {\n tabs: PropTypes.array.isRequired,\n defaultTab: PropTypes.string,\n updateURL: PropTypes.bool,\n};\nVerticalTabs.defaultProps = {\n onTabChange: function() {},\n // Set updateURL to default to true but allow for change\n // Nested tabs should set this variable to false\n updateURL: true,\n};\n\n/*\n * TabPane component.\n * Used to wrap content for every tab.\n */\nclass TabPane extends Component {\n render() {\n let classList = 'tab-pane';\n let title;\n\n if (this.props.TabId === this.props.activeTab) {\n classList += ' active';\n }\n if (this.props.Title) {\n title =

    {this.props.Title}

    ;\n }\n\n return (\n
    \n {title}\n {this.props.children}\n
    \n );\n }\n}\nTabPane.propTypes = {\n TabId: PropTypes.string.isRequired,\n Title: PropTypes.string,\n activeTab: PropTypes.string,\n};\n\nexport {\n Tabs,\n VerticalTabs,\n TabPane,\n};\n","import React, {Component} from 'react';\nimport PropTypes from 'prop-types';\n\nimport Loader from 'Loader';\nimport FilterableDataTable from 'FilterableDataTable';\nimport Modal from 'Modal';\n\nimport OpenProfileForm from './openProfileForm';\n\n/**\n * Candidate List\n *\n * Main module component rendering the candidate list and open profile form\n *\n * @author Dave MacFarlane\n * @author Cécile Madjar *\n */\nclass CandidateListIndex extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n data: {},\n error: false,\n isLoaded: false,\n hideFilter: true,\n show: {profileForm: false},\n };\n\n this.fetchData = this.fetchData.bind(this);\n this.formatColumn = this.formatColumn.bind(this);\n this.toggleFilters = this.toggleFilters.bind(this);\n }\n\n show(state) {\n let show = this.state.show;\n show[state] = true;\n this.setState({show});\n }\n\n hide(state) {\n let show = this.state.show;\n show[state] = false;\n this.setState({show});\n }\n\n componentDidMount() {\n this.fetchData()\n .then(() => this.setState({isLoaded: true}));\n\n const searchParams = new URLSearchParams(location.search);\n if (searchParams.has('hide')) {\n this.setState({hideFilter: JSON.parse(searchParams.get('hide'))});\n }\n }\n\n /**\n * Retrieve data from the provided URL and save it in state\n * Additionally add hiddenHeaders to global loris variable\n * for easy access by columnFormatter.\n *\n * @return {object}\n */\n fetchData() {\n return fetch(this.props.dataURL, {credentials: 'same-origin'})\n .then((resp) => resp.json())\n .then((data) => this.setState({data}))\n .catch((error) => {\n this.setState({error: true});\n console.error(error);\n });\n }\n\n // Basic/Advanced toggle\n toggleFilters() {\n const hideFilter = !this.state.hideFilter;\n this.setState({hideFilter});\n\n // Updates query params to reflect advance filter toggle.\n const searchParams = new URLSearchParams(location.search);\n searchParams.set('hide', hideFilter);\n history.replaceState(history.state, '', `?${searchParams.toString()}`);\n };\n\n /**\n * Modify behaviour of specified column cells in the Data Table component\n *\n * @param {string} column - column name\n * @param {string} cell - cell content\n * @param {object} row - row content indexed by column\n *\n * @return {*} a formated table cell for a given column\n */\n formatColumn(column, cell, row) {\n if (column === 'PSCID' && this.props.hasPermission('access_all_profiles')) {\n let url = this.props.baseURL + '/' + row['DCCID'] + '/';\n return {cell};\n }\n if (column === 'Feedback') {\n switch (cell) {\n case '1': return opened;\n case '2': return answered;\n case '3': return closed;\n case '4': return comment;\n default: return None;\n }\n }\n if (column === 'Scan Done' && cell === 'Y') {\n let url = this.props.baseURL + '/imaging_browser/?PSCID=' + row['PSCID'];\n return (\n \n {cell}\n );\n }\n return {cell};\n }\n\n render() {\n // If error occurs, return a message.\n // XXX: Replace this with a UI component for 500 errors.\n if (this.state.error) {\n return

    An error occured while loading the page.

    ;\n }\n\n // Waiting for async data to load\n if (!this.state.isLoaded) {\n return ;\n }\n\n /**\n * XXX: Currently, the order of these fields MUST match the order of the\n * queried columns in _setupVariables() in candidate_list.class.inc\n */\n // FIXME: if candidate in more than one subproject, filter does not work\n const options = this.state.data.fieldOptions;\n const fields = [\n {\n label: 'PSCID',\n show: true,\n filter: {\n name: 'pscid',\n type: 'text',\n },\n },\n {\n label: 'DCCID',\n show: true,\n filter: {\n name: 'dccid',\n type: 'text',\n },\n },\n {\n label: 'Visit Label',\n show: false,\n filter: {\n name: 'visitLabel',\n type: 'text',\n },\n },\n {\n label: 'Site',\n show: true,\n filter: {\n name: 'site',\n type: 'select',\n options: options.site,\n },\n },\n {\n 'label': 'Subproject',\n 'show': true,\n 'filter': {\n name: 'subproject',\n type: 'select',\n options: options.subproject,\n },\n },\n {\n label: 'Entity Type',\n show: true,\n filter: {\n name: 'entityType',\n type: 'select',\n options: {\n 'Human': 'Human',\n 'Scanner': 'Scanner',\n },\n },\n },\n {\n 'label': 'Scan Done',\n 'show': true,\n 'filter': {\n name: 'scanDone',\n type: 'select',\n hide: this.state.hideFilter,\n options: {\n 'Y': 'Yes',\n 'N': 'No',\n },\n },\n },\n {\n 'label': 'Participant Status',\n 'show': true,\n 'filter': {\n name: 'participantStatus',\n type: 'select',\n hide: this.state.hideFilter,\n options: options.participantstatus,\n },\n },\n {\n 'label': 'DoB',\n 'show': true,\n 'filter': {\n name: 'DoB',\n type: 'date',\n hide: this.state.hideFilter,\n },\n },\n {\n label: 'Sex',\n show: true,\n filter: {\n name: 'sex',\n type: 'select',\n hide: this.state.hideFilter,\n options: {\n 'Male': 'Male',\n 'Female': 'Female',\n },\n },\n },\n {\n 'label': 'VisitCount',\n 'show': true,\n 'filter': {\n name: 'visitCount',\n type: 'text',\n hide: this.state.hideFilter,\n },\n },\n {\n 'label': 'Feedback',\n 'show': true,\n 'filter': {\n name: 'feedback',\n type: 'select',\n hide: this.state.hideFilter,\n options: {\n '0': 'None',\n '1': 'opened',\n '2': 'answered',\n '3': 'closed',\n '4': 'comment',\n },\n },\n },\n {\n 'label': 'Latest Visit Status',\n 'show': true,\n 'filter': {\n name: 'latestVisitStatus',\n type: 'select',\n hide: this.state.hideFilter,\n options: {\n 'Not Started': 'Not Started',\n 'Screening': 'Screening',\n 'Visit': 'Visit',\n 'Approval': 'Approval',\n 'Recycling Bin': 'Recycling Bin',\n },\n },\n },\n\n ];\n fields.push(\n {\n 'label': 'Project',\n 'show': true,\n 'filter': {\n name: 'project',\n type: 'select',\n options: options.project,\n },\n },\n );\n\n if (options.useedc === 'true') {\n fields.push(\n {\n 'label': 'EDC',\n 'show': true,\n 'filter': {\n name: 'edc',\n type: 'date',\n hide: this.state.hideFilter,\n },\n }\n );\n }\n\n // Open profile modal window\n const profileForm = (\n {\n this.hide('profileForm');\n }}\n onClick={this.openProfile}\n >\n \n \n );\n\n // Add action buttons for toggle and open profile\n // FIXME: move toggle button in the filter component next to the clear button\n const actions = [\n {\n label: this.state.hideFilter ? 'Show Advanced Filters' : 'Hide Advanced Filters',\n action: this.toggleFilters,\n name: 'advanced',\n },\n {\n label: 'Open Profile',\n action: () => this.show('profileForm'),\n show: !this.props.hasPermission('access_all_profiles'),\n },\n ];\n\n return (\n
    \n {profileForm}\n \n
    \n );\n }\n}\n\nCandidateListIndex.propTypes = {\n dataURL: PropTypes.string.isRequired,\n hasPermission: PropTypes.func.isRequired,\n};\n\nwindow.addEventListener('load', () => {\n ReactDOM.render(\n ,\n document.getElementById('lorisworkspace')\n );\n});\n","/**\n * This file contains React component for Panel\n *\n * @author Alex I.\n * @version 1.0.0\n *\n */\n\nimport React, {Component} from 'react';\nimport PropTypes from 'prop-types';\n\n/**\n * Panel component\n * Wraps children in a collapsible bootstrap panel\n */\nclass Panel extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n collapsed: this.props.initCollapsed,\n };\n\n // Initialize panel class based on collapsed status\n this.panelClass = (\n this.props.initCollapsed ?\n 'panel-collapse collapse' :\n 'panel-collapse collapse in'\n );\n\n this.toggleCollapsed = this.toggleCollapsed.bind(this);\n }\n\n toggleCollapsed() {\n this.setState({collapsed: !this.state.collapsed});\n }\n\n render() {\n // Change arrow direction based on collapse status\n let glyphClass = (\n this.state.collapsed ?\n 'glyphicon pull-right glyphicon-chevron-down' :\n 'glyphicon pull-right glyphicon-chevron-up'\n );\n\n // Add panel header, if title is set\n const panelHeading = this.props.title ? (\n \n {this.props.title}\n \n \n ) : '';\n\n return (\n
    \n {panelHeading}\n \n
    \n {this.props.children}\n
    \n
    \n \n );\n }\n}\n\nPanel.propTypes = {\n initCollapsed: PropTypes.bool,\n id: PropTypes.string,\n height: PropTypes.string,\n title: PropTypes.string,\n};\nPanel.defaultProps = {\n initCollapsed: false,\n id: 'default-panel',\n height: '100%',\n title: '',\n};\n\nexport default Panel;\n","/* exported RPaginationLinks */\n\nimport React, {Component} from 'react';\nimport PropTypes from 'prop-types';\n\nclass PaginationLinks extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n\n };\n this.changePage = this.changePage.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.Total < prevProps.Total) {\n this.props.onChangePage(1);\n }\n }\n\n changePage(i) {\n return function(evt) {\n // Don't jump to the top of the page\n evt.preventDefault();\n\n if (this.props.onChangePage) {\n this.props.onChangePage(i);\n }\n }.bind(this);\n }\n\n render() {\n let rowsPerPage = this.props.RowsPerPage;\n let pageLinks = [];\n let classList;\n let lastPage = Math.ceil(this.props.Total / rowsPerPage);\n let startPage = Math.max(1, this.props.Active - 3);\n let lastShownPage = Math.min(this.props.Active + 3, lastPage);\n\n if (this.props.Total === 0) {\n return
    ;\n }\n if (this.props.Total < this.props.RowsPerPage) {\n return
    ;\n }\n\n if ((lastShownPage - startPage) <= 7) {\n lastShownPage = startPage + 6;\n if (lastShownPage > lastPage) {\n lastShownPage = lastPage;\n startPage = lastPage - 6;\n }\n }\n\n if (startPage > 1) {\n pageLinks.push(\n
  • «
  • \n );\n }\n if (startPage < 1) {\n startPage = 1;\n }\n if (lastShownPage < 1) {\n lastShownPage = 1;\n }\n\n // If there is only 1 page, don't display pagination links\n if (startPage === lastShownPage) {\n return
    ;\n }\n\n for (let i = startPage; i <= lastShownPage; i += 1) {\n classList = '';\n if (this.props.Active === i) {\n classList = 'active';\n }\n pageLinks.push(\n
  • \n {i}\n
  • \n );\n }\n if (lastShownPage !== lastPage) {\n pageLinks.push(\n
  • \n »\n
  • \n );\n }\n\n return (\n
      \n {pageLinks}\n
    \n );\n }\n}\nPaginationLinks.propTypes = {\n onChangePage: PropTypes.func,\n Total: PropTypes.number.isRequired,\n};\nPaginationLinks.defaultProps = {\n RowsPerPage: 10,\n Active: 1,\n};\n\nlet RPaginationLinks = React.createFactory(PaginationLinks);\n\nwindow.PaginationLinks = PaginationLinks;\nwindow.RPaginationLinks = RPaginationLinks;\n\nexport default PaginationLinks;\n","import React, {Component} from 'react';\nimport PropTypes from 'prop-types';\nimport PaginationLinks from 'jsx/PaginationLinks';\n\n/**\n * Data Table component\n * Displays a set of data that is receives via props.\n */\nclass DataTable extends Component {\n constructor(props) {\n super(props);\n this.state = {\n page: {\n number: 1,\n rows: 20,\n },\n sort: {\n column: -1,\n ascending: true,\n },\n };\n\n this.changePage = this.changePage.bind(this);\n this.setSortColumn = this.setSortColumn.bind(this);\n this.updateSortColumn = this.updateSortColumn.bind(this);\n this.toggleSortOrder = this.toggleSortOrder.bind(this);\n this.updatePageNumber = this.updatePageNumber.bind(this);\n this.updatePageRows = this.updatePageRows.bind(this);\n this.downloadCSV = this.downloadCSV.bind(this);\n this.getFilteredRowIndexes = this.getFilteredRowIndexes.bind(this);\n this.sortRows = this.sortRows.bind(this);\n this.hasFilterKeyword = this.hasFilterKeyword.bind(this);\n this.renderActions = this.renderActions.bind(this);\n }\n\n changePage(i) {\n const page = this.state.page;\n page.number = i;\n this.setState({page});\n }\n\n setSortColumn(column) {\n if (this.state.sort.column === column) {\n this.toggleSortOrder();\n } else {\n this.updateSortColumn(column);\n }\n }\n\n updateSortColumn(column) {\n const sort = this.state.sort;\n sort.column = column;\n this.setState({sort});\n }\n\n toggleSortOrder() {\n const sort = this.state.sort;\n sort.ascending = !sort.ascending;\n this.setState({sort});\n }\n\n /**\n * Updates page state\n *\n * @param {int} number of page\n */\n updatePageNumber(number) {\n const page = this.sate.page;\n page.number = number;\n this.setState({page});\n }\n\n /**\n * Update number of rows per page\n *\n * @param {object} e event from which to abstract value\n */\n updatePageRows(e) {\n const page = Object.assign({}, this.state.page);\n page.rows = e.target.value;\n page.number = 1;\n this.setState({page});\n }\n\n downloadCSV(filteredRowIndexes) {\n let csvData = filteredRowIndexes.map((id) => this.props.data[id]);\n // Map cell data to proper values if applicable.\n if (this.props.getMappedCell) {\n csvData = csvData\n .map((row, i) => this.props.fields\n .map((field, j) => this.props.getMappedCell(field.label, row[j]))\n );\n }\n\n let csvworker = new Worker(loris.BaseURL + '/js/workers/savecsv.js');\n\n csvworker.addEventListener('message', function(e) {\n let dataURL;\n let dataDate;\n let link;\n if (e.data.cmd === 'SaveCSV') {\n dataDate = new Date().toISOString();\n dataURL = window.URL.createObjectURL(e.data.message);\n link = document.createElement('a');\n link.download = 'data-' + dataDate + '.csv';\n link.type = 'text/csv';\n link.href = dataURL;\n document.body.appendChild(link);\n $(link)[0].click();\n document.body.removeChild(link);\n }\n });\n const headerList = this.props.fields.map((field) => field.label);\n csvworker.postMessage({\n cmd: 'SaveFile',\n data: csvData,\n headers: headerList,\n identifiers: this.props.RowNameMap,\n });\n }\n\n getFilteredRowIndexes() {\n let useKeyword = false;\n let filterValuesCount = Object.keys(this.props.filter).length;\n let tableData = this.props.data;\n let fieldData = this.props.fields;\n\n let filteredIndexes = [];\n\n // If there are no filters set, use all the data.\n let hasFilters = (filterValuesCount !== 0);\n if (hasFilters === false) {\n for (let i = 0; i < tableData.length; i++) {\n filteredIndexes.push(i);\n }\n return filteredIndexes;\n }\n\n if (this.props.filter.keyword) {\n useKeyword = true;\n }\n\n if (useKeyword) {\n filterValuesCount -= 1;\n }\n\n for (let i = 0; i < tableData.length; i++) {\n let headerCount = 0;\n let keywordMatch = 0;\n for (let j = 0; j < fieldData.length; j++) {\n let data = tableData[i] ? tableData[i][j] : null;\n if (this.hasFilterKeyword((fieldData[j].filter || {}).name, data)) {\n headerCount++;\n }\n if (useKeyword) {\n if (this.hasFilterKeyword('keyword', data)) {\n keywordMatch++;\n }\n }\n }\n\n if (headerCount === filterValuesCount &&\n ((useKeyword === true && keywordMatch > 0) ||\n (useKeyword === false && keywordMatch === 0))) {\n filteredIndexes.push(i);\n }\n }\n\n return filteredIndexes;\n }\n\n sortRows(rowIndexes) {\n const index = [];\n\n for (let i = 0; i < rowIndexes.length; i++) {\n let idx = rowIndexes[i];\n let val = this.props.data[idx][this.state.sort.column] || undefined;\n\n // If sortColumn is equal to default No. column, set value to be\n // index + 1\n if (this.state.sort.column === -1) {\n val = idx + 1;\n }\n\n const isString = (typeof val === 'string' || val instanceof String);\n const isNumber = !isNaN(val) && typeof val !== 'object';\n\n if (val === '.') {\n // hack to handle non-existent items in DQT\n val = null;\n } else if (isNumber) {\n // perform type conversion (from string to int/float)\n val = Number(val);\n } else if (isString) {\n // if string with text convert to lowercase\n val = val.toLowerCase();\n } else {\n val = undefined;\n }\n\n if (this.props.RowNameMap) {\n index.push({RowIdx: idx, Value: val, Content: this.props.RowNameMap[idx]});\n } else {\n index.push({RowIdx: idx, Value: val, Content: idx + 1});\n }\n }\n\n index.sort((a, b) => {\n if (this.state.sort.ascending) {\n if (a.Value === b.Value) {\n // If all values are equal, sort by rownum\n if (a.RowIdx < b.RowIdx) return -1;\n if (a.RowIdx > b.RowIdx) return 1;\n }\n // Check if null values\n if (a.Value === null || typeof a.Value === 'undefined') return -1;\n if (b.Value === null || typeof b.Value === 'undefined') return 1;\n\n // Sort by value\n if (a.Value < b.Value) return -1;\n if (a.Value > b.Value) return 1;\n } else {\n if (a.Value === b.Value) {\n // If all values are equal, sort by rownum\n if (a.RowIdx < b.RowIdx) return 1;\n if (a.RowIdx > b.RowIdx) return -1;\n }\n // Check if null values\n if (a.Value === null || typeof a.Value === 'undefined') return 1;\n if (b.Value === null || typeof b.Value === 'undefined') return -1;\n\n // Sort by value\n if (a.Value < b.Value) return 1;\n if (a.Value > b.Value) return -1;\n }\n // They're equal..\n return 0;\n });\n return index;\n }\n\n /**\n * Searches for the filter keyword in the column cell\n *\n * Note: Search is case-insensitive.\n *\n * @param {string} name field name\n * @param {string} data search string\n * @return {boolean} true, if filter value is found to be a substring\n * of one of the column values, false otherwise.\n */\n hasFilterKeyword(name, data) {\n let filterData = null;\n let exactMatch = false;\n let opposite = false;\n let result = false;\n let searchKey = null;\n let searchString = null;\n\n if (this.props.filter[name]) {\n filterData = this.props.filter[name].value;\n exactMatch = this.props.filter[name].exactMatch;\n opposite = this.props.filter[name].opposite;\n }\n\n // Handle null inputs\n if (filterData === null || data === null) {\n return false;\n }\n\n // Handle numeric inputs\n if (typeof filterData === 'number') {\n let intData = Number.parseInt(data, 10);\n result = (filterData === intData);\n }\n\n // Handle string inputs\n if (typeof filterData === 'string') {\n searchKey = filterData.toLowerCase();\n switch (typeof data) {\n case 'object':\n // Handles the case where the data is an array (typeof 'object')\n // and you want to search through it for\n // the string you are filtering by\n let searchArray = data.map((e) => e.toLowerCase());\n if (exactMatch) {\n result = searchArray.includes(searchKey);\n } else {\n result = (searchArray.find((e) => (e.indexOf(searchKey) > -1))) !== undefined;\n }\n break;\n default:\n searchString = data ? data.toString().toLowerCase() : '';\n if (exactMatch) {\n result = (searchString === searchKey);\n } else if (opposite) {\n result = searchString !== searchKey;\n } else {\n result = (searchString.indexOf(searchKey) > -1);\n }\n break;\n }\n }\n\n // Handle boolean inputs\n if (typeof filterData === 'boolean') {\n result = (filterData === data);\n }\n\n // Handle array inputs for multiselects\n if (typeof filterData === 'object') {\n let match = false;\n for (let i = 0; i < filterData.length; i += 1) {\n searchKey = filterData[i].toLowerCase();\n searchString = data ? data.toString().toLowerCase() : '';\n\n match = (searchString.indexOf(searchKey) > -1);\n if (match) {\n result = true;\n }\n }\n }\n\n return result;\n }\n\n componentDidMount() {\n $('.dynamictable').DynamicTable();\n }\n\n renderActions() {\n if (this.props.actions) {\n return this.props.actions.map((action, key) => {\n if (action.show !== false) {\n return (\n \n );\n }\n });\n }\n }\n\n render() {\n if ((this.props.data === null || this.props.data.length === 0) && !this.props.nullTableShow) {\n return (\n
    \n
    \n
    \n
    \n {this.renderActions()}\n
    \n
    \n
    \n
    \n No result found.\n
    \n
    \n );\n }\n let rowsPerPage = this.state.page.rows;\n let headers = this.props.hide.defaultColumn === true ? [] : [\n {\n this.setSortColumn(-1);\n }}>\n {this.props.rowNumLabel}\n ,\n ];\n\n for (let i = 0; i < this.props.fields.length; i += 1) {\n if (this.props.fields[i].show === true) {\n let colIndex = i + 1;\n if (this.props.fields[i].freezeColumn === true) {\n headers.push(\n {\n this.setSortColumn(i);\n }}>\n {this.props.fields[i].label}\n \n );\n } else {\n headers.push(\n {\n this.setSortColumn(i);\n }}>\n {this.props.fields[i].label}\n \n );\n }\n }\n }\n\n let rows = [];\n let filteredRowIndexes = this.getFilteredRowIndexes();\n let filteredCount = filteredRowIndexes.length;\n let index = this.sortRows(filteredRowIndexes);\n let currentPageRow = (rowsPerPage * (this.state.page.number - 1));\n\n if (this.props.filter.keyword) {\n useKeyword = true;\n }\n\n // Format each cell for the data table.\n for (let i = currentPageRow;\n (i < filteredCount) && (rows.length < rowsPerPage);\n i++\n ) {\n let rowIndex = index[i].RowIdx;\n let rowData = this.props.data[rowIndex];\n let curRow = [];\n // Iterates through headers to populate row columns\n // with corresponding data\n for (let j = 0; j < this.props.fields.length; j += 1) {\n if (this.props.fields[j].show === false) {\n continue;\n }\n\n let celldata = rowData[j];\n let cell = null;\n\n let row = {};\n row[this.props.rowNumLabel] = index[i].Content;\n this.props.fields\n .forEach((field, k) => row[field.label] = rowData[k]);\n\n // Get custom cell formatting if available\n if (this.props.getFormattedCell) {\n cell = this.props.getFormattedCell(\n this.props.fields[j].label,\n celldata,\n row\n );\n }\n if (cell !== null) {\n // Note: Can't currently pass a key, need to update columnFormatter\n // to not return a node.\n // let key = 'td_col_' + j;\n curRow.push(cell);\n }\n }\n\n const rowIndexDisplay = index[i].Content;\n rows.push(\n \n {rowIndexDisplay}\n {curRow}\n \n );\n }\n\n let rowsPerPageDropdown = (\n \n \n \n \n \n \n \n \n );\n\n let header = this.props.hide.rowsPerPage === true ? '' : (\n
    \n
    \n
    \n
    \n {rows.length} rows displayed of {filteredCount}.\n (Maximum rows per page: {rowsPerPageDropdown})\n
    \n
    \n {this.renderActions()}\n \n Download Table as CSV\n \n \n
    \n
    \n
    \n
    \n );\n\n let footer = this.props.hide.downloadCSV === true ? '' : (\n
    \n
    \n
    \n
    \n {rows.length} rows displayed of {filteredCount}.\n (Maximum rows per page: {rowsPerPageDropdown})\n
    \n
    \n \n
    \n
    \n
    \n
    \n );\n\n return (\n
    \n {header}\n \n \n {headers}\n \n {this.props.folder}\n \n {rows}\n \n
    \n {footer}\n
    \n );\n }\n}\nDataTable.propTypes = {\n data: PropTypes.array.isRequired,\n fields: PropTypes.array,\n rowNumLabel: PropTypes.string,\n filter: PropTypes.obj,\n // Function of which returns a JSX element for a table cell, takes\n // parameters of the form: func(ColumnName, CellData, EntireRowData)\n getFormattedCell: PropTypes.func,\n onSort: PropTypes.func,\n actions: PropTypes.array,\n hide: PropTypes.object,\n nullTableShow: PropTypes.bool,\n};\nDataTable.defaultProps = {\n data: [],\n fields: [],\n rowNumLabel: 'No.',\n filter: {},\n hide: {\n rowsPerPage: false,\n downloadCSV: false,\n defaultColumn: false,\n },\n nullTableShow: false,\n};\n\nexport default DataTable;\n","import React, {PureComponent} from 'react';\nimport PropTypes from 'prop-types';\n\nimport Panel from 'jsx/Panel';\nimport {Tabs, TabPane} from 'jsx/Tabs';\nimport DataTable from 'jsx/DataTable';\nimport Filter from 'jsx/Filter';\n\n/**\n * FilterableDataTable component.\n * A wrapper for all datatables that handles filtering.\n *\n * Handles the updating and clearing of the filter state based on changes sent\n * from the FitlerForm.\n *\n * Passes the Filter to the Datatable.\n *\n * Deprecates Filter Form.\n */\nclass FilterableDataTable extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n filter: {},\n };\n this.updateFilter = this.updateFilter.bind(this);\n this.clearFilter = this.clearFilter.bind(this);\n }\n\n /**\n * Updates filter state\n *\n * @param {object} filter passed from FilterForm\n */\n updateFilter(filter) {\n this.setState({filter});\n }\n\n /**\n * Sets Filter to empty object\n */\n clearFilter() {\n this.updateFilter({});\n history.replaceState({}, '', '?');\n }\n\n render() {\n const filter = (\n \n );\n\n const dataTable = (\n \n );\n\n const filterPresets = () => {\n if (this.props.filterPresets) {\n const tabPanes = this.props.filterPresets.map((preset) => {\n return ;\n });\n const tabs = this.props.filterPresets.map((preset) => {\n return {id: preset.label, label: preset.label};\n });\n\n return (\n {\n const active = this.props.filterPresets.find((preset) => {\n return preset.label === tabId;\n });\n this.updateFilter(active.filter);\n }}>\n {tabPanes}\n \n );\n };\n };\n\n return (\n \n {filter}\n {this.props.children}\n {filterPresets()}\n {dataTable}\n \n );\n }\n}\n\nFilterableDataTable.defaultProps = {\n columns: 3,\n};\n\nFilterableDataTable.propTypes = {\n name: PropTypes.string.isRequired,\n title: PropTypes.string,\n data: PropTypes.object.isRequired,\n fields: PropTypes.object.isRequired,\n columns: PropTypes.number,\n getFormattedCell: PropTypes.func,\n actions: PropTypes.object,\n};\n\nexport default FilterableDataTable;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/modules/candidate_list/js/candidate_list_helper.js b/modules/candidate_list/js/candidate_list_helper.js new file mode 100644 index 00000000000..177b32cfe45 --- /dev/null +++ b/modules/candidate_list/js/candidate_list_helper.js @@ -0,0 +1,38 @@ +/*global document: false, $: false, window: false, unescape: false, Option: false,isElementsSet, alert*/ +function hideFilter(obj) { + 'use strict'; + + var heading = $(obj); + var arrow = $(obj).children('.arrow'); + if (heading.hasClass('panel-collapsed')) { + // expand the panel + heading.parents('.panel').find('.panel-body').slideDown(); + heading.removeClass('panel-collapsed'); + arrow.removeClass('glyphicon-chevron-down').addClass('glyphicon-chevron-up'); + } else { + // collapse the panel + heading.parents('.panel').find('.panel-body').slideUp(); + heading.addClass('panel-collapsed'); + arrow.removeClass('glyphicon-chevron-up').addClass('glyphicon-chevron-down'); + } +} +function toggleMe() { + "use strict"; + $("#advanced-label").toggle(); + $(".advancedOptions").toggle(); + $(".advanced-buttons").toggle(); +} + + +$(function(){ + $('input[name=dob]').datepicker({ + dateFormat: 'yy-mm-dd', + changeMonth: true, + changeYear: true + }); + $('input[name=edc]').datepicker({ + dateFormat: 'yy-mm-dd', + changeMonth: true, + changeYear: true + }); +}); diff --git a/modules/candidate_list/js/onLoad.js.map b/modules/candidate_list/js/onLoad.js.map new file mode 100644 index 00000000000..1ce68420d4e --- /dev/null +++ b/modules/candidate_list/js/onLoad.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./modules/candidate_list/jsx/onLoad.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","getDefault","getModuleExports","object","property","prototype","hasOwnProperty","p","s","$","ReactDOM","React","createElement","DynamicDataTable","DataURL","loris","BaseURL","getFormattedCell","formatColumn","freezeColumn","document"],"mappings":"mBACA,IAAAA,oBAGA,SAAAC,oBAAAC,UAGA,GAAAF,iBAAAE,UAAA,CACA,OAAAF,iBAAAE,UAAAC,QAGA,IAAAC,OAAAJ,iBAAAE,WACAG,EAAAH,SACAI,EAAA,MACAH,YAIAI,QAAAL,UAAAM,KAAAJ,OAAAD,QAAAC,cAAAD,QAAAF,qBAGAG,OAAAE,EAAA,KAGA,OAAAF,OAAAD,QAKAF,oBAAAQ,EAAAF,QAGAN,oBAAAS,EAAAV,iBAGAC,oBAAAU,EAAA,SAAAR,QAAAS,KAAAC,QACA,IAAAZ,oBAAAa,EAAAX,QAAAS,MAAA,CACAG,OAAAC,eAAAb,QAAAS,MAA0CK,WAAA,KAAAC,IAAAL,WAK1CZ,oBAAAkB,EAAA,SAAAhB,SACA,UAAAiB,SAAA,aAAAA,OAAAC,YAAA,CACAN,OAAAC,eAAAb,QAAAiB,OAAAC,aAAwDC,MAAA,WAExDP,OAAAC,eAAAb,QAAA,cAAiDmB,MAAA,QAQjDrB,oBAAAsB,EAAA,SAAAD,MAAAE,MACA,GAAAA,KAAA,EAAAF,MAAArB,oBAAAqB,OACA,GAAAE,KAAA,SAAAF,MACA,GAAAE,KAAA,UAAAF,QAAA,UAAAA,aAAAG,WAAA,OAAAH,MACA,IAAAI,GAAAX,OAAAY,OAAA,MACA1B,oBAAAkB,EAAAO,IACAX,OAAAC,eAAAU,GAAA,WAAyCT,WAAA,KAAAK,QACzC,GAAAE,KAAA,UAAAF,OAAA,iBAAAM,OAAAN,MAAArB,oBAAAU,EAAAe,GAAAE,IAAA,SAAAA,KAAgH,OAAAN,MAAAM,MAAqBC,KAAA,KAAAD,MACrI,OAAAF,IAIAzB,oBAAA6B,EAAA,SAAA1B,QACA,IAAAS,OAAAT,eAAAqB,WACA,SAAAM,aAA2B,OAAA3B,OAAA,YAC3B,SAAA4B,mBAAiC,OAAA5B,QACjCH,oBAAAU,EAAAE,OAAA,IAAAA,QACA,OAAAA,QAIAZ,oBAAAa,EAAA,SAAAmB,OAAAC,UAAsD,OAAAnB,OAAAoB,UAAAC,eAAA5B,KAAAyB,OAAAC,WAGtDjC,oBAAAoC,EAAA,GAIA,OAAApC,wCAAAqC,EAAA,oEChFAC,EAAE,WACAC,gBAAgBC,MAAAC,cAAAC,kBACdC,QAAYC,MAAZC,QADc,+BAEdC,iBAFcC,aAGdC,aAAa,UAEbC,wBALFV","file":"./modules/candidate_list/js/onLoad.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 57);\n","/* global formatColumn */\n\n$(function() {\n ReactDOM.render(,\n document.getElementById('datatable')\n );\n});\n"],"sourceRoot":""} \ No newline at end of file diff --git a/modules/candidate_list/js/openProfileForm.js.map b/modules/candidate_list/js/openProfileForm.js.map new file mode 100644 index 00000000000..9a03549e1ca --- /dev/null +++ b/modules/candidate_list/js/openProfileForm.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external \"React\"","webpack:///./modules/candidate_list/jsx/openProfileForm.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","getDefault","getModuleExports","object","property","prototype","hasOwnProperty","p","s","React","_react","OpenProfileForm","props","_classCallCheck","this","_this","_possibleConstructorReturn","__proto__","getPrototypeOf","state","error","message","className","PSCID","CandID","updateFormElement","validateAndSubmit","formElement","setState","$","loris","data","window","warning","_react2","default","createElement","FormElement","onSubmit","TextboxElement","label","onUserInput","ButtonElement","Component"],"mappings":"mBACA,IAAAA,oBAGA,SAAAC,oBAAAC,UAGA,GAAAF,iBAAAE,UAAA,CACA,OAAAF,iBAAAE,UAAAC,QAGA,IAAAC,OAAAJ,iBAAAE,WACAG,EAAAH,SACAI,EAAA,MACAH,YAIAI,QAAAL,UAAAM,KAAAJ,OAAAD,QAAAC,cAAAD,QAAAF,qBAGAG,OAAAE,EAAA,KAGA,OAAAF,OAAAD,QAKAF,oBAAAQ,EAAAF,QAGAN,oBAAAS,EAAAV,iBAGAC,oBAAAU,EAAA,SAAAR,QAAAS,KAAAC,QACA,IAAAZ,oBAAAa,EAAAX,QAAAS,MAAA,CACAG,OAAAC,eAAAb,QAAAS,MAA0CK,WAAA,KAAAC,IAAAL,WAK1CZ,oBAAAkB,EAAA,SAAAhB,SACA,UAAAiB,SAAA,aAAAA,OAAAC,YAAA,CACAN,OAAAC,eAAAb,QAAAiB,OAAAC,aAAwDC,MAAA,WAExDP,OAAAC,eAAAb,QAAA,cAAiDmB,MAAA,QAQjDrB,oBAAAsB,EAAA,SAAAD,MAAAE,MACA,GAAAA,KAAA,EAAAF,MAAArB,oBAAAqB,OACA,GAAAE,KAAA,SAAAF,MACA,GAAAE,KAAA,UAAAF,QAAA,UAAAA,aAAAG,WAAA,OAAAH,MACA,IAAAI,GAAAX,OAAAY,OAAA,MACA1B,oBAAAkB,EAAAO,IACAX,OAAAC,eAAAU,GAAA,WAAyCT,WAAA,KAAAK,QACzC,GAAAE,KAAA,UAAAF,OAAA,iBAAAM,OAAAN,MAAArB,oBAAAU,EAAAe,GAAAE,IAAA,SAAAA,KAAgH,OAAAN,MAAAM,MAAqBC,KAAA,KAAAD,MACrI,OAAAF,IAIAzB,oBAAA6B,EAAA,SAAA1B,QACA,IAAAS,OAAAT,eAAAqB,WACA,SAAAM,aAA2B,OAAA3B,OAAA,YAC3B,SAAA4B,mBAAiC,OAAA5B,QACjCH,oBAAAU,EAAAE,OAAA,IAAAA,QACA,OAAAA,QAIAZ,oBAAAa,EAAA,SAAAmB,OAAAC,UAAsD,OAAAnB,OAAAoB,UAAAC,eAAA5B,KAAAyB,OAAAC,WAGtDjC,oBAAAoC,EAAA,GAIA,OAAApC,wCAAAqC,EAAA,kCClFAlC,OAAAD,QAAAoC,+1BCAA,IAAAC,OAAAvC,oBAAA,ugCAQMwC,2EACJ,SAAAA,gBAAAC,OAAmBC,gBAAAC,KAAAH,iBAAA,IAAAI,MAAAC,2BAAAF,MAAAH,gBAAAM,WAAAhC,OAAAiC,eAAAP,kBAAAjC,KAAAoC,KAAAF,QAGjBG,MAAAI,OACEC,OACEC,QADK,GAELC,UAAW,kCAEbC,MALW,GAMXC,OAAQ,IAGVT,MAAAU,kBAAyBV,MAAAU,kBAAA1B,KAAzBgB,OACAA,MAAAW,kBAAyBX,MAAAW,kBAAA3B,KAAzBgB,OAbiB,OAAAA,8FAgBDY,YAAanC,OAC7B,IAAI2B,MAAQL,KAAZK,MACAA,yBACAL,KAAAc,SAAAT,qEAIA,IAAIA,MAAQL,KAAZK,MACA,GAAIL,KAAAK,MAAAK,SAAJ,GAA8B,CAC5BL,aACEE,QADY,0BAEZC,UAAW,kCAEbR,KAAAc,SAAAT,OACA,OAGF,GAAIL,KAAAK,MAAAI,QAAJ,GAA6B,CAC3BJ,aACEE,QADY,0BAEZC,UAAW,kCAEbR,KAAAc,SAAAT,OACA,OAKFA,aACEE,QADY,gBAEZC,UAAW,gCAEbR,KAAAc,SAAAT,OAEAU,MAAMC,cAAND,+BAEIL,OAAQL,MADVK,OAEED,MAAOJ,MAAMI,OAEb,SAAAQ,MAEE,GAAIA,OAAJ,IAAkB,CAChBZ,aACEE,QADY,qBAEZC,UAAW,gCAEbU,qBAAuBF,kBAAsBX,MAA7Ca,WACK,CAELb,aACEE,QADY,8BAEZC,UAAW,kCAGfR,KAAAc,SAAAT,QAfFpB,KALJ8B,+CAyBA,IAAII,aAAJ,EAEA,GAAInB,KAAAK,MAAAC,MAAAC,UAAJ,GAAqC,CACnCY,QACQC,QAAAC,QAAAC,cAAA,OAAKd,UAAWR,KAAAK,MAAAC,MAAhBE,WACGR,KAAAK,MAAAC,MAAiBC,SAI9B,OACEa,QAAAC,QAAAC,cAAAC,aACEvD,KADF,cAEEwD,SAAUxB,KAFZY,mBAGEQ,QAAAC,QAAAC,cAAAG,gBACEzD,KADF,SAEE0D,MAFF,QAGEhD,MAAOsB,KAAAK,MAHTK,OAIEiB,YAAa3B,KAAKW,oBAEpBS,QAAAC,QAAAC,cAAAG,gBACEzD,KADF,QAEE0D,MAFF,QAGEhD,MAAOsB,KAAAK,MAHTI,MAIEkB,YAAa3B,KAAKW,oBAbtBQ,QAgBEC,QAAAC,QAAAC,cAAAM,eACE5D,KADF,eAEE0D,MAFF,eAGEC,YAAa3B,KAAKY,iDAzGEiB,kCAgHfhC","file":"./modules/candidate_list/js/openProfileForm.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 25);\n","module.exports = React;","import React, {Component} from 'react';\n\n/**\n * Open Profile Form\n *\n * Module component rendering the Open Profile Form\n *\n */\nclass OpenProfileForm extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n error: {\n message: '',\n className: 'alert alert-danger text-center',\n },\n PSCID: '',\n CandID: '',\n };\n\n this.updateFormElement = this.updateFormElement.bind(this);\n this.validateAndSubmit = this.validateAndSubmit.bind(this);\n }\n\n updateFormElement(formElement, value) {\n let state = this.state;\n state[formElement] = value;\n this.setState(state);\n }\n\n validateAndSubmit() {\n let state = this.state;\n if (this.state.CandID === '') {\n state.error = {\n message: 'You must enter a DCCID!',\n className: 'alert alert-danger text-center',\n };\n this.setState(state);\n return;\n }\n\n if (this.state.PSCID === '') {\n state.error = {\n message: 'You must enter a PSCID!',\n className: 'alert alert-danger text-center',\n };\n this.setState(state);\n return;\n }\n\n // Always include a validating message.. the callback for the ajax request will\n // update it after the ajax call returns.\n state.error = {\n message: 'Validating...',\n className: 'alert alert-info text-center',\n };\n this.setState(state);\n\n $.get(loris.BaseURL + '/candidate_list/validateIDs',\n {\n CandID: state.CandID,\n PSCID: state.PSCID,\n },\n function(data) {\n // ids are valid, submit accessProfileForm form\n if (data === '1') {\n state.error = {\n message: 'Opening profile...',\n className: 'alert alert-info text-center',\n };\n window.location.href = loris.BaseURL + '/' + state.CandID;\n } else {\n // display error message\n state.error = {\n message: 'DCCID or PSCID is not valid',\n className: 'alert alert-danger text-center',\n };\n }\n this.setState(state);\n }.bind(this));\n }\n\n render() {\n let warning;\n\n if (this.state.error.message !== '') {\n warning = (\n
    \n {this.state.error.message}\n
    \n );\n }\n return (\n \n \n \n {warning}\n \n \n );\n }\n}\n\nexport default OpenProfileForm;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/modules/candidate_list/jsx/candidateListIndex.js b/modules/candidate_list/jsx/candidateListIndex.js new file mode 100644 index 00000000000..e98b377c574 --- /dev/null +++ b/modules/candidate_list/jsx/candidateListIndex.js @@ -0,0 +1,363 @@ +import React, {Component} from 'react'; +import PropTypes from 'prop-types'; + +import Loader from 'Loader'; +import FilterableDataTable from 'FilterableDataTable'; +import Modal from 'Modal'; + +import OpenProfileForm from './openProfileForm'; + +/** + * Candidate List + * + * Main module component rendering the candidate list and open profile form + * + * @author Dave MacFarlane + * @author Cécile Madjar * + */ +class CandidateListIndex extends Component { + constructor(props) { + super(props); + + this.state = { + data: {}, + error: false, + isLoaded: false, + hideFilter: true, + show: {profileForm: false}, + }; + + this.fetchData = this.fetchData.bind(this); + this.formatColumn = this.formatColumn.bind(this); + this.toggleFilters = this.toggleFilters.bind(this); + } + + show(state) { + let show = this.state.show; + show[state] = true; + this.setState({show}); + } + + hide(state) { + let show = this.state.show; + show[state] = false; + this.setState({show}); + } + + componentDidMount() { + this.fetchData() + .then(() => this.setState({isLoaded: true})); + + const searchParams = new URLSearchParams(location.search); + if (searchParams.has('hide')) { + this.setState({hideFilter: JSON.parse(searchParams.get('hide'))}); + } + } + + /** + * Retrieve data from the provided URL and save it in state + * Additionally add hiddenHeaders to global loris variable + * for easy access by columnFormatter. + * + * @return {object} + */ + fetchData() { + return fetch(this.props.dataURL, {credentials: 'same-origin'}) + .then((resp) => resp.json()) + .then((data) => this.setState({data})) + .catch((error) => { + this.setState({error: true}); + console.error(error); + }); + } + + // Basic/Advanced toggle + toggleFilters() { + const hideFilter = !this.state.hideFilter; + this.setState({hideFilter}); + + // Updates query params to reflect advance filter toggle. + const searchParams = new URLSearchParams(location.search); + searchParams.set('hide', hideFilter); + history.replaceState(history.state, '', `?${searchParams.toString()}`); + }; + + /** + * Modify behaviour of specified column cells in the Data Table component + * + * @param {string} column - column name + * @param {string} cell - cell content + * @param {object} row - row content indexed by column + * + * @return {*} a formated table cell for a given column + */ + formatColumn(column, cell, row) { + if (column === 'PSCID' && this.props.hasPermission('access_all_profiles')) { + let url = this.props.baseURL + '/' + row['DCCID'] + '/'; + return {cell}; + } + if (column === 'Feedback') { + switch (cell) { + case '1': return opened; + case '2': return answered; + case '3': return closed; + case '4': return comment; + default: return None; + } + } + if (column === 'Scan Done' && cell === 'Y') { + let url = this.props.baseURL + '/imaging_browser/?PSCID=' + row['PSCID']; + return ( + + {cell} + ); + } + return {cell}; + } + + render() { + // If error occurs, return a message. + // XXX: Replace this with a UI component for 500 errors. + if (this.state.error) { + return

    An error occured while loading the page.

    ; + } + + // Waiting for async data to load + if (!this.state.isLoaded) { + return ; + } + + /** + * XXX: Currently, the order of these fields MUST match the order of the + * queried columns in _setupVariables() in candidate_list.class.inc + */ + // FIXME: if candidate in more than one subproject, filter does not work + const options = this.state.data.fieldOptions; + const fields = [ + { + label: 'PSCID', + show: true, + filter: { + name: 'pscid', + type: 'text', + }, + }, + { + label: 'DCCID', + show: true, + filter: { + name: 'dccid', + type: 'text', + }, + }, + { + label: 'Visit Label', + show: false, + filter: { + name: 'visitLabel', + type: 'text', + }, + }, + { + label: 'Site', + show: true, + filter: { + name: 'site', + type: 'select', + options: options.site, + }, + }, + { + 'label': 'Subproject', + 'show': true, + 'filter': { + name: 'subproject', + type: 'select', + options: options.subproject, + }, + }, + { + label: 'Entity Type', + show: true, + filter: { + name: 'entityType', + type: 'select', + options: { + 'Human': 'Human', + 'Scanner': 'Scanner', + }, + }, + }, + { + 'label': 'Scan Done', + 'show': true, + 'filter': { + name: 'scanDone', + type: 'select', + hide: this.state.hideFilter, + options: { + 'Y': 'Yes', + 'N': 'No', + }, + }, + }, + { + 'label': 'Participant Status', + 'show': true, + 'filter': { + name: 'participantStatus', + type: 'select', + hide: this.state.hideFilter, + options: options.participantstatus, + }, + }, + { + 'label': 'DoB', + 'show': true, + 'filter': { + name: 'DoB', + type: 'date', + hide: this.state.hideFilter, + }, + }, + { + label: 'Sex', + show: true, + filter: { + name: 'sex', + type: 'select', + hide: this.state.hideFilter, + options: { + 'Male': 'Male', + 'Female': 'Female', + }, + }, + }, + { + 'label': 'VisitCount', + 'show': true, + 'filter': { + name: 'visitCount', + type: 'text', + hide: this.state.hideFilter, + }, + }, + { + 'label': 'Feedback', + 'show': true, + 'filter': { + name: 'feedback', + type: 'select', + hide: this.state.hideFilter, + options: { + '0': 'None', + '1': 'opened', + '2': 'answered', + '3': 'closed', + '4': 'comment', + }, + }, + }, + { + 'label': 'Latest Visit Status', + 'show': true, + 'filter': { + name: 'latestVisitStatus', + type: 'select', + hide: this.state.hideFilter, + options: { + 'Not Started': 'Not Started', + 'Screening': 'Screening', + 'Visit': 'Visit', + 'Approval': 'Approval', + 'Recycling Bin': 'Recycling Bin', + }, + }, + }, + + ]; + fields.push( + { + 'label': 'Project', + 'show': true, + 'filter': { + name: 'project', + type: 'select', + options: options.project, + }, + }, + ); + + if (options.useedc === 'true') { + fields.push( + { + 'label': 'EDC', + 'show': true, + 'filter': { + name: 'edc', + type: 'date', + hide: this.state.hideFilter, + }, + } + ); + } + + // Open profile modal window + const profileForm = ( + { + this.hide('profileForm'); + }} + onClick={this.openProfile} + > + + + ); + + // Add action buttons for toggle and open profile + // FIXME: move toggle button in the filter component next to the clear button + const actions = [ + { + label: this.state.hideFilter ? 'Show Advanced Filters' : 'Hide Advanced Filters', + action: this.toggleFilters, + name: 'advanced', + }, + { + label: 'Open Profile', + action: () => this.show('profileForm'), + show: !this.props.hasPermission('access_all_profiles'), + }, + ]; + + return ( +
    + {profileForm} + +
    + ); + } +} + +CandidateListIndex.propTypes = { + dataURL: PropTypes.string.isRequired, + hasPermission: PropTypes.func.isRequired, +}; + +window.addEventListener('load', () => { + ReactDOM.render( + , + document.getElementById('lorisworkspace') + ); +}); diff --git a/modules/candidate_list/jsx/onLoad.js b/modules/candidate_list/jsx/onLoad.js new file mode 100644 index 00000000000..16d21da6b74 --- /dev/null +++ b/modules/candidate_list/jsx/onLoad.js @@ -0,0 +1,11 @@ +/* global formatColumn */ + +$(function() { + ReactDOM.render(, + document.getElementById('datatable') + ); +}); diff --git a/modules/candidate_list/jsx/openProfileForm.js b/modules/candidate_list/jsx/openProfileForm.js new file mode 100644 index 00000000000..58ae02851a0 --- /dev/null +++ b/modules/candidate_list/jsx/openProfileForm.js @@ -0,0 +1,121 @@ +import React, {Component} from 'react'; + +/** + * Open Profile Form + * + * Module component rendering the Open Profile Form + * + */ +class OpenProfileForm extends Component { + constructor(props) { + super(props); + + this.state = { + error: { + message: '', + className: 'alert alert-danger text-center', + }, + PSCID: '', + CandID: '', + }; + + this.updateFormElement = this.updateFormElement.bind(this); + this.validateAndSubmit = this.validateAndSubmit.bind(this); + } + + updateFormElement(formElement, value) { + let state = this.state; + state[formElement] = value; + this.setState(state); + } + + validateAndSubmit() { + let state = this.state; + if (this.state.CandID === '') { + state.error = { + message: 'You must enter a DCCID!', + className: 'alert alert-danger text-center', + }; + this.setState(state); + return; + } + + if (this.state.PSCID === '') { + state.error = { + message: 'You must enter a PSCID!', + className: 'alert alert-danger text-center', + }; + this.setState(state); + return; + } + + // Always include a validating message.. the callback for the ajax request will + // update it after the ajax call returns. + state.error = { + message: 'Validating...', + className: 'alert alert-info text-center', + }; + this.setState(state); + + $.get(loris.BaseURL + '/candidate_list/validateIDs', + { + CandID: state.CandID, + PSCID: state.PSCID, + }, + function(data) { + // ids are valid, submit accessProfileForm form + if (data === '1') { + state.error = { + message: 'Opening profile...', + className: 'alert alert-info text-center', + }; + window.location.href = loris.BaseURL + '/' + state.CandID; + } else { + // display error message + state.error = { + message: 'DCCID or PSCID is not valid', + className: 'alert alert-danger text-center', + }; + } + this.setState(state); + }.bind(this)); + } + + render() { + let warning; + + if (this.state.error.message !== '') { + warning = ( +
    + {this.state.error.message} +
    + ); + } + return ( + + + + {warning} + + + ); + } +} + +export default OpenProfileForm; diff --git a/modules/candidate_list/php/candidate_list.class.inc b/modules/candidate_list/php/candidate_list.class.inc new file mode 100644 index 00000000000..30382fa6c00 --- /dev/null +++ b/modules/candidate_list/php/candidate_list.class.inc @@ -0,0 +1,190 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +namespace LORIS\candidate_list; +/** + * Implements the candidate_list menu + * + * @category Main + * @package Candidate_List + * @author Loris Team + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +class Candidate_List extends \NDB_Menu_Filter +{ + var $AjaxModule = true; + + /** + * Overloading this method to allow access to site users (their own site only) + * and users w/ multisite privs + * + * @param \User $user The user whose access is being checked + * + * @return bool true if user has access, false otherwise + */ + function _hasAccess(\User $user) : bool + { + return ( + $user->hasPermission('access_all_profiles') + || ($user->hasStudySite() && $user->hasPermission('data_entry')) + + ); + } + + /** + * Sets up all the class variables needed for the candidate_list menu + * filter + * + * @return void + */ + function _setupVariables() + { + $user = \User::singleton(); + $config = \NDB_Config::singleton(); + + $this->skipTemplate = true; + + // set the class variables + $this->columns = array( + 'c.PSCID', + 'c.CandID AS DCCID', + 'GROUP_CONCAT(DISTINCT s.Visit_label) AS VisitLabel', + 'psc.Name AS RegistrationSite', + 'GROUP_CONCAT(DISTINCT sp.title) as Subproject', + 'c.Entity_type AS EntityType', + 'MAX(s.Scan_done) as scanDone', + 'COALESCE(pso.Description,"Active") AS ParticipantStatus', + 'DATE_FORMAT(c.DoB,\'%Y-%m-%d\') AS DoB', + 'c.Sex', + 'COUNT(DISTINCT s.Visit_label) AS VisitCount', + "IFNULL(MIN(feedback_bvl_thread.Status+0),0) AS Feedback", + 'max(s.Current_stage) AS LatestVisitStatus', + 'p.Name as Project', + ); + + if ($config->getSetting("useEDC") === "true") { + $this->columns[] = 'DATE_FORMAT((c.EDC),\'%Y-%m-%d\') AS EDC'; + } + + $this->query = " FROM candidate c + LEFT JOIN psc ON (c.RegistrationCenterID=psc.CenterID) + LEFT JOIN session s ON (c.CandID = s.CandID AND s.Active = 'Y') + LEFT JOIN feedback_bvl_thread + ON (c.CandID=feedback_bvl_thread.CandID) + LEFT JOIN participant_status ps ON (ps.CandID=c.CandID) + LEFT JOIN participant_status_options pso + ON (ps.participant_status=pso.ID) + LEFT JOIN Project p ON (c.ProjectID=p.ProjectID) + LEFT JOIN subproject sp ON (s.SubprojectID=sp.SubprojectID) + WHERE c.Active = 'Y'"; + + if (!$user->hasPermission('access_all_profiles')) { + $site_arr = implode(",", $user->getCenterIDs()); + $this->query .= " AND c.RegistrationCenterID IN (" . $site_arr . ")"; + } + + //'COALESCE(pso.ID,1) AS Participant_Status', + $this->group_by = 'c.CandID, psc.Name, c.PSCID, c.Sex'; + $this->order_by = 'c.PSCID ASC'; + } + + + /** + * Create the form for the candidate_list menu page + * + * @return void + */ + function setup() + { + parent::setup(); + // Relying on a side-effect of the the server process module to autoload + // its namespace. + \Module::factory('candidate_parameters'); + + // create user object + $user = \User::singleton(); + $config = \NDB_Config::singleton(); + + // get the list of sites available for the user + if ($user->hasPermission('access_all_profiles')) { + $list_of_sites = \Utility::getSiteList(); + } else { + $list_of_sites = $user->getStudySites(); + } + foreach ($list_of_sites as $id => $name) { + $site_options[$name] = $name; + } + + // get the list of projects + $list_of_projects = \Utility::getProjectList(); + $project_options = array(); + foreach ($list_of_projects as $id => $name) { + $project_options[$name] = $name; + } + + // get the list of subprojects + $list_of_subprojects = \Utility::getSubprojectList(); + foreach ($list_of_subprojects as $id => $name) { + $subproject_options[$name] = $name; + } + + // get the list participant status options + $list_of_participant_status + = \Candidate::getParticipantStatusOptions(); + foreach ($list_of_participant_status as $id => $name) { + $participant_status_options[$name] = $name; + } + + $this->fieldOptions = [ + 'site' => $site_options, + 'project' => $project_options, + 'subproject' => $subproject_options, + 'participantstatus' => $participant_status_options, + 'useedc' => $config->getSetting("useEDC"), + ]; + + return true; + } + + /** + * Include the column formatter required to display the feedback link colours + * in the candidate_list menu + * + * @return array of javascript to be inserted + */ + function getJSDependencies() + { + $factory = \NDB_Factory::singleton(); + $baseURL = $factory->settings()->getBaseURL(); + $deps = parent::getJSDependencies(); + return array_merge( + $deps, + array( + $baseURL . "/candidate_list/js/candidateListIndex.js", + ) + ); + } + + /** + * Generate a breadcrumb trail for this page. + * + * @return \LORIS\BreadcrumbTrail + */ + public function getBreadcrumbs(): \LORIS\BreadcrumbTrail + { + return new \LORIS\BreadcrumbTrail( + new \LORIS\Breadcrumb('Access Profile', "/$this->name") + ); + } +} + diff --git a/modules/candidate_list/php/module.class.inc b/modules/candidate_list/php/module.class.inc new file mode 100644 index 00000000000..7ec9ef20379 --- /dev/null +++ b/modules/candidate_list/php/module.class.inc @@ -0,0 +1,29 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris-Trunk/ + */ +namespace LORIS\candidate_list; + +/** + * Class module implements the basic LORIS module functionality + * + * @category Behavioural + * @package Main + * @subpackage Behavioural + * @author Dave MacFarlane + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris-Trunk/ + */ +class Module extends \Module +{ +} diff --git a/modules/candidate_list/php/validateids.class.inc b/modules/candidate_list/php/validateids.class.inc new file mode 100644 index 00000000000..567e11a78c5 --- /dev/null +++ b/modules/candidate_list/php/validateids.class.inc @@ -0,0 +1,115 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +namespace LORIS\candidate_list; +use \Psr\Http\Message\ServerRequestInterface; +use \Psr\Http\Message\ResponseInterface; + +/** + * Implements the ValidateIDs endpoint + * + * @category Main + * @package Candidate_List + * @author Loris Team + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +class ValidateIDs extends \NDB_Page +{ + public $skipTemplate = true; + + /** + * Same as the permissions for the main menu filter page. + * + * @param \User $user The user whose access is being checked + * + * @return bool true iff the user has access to this page. + */ + function _hasAccess(\User $user) : bool + { + return ( + $user->hasPermission('access_all_profiles') + || ($user->hasStudySite() && $user->hasPermission('data_entry')) + + ); + } + + /** + * This acts as an AJAX endpoint that only returns a "0" or "1" depending + * on whether the candidate passed exists. + * + * @param ServerRequestInterface $request The incoming PSR7 request + * + * @return ResponseInterface The outgoing PSR7 response + */ + public function handle(ServerRequestInterface $request) : ResponseInterface + { + // The parent handles things like hasAccess checks. + $resp = parent::handle($request); + switch ($resp->getStatusCode()) { + case 200: + // If it was a 200 code, it just means display was called and + // access validated. We still need to do other validations + // and add the result body. + break; + default: + return $resp; + } + + // Ensure it's a GET request. + if ($request->getMethod() != "GET") { + return (new \LORIS\Http\Response()) + ->withHeader("Content-Type", "text/plain") + ->withStatus(405) + ->withHeader("Allow", "GET") + ->withBody( + new \LORIS\Http\StringStream( + "Only GET requests are allowed" + ) + ); + } + + // Ensure CandID and PSCID are both passed. + $gets = $request->getQueryParams(); + + if (!ctype_digit($gets['CandID'])) { + $exists = "0"; + } else { + if (!isset($gets['CandID']) || !isset($gets['PSCID'])) { + return (new \LORIS\Http\Response()) + ->withHeader("Content-Type", "text/plain") + ->withStatus(400) + ->withBody( + new \LORIS\Http\StringStream( + "Must provide PSCID and CandID to validate" + ) + ); + } + // Return "0" or "1" based on whether it exists or not. + // We always return a 200 error code and not a 404, because + // even if the CandID doesn't exist or match, the validateids + // endpoint still exists and has a valid response. + $exists = \Candidate::candidateExists( + $gets['CandID'], + $gets['PSCID'] + ) ? "1" : "0"; + } + return (new \LORIS\Http\Response()) + ->withHeader("Content-Type", "text/plain") + ->withStatus(200) + ->withBody(new \LORIS\Http\StringStream($exists)); + } +} \ No newline at end of file diff --git a/modules/candidate_list/test/Feedback_BVL_Test_Plan.md b/modules/candidate_list/test/Feedback_BVL_Test_Plan.md new file mode 100644 index 00000000000..b70aaf0a8b4 --- /dev/null +++ b/modules/candidate_list/test/Feedback_BVL_Test_Plan.md @@ -0,0 +1,36 @@ +#Test Plan: Behavioural (BVL) Feedback module (pop-up) +*Note: this file is stored in modules/candidate_list/test/ for now.* + +## Module mechanics: +1. Verify that clicking pencil icon in top menu bar will pop up BVL Feedback window and display appropriate content from and BVL Candidate/Timepoint/Instrument/Subtest page +2. Verify that upon clicking the pencil icon again, the bvl feedback pop-up re-appears and behaves normally as you navigate through Loris's BVL side (per Synced content section below) + +## Synced content - Pop-up and main window content +3. Verify that upon clicking a link in feedback window (to an instrument, timepoint), main Loris browser window will reload with appropriate page (e.g. aosi form). Verify this works moving through various links/levels e.g. candidate list, timepoint list, instrument list and back again. +4. Verify that when navigating from candidate list to timepoint list to instrument list to instrument forms, and back and forth, in the main Loris browser window - Feedback window should reload to follow with appropriate feedback detail/links at each level. + +## Content display: +5. Verify that all feedback threads/data are accurate at candidate-list, timepoint-list, instrument-list and instrument-form levels, on several candidates. Compare to back-end table contents. +6. Is feedback status accurate in Feedback columns in Candidate List, Timepoint List, and INstrument list pages? Does it change when Feedback status changes? +7. Verify that links work inside Bvl Feedback popup window for/on DCCID, visit label, instrument etc + +## Permissions: +*This section should be revisited when permissions are re-done. Soon.* + +8. Verify that own-site feedback data is Viewable { to everyone - no permission restrictions at present. Try accessing via Stats Bvl/Completion links. These permissions should be fixed.} + +9. Verify that own-site feedback data Editable IFF has permission bvl_feedback + +10. Verify that Other sites feedback data viewable IFF has permission:access_all_profiles + +11. Verify that Other sites feedback data editable IFF has permission:access_all_profiles ** should be changed to superuser + +## Creating/Editing feedback threads: +12. Create new feedback thread. Does it save? Does it display in table at bottom? +13. Verify that adding a new feedback thread will not save if Comment field is blank - should give error message and not save. +14. Change type of feedback in an existing thread - does it save? +15. Verify that adding a new comment to an existing thread does not overwrite old comments. After saving should appear in table below, organized with previous entries for that thread (not just in chronological order as most recent feedback update). +16. Change QC status. Does it save? +17. Change Action Required status. Does it work? +18. Make sure dropdowns are populated with appropriate data e.g. instrument field names. +19. "Close all threads" button (doesn't actually work but not sure this features is desirable anymore - no need to flag for bug fixes for now) diff --git a/modules/candidate_list/test/TestPlan.md b/modules/candidate_list/test/TestPlan.md new file mode 100644 index 00000000000..5afa77b3b0a --- /dev/null +++ b/modules/candidate_list/test/TestPlan.md @@ -0,0 +1,35 @@ +# Access Profile Test Plan + +1. Access access profile page, ensure that it renders.[Automation Testing] +2. Verify that either the permission access_all_profiles or data_entry is required for access the page.[Automation Testing] +3. Verify that if data_entry and not access_all_profiles permissions, can only see subjects from own site.[Automation Testing] +4. Verify that if data_entry and not access_all_profiles permissions, check that initial filter state is Subproject = All.[Automation Testing] +5. Verify advanced/basic filter toggle works.[Automation Testing] +6. Verify advanced filters are expanded on page load when an advanced filter is set, and collapsed otherwise.[Automation Testing] +7. Check that each dropdown has the correct options.[Automation Testing] +8. Test each filter individually + [ ] Site + [ ] DCCID + [ ] PSCID + [ ] Subproject + [ ] Project + [ ] Scan done + [ ] Participant Status + [ ] Biological Sex + [ ] Number of visits + [ ] Date of birth + [ ] Latest Visit Status + [ ] Feedback + [Automation Testing] +9. Click "Clear Form" and ensure filters are reset to same state as #2. +10. Ensure that columns are sortable by clicking on them. +11. Filter for Scan done. Ensure that "Yes" link points to correct scan in imaging browser. +12. Ensure PSCID link points to correct timepoint_list page. +13. Ensure that for candidates with feedback, feedback column is displayed and in the correct colour. +14. Ensure that the Open Profile panel only appears when not access_all_profiles permissions. +15. Enter wrong PSCID/DCCID combination and click Open Profile. Ensure that you get an error. +Incorrect PSCID/DCCID combinations in the filter form should not give such an error. +It should return that no results were found. +16. Enter correct PSCID/DCCID combination and ensure that it loads correct timepoint_list page +17. Remove access_all_profiles permission and ensure that PSCID links are not clickable. +18. Change useEDC config variable to _no_ from the Configuration Module and ensure filters are removed from menu. diff --git a/modules/candidate_list/test/candidate_listTest.php b/modules/candidate_list/test/candidate_listTest.php new file mode 100755 index 00000000000..8373299ee09 --- /dev/null +++ b/modules/candidate_list/test/candidate_listTest.php @@ -0,0 +1,307 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://github.com/aces/Loris + */ +require_once __DIR__ + . "/../../../test/integrationtests/LorisIntegrationTestWithCandidate.class.inc"; +/** + * CandidateListTestIntegrationTest + * + * @category Test + * @package Loris + * @author Nicolas Brossard + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://github.com/aces/Loris + */ +class CandidateListTestIntegrationTest extends LorisIntegrationTestWithCandidate +{ + //filter location + static $PSCID = ".col-xs-12:nth-child(2) > .row .form-control"; + static $DCCID = ".col-xs-12:nth-child(3) > .row .form-control"; + static $visitLabel = ".col-xs-12:nth-child(4) .form-control"; + static $site = ".col-xs-12:nth-child(5) .form-control, select"; + static $entityType = ".col-xs-12:nth-child(7) .form-control, select"; + static $sex = "#candidateList_filter > div > div > fieldset >". + " div:nth-child(11) > div > div > select"; + static $project = ".col-xs-12:nth-child(15) .form-control, select"; + static $advancedFilter = ".table-header > div > div > div:nth-child(2) >". + " button:nth-child(1)"; + static $openProfile = ".table-header > div > div > div:nth-child(2) >". + " button:nth-child(2)"; + static $clearFilter = ".col-sm-9 > .btn"; + static $display = ".table-header > div > div > div:nth-child(1)"; + static $pscidLink = "tr:nth-child(1) a"; + + /** + * Backs up the useEDC config value and sets the value to a known + * value (true) for testing. + * + * @return void + */ + function setUp() + { + parent::setUp(); + $this->setupConfigSetting("useEDC", "true"); + } + + /** + * Restore the values backed up in the setUp function + * + * @return void + */ + function tearDown() + { + parent::tearDown(); + $this->restoreConfigSetting("useEDC"); + } + /** + * Tests that, the homepage should not have "You do not have access + * to this page." on the page with permission. + * + * @return void + */ + function testPageLoadsWithoutPermissionsAccessAllProfiles() + { + $this->setupPermissions(array("access_all_profiles")); + $this->safeGet($this->url . "/candidate_list/"); + $bodyText = $this->webDriver + ->findElement(WebDriverBy::cssSelector("body"))->getText(); + $this->assertNotContains( + "You do not have access to this page.", + $bodyText + ); + $this->resetPermissions(); + } + /** + * Tests that, when loading the candidate_list module, the breadcrumb + * appears and the default filters are set to "Basic" mode. + * + * @return void + */ + function testCandidateListPageLoads() + { + $this->safeGet($this->url . "/candidate_list/"); + $bodyText = $this->webDriver + ->findElement(WebDriverBy::cssSelector("body"))->getText(); + $this->assertContains("Access Profile", $bodyText); + // Ensure that the default is basic mode (which means the button + // says "Advanced") + $btn = self::$advancedFilter; + $buttonText = $this->webDriver->executescript( + "return document.querySelector('$btn').textContent" + ); + $this->assertContains("Advanced", $buttonText); + } + /** + * Tests that, after clicking the "Advanced" button, all of the + * advanced filters appear on the page and are the correct element type. + * + * @return void + */ + function testCandidateListAdvancedOptionsAppear() + { + $this->safeGet($this->url . "/candidate_list/"); + $bodyText = $this->webDriver + ->findElement(WebDriverBy::cssSelector("body"))->getText(); + $this->assertContains("Access Profile", $bodyText); + // Switch to Advanced mode + $btn = self::$advancedFilter; + $this->webDriver->executescript( + "return document.querySelector('$btn').click()" + ); + // Go through each element and ensure it's on the page after clicking + // advanced + $scanDoneOptions = $this->webDriver->findElement( + WebDriverBy::Name("scanDone") + ); + $this->assertEquals("select", $scanDoneOptions->getTagName()); + $participantsStatusOptions = $this->webDriver->findElement( + WebDriverBy::Name("participantStatus") + ); + $this->assertEquals("select", $participantsStatusOptions->getTagName()); + $dobOptions = $this->webDriver->findElement(WebDriverBy::Name("DoB")); + $this->assertEquals("input", $dobOptions->getTagName()); + // Not currently done + //$this->assertEquals("date",$dobOptions->getAttribute("type")); + $sexOptions = $this->webDriver->findElement(WebDriverBy::Name("sex")); + $this->assertEquals("select", $sexOptions->getTagName()); + $numVisits = $this->webDriver->findElement( + WebDriverBy::Name("visitCount") + ); + $this->assertEquals("input", $dobOptions->getTagName()); + // Not currently done in Loris. + //$this->assertEquals("number",$dobOptions->getAttribute("type")); + //$this->assertEquals("0",$dobOptions->getAttribute("min")); + $edcOptions = $this->webDriver->findElement(WebDriverBy::Name("edc")); + $this->assertEquals("input", $edcOptions->getTagName()); + // Not currently done + //$this->assertEquals("date",$edcOptions->getAttribute("type")); + $latestVisitOptions = $this->webDriver->findElement( + WebDriverBy::Name("latestVisitStatus") + ); + $this->assertEquals("select", $latestVisitOptions->getTagName()); + $feedbackOptions = $this->webDriver->findElement( + WebDriverBy::Name("feedback") + ); + $this->assertEquals("select", $feedbackOptions->getTagName()); + } + /** + * Tests clear button in the form + * The form should refreash and the data should be gone. + * + * @return void + */ + function testFilters() + { + $this->safeGet($this->url . "/candidate_list/"); + + //testing data from RBdata.sql + + $this-> _testFilter(self::$PSCID, "0 rows", 'test'); + $this-> _testFilter(self::$PSCID, "1 rows", 'MTL001'); + $this-> _testFilter(self::$DCCID, "1 rows", '300001'); + $this-> _testFilter(self::$DCCID, "0 rows", 'test'); + $this-> _testFilter(self::$visitLabel, "374", 'V1'); + $this-> _testFilter(self::$visitLabel, "261", 'V2'); + $this-> _testFilter(self::$site, "8 rows", '1'); + $this-> _testFilter(self::$site, "168", '2'); + $this-> _testFilter(self::$entityType, "8 rows", '1'); + + // test advanced filter - sex + // Switch to Advanced mode + $btn = self::$advancedFilter; + $this->webDriver->executescript( + "return document.querySelector('$btn').click()" + ); + //female + $this-> _testFilter(self::$sex, "20 rows displayed of 334", '1'); + // male + $this-> _testFilter(self::$sex, "20 rows displayed of 328", '2'); + + } + /** + * Testing filter funtion and clear button + * + * @param string $element The input element loaction + * @param string $records The records number in the table + * @param string $value The test value + * + * @return void + */ + function _testFilter($element,$records,$value) + { + // get element from the page + if (strpos($element, "select") === false) { + $this->webDriver->executescript( + "input = document.querySelector('$element'); + lastValue = input.value; + input.value = '$value'; + event = new Event('input', { bubbles: true }); + input._valueTracker.setValue(lastValue); + input.dispatchEvent(event); + " + ); + } else { + $this->webDriver->executescript( + "input = document.querySelector('$element'); + input.selectedIndex = '$value'; + event = new Event('change', { bubbles: true }); + input.dispatchEvent(event); + " + ); + } + $row = self::$display; + $bodyText = $this->webDriver->executescript( + "return document.querySelector('$row').textContent" + ); + // 4 means there are 4 records under this site. + $this->assertContains($records, $bodyText); + //test clear filter + $btn = self::$clearFilter; + $this->webDriver->executescript( + "document.querySelector('$btn').click();" + ); + $inputText = $this->webDriver->executescript( + "return document.querySelector('$element').value" + ); + $this->assertEquals("", $inputText); + } + /** + * Tests that, when user only has data_entry permisson, user + * can click open profile button to input PSCID and DCCID + * + * @return void + */ + function testDataEntryAndOpenProfile() + { + $this->setupPermissions(array("data_entry")); + $this->safeGet($this->url . "/candidate_list/"); + //click open profile button + $btn = self::$openProfile; + $this->webDriver->executescript( + "document.querySelector('$btn').click();" + ); + // input PSCID and DCCID + $dccid = "#lorisworkspace > div > div:nth-child(1) > div >". + " div:nth-child(2)>form>div>div:nth-child(1)>div>div>input"; + $pscid = "#lorisworkspace > div > div:nth-child(1) > div >". + " div:nth-child(2)>form>div>div:nth-child(2)>div>div>input"; + // to do react input value + $this->webDriver->executescript( + "input = document.querySelector('$dccid'); + lastValue = input.value; + input.value = '300001'; + event = new Event('input', { bubbles: true }); + input._valueTracker.setValue(lastValue); + input.dispatchEvent(event);" + ); + $this->webDriver->executescript( + "input = document.querySelector('$pscid'); + lastValue = input.value; + input.value = 'MTL001'; + event = new Event('input', { bubbles: true }); + input._valueTracker.setValue(lastValue); + input.dispatchEvent(event);" + ); + $btn = ".col-sm-12 > .row .btn"; + //to do check the url + $this->webDriver->executescript( + "document.querySelector('$btn').click();" + );sleep(2); + $URL = $this->webDriver->executescript("return window.location.href;"); + $this->assertContains("300001", $URL); + $this->resetPermissions(); + } + /** + * Tests that, click the pscid link, and it will goto the candidate profile page + * + * @return void + */ + function testPscidLink() + { + $this->markTestSkipped( + 'This test needs work. It is causing failures sometimes for ' + . 'unkown reasons.' + ); + $this->safeGet($this->url . "/candidate_list/"); + $link = self::$pscidLink; + $this->webDriver->executescript( + "document.querySelector('$link').click();" + ); + $bodyText = $this->webDriver + ->findElement(WebDriverBy::cssSelector("body"))->getText(); + $this->assertContains( + "Candidate Profile", + $bodyText + ); + } + +} From 9191e6c63c0b5aeafb3587cd5d68c2dc7e3589d9 Mon Sep 17 00:00:00 2001 From: Zaliqa Rosli Date: Wed, 29 Jan 2020 18:05:55 -0500 Subject: [PATCH 2/5] remove unwanted columns --- modules/candidate_list/.gitignore | 3 +- .../candidate_list/jsx/candidateListIndex.js | 126 +++++++----------- .../php/candidate_list.class.inc | 12 +- 3 files changed, 55 insertions(+), 86 deletions(-) diff --git a/modules/candidate_list/.gitignore b/modules/candidate_list/.gitignore index b904e07bcc6..b73aaf81916 100644 --- a/modules/candidate_list/.gitignore +++ b/modules/candidate_list/.gitignore @@ -1,4 +1,5 @@ js/openProfileForm.js js/columnFormatter.js js/onLoad.js -js/candidateListIndex.js \ No newline at end of file +js/candidateListIndex.js +js/candidateListIndex.js.map diff --git a/modules/candidate_list/jsx/candidateListIndex.js b/modules/candidate_list/jsx/candidateListIndex.js index e98b377c574..93e038c854e 100644 --- a/modules/candidate_list/jsx/candidateListIndex.js +++ b/modules/candidate_list/jsx/candidateListIndex.js @@ -105,13 +105,16 @@ class CandidateListIndex extends Component { default: return None; } } - if (column === 'Scan Done' && cell === 'Y') { + if (column === 'MRI' && cell === 'Y') { let url = this.props.baseURL + '/imaging_browser/?PSCID=' + row['PSCID']; return ( - {cell} + Yes ); } + if (column === 'MRI' && cell === 'N') { + return No; + } return {cell}; } @@ -151,20 +154,25 @@ class CandidateListIndex extends Component { }, }, { - label: 'Visit Label', - show: false, - filter: { - name: 'visitLabel', - type: 'text', + 'label': 'DoB', + 'show': true, + 'filter': { + name: 'DoB', + type: 'date', + hide: this.state.hideFilter, }, }, { - label: 'Site', + label: 'Sex', show: true, filter: { - name: 'site', + name: 'sex', type: 'select', - options: options.site, + hide: this.state.hideFilter, + options: { + 'Male': 'Male', + 'Female': 'Female', + }, }, }, { @@ -177,19 +185,7 @@ class CandidateListIndex extends Component { }, }, { - label: 'Entity Type', - show: true, - filter: { - name: 'entityType', - type: 'select', - options: { - 'Human': 'Human', - 'Scanner': 'Scanner', - }, - }, - }, - { - 'label': 'Scan Done', + 'label': 'MRI', 'show': true, 'filter': { name: 'scanDone', @@ -202,91 +198,63 @@ class CandidateListIndex extends Component { }, }, { - 'label': 'Participant Status', - 'show': true, - 'filter': { - name: 'participantStatus', - type: 'select', - hide: this.state.hideFilter, - options: options.participantstatus, + label: 'Visit Label', + show: false, + filter: { + name: 'visitLabel', + type: 'text', }, }, { - 'label': 'DoB', + 'label': 'Visit Count', 'show': true, 'filter': { - name: 'DoB', - type: 'date', + name: 'visitCount', + type: 'text', hide: this.state.hideFilter, }, }, { - label: 'Sex', + label: 'Site', show: true, filter: { - name: 'sex', + name: 'site', type: 'select', - hide: this.state.hideFilter, - options: { - 'Male': 'Male', - 'Female': 'Female', - }, + options: options.site, }, }, { - 'label': 'VisitCount', + 'label': 'Project', 'show': true, 'filter': { - name: 'visitCount', - type: 'text', - hide: this.state.hideFilter, + name: 'project', + type: 'select', + options: options.project, }, }, { - 'label': 'Feedback', - 'show': true, + label: 'Entity Type', + show: false, + }, + { + 'label': 'Participant Status', + 'show': false, 'filter': { - name: 'feedback', + name: 'participantStatus', type: 'select', hide: this.state.hideFilter, - options: { - '0': 'None', - '1': 'opened', - '2': 'answered', - '3': 'closed', - '4': 'comment', - }, + options: options.participantstatus, }, }, + { + 'label': 'Feedback', + 'show': false, + }, { 'label': 'Latest Visit Status', - 'show': true, - 'filter': { - name: 'latestVisitStatus', - type: 'select', - hide: this.state.hideFilter, - options: { - 'Not Started': 'Not Started', - 'Screening': 'Screening', - 'Visit': 'Visit', - 'Approval': 'Approval', - 'Recycling Bin': 'Recycling Bin', - }, - }, + 'show': false, }, - ]; - fields.push( - { - 'label': 'Project', - 'show': true, - 'filter': { - name: 'project', - type: 'select', - options: options.project, - }, - }, - ); if (options.useedc === 'true') { fields.push( diff --git a/modules/candidate_list/php/candidate_list.class.inc b/modules/candidate_list/php/candidate_list.class.inc index 30382fa6c00..4dfa6e9593e 100644 --- a/modules/candidate_list/php/candidate_list.class.inc +++ b/modules/candidate_list/php/candidate_list.class.inc @@ -58,18 +58,18 @@ class Candidate_List extends \NDB_Menu_Filter $this->columns = array( 'c.PSCID', 'c.CandID AS DCCID', + 'DATE_FORMAT(c.DoB,\'%Y-%m-%d\') AS DoB', + 'c.Sex', + 'GROUP_CONCAT(DISTINCT sp.title) as Subproject', + 'MAX(s.Scan_done) as scanDone', 'GROUP_CONCAT(DISTINCT s.Visit_label) AS VisitLabel', + 'COUNT(DISTINCT s.Visit_label) AS VisitCount', 'psc.Name AS RegistrationSite', - 'GROUP_CONCAT(DISTINCT sp.title) as Subproject', + 'p.Name as Project', 'c.Entity_type AS EntityType', - 'MAX(s.Scan_done) as scanDone', 'COALESCE(pso.Description,"Active") AS ParticipantStatus', - 'DATE_FORMAT(c.DoB,\'%Y-%m-%d\') AS DoB', - 'c.Sex', - 'COUNT(DISTINCT s.Visit_label) AS VisitCount', "IFNULL(MIN(feedback_bvl_thread.Status+0),0) AS Feedback", 'max(s.Current_stage) AS LatestVisitStatus', - 'p.Name as Project', ); if ($config->getSetting("useEDC") === "true") { From b552d655153c2672441c620c8859b5869936610b Mon Sep 17 00:00:00 2001 From: Zaliqa Rosli Date: Wed, 29 Jan 2020 18:51:33 -0500 Subject: [PATCH 3/5] grab changes from loris PR#5400 --- .../candidate_list/jsx/candidateListIndex.js | 22 +++++++++++++++---- .../php/candidate_list.class.inc | 4 ++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/modules/candidate_list/jsx/candidateListIndex.js b/modules/candidate_list/jsx/candidateListIndex.js index 93e038c854e..8f5cbeb7bf9 100644 --- a/modules/candidate_list/jsx/candidateListIndex.js +++ b/modules/candidate_list/jsx/candidateListIndex.js @@ -64,7 +64,17 @@ class CandidateListIndex extends Component { fetchData() { return fetch(this.props.dataURL, {credentials: 'same-origin'}) .then((resp) => resp.json()) - .then((data) => this.setState({data})) + .then((data) => { + // Convert concatenated string of subproject and visit labels to array + data.Data = data.Data.map((row) => { + // Visit label + row[6] = (row[6]) ? row[6].split(',') : null; + // Subproject + row[4] = (row[4]) ? row[4].split(',') : null; + return row; + }); + this.setState({data}); + }) .catch((error) => { this.setState({error: true}); console.error(error); @@ -92,7 +102,7 @@ class CandidateListIndex extends Component { * @return {*} a formated table cell for a given column */ formatColumn(column, cell, row) { - if (column === 'PSCID' && this.props.hasPermission('access_all_profiles')) { + if (column === 'PSCID') { let url = this.props.baseURL + '/' + row['DCCID'] + '/'; return {cell}; } @@ -115,6 +125,10 @@ class CandidateListIndex extends Component { if (column === 'MRI' && cell === 'N') { return No; } + if (column === 'Subproject' && cell != null) { + // If user has multiple subprojects, join array into string + return {cell.join(', ')}; + } return {cell}; } @@ -134,7 +148,6 @@ class CandidateListIndex extends Component { * XXX: Currently, the order of these fields MUST match the order of the * queried columns in _setupVariables() in candidate_list.class.inc */ - // FIXME: if candidate in more than one subproject, filter does not work const options = this.state.data.fieldOptions; const fields = [ { @@ -202,7 +215,8 @@ class CandidateListIndex extends Component { show: false, filter: { name: 'visitLabel', - type: 'text', + type: 'select', + options: options.visitlabel, }, }, { diff --git a/modules/candidate_list/php/candidate_list.class.inc b/modules/candidate_list/php/candidate_list.class.inc index 4dfa6e9593e..57561523ad0 100644 --- a/modules/candidate_list/php/candidate_list.class.inc +++ b/modules/candidate_list/php/candidate_list.class.inc @@ -115,6 +115,9 @@ class Candidate_List extends \NDB_Menu_Filter $user = \User::singleton(); $config = \NDB_Config::singleton(); + // get the list of visit labels + $visit_label_options = \Utility::getVisitList(); + // get the list of sites available for the user if ($user->hasPermission('access_all_profiles')) { $list_of_sites = \Utility::getSiteList(); @@ -146,6 +149,7 @@ class Candidate_List extends \NDB_Menu_Filter } $this->fieldOptions = [ + 'visitlabel' => $visit_label_options, 'site' => $site_options, 'project' => $project_options, 'subproject' => $subproject_options, From 61921427907ee9350ddebbfa1473942e69800370 Mon Sep 17 00:00:00 2001 From: Zaliqa Rosli Date: Thu, 30 Jan 2020 15:27:43 -0500 Subject: [PATCH 4/5] add new columns to table --- .../candidate_list/jsx/candidateListIndex.js | 88 ++++++++++++++++++- .../php/candidate_list.class.inc | 7 ++ 2 files changed, 94 insertions(+), 1 deletion(-) diff --git a/modules/candidate_list/jsx/candidateListIndex.js b/modules/candidate_list/jsx/candidateListIndex.js index 8f5cbeb7bf9..926a6d6a2b8 100644 --- a/modules/candidate_list/jsx/candidateListIndex.js +++ b/modules/candidate_list/jsx/candidateListIndex.js @@ -66,11 +66,20 @@ class CandidateListIndex extends Component { .then((resp) => resp.json()) .then((data) => { // Convert concatenated string of subproject and visit labels to array + // Convert Instruments Yes/No data to 'N' if null data.Data = data.Data.map((row) => { // Visit label - row[6] = (row[6]) ? row[6].split(',') : null; + row[11] = (row[11]) ? row[11].split(',') : null; // Subproject row[4] = (row[4]) ? row[4].split(',') : null; + // Epidemio + row[5] = row[5] ? row[5] : 'N'; + // Neuropsychology + row[8] = row[8] ? row[8] : 'N'; + // Moca + row[9] = row[9] ? row[9] : 'N'; + // UPDRS + row[10] = row[10] ? row[10] : 'N'; return row; }); this.setState({data}); @@ -129,6 +138,18 @@ class CandidateListIndex extends Component { // If user has multiple subprojects, join array into string return {cell.join(', ')}; } + if (column === 'Epidemio Questionnaire' || + column === 'Biospecimen' || + column === 'Neuropsychology Evaluation' || + column === 'MoCA' || + column === 'UPDRS - Part III') { + switch (cell) { + case 'Y': + return Yes; + case 'N': + return No; + } + } return {cell}; } @@ -197,6 +218,32 @@ class CandidateListIndex extends Component { options: options.subproject, }, }, + { + 'label': 'Epidemio Questionnaire', + 'show': true, + 'filter': { + name: 'Epidemio', + type: 'select', + hide: this.state.hideFilter, + options: { + 'Y': 'Yes', + 'N': 'No', + }, + }, + }, + { + 'label': 'Biospecimen', + 'show': true, + 'filter': { + name: 'bioSpecimen', + type: 'select', + hide: this.state.hideFilter, + options: { + 'Y': 'Yes', + 'N': 'No', + }, + }, + }, { 'label': 'MRI', 'show': true, @@ -210,6 +257,45 @@ class CandidateListIndex extends Component { }, }, }, + { + 'label': 'Neuropsychology Evaluation', + 'show': true, + 'filter': { + name: 'Neuropsych', + type: 'select', + hide: this.state.hideFilter, + options: { + 'Y': 'Yes', + 'N': 'No', + }, + }, + }, + { + 'label': 'MoCA', + 'show': true, + 'filter': { + name: 'Moca', + type: 'select', + hide: this.state.hideFilter, + options: { + 'Y': 'Yes', + 'N': 'No', + }, + }, + }, + { + 'label': 'UPDRS - Part III', + 'show': true, + 'filter': { + name: 'UPDRS', + type: 'select', + hide: this.state.hideFilter, + options: { + 'Y': 'Yes', + 'N': 'No', + }, + }, + }, { label: 'Visit Label', show: false, diff --git a/modules/candidate_list/php/candidate_list.class.inc b/modules/candidate_list/php/candidate_list.class.inc index 57561523ad0..95e962f090b 100644 --- a/modules/candidate_list/php/candidate_list.class.inc +++ b/modules/candidate_list/php/candidate_list.class.inc @@ -61,7 +61,12 @@ class Candidate_List extends \NDB_Menu_Filter 'DATE_FORMAT(c.DoB,\'%Y-%m-%d\') AS DoB', 'c.Sex', 'GROUP_CONCAT(DISTINCT sp.title) as Subproject', + 'GROUP_CONCAT(DISTINCT CASE WHEN f.Test_name="Epidemio" THEN "Y" ELSE NULL END) AS Epidemio', + 'CASE WHEN COUNT(DISTINCT bs.SpecimenID)>0 THEN "Y" ELSE "N" END AS Biospecimen', 'MAX(s.Scan_done) as scanDone', + 'GROUP_CONCAT(DISTINCT CASE WHEN f.Test_name="NeuropsychologyEvaluation" THEN "Y" ELSE NULL END) AS Neuropsych', + 'GROUP_CONCAT(DISTINCT CASE WHEN f.Test_name="MoCA" THEN "Y" ELSE NULL END) AS Moca', + 'GROUP_CONCAT(DISTINCT CASE WHEN f.Test_name="UPDRS" THEN "Y" ELSE NULL END) AS UPDRS', 'GROUP_CONCAT(DISTINCT s.Visit_label) AS VisitLabel', 'COUNT(DISTINCT s.Visit_label) AS VisitCount', 'psc.Name AS RegistrationSite', @@ -86,6 +91,8 @@ class Candidate_List extends \NDB_Menu_Filter ON (ps.participant_status=pso.ID) LEFT JOIN Project p ON (c.ProjectID=p.ProjectID) LEFT JOIN subproject sp ON (s.SubprojectID=sp.SubprojectID) + LEFT JOIN flag f ON (s.ID=f.SessionID) + LEFT JOIN biobank_specimen bs ON (s.ID = bs.SessionID) WHERE c.Active = 'Y'"; if (!$user->hasPermission('access_all_profiles')) { From 75ec084957a9ca66e10e4e22ad9f5fcf66220bd5 Mon Sep 17 00:00:00 2001 From: Zaliqa Rosli Date: Thu, 30 Jan 2020 15:40:59 -0500 Subject: [PATCH 5/5] add link to biospecimens --- modules/candidate_list/jsx/candidateListIndex.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/candidate_list/jsx/candidateListIndex.js b/modules/candidate_list/jsx/candidateListIndex.js index 926a6d6a2b8..0fd520ac9a7 100644 --- a/modules/candidate_list/jsx/candidateListIndex.js +++ b/modules/candidate_list/jsx/candidateListIndex.js @@ -138,8 +138,16 @@ class CandidateListIndex extends Component { // If user has multiple subprojects, join array into string return {cell.join(', ')}; } + if (column === 'Biospecimen') { + switch (cell) { + case 'Y': + let url = this.props.baseURL + '/biobank?pscid=' + row['PSCID']; + return Yes; + case 'N': + return No; + } + } if (column === 'Epidemio Questionnaire' || - column === 'Biospecimen' || column === 'Neuropsychology Evaluation' || column === 'MoCA' || column === 'UPDRS - Part III') {