{"version":3,"sources":["history.js","store/ClientConfiguration.js","FetchWrapper.js","store/Alerts.js","store/SystemControl.js","constants/ItemCategories.js","constants/ItemTypes.js","store/ItemTypes.js","store/Items.js","store/MyDetails.js","store/MyPlan.js","store/Lifetime.js","store/PasswordManager.js","store/Authentication.js","store/Weeks.js","constants/RequestTypes.js","utils/utils.js","store/Request.js","store/PrintView.js","store/PortalRedirect.js","constants/DataFormDataTypes.js","store/DataForm.js","store/RedirectController.js","components/PrivateRoute.js","components/NavMenu.js","constants/DateTimeTypes.js","components/DateTime.js","constants/NoteTypes.js","components/PrintView.js","components/AlertPanel.js","components/Layout.js","components/Loading.js","pages/Login.js","components/Header.js","pages/Logout.js","components/NoItems.js","components/TileIcon.js","components/ItemTypeControl.js","components/FileDLView.js","components/TrainingQuestionsPanel.js","components/Item.js","components/ItemsList.js","components/ItemsPage.js","pages/Notices.js","pages/Documents.js","pages/MyPay.js","components/DetailField.js","components/DetailButtons.js","pages/MyDetails.js","components/Plan.js","pages/MyPlan.js","pages/MyRequests.js","components/Checkbox.js","components/Dialog.js","constants/DayPartEnum.js","components/RequestCheckResponse.js","utils/requestUtils.js","components/TCSInputNumeric.js","pages/Request.js","components/CalendarDay.js","components/Calendar.js","pages/SiteCalendar.js","pages/Authenticate.js","pages/ForgotPassword.js","pages/ChangePassword.js","pages/PasswordChanged.js","pages/Contacts.js","pages/MyTraining.js","constants/PortalRedirectTypes.js","pages/PortalRedirect.js","components/DataFormButtons.js","components/DataFormField.js","components/EPSignaturePad.js","components/DataFormImage.js","components/DataFormRow.js","constants/DataFormOwnerTypes.js","pages/DataForm.js","App.js","registerServiceWorker.js","fontawesome.js","index.js","store/configureStore.js"],"names":["history","window","matchMedia","matches","createHashHistory","createBrowserHistory","initialState","config","isLoading","isLoaded","configActions","requestClientConfig","dispatch","getState","a","type","fetch","response","json","reducer","state","action","fetchActions","get","url","ticket","data","__fetch","post","method","requestOptions","mode","headers","body","JSON","stringify","then","handleResponse","text","parse","ok","error","sessionExpired","keys","Object","length","message","toLowerCase","undefined","toString","getErrorFromResponse","statusText","Promise","reject","alerts","alertActions","success","alert","clear","configuration","localStorage","getItem","companyName","systemControlActions","clientConfiguration","endpoint","authentication","user","setItem","_success","lifetimeActions","onLogInExtended","_failure","getLocal","itemCategories","itemTypes","items","itemTypeActions","itemCategory","_request","requestShape","baseUrl","name","hasDataFieldName","getRequestShapeForType","map","item","i","hasOwnProperty","userActions","createNamedReducer","maxPage","page","itemTypeId","itemActions","getPage","markAsRead","id","setAcknowledged","markAsUnread","startTraining","newItemsArray","forEach","itemindex","itemToChange","isAnsweringTraining","currentQuestionIndex","employeeAnswers","push","_storeItem","changeTrainingQuestion","forward","newEmployeeAnswers","employeeAnswer","answerTrainingQuestion","answerIndex","employeeAnswerIndex","completeTraining","typeNameParam","urlComponents","encodeURIComponent","returnData","questions","question","questionIndex","lineNumber","answers","buildReturnData","setTimeout","newItem","isExpanded","updateIsExpanded","newIsExpanded","expandItemId","query","getNew","typeIdParamName","isAcknowledged","isAlwaysExpand","rowCount","rc","parseInt","Math","floor","maxPageFromTotalRows","unreadNotices","readNotices","unreadDocuments","readDocuments","unreadPay","readPay","unreadRequests","readRequests","uncompletedTraining","completedTraining","getStoreForCategory","fields","canRequest","timestamp","editing","changedFields","imageFile","canPreviewFile","hasSaveError","detailsActions","refresh","save","myDetails","hasImage","key","field","value","replace","cancelEdit","setEdit","updateChangedField","newChangedFields","bMatchFound","isChanged","dataType","requiresImageOnChange","_updateChangedField","setImageFile","fileToRead","bcanPreviewFile","URL","createObjectURL","setImageFile_NoFileSelected","setImageFile_StoreLoadedFile","readerResult","_storeLoadedFile","clearImageFile","_clearImageFile","Date","now","planActions","myPlan","onLogIn","epNoticesEnabled","epDocumentsEnabled","epMyPayEnabled","epMyTrainingEnabled","onLogOut","removeItem","changingPassword","isPasswordChangeRequired","isForgottenPassword","passwordActions","changeRequired","change","currentPassword","newPassword","repeatPassword","loginCompleted","loggedIn","isAuthenticationRequired","loggingOut","ssoLoggedIn","loggedOut","login","employeeCode","password","_loginRequest","_authenticationRequired","_passwordChangeRequired","_loginSuccess","_loginFailure","forgotPassword","nicNumber","dateOfBirth","nicnumber","dateofbirth","authenticate","accessCode","_loginCompleted","logout","_loggedout","_logoutFailure","ssoLogin","ssoAuthenticationTicket","loggingIn","epCalendarStyle","stateLookup","stateLookup_tl","weeks","siteId","month","year","weeksActions","getWeeks","yearMonth","formatYearMonth","calendarstyle","startDate","actualMonth","moment","weekStartDate","add","today","week","date","days","clone","format","monState","stateClass","getClassForState","stateText","requestId","monRequestId","isInMonth","isToday","isSame","tueState","tueRequestId","wedState","wedRequestId","thuState","thuRequestId","friState","friRequestId","satState","satRequestId","sunState","sunRequestId","weekNumber","mapWeeks","getClassForStateSample","dayState","requestTypes","utils","truncateDate","pos","indexOf","substr","byteArrayToString","array","decodeURIComponent","escape","atob","getSafeHTML","htmlContent","html","DOMPurify","sanitize","__html","detectCompatibleBrowser","ua","navigator","userAgent","msie","substring","rv","detectIE","formatValue","inputType","decimalPlaces","numeric","parseFloat","isNaN","toFixed","getDateFormat","getTimeFormat","getDayFormat","getDayAndDateFormat","getDateTimeFormat","getDayAndDateTimeFormat","applyFrameKiller","self","top","document","documentElement","style","display","location","vApplyFrameKiller","formatEnumString","forString","sReturnString","replaceAll","toUpperCase","request","checkResponse","fromCalendar","copyAcknowledge","requestActions","copyfromid","fromDate","toDate","requestTypeId","absenceReasonId","isSpecificDays","specificDays","sites","requestNote","dayPart","hours","saveOrCheck","check","clearCheck","acknowledge","navigateAwayFromRequest","cancel","setFromCalendar","setCopyAcknowledge","absenceReasons","isSelected","returnSpecificDays","specificDay","isIncluded","specificDate","site","printViewActions","show","hide","portalRedirectActions","toPortal","portalRedirectType","portalLoginURL","_toPortalSuccess","link","open","_toPortalFailure","cleanUp","dataFormDataTypes","dataForm","changedAnswers","validatedAnswers","ownerId","ownerType","validationError","messageBoxText","dataFormActions","getDataForm","dataFormItems","answer","datesToHtml","updateAnswer","newChangedAnswers","validateAnswersWrapper","validate","_updateChangedAnswer","complete","dataFormOwnerType","_saving","_validate","removeMessageBoxText","forComplete","validatedAnswersWrapper","specificLineNumber","newValidatedAnswers","newValidationError","newMessageBoxText","dataFormItem","bImageOrSignature","bValidate","bValidateMandatory","hasMandatoryError","hasDocumentContent","allowsImageUpload","isMandatory","messageSuffix","hasError","lineText","handledAnwser","maxValue","minValue","bOK","previousPageArgs","redirectControllerActions","redirect","redirectTo","clearRedirect","PrivateRoute","Component","component","rest","render","props","to","pathname","from","useStyles","makeStyles","theme","createStyles","logo","width","height","maxWidth","maxHeight","companyNameLarge","color","fontSize","paddingLeft","spacing","companyNameSmall","paddingTop","paddingBottom","menuItem","textTransform","paddingRight","background","activeMenuItem","drawerPaperSmall","drawerPaperLarge","appBarSmall","flexGrow","zIndex","drawer","appBarLarge","divider","paperToolbar","minHeight","NavMenu","classes","React","useState","openDrawer","setOpenDrawer","handleDrawerBurderClick","handleDrawerClose","renderMenuItems","systemControl","exact","className","activeClassName","MenuItem","onClick","epMyDetailsEnabled","epMyPlanEnabled","epMyRequestsEnabled","epContactsEnabled","epChangePasswordEnabled","epManagerPortalEnabled","isEnabledForMP","epTeamPortalEnabled","isEnabledForTP","thirdPartyMenuTitle","event","thirdPartyMenuURL","activeElement","blur","epLink1Enabled","epLink1Title","epLink1URL","epLink2Enabled","epLink2Title","epLink2URL","needsSmallMenu","root","AppBar","disableGutters","Toolbar","Col","xs","src","alt","icon","Drawer","variant","anchor","onClose","paper","Divider","position","dateTimeTypes","DateTime","this","componentKey","componentName","dateTimeType","onBlur","onChange","disabled","disabledFormat","dateIsUtc","globalsDateTimeFormat","globalsDateFormat","globalsTimeFormat","closeOnSelect","dateTimeFormat","dateFormat","timeFormat","localValue","localDateIsUtc","utc","inputProps","noteTypes","PrintView","handlePrint","preventDefault","print","handleClose","closeView","expanded","bind","Button","bsSize","size","subject","typeName","postedDate","itemType","noteType","dangerouslySetInnerHTML","noteHTMLContent","note","split","k","connect","AlertPanel","handleClear","hasClear","sm","splitMessage","Row","Layout","setNeedsSmallMenu","mediaQueryNeedsSmallMenu","useMediaQuery","useEffect","renderNavMenu","isNavbarVisible","renderComponents","index","children","printViewItem","Container","fluid","Login","handleChange","setState","target","handleLogin","browserError","handleForgotPassword","match","params","span","offset","onSubmit","FormGroup","controlId","FormLabel","FormControl","autoFocus","block","validateForm","bindActionCreators","Header","title","Logout","handleSubmit","TileIcon","handleClick","onSelected","decimalToHexString","number","borderColor","borderColour","backgroundColor","backColour","textColour","tileText","ItemTypeControl","handleSelected","selectItemType","hasData","description","FileDLView","handleStartTrainingClick","isCompleted","TrainingQuestionsPanel","handlePrev","handleNext","handleChangeAnswer","newAnswerIndex","Number","handleComplete","nCurrentQuestionIndex","nQuestionsLength","currentQuestion","currentQuestionText","canPrev","canNext","canComplete","includes","fontWeight","Item","handleItemClick","handleExpandedCollapse","handleMarkAsRead","handleMarkAsUnread","handlePrintView","handleAttachedURL","hasAttachedURL","attachedURL","handleEmailClick","hasEPContactEmail","href","epContactEmail","handlePhoneClick","hasEPContactPhone","epContactPhone","handleDataFormClick","hasDataForm","handleStartTraining","payYear","payPeriod","formattedSites","epContactDescription","displayDate","payDate","completedStamp","info","requestStatus","simpleMode","isPassed","isStarted","isSticky","epContactNameAndComment","hasFile","fileextension","attachedURLDescription","acknowledgedStamp","ItemsList","handleItemTypeSelect","handleNew","onNewClick","handleChangeTrainingQuestion","handleAnswerTrainingQuestion","handleCompleteTraining","handleFirst","handleLast","prevPageArgs","showHistory","itemId","redirectPage","expandedItemId","showNewButton","newButtonText","canNavigate","ItemsPage","usePrevPageArgs","handleSelect","bShowHistory","Tabs","activeKey","onSelect","Tab","eventKey","unreadTabText","readTabText","unreadItemCategory","unreadItemTypes","unread","readItemCategory","readItemTypes","read","redirectController","Notices","unreadNoticeTypes","readNoticeTypes","Documents","unreadDocumentTypes","readDocumentTypes","unreadPayTypes","readPayTypes","DetailField","dataTypes","newValue","originalValue","changed","handleChecked","checked","handleBlur","handleDatetimeChange","momentDate","handleDatetimeBlur","getDecimalPlaces","getInputType","isPending","propsediting","propstimestamp","detailChangedClass","detailPendingClass","options","validValues","opt","DetailButton","edit","isBlockSave","MyDetails","handleFieldChanged","handleEdit","handleSave","handleCancel","handleImageFileChange","files","localProps","reader","FileReader","onloadend","result","readAsDataURL","handleImageFileClear","isImageRequired","values","hasChangedDetails","filter","DetailButtons","checkImageRequired","localItem","label","accept","htmlFor","Plan","toDecimal","x","holidayYear","holEntitlementDays","bankHolidayDays","holUsedDays","holApprovedDays","holRequestedDays","holRemainingDays","absUsedDays","absApprovedDays","absRequestedDays","MyPlan","MyRequests","handleNewClick","unreadRequestTypes","readRequestTypes","Checkbox","Dialog","handleConfirm","onConfirm","onCancel","confirmClass","confirmText","hideCancel","dayPartEnum","full_day","half_day","morning","afternoon","RequestCheckResponse","details","status","requestUtils","getStateObject","buildSpecificDays","requestType","processedNote","requestStatusEnum","canAmend","canCancel","canAcknowledge","canChange","showCancelDialog","editingHours","isAmendingApproved","specificDaysReturn","workingDate","bisIncluded","isAfter","TCSInputNumeric","handleFocus","select","onFocus","requestStatuses","Request","handleFromDatetimeChange","handleToDatetimeChange","handleIsSpecificDaysSelect","handleSpecificDaySelect","filterItem","modifySpecificDay","slice","concat","handleReasonSelect","handleSiteSelect","modifySite","handleTypeChanged","handleDayPartTypeChanged","handleHoursChanged","newHours","handleHoursBlur","handleBack","handleAcknowledge","handleChangeAcknowledge","handleConfirmCancel","handleDismissCancel","handleCheck","isNewRequest","disableEdit","showSave","showCheck","showEdit","showAcknowledge","showCancel","showChange","backTitle","sameDay","enableDayPart","enableHours","enableSpecificDays","showSpecificDays","reason","absenceReason","j","min","max","step","CalendarDay","glyphLookup","Calendar","isSameOrBefore","forState","day","SiteCalendar","decodedSite","Authenticate","handleAuthenticate","ForgotPassword","handleBackToLogin","ChangePassword","passwordManager","PasswordChanged","Contacts","allContacs","allContactTypes","MyTraining","uncompleted","completed","uncompletedItemTypes","completedItemTypes","uncompletedItemCategory","completedItemCategory","uncompletedTrainingTypes","completedTrainingTypes","portalRedirectTypes","PortalRedirect","portalredirecttype","mpLoginURL","tpLoginURL","portalRedirect","DataFormButton","previousText","canEdit","DataFormField","newAnswer","originalAnswer","dataFormChangedClass","dataFormPendingClass","dataFormErrorClass","sURL","defaultValue","startsWith","hasAnswer","itemValues","itemValue","EPSignaturePad","sigPad","handleImageSet","on","isEmpty","isEnabled","handleImageClear","handleAccept","base64Image","getCanvas","toDataURL","off","handleOnEnd","signature","clearDisabled","acceptDisabled","canvasProps","ref","onEnd","DataFormImage","handleRemoveButtonOnClick","handleImageFileAdded","endsWith","handleSignatureImageFileRemoved","handleSignatureImageFileAdded","editingAndAllowsImageUpload","documentSource","documentExtension","documentContent","hasNewAnswer","capture","DataFormRow","showMultiLineAnswerText","showImage","showField","sectionHeading","LineNumber","dataFormOwnerTypes","DataForm","handleMessageBoxClose","header","dataFormSubject","hasItems","DataFormButtons","App","rootDefaultPath","MyPay","printView","path","withRouter","isLocalhost","Boolean","hostname","registerValidSW","swUrl","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","console","log","catch","library","faExclamationCircle","faInfoCircle","faCheck","faClock","faTimes","faPrint","faTimesCircle","faFile","faGraduationCap","faGlobeAmericas","faEnvelope","faChevronRight","faChevronLeft","faChevronDown","faStepForward","faStepBackward","faLock","faSave","faTrashAlt","faBars","faSpinner","faExclamation","initialReduxState","store","reducers","ClientConfiguration","Authentication","PasswordManager","Weeks","SystemControl","Alerts","RedirectController","Items","ItemTypes","middleware","thunk","routerMiddleware","enhancers","appReducer","combineReducers","router","connectRouter","createStore","compose","applyMiddleware","configureStore","rootElement","getElementById","ReactDOM","process","origin","addEventListener","ready","unregister","reload","checkValidServiceWorker","registerServiceWorker"],"mappings":"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","file":"static/js/main.dc48bcb8.chunk.js","sourcesContent":["/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2020 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: history.js\r\n// Details: set up history\r\n//\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 112897 28/04/21 JC M01 Added createHashHistory\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport { createBrowserHistory, createHashHistory } from 'history';\r\n\r\n/* M01 - if we're in standalone browser mode then use hash history rather than browser as iOS/android do not work properly */\r\nfunction configureHistory() {\r\n return window.matchMedia('(display-mode: standalone)').matches\r\n ? createHashHistory()\r\n : createBrowserHistory()\r\n}\r\n\r\nexport const history = configureHistory();\r\n\r\n\r\n","const requestClientConfigType = 'REQUEST_CLIENT_CONFIG';\r\nconst receiveClientConfigType = 'RECEIVE_CLIENT_CONFIG';\r\nconst initialState = { config: {}, isLoading: false, isLoaded: false };\r\n\r\nexport const configActions = {\r\n\trequestClientConfig: () => async (dispatch, getState) => {\r\n\t\tif (getState().config) {\r\n\t\t\t// Don't issue a duplicate request (we already have or are loading the requested data)\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdispatch({ type: requestClientConfigType });\r\n\r\n\t\tconst url = \"ClientConfiguration\";\r\n\t\tconst response = await fetch(url);\r\n\t\tconst config = await response.json();\r\n\r\n\t\tdispatch({ type: receiveClientConfigType, config });\r\n\t}\r\n};\r\n\r\nexport const reducer = (state, action) => {\r\n\tstate = state || initialState;\r\n\r\n\tif (action.type === requestClientConfigType) {\r\n\t\treturn {\r\n\t\t\t...state,\r\n\t\t\tisLoading: true,\r\n\t\t\tisLoaded: false\r\n\t\t};\r\n\t}\r\n\r\n\tif (action.type === receiveClientConfigType) {\r\n\t\treturn {\r\n\t\t\t...state,\r\n\t\t\tconfig: action.config,\r\n\t\t\tisLoading: false,\r\n\t\t\tisLoaded: true\r\n\t\t};\r\n\t}\r\n\r\n\treturn state;\r\n};\r\n","export const fetchActions = {\r\n\tget,\r\n\tpost\r\n};\r\n\r\n\r\nfunction get(url, ticket, data) {\r\n\treturn __fetch(url, \"GET\", ticket, data);\r\n}\r\n\r\nfunction post(url, ticket, data) {\r\n\treturn __fetch(url, \"POST\", ticket, data);\r\n}\r\n\r\n\r\nfunction __fetch(url, method, ticket, data) {\r\n\tconst requestOptions = {\r\n\t\tmethod: method,\r\n\t\tmode: \"cors\",\r\n\t\theaders: {\r\n\t\t\t\"Content-Type\": \"application/json; charset=utf-8\"\r\n\t\t}\r\n\t};\r\n\r\n\tif (data) {\r\n\t\trequestOptions.body = JSON.stringify(data);\r\n\t}\r\n\r\n\tif (ticket) {\r\n\t\trequestOptions.headers[\"tep-ticket\"] = ticket;\r\n\t}\r\n\r\n\treturn fetch(url, requestOptions)\r\n\t\t.then(handleResponse)\r\n\t\t.then(data => {\r\n\t\t\treturn data;\r\n\t\t});\r\n}\r\n\r\nfunction handleResponse(response) {\r\n\treturn response.text().then(text => {\r\n\t\tconst data = text && JSON.parse(text);\r\n\r\n\t\tif (!response.ok) {\r\n\t\t\tconst error = getErrorFromResponse(data, response.statusText);\r\n\t\t\treturn Promise.reject(error);\r\n\t\t}\r\n\t\treturn {\r\n\t\t\tdata: data,\r\n\t\t\theaders: response.headers\r\n\t\t};\r\n\t});\r\n}\r\n\r\nexport function getErrorFromResponse(data, response) {\r\n\r\n\tvar error = { sessionExpired: false };\r\n\tif (typeof data === \"object\") {\r\n\t\tvar keys = Object.keys(data);\r\n\t\tif (keys.length !== 0) {\r\n\t\t\terror.message = data[keys[0]];\r\n\t\t}\r\n\t}\r\n\tif (error.message && error.message.toLowerCase() === \"invalid session\") {\r\n\t\terror.sessionExpired = true;\r\n\t}\r\n\r\n\tif (error.message === undefined) {\r\n\t\terror.message = data.toString() || response.text();\r\n\t}\r\n\treturn error;\r\n}","const alertSuccessType = 'ALERT_SUCCESS';\r\nconst alertErrorType = 'ALERT_ERROR';\r\nconst alertClearType = 'ALERT_CLEAR';\r\n\r\nconst initialState = {\r\n\talerts: [] \r\n};\r\n\r\nexport const alertActions = {\r\n\tsuccess,\r\n\terror,\r\n\tclear\r\n};\r\n\r\nfunction success(message) {\r\n\treturn { type: alertSuccessType, alert: { type: 'alert-success', message: message } };\r\n}\r\n\r\nfunction error(message) {\r\n\treturn { type: alertErrorType, alert: { type: 'alert-danger', message: message } };\r\n}\r\n\r\nfunction clear() {\r\n\treturn { type: alertClearType };\r\n}\r\n\r\n\r\nexport const reducer = (state, action) => {\r\n\tstate = state || initialState;\r\n\r\n\tif (action.type === alertSuccessType) {\r\n\t\treturn { ...state, alerts: [...state.alerts, action.alert] };\r\n\t}\r\n\r\n\tif (action.type === alertErrorType) {\r\n\t\treturn { ...state, alerts: [...state.alerts, action.alert] };\r\n\t}\r\n\r\n\tif (action.type === alertClearType) {\r\n\t\treturn { ...state, alerts: [] };\r\n\t}\r\n\r\n\treturn state;\r\n};","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: SystemControl\r\n// Details: System control : store\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 101886 02/07/19 JHT M01 Added getLocal\r\n// 104759 11/12/19 JC M02 Navigator now soft coded, based on system control configuration\r\n//-------------------------------------------------------\r\n*/\r\nimport { alertActions } from './Alerts';\r\nimport { fetchActions } from \"../FetchWrapper\";\r\nimport { lifetimeActions } from './Lifetime';//M02\r\n\r\nconst systemControlRequestType = 'SYSTEMCONTROL_REQUEST';\r\nconst systemControlSuccessType = 'SYSTEMCONTROL_SUCCESS';\r\nconst systemControlFailureType = 'SYSTEMCONTROL_FAILURE';\r\n\r\nlet systemControl = JSON.parse(localStorage.getItem('systemControl'));\r\n\r\nconst initialState = {\r\n\tconfiguration: systemControl || { companyName: \" \"}\r\n};\r\n\r\nexport const systemControlActions = {\r\n get, \r\n getLocal //M01\r\n};\r\n\r\nfunction get() {\r\n\treturn (dispatch, getState) => {\r\n\t\tif (!getState().clientConfiguration.config.endpoint)\r\n\t\t\treturn;\r\n\r\n\t\tdispatch(_request());\r\n\r\n\t\tconst url = getState().clientConfiguration.config.endpoint + \"/systemcontrol\";\r\n\t\tconst ticket = getState().authentication.user.ticket;\r\n\r\n\t\tfetchActions.get(url, ticket)\r\n\t\t\t.then(\r\n\t\t\t\tresponse => {\r\n\t\t\t\t\tvar configuration = response.data;\r\n\t\t\t\t\tlocalStorage.setItem('systemControl', JSON.stringify(configuration));\r\n dispatch(_success(configuration));\r\n\r\n //M02\r\n dispatch(lifetimeActions.onLogInExtended(configuration));\r\n\t\t\t\t},\r\n\t\t\t\terror => {\r\n\t\t\t\t\tvar message = `Could not get system control information: ${error}`;\r\n\t\t\t\t\tdispatch(_failure(message));\r\n\t\t\t\t\tdispatch(alertActions.error(message));\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t};\r\n\r\n\tfunction _request(configuration) { return { type: systemControlRequestType, configuration }; }\r\n\tfunction _success(configuration) { return { type: systemControlSuccessType, configuration }; }\r\n\tfunction _failure(error) { return { type: systemControlFailureType, error }; }\r\n}\r\n\r\n// --------------------------------------------------------------\r\n// M01 get the existing localStore copy \r\nfunction getLocal() {\r\n let sysCtrl = JSON.parse(localStorage.getItem('systemControl')); \r\n return sysCtrl;\r\n}\r\n\r\nexport const reducer = (state, action) => {\r\n\tstate = state || initialState;\r\n\r\n\tif (action.type === systemControlRequestType) {\r\n\t\treturn { ...state };\r\n\t}\r\n\r\n\tif (action.type === systemControlSuccessType) {\r\n\t\treturn { ...state, configuration: action.configuration };\r\n\t}\r\n\r\n\tif (action.type === systemControlFailureType) {\r\n\t\treturn { ...state };\r\n\t}\r\n\treturn state;\r\n};","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: ItemCategories\r\n// Details: Item categories constant\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 102715 16/08/19 JC M01 Added allContacts\r\n// 103782 10/12/19 JC M02 Expanded for training\r\n//-------------------------------------------------------\r\n*/\r\n\r\nexport const itemCategories = {\r\n\tunreadNotices: 'UNREAD_NOTICES',\r\n\treadNotices: 'READ_NOTICES',\r\n\tunreadDocuments: 'UNREAD_DOCUMENTS',\r\n\treadDocuments: 'READ_DOCUMENTS',\r\n\tunreadPay: 'UNREAD_PAY',\r\n\treadPay: 'READ_PAY',\r\n\tunreadRequests: 'UNREAD_REQUESTS',\r\n readRequests: 'READ_REQUESTS',\r\n allContacts: 'ALL_CONTACTS', //M01\r\n uncompletedTraining: 'UNCOMPLETED_TRAINING',\r\n completedTraining: 'COMPLETED_TRAINING'\r\n};\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: ItemTypes\r\n// Details: Item types constant\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 102715 16/08/19 JC M01 Added allContacts\r\n// 103782 10/12/19 JC M02 Expanded for training\r\n//-------------------------------------------------------\r\n*/\r\nexport const itemTypes = {\r\n\tnotice: 'NOTICE',\r\n\tdocument: 'DOCUMENT',\r\n\tpayRecord: 'PAY_RECORD',\r\n request: 'REQUEST',\r\n contact: 'CONTACT', //M01\r\n training: 'TRAINING' //M02\r\n};\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: ItemTypes\r\n// Details: Item Types store\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 102715 16/08/19 JC M01 Added Contacts\r\n// 103782 10/12/19 JC M02 Added MyTraining\r\n// 111318 25/01/21 JC M03 Handle no 'type' for contacts\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport { fetchActions } from \"../FetchWrapper\";\r\nimport { itemCategories } from \"../constants/ItemCategories\";\r\nimport { userActions } from './Authentication';\r\n\r\nconst requestType = '_ITEM_TYPES_REQUEST';\r\nconst successType = '_ITEM_TYPES_SUCCESS';\r\nconst failureType = '_ITEM_TYPES_FAILURE';\r\n\r\nconst initialState = {\r\n\tisLoading: false,\r\n\titems: []\r\n};\r\n\r\nexport const itemTypeActions = {\r\n\tget\r\n};\r\n\r\nfunction get(itemCategory) {\r\n\treturn (dispatch, getState) => {\r\n\t\tif (!getState().clientConfiguration.config.endpoint)\r\n\t\t\treturn;\r\n\r\n\t\tdispatch(_request(itemCategory));\r\n\t\tvar requestShape = getRequestShapeForType(getState().clientConfiguration.config.endpoint, itemCategory);\r\n\r\n\t\tif (requestShape.error) {\r\n\t\t\tdispatch(_failure(itemCategory, requestShape.error));\r\n } else if (requestShape.url && requestShape.url !== undefined) { //M03 check that requestShape has a url\r\n\r\n\t\t\tconst ticket = getState().authentication.user.ticket;\r\n\t\t\tconst hasDataFieldName = requestShape.hasDataFieldName;\r\n\r\n\t\t\tfetchActions.get(requestShape.url, ticket)\r\n\t\t\t\t.then(\r\n\t\t\t\t\tresponse => {\r\n\t\t\t\t\t\tvar itemTypes = response.data.map((item, i) => {\r\n\t\t\t\t\t\t\t// Map specific new/history data property to a standard data property\r\n\t\t\t\t\t\t\tif (item.hasOwnProperty(hasDataFieldName)) {\r\n\t\t\t\t\t\t\t\titem[\"hasData\"] = item[hasDataFieldName];\r\n\t\t\t\t\t\t\t\tdelete item[hasDataFieldName];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treturn item;\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\tdispatch(_success(itemCategory, itemTypes ));\r\n\t\t\t\t\t},\r\n\t\t\t\t\terror => {\r\n\t\t\t\t\t\tif (error.sessionExpired) {\r\n\t\t\t\t\t\t\tdispatch(userActions.sessionExpired());\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tvar message = `Could not get ${requestShape.name}: ${error.message}`;\r\n\t\t\t\t\t\t\tdispatch(_failure(itemCategory, message));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t}\r\n\t};\r\n\r\n\t// Gets information on how the request should appear for the recognised types\r\n\tfunction getRequestShapeForType(baseUrl, itemCategory) {\r\n\t\tswitch (itemCategory) {\r\n\t\t\tcase itemCategories.unreadNotices:\r\n\t\t\t\treturn {\r\n\t\t\t\t\tname: \"unread notices\",\r\n\t\t\t\t\turl: baseUrl + \"/employeenoticetypes\",\r\n\t\t\t\t\thasDataFieldName: \"hasNewData\"\r\n\t\t\t\t};\r\n\r\n\t\t\tcase itemCategories.readNotices:\r\n\t\t\t\treturn {\r\n\t\t\t\t\tname: \"read notices\",\r\n\t\t\t\t\turl: baseUrl + \"/employeenoticetypes\",\r\n\t\t\t\t\thasDataFieldName: \"hasHistoryData\"\r\n\t\t\t\t};\r\n\r\n\t\t\tcase itemCategories.unreadDocuments:\r\n\t\t\t\treturn {\r\n\t\t\t\t\tname: \"unread documents\",\r\n\t\t\t\t\turl: baseUrl + \"/employeedocumenttypes\",\r\n\t\t\t\t\thasDataFieldName: \"hasNewData\"\r\n\t\t\t\t};\r\n\r\n\t\t\tcase itemCategories.readDocuments:\r\n\t\t\t\treturn {\r\n\t\t\t\t\tname: \"read documents\",\r\n\t\t\t\t\turl: baseUrl + \"/employeedocumenttypes\",\r\n\t\t\t\t\thasDataFieldName: \"hasHistoryData\"\r\n\t\t\t\t};\r\n\r\n\t\t\tcase itemCategories.unreadPay:\r\n\t\t\t\treturn {\r\n\t\t\t\t\tname: \"unread pay\",\r\n\t\t\t\t\turl: baseUrl + \"/employeepayrecordtypes\",\r\n\t\t\t\t\thasDataFieldName: \"hasNewData\"\r\n\t\t\t\t};\r\n\r\n\t\t\tcase itemCategories.readPay:\r\n\t\t\t\treturn {\r\n\t\t\t\t\tname: \"read pay\",\r\n\t\t\t\t\turl: baseUrl + \"/employeepayrecordtypes\",\r\n\t\t\t\t\thasDataFieldName: \"hasHistoryData\"\r\n\t\t\t\t};\r\n\r\n\t\t\tcase itemCategories.unreadRequests:\r\n\t\t\t\treturn {\r\n\t\t\t\t\tname: \"unread requests\",\r\n\t\t\t\t\turl: baseUrl + \"/employeerequesttypes\",\r\n\t\t\t\t\thasDataFieldName: \"hasNewData\"\r\n\t\t\t\t};\r\n\r\n\t\t\tcase itemCategories.readRequests:\r\n\t\t\t\treturn {\r\n\t\t\t\t\tname: \"read requests\",\r\n\t\t\t\t\turl: baseUrl + \"/employeerequesttypes\",\r\n\t\t\t\t\thasDataFieldName: \"hasHistoryData\"\r\n };\r\n\r\n //M01 all Contacts\r\n case itemCategories.allContacts:\r\n return {\r\n //return nothing as no specific item types\r\n };\r\n\r\n case itemCategories.uncompletedTraining: //M02\r\n return {\r\n name: \"uncompleted training\",\r\n url: baseUrl + \"/employeetrainingtypes\",\r\n hasDataFieldName: \"hasNewData\"\r\n };\r\n\r\n case itemCategories.completedTraining: //M02\r\n return {\r\n name: \"completed training\",\r\n url: baseUrl + \"/employeetrainingtypes\",\r\n hasDataFieldName: \"hasHistoryData\"\r\n };\r\n\r\n\t\t\tdefault:\r\n\t\t\t\treturn {\r\n\t\t\t\t\terror: \"Unrecognised item type in ItemTypes.js:getRequestShapeForType: '\" + itemCategory + \"'.\"\r\n\t\t\t\t};\r\n\t\t}\r\n\t}\r\n\r\n\tfunction _request(itemCategory) { return { type: itemCategory + requestType }; }\r\n\tfunction _success(itemCategory, items) { return { type: itemCategory + successType, items }; }\r\n\tfunction _failure(itemCategory, error) { return { type: itemCategory + failureType, error }; }\r\n}\r\n\r\nexport const createNamedReducer = (itemCategory = '') => {\r\n\treturn (state, action) => {\r\n\t\tstate = state || initialState;\r\n\r\n\t\tswitch (action.type) {\r\n\t\t\tcase itemCategory + requestType:\r\n\t\t\t\treturn { ...state, isLoading: true };\r\n\r\n\t\t\tcase itemCategory + successType:\r\n\t\t\t\treturn { ...state, isLoading: true, items: action.items, error: {} };\r\n\r\n\t\t\tcase itemCategory + failureType:\r\n\t\t\t\treturn { ...state, isLoading: true, error: action.error };\r\n\r\n\t\t\tdefault:\r\n\t\t\t\treturn state;\r\n\t\t}\r\n\t};\r\n};","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: Items\r\n// Details: Item store\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 102715 16/08/19 JC M01 Added Contacts\r\n// 103782 10/12/19 JC M02 Added MyTraining\r\n// WI3713 25/01/24 JC M03JC Moved IsExpanded down to item store\r\n//-------------------------------------------------------\r\n*/\r\nimport { fetchActions } from \"../FetchWrapper\";\r\nimport { itemCategories } from \"../constants/ItemCategories\";\r\nimport { itemTypes } from '../constants/ItemTypes';\r\nimport { userActions } from './Authentication';\r\nimport { itemTypeActions } from './ItemTypes';\r\n\r\nconst requestType = '_ITEMS_REQUEST';\r\nconst successType = '_ITEMS_SUCCESS';\r\nconst failureType = '_ITEMS_FAILURE';\r\nconst storeItemType = '_ITEMS_STOREITEM'; //M02\r\nconst completeItemType = '_ITEMS_COMPLETEITEM'; //M02\r\nconst pageSize = 20;\r\n\r\nconst initialState = {\r\n\tisLoading: false,\r\n\titems: [],\r\n\tmaxPage: 1,\r\n\tpage: 1,\r\n\titemTypeId: -1\r\n};\r\n\r\nexport const itemActions = {\r\n\tgetPage,\r\n\tmarkAsRead,\r\n markAsUnread,\r\n startTraining, //M02\r\n changeTrainingQuestion, //M02\r\n answerTrainingQuestion, //M02\r\n completeTraining,\r\n updateIsExpanded //M03JC\r\n};\r\n\r\nfunction getPage(page, itemCategory, itemTypeId, expandItemId) { \r\n //M03JC added expandItemId\r\n return (dispatch, getState) => {\r\n\t\tif (!getState().clientConfiguration.config.endpoint)\r\n\t\t\treturn;\r\n\r\n\t\tdispatch(itemTypeActions.get(itemCategory));\r\n\t\tdispatch(_request(itemCategory, itemTypeId));\r\n\r\n\t\tconst requestShape = getRequestShapeForType(getState().clientConfiguration.config.endpoint, itemCategory);\r\n\r\n\t\tif (requestShape.error) {\r\n\t\t\tdispatch(_failure(itemCategory, itemTypeId, requestShape.error));\r\n\t\t} else {\r\n\r\n\t\t\tconst ticket = getState().authentication.user.ticket;\r\n\t\t\tconst query = `?page=${encodeURIComponent(page)}`\r\n\t\t\t\t+ `&getNew=${encodeURIComponent(requestShape.getNew)}`\r\n\t\t\t\t+ `&${requestShape.typeIdParamName}=${encodeURIComponent(itemTypeId)}`\r\n\t\t\t\t+ `&pageSize=${pageSize}`;\r\n\r\n\t\t\tconst typeNameParam = requestShape.typeNameParam;\r\n\r\n\t\t\tfetchActions.get(requestShape.url + query, ticket)\r\n\t\t\t\t.then(\r\n\t\t\t\t\tresponse => {\r\n\t\t\t\t\t\tvar items = response.data.map((item, i) => {\r\n\t\t\t\t\t\t\t// Add a type name property so the UI knows how to display it\r\n\t\t\t\t\t\t\titem[\"itemType\"] = typeNameParam;\r\n\r\n\t\t\t\t\t\t\t// Construct a 'sticky' flag reflecting if item is acknowledged and \r\n\t\t\t\t\t\t\t// we are in an unread list\r\n item[\"isSticky\"] = requestShape.getNew && item.isAcknowledged;\r\n\r\n // M03JC Construct an 'expanded' flag reflecting if item is expanded, defaulting to isAlwaysExpand \r\n //or if the item is the one we need to expand\r\n item[\"isExpanded\"] = (item.isAlwaysExpand === true || item.id == expandItemId);\r\n\r\n\t\t\t\t\t\t\t// Map specific type name property to a standard data property\r\n\t\t\t\t\t\t\tif (item.hasOwnProperty(typeNameParam)) {\r\n\t\t\t\t\t\t\t\titem[\"typeName\"] = item[typeNameParam];\r\n\t\t\t\t\t\t\t\tdelete item[typeNameParam];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treturn item;\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tvar maxPage = maxPageFromTotalRows(response.headers.get(\"tep-totalrows\"));\r\n\t\t\t\t\t\tif (page > maxPage) {\r\n\t\t\t\t\t\t\tdispatch(getPage(maxPage, itemCategory, itemTypeId));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tdispatch(_success(itemCategory, itemTypeId, items, page, maxPage));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\t\t\t\t\terror => {\r\n\t\t\t\t\t\tif (error.sessionExpired) {\r\n\t\t\t\t\t\t\tdispatch(userActions.sessionExpired());\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tvar message = `Could not get ${requestShape.name}: ${error.message}`;\r\n\t\t\t\t\t\t\tdispatch(_failure(itemCategory, itemTypeId, message));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t}\r\n\t};\r\n\r\n\tfunction maxPageFromTotalRows(rowCount) {\r\n\t\tvar rc = parseInt(rowCount, 10) || 0;\r\n\t\tvar pages = Math.floor((rc - 1) / pageSize) + 1;\r\n\t\treturn pages;\r\n\t}\r\n\r\n}\r\n\r\nfunction markAsRead(id, itemCategory, itemTypeId) {\r\n\treturn setAcknowledged(id, itemCategory, true, itemTypeId);\r\n}\r\n\r\nfunction markAsUnread(id, itemCategory, itemTypeId) {\r\n\treturn setAcknowledged(id, itemCategory, false, itemTypeId);\r\n}\r\n\r\nfunction setAcknowledged(id, itemCategory, state, itemTypeId) {\r\n\treturn (dispatch, getState) => {\r\n\t\tdispatch(_request(itemCategory, itemTypeId));\r\n\r\n\t\tconst requestShape = getRequestShapeForType(getState().clientConfiguration.config.endpoint, itemCategory);\r\n\r\n\t\tif (requestShape.error) {\r\n\t\t\tdispatch(_failure(itemCategory, itemTypeId, requestShape.error));\r\n\t\t} else {\r\n\r\n\t\t\tconst ticket = getState().authentication.user.ticket;\r\n\t\t\tconst action = state ? \"read\" : \"notread\";\r\n\t\t\tconst urlComponents = `/${action}/${encodeURIComponent(id)}`;\r\n\r\n\t\t\tfetchActions.post(requestShape.url + urlComponents, ticket)\r\n\t\t\t\t.then(\r\n\t\t\t\t\t() => {\r\n\t\t\t\t\t\tsetTimeout(function () {\r\n const page = getStoreForCategory(getState, itemCategory).page; //M02 was getPageForCategory\r\n\t\t\t\t\t\t\tdispatch(getPage(page, itemCategory, itemTypeId));\r\n\t\t\t\t\t\t}, 500);\r\n\t\t\t\t\t},\r\n\t\t\t\t\terror => {\r\n\t\t\t\t\t\tif (error.sessionExpired) {\r\n\t\t\t\t\t\t\tdispatch(userActions.sessionExpired());\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tvar message = `Could not set read/unread for ${requestShape.name}: ${error.message}`;\r\n\t\t\t\t\t\t\tdispatch(_failure(itemCategory, itemTypeId, message));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t}\r\n\t};\r\n\r\n}\r\n\r\nfunction startTraining(id, itemCategory, items) {\r\n return (dispatch) => {\r\n\r\n //create new items array\r\n var newItemsArray = [];\r\n \r\n //go through each current item\r\n items.forEach(function (item, itemindex) {\r\n\r\n //if the item matches the id\r\n if (item && item.id === id) {\r\n\r\n //clone the item\r\n var itemToChange = { ...item };\r\n\r\n //put relevant properties onto the item\r\n itemToChange.isAnsweringTraining = true; //flag as answering training\r\n itemToChange.currentQuestionIndex = 0; //starts on the first question\r\n itemToChange.employeeAnswers = [-1]; //employee first answer is -1\r\n\r\n // and add the item for the new array\r\n newItemsArray.push(itemToChange);\r\n\r\n } else {\r\n\r\n // otherwise clone the item for the new array\r\n newItemsArray.push({ ...item });\r\n }\r\n }); \r\n \r\n //and dispatch to store\r\n dispatch(_storeItem(itemCategory, newItemsArray));\r\n };\r\n}\r\n\r\nfunction changeTrainingQuestion(id, itemCategory, items, forward) {\r\n return (dispatch) => {\r\n\r\n //create new items array\r\n var newItemsArray = [];\r\n\r\n //go through each current item\r\n items.forEach(function (item) {\r\n\r\n //if the item matches the id\r\n if (item && item.id === id) {\r\n\r\n //clone the item\r\n var itemToChange = { ...item };\r\n\r\n //push the question index forward/back\r\n if (forward) {\r\n itemToChange.currentQuestionIndex = itemToChange.currentQuestionIndex + 1;\r\n\r\n //if there's no employee answer for this index then add\r\n if (itemToChange.employeeAnswers.length === itemToChange.currentQuestionIndex) {\r\n\r\n //create new employee answers array\r\n var newEmployeeAnswers = [];\r\n\r\n //go through each item answer\r\n item.employeeAnswers.forEach(function (employeeAnswer) {\r\n\r\n // add the employee answer to the new array\r\n newEmployeeAnswers.push(employeeAnswer);\r\n });\r\n\r\n //add the new answer to the employee answers\r\n newEmployeeAnswers.push(-1);\r\n\r\n //store the new employee answers on the item to change\r\n itemToChange.employeeAnswers = newEmployeeAnswers;\r\n }\r\n\r\n } else {\r\n //push back\r\n itemToChange.currentQuestionIndex = itemToChange.currentQuestionIndex - 1;\r\n }\r\n \r\n // and add the item for the new array\r\n newItemsArray.push(itemToChange);\r\n\r\n } else {\r\n\r\n // otherwise clone the item for the new array\r\n newItemsArray.push({ ...item });\r\n }\r\n });\r\n\r\n //and dispatch to store\r\n dispatch(_storeItem(itemCategory, newItemsArray));\r\n };\r\n\r\n}\r\n\r\nfunction answerTrainingQuestion(id, itemCategory, items, answerIndex) {\r\n return (dispatch) => {\r\n\r\n //create new items array\r\n var newItemsArray = [];\r\n\r\n //go through each current item\r\n items.forEach(function (item) {\r\n\r\n //if the item matches the id\r\n if (item && item.id === id) {\r\n\r\n //clone the item\r\n var itemToChange = { ...item };\r\n\r\n //create new employee answers array\r\n var newEmployeeAnswers = [];\r\n\r\n //go through each item answer\r\n item.employeeAnswers.forEach(function (employeeAnswer, employeeAnswerIndex) {\r\n\r\n //if the index matches the current question index\r\n if (employeeAnswerIndex === itemToChange.currentQuestionIndex) {\r\n\r\n // and add the answer to the new array\r\n newEmployeeAnswers.push(answerIndex);\r\n\r\n } else {\r\n // otherwise add the employee answer to the new array\r\n newEmployeeAnswers.push(employeeAnswer);\r\n }\r\n });\r\n\r\n //store the new employee answers on the item to change\r\n itemToChange.employeeAnswers = newEmployeeAnswers;\r\n\r\n // and add the item for the new array\r\n newItemsArray.push(itemToChange);\r\n\r\n } else {\r\n\r\n // otherwise clone the item for the new array\r\n newItemsArray.push({ ...item });\r\n }\r\n });\r\n\r\n //and dispatch to store\r\n dispatch(_storeItem(itemCategory, newItemsArray));\r\n };\r\n\r\n}\r\n\r\nfunction completeTraining(id, itemCategory, itemTypeId, items) {\r\n return (dispatch, getState) => {\r\n if (!getState().clientConfiguration.config.endpoint)\r\n return;\r\n\r\n dispatch(_completing());\r\n\r\n //get the request shape & type name param\r\n const requestShape = getRequestShapeForType(getState().clientConfiguration.config.endpoint, itemCategory);\r\n const typeNameParam = requestShape.typeNameParam;\r\n\r\n //set URL and auth ticket\r\n const url = getState().clientConfiguration.config.endpoint + \"/employeetrainings/complete\";\r\n const urlComponents = `/${encodeURIComponent(id)}`;\r\n const ticket = getState().authentication.user.ticket;\r\n var data = buildReturnData(id, items);\r\n\r\n //post to the API\r\n fetchActions.post(url + urlComponents, ticket, data)\r\n .then(\r\n response => {\r\n //no data? - this should never happen though\r\n if (!response.data) {\r\n dispatch(_failure(itemCategory, itemTypeId, \"Could not complete training\"));\r\n }\r\n setTimeout(function () {\r\n \r\n //create new items array\r\n var newItemsArray = [];\r\n\r\n //go through each current item\r\n items.forEach(function (item) {\r\n\r\n //if the item matches the id\r\n if (item && item.id === id) {\r\n\r\n //get the data as a new item\r\n var newItem = response.data;\r\n\r\n // Add a type name property so the UI knows how to display it\r\n newItem[\"itemType\"] = typeNameParam;\r\n\r\n // M03JC copy over the isexpanded property\r\n newItem[\"isExpanded\"] = item.hasOwnProperty(\"isExpanded\") && item.isExpanded;\r\n\r\n //push the item into the new items array\r\n newItemsArray.push(newItem);\r\n\r\n } else {\r\n\r\n // otherwise clone the item for the new array\r\n newItemsArray.push({ ...item });\r\n }\r\n });\r\n\r\n //and dispatch to store\r\n dispatch(_storeItem(itemCategory, newItemsArray));\r\n\r\n }, 500);\r\n },\r\n error => {\r\n if (error.sessionExpired) {\r\n dispatch(userActions.sessionExpired());\r\n }\r\n else {\r\n var message = `Could not save detail: ${error.message}`;\r\n dispatch(_failure(message));\r\n }\r\n }\r\n );\r\n };\r\n\r\n function buildReturnData(id, items) {\r\n\r\n //data to return\r\n var returnData = {};\r\n\r\n //go through each current item\r\n items.forEach(function (item) {\r\n\r\n //if the item matches the id\r\n if (item && item.id === id) {\r\n\r\n //go through each question on the item\r\n item.questions.forEach(function (question, questionIndex) {\r\n\r\n //the return data for the question's line number is the line number of the answer relating to the answer index for the question index\r\n returnData[question.lineNumber] = question.answers[item.employeeAnswers[questionIndex]].lineNumber;\r\n\r\n }); //next question\r\n }\r\n\r\n\r\n }); //next item\r\n\r\n //return\r\n return returnData;\r\n }\r\n\r\n function _completing() { return { type: completeItemType }; }\r\n}\r\n\r\nfunction updateIsExpanded(id, itemCategory, items) {\r\n return (dispatch, getState) => {\r\n if (!getState().clientConfiguration.config.endpoint)\r\n return;\r\n\r\n //get the request shape & type name param\r\n const requestShape = getRequestShapeForType(getState().clientConfiguration.config.endpoint, itemCategory);\r\n const typeNameParam = requestShape.typeNameParam;\r\n\r\n //create new items array\r\n var newItemsArray = [];\r\n\r\n //go through each current item\r\n items.forEach(function (item) {\r\n\r\n //copy over the item is expanded property\r\n let newIsExpanded = item.isExpanded;\r\n\r\n //if the id matches\r\n if (item && item.id === id) {\r\n //change the is expanded value\r\n newIsExpanded = !newIsExpanded;\r\n } \r\n\r\n // clone the item for the new array, setting isExpanded\r\n newItemsArray.push({ ...item, isExpanded: newIsExpanded });\r\n\r\n });\r\n\r\n //and dispatch to store\r\n dispatch(_storeItem(itemCategory, newItemsArray));\r\n };\r\n}\r\n\r\n// Gets information on how the request should appear for the recognised types\r\nfunction getRequestShapeForType(baseUrl, itemCategory) {\r\n\tswitch (itemCategory) {\r\n\t\tcase itemCategories.unreadNotices:\r\n\t\t\treturn {\r\n\t\t\t\tname: \"unread notices\",\r\n\t\t\t\turl: baseUrl + \"/employeenotices\",\r\n\t\t\t\ttypeIdParamName: \"NoticeTypeId\",\r\n\t\t\t\ttypeNameParam: itemTypes.notice,\r\n\t\t\t\tgetNew: true\r\n\t\t\t};\r\n\r\n\t\tcase itemCategories.readNotices:\r\n\t\t\treturn {\r\n\t\t\t\tname: \"read notices\",\r\n\t\t\t\turl: baseUrl + \"/employeenotices\",\r\n\t\t\t\ttypeIdParamName: \"NoticeTypeId\",\r\n\t\t\t\ttypeNameParam: itemTypes.notice,\r\n\t\t\t\tgetNew: false\r\n\t\t\t};\r\n\r\n\t\tcase itemCategories.unreadDocuments:\r\n\t\t\treturn {\r\n\t\t\t\tname: \"unread documents\",\r\n\t\t\t\turl: baseUrl + \"/employeedocuments\",\r\n\t\t\t\ttypeIdParamName: \"DocumentTypeId\",\r\n\t\t\t\ttypeNameParam: itemTypes.document,\r\n\t\t\t\tgetNew: true\r\n\t\t\t};\r\n\r\n\t\tcase itemCategories.readDocuments:\r\n\t\t\treturn {\r\n\t\t\t\tname: \"read documents\",\r\n\t\t\t\turl: baseUrl + \"/employeedocuments\",\r\n\t\t\t\ttypeIdParamName: \"DocumentTypeId\",\r\n\t\t\t\ttypeNameParam: itemTypes.document,\r\n\t\t\t\tgetNew: false\r\n\t\t\t};\r\n\r\n\t\tcase itemCategories.unreadPay:\r\n\t\t\treturn {\r\n\t\t\t\tname: \"unread pay\",\r\n\t\t\t\turl: baseUrl + \"/payrecords\",\r\n\t\t\t\ttypeIdParamName: \"PayRecordTypeId\",\r\n\t\t\t\ttypeNameParam: itemTypes.payRecord,\r\n\t\t\t\tgetNew: true\r\n\t\t\t};\r\n\r\n\t\tcase itemCategories.readPay:\r\n\t\t\treturn {\r\n\t\t\t\tname: \"read pay\",\r\n\t\t\t\turl: baseUrl + \"/payrecords\",\r\n\t\t\t\ttypeIdParamName: \"PayRecordTypeId\",\r\n\t\t\t\ttypeNameParam: itemTypes.payRecord,\r\n\t\t\t\tgetNew: false\r\n\t\t\t};\r\n\r\n\t\tcase itemCategories.unreadRequests:\r\n\t\t\treturn {\r\n\t\t\t\tname: \"unread requests\",\r\n\t\t\t\turl: baseUrl + \"/requests\",\r\n\t\t\t\ttypeIdParamName: \"RequestTypeId\",\r\n\t\t\t\ttypeNameParam: itemTypes.request,\r\n\t\t\t\tgetNew: true\r\n\t\t\t};\r\n\r\n\t\tcase itemCategories.readRequests:\r\n\t\t\treturn {\r\n\t\t\t\tname: \"read requests\",\r\n\t\t\t\turl: baseUrl + \"/requests\",\r\n\t\t\t\ttypeIdParamName: \"RequestTypeId\",\r\n\t\t\t\ttypeNameParam: itemTypes.request,\r\n\t\t\t\tgetNew: false\r\n };\r\n\r\n //M01 handle contacts\r\n case itemCategories.allContacts:\r\n return {\r\n name: \"contacts\",\r\n url: baseUrl + \"/contacts\",\r\n typeNameParam: itemTypes.contact,\r\n };\r\n\r\n case itemCategories.uncompletedTraining: //M02\r\n return {\r\n name: \"uncompleted training\",\r\n url: baseUrl + \"/employeetrainings\",\r\n typeIdParamName: \"TrainingTypeId\",\r\n typeNameParam: itemTypes.training,\r\n getNew: true\r\n };\r\n\r\n case itemCategories.completedTraining: //M02\r\n return {\r\n name: \"completed training\",\r\n url: baseUrl + \"/employeetrainings\",\r\n typeIdParamName: \"TrainingTypeId\",\r\n typeNameParam: itemTypes.training,\r\n getNew: false\r\n };\r\n\r\n\t\tdefault:\r\n\t\t\treturn {\r\n\t\t\t\terror: \"Unrecognised item category in Items.js:getRequestShapeForType: '\" + itemCategory + \"'.\"\r\n\t\t\t};\r\n\t}\r\n}\r\n\r\nfunction _request(itemCategory, itemTypeId) { return { type: itemCategory + requestType, itemTypeId: itemTypeId }; }\r\nfunction _success(itemCategory, itemTypeId, items, page, maxPage) {\r\n\treturn { type: itemCategory + successType, itemTypeId: itemTypeId, items, page, maxPage };\r\n}\r\nfunction _failure(itemCategory, itemTypeId, error) { return { type: itemCategory + failureType, itemTypeId: itemTypeId, error }; }\r\nfunction _storeItem(itemCategory, items) { return { type: itemCategory + storeItemType, items }; }\r\n\r\n\r\n//M02 \r\nfunction getStoreForCategory(getState, itemCategory) {\r\n switch (itemCategory) {\r\n case itemCategories.unreadNotices:\r\n return getState().unreadNotices;\r\n case itemCategories.readNotices:\r\n return getState().readNotices;\r\n case itemCategories.unreadDocuments:\r\n return getState().unreadDocuments;\r\n case itemCategories.readDocuments:\r\n return getState().readDocuments;\r\n case itemCategories.unreadPay:\r\n return getState().unreadPay;\r\n case itemCategories.readPay:\r\n return getState().readPay;\r\n case itemCategories.unreadRequests:\r\n return getState().unreadRequests;\r\n case itemCategories.readRequests:\r\n return getState().readRequests;\r\n case itemCategories.uncompletedTraining: \r\n return getState().uncompletedTraining;\r\n case itemCategories.completedTraining:\r\n return getState().completedTraining;\r\n default:\r\n //return empty object with a page property\r\n return {page: 0};\r\n }\r\n}\r\n\r\nexport const createNamedReducer = (itemCategory = '') => {\r\n\treturn (state, action) => {\r\n\t\tstate = state || initialState;\r\n\r\n\t\tswitch (action.type) {\r\n\t\t\tcase itemCategory + requestType:\r\n\t\t\t\treturn { ...state, isLoading: true, itemTypeId: action.itemTypeId };\r\n\r\n\t\t\tcase itemCategory + successType:\r\n\t\t\t\treturn { ...state, isLoading: false, itemTypeId: action.itemTypeId, items: action.items, page: action.page, maxPage: action.maxPage, error: undefined };\r\n\r\n\t\t\tcase itemCategory + failureType:\r\n return { ...state, isLoading: false, itemTypeId: action.itemTypeId, error: action.error };\r\n\r\n //M02 store single item\r\n case itemCategory + storeItemType:\r\n return { ...state, items: action.items };\r\n\r\n //M02 complete single item\r\n case itemCategory + completeItemType:\r\n return { ...state, items: action.items };\r\n\r\n\t\t\tdefault:\r\n\t\t\t\treturn state;\r\n\t\t}\r\n\t};\r\n};","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: MyDetails\r\n// Details: My details store\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 101886 02/07/19 JHT M01 Added image upload\r\n// 106537 04/03/20 JC M02 Clear errors on start of details saving\r\n// 103839 06/04/20 JC M03 Added refresh timestamp\r\n// 108107 01/06/20 JC M04 Moved most logic to store\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport { fetchActions } from \"../FetchWrapper\";\r\nimport { userActions } from './Authentication';\r\n\r\nconst detailsRequestType = 'DETAILS_REQUEST';\r\nconst detailsSuccessType = 'DETAILS_SUCCESS';\r\nconst detailsFailureType = 'DETAILS_FAILURE';\r\nconst detailsClearType = 'DETAILS_CLEAR';\r\nconst detailsSavingType = \"DETAILS_SAVING\";\r\nconst detailsSavingFailureType = \"DETAILS_SAVINGFAILURE\";\r\n\r\nconst detailsSetEditType = \"DETAILS_SETEDIT\"; //M04\r\nconst detailsCancelEditType = \"DETAILS_CANCELEDIT\"; //M04\r\n\r\nconst detailsUpdateChangedFieldType = \"DETAILS_UPDATECHANGEFIELD\"; //M04\r\n\r\nconst detailsSetImageFileType = \"DETAILS_SETIMAGEFILE\"; //M04\r\nconst detailsSetImageFileStoreLoadedFileType = \"DETAILS_SETIMAGEFILESTORELOADEDFILETYPE\"; //M04\r\nconst detailsSetImageFileNoFileSelectedType = \"DETAILS_SETIMAGEFILENOFILESELECTEDTYPE\"; //M04\r\nconst detailsClearImageFileType = \"DETAILS_CLEARIMAGEFILE\"; //M04\r\n\r\nconst imageKey = \"~EPChange~image\" //M04\r\n\r\nconst initialState = {\r\n fields: [],\r\n isLoading: false,\r\n canRequest: true,\r\n error: undefined,\r\n timestamp: 0, //M03\r\n editing: false, //M04,\r\n changedFields: {}, //M04\r\n imageFile: null, //M04\r\n canPreviewFile: false, //M04\r\n hasSaveError: false //M04\r\n};\r\n\r\nexport const detailsActions = {\r\n\tget,\r\n\trefresh,\r\n\tsave,\r\n clear,\r\n\r\n setEdit, //M04\r\n cancelEdit, //M04\r\n\r\n updateChangedField, //M04\r\n\r\n setImageFile, //M04\r\n setImageFile_NoFileSelected, //M04\r\n setImageFile_StoreLoadedFile, //M04\r\n clearImageFile //M04\r\n};\r\n\r\nfunction get() {\r\n\treturn (dispatch, getState) => {\r\n if (!getState().myDetails.canRequest) {\r\n //no changed fields so cancel, but do not refresh detals\r\n dispatch(cancelEdit(false));\r\n return\r\n }\r\n\r\n\t\tdispatch(refresh());\r\n\t};\r\n}\r\n\r\nfunction refresh() {\r\n\treturn (dispatch, getState) => {\r\n\r\n\t\tif (!getState().clientConfiguration.isLoaded)\r\n\t\t\treturn;\r\n\r\n\t\tif (!getState().clientConfiguration.config.endpoint && !getState().authentication.user)\r\n\t\t\treturn;\r\n\r\n\t\tdispatch(_request());\r\n\r\n\t\tconst url = getState().clientConfiguration.config.endpoint + \"/employeedetails\";\r\n\t\tconst ticket = getState().authentication.user.ticket;\r\n\r\n\t\tfetchActions.get(url, ticket)\r\n\t\t\t.then(\r\n\t\t\t\tresponse => {\r\n\t\t\t\t\tdatesToHtml(response.data);\r\n\t\t\t\t\tdispatch(_success(response.data));\r\n\t\t\t\t},\r\n\t\t\t\terror => {\r\n\t\t\t\t\tif (error.sessionExpired) {\r\n\t\t\t\t\t\tdispatch(userActions.sessionExpired());\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvar message = `Could not get my details: ${error.message}`;\r\n\t\t\t\t\t\tdispatch(_failure(message));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t};\r\n\r\n\tfunction datesToHtml(fields) {\r\n\t\treturn fields.map((item, i) => {\r\n\t\t\tif (item.dataType === 3 || item.dataType === 4) // Date and DateTime\r\n\t\t\t\titem.value = item.value.replace(/\\//g, \"-\");\r\n\t\t\treturn item;\r\n\t\t});\r\n\t}\r\n\r\n\tfunction _request() { return { type: detailsRequestType }; }\r\n\tfunction _success(fields) { return { type: detailsSuccessType, fields }; }\r\n\tfunction _failure(error) { return { type: detailsFailureType, error }; }\r\n}\r\n\r\n\r\n// --------------------------------------------------------------\r\n// Save from MyDetails\r\n// M01 added 'hasImage'\r\nfunction save() {\r\n\treturn (dispatch, getState) => {\r\n\t\tif (!getState().clientConfiguration.config.endpoint)\r\n return;\r\n\r\n // get changed fields from state\r\n let { changedFields } = getState().myDetails;\r\n\r\n // if any changes in state, force save \r\n if (changedFields.length !== 0) { //M03\r\n\r\n dispatch(_saving());\r\n\r\n let hasImage = getState().myDetails.imageFile !== null;\r\n\r\n //set URL and auth ticket\r\n const url = getState().clientConfiguration.config.endpoint + \"/employeedetails\";\r\n const ticket = getState().authentication.user.ticket;\r\n var data = {};\r\n\r\n //build 'data' array from list of changedField\r\n Object.keys(changedFields).forEach(function (key) {\r\n\r\n //*M01 weed out image if no image selected (to prevent overwrite of prev stored image)\r\n var bSkip = false;\r\n bSkip = !hasImage && key === imageKey;\r\n if (!bSkip) {\r\n var field = changedFields[key];\r\n var value = dateToApi(field);\r\n data[key] = value;\r\n }\r\n });\r\n\r\n //post to the API\r\n fetchActions.post(url, ticket, data)\r\n .then(\r\n response => {\r\n if (response.data) {\r\n var message = `Error saving detail: ${response.data}`;\r\n dispatch(_failure(message));\r\n }\r\n setTimeout(function () {\r\n dispatch(cancelEdit(false)); //tidy up via cancel edit\r\n dispatch(detailsActions.refresh());\r\n }, 500);\r\n },\r\n error => {\r\n if (error.sessionExpired) {\r\n dispatch(userActions.sessionExpired());\r\n }\r\n else {\r\n var message = `Could not save detail: ${error.message}`;\r\n dispatch(_failure(message));\r\n }\r\n }\r\n );\r\n } else {\r\n //no changed fields so cancel, refreshing details\r\n dispatch(cancelEdit(true));\r\n }\r\n\t};\r\n\r\n\tfunction dateToApi(item) {\r\n\t\tif (item.type === 3 || item.type === 4) // Date and DateTime\r\n\t\t\treturn item.value.replace(/-/g, \"/\");\r\n\t\treturn item.value;\r\n\t}\r\n\r\n\tfunction _saving() { return { type: detailsSavingType }; }\r\n function _failure(error) { return { type: detailsSavingFailureType, error }; } //M04 was detailsFailureType\r\n}\r\n\r\nfunction clear() {\r\n\treturn (dispatch) => {\r\n\t\tdispatch(_clear());\r\n\t};\r\n\r\n\tfunction _clear() { return { type: detailsClearType }; }\r\n}\r\n\r\n//M04 set edit\r\nfunction setEdit() {\r\n return (dispatch) => {\r\n dispatch(_setEdit());\r\n };\r\n\r\n function _setEdit() { return { type: detailsSetEditType }; }\r\n}\r\n\r\n//M04 cancel edit\r\nfunction cancelEdit(refresh) {\r\n return (dispatch) => {\r\n //cancel edit\r\n dispatch(_cancelEdit());\r\n\r\n //if set to refresh\r\n if (refresh) {\r\n //and re-get details\r\n dispatch(get());\r\n }\r\n };\r\n\r\n function _cancelEdit() { return { type: detailsCancelEditType }; }\r\n}\r\n\r\n//M04 update changed field\r\nfunction updateChangedField(item) {\r\n return (dispatch, getState) => {\r\n\r\n //declare new changed fields object\r\n let newChangedFields = {};\r\n\r\n //determine if we've found a match\r\n let bMatchFound = false;\r\n\r\n //get the current changed fields\r\n const { changedFields } = getState().myDetails;\r\n\r\n //go through each changed field\r\n Object.keys(changedFields).forEach(function (key) {\r\n\r\n // if the key matches\r\n if (key === item.key) {\r\n\r\n //flag as match found\r\n bMatchFound = true;\r\n\r\n //if changed\r\n if (item.isChanged) {\r\n // if changed, add to new changed fields\r\n newChangedFields[key] = { value: item.value, dataType: item.dataType, requiresImageOnChange: item.requiresImageOnChange };\r\n }\r\n else {\r\n //do nothing as will not be copied over, i.e. deleted\r\n }\r\n } else {\r\n //doesn't match so copy over anyway\r\n newChangedFields[key] = { ...changedFields[key] };\r\n }\r\n });\r\n\r\n\r\n //not found & item is changed so add\r\n if (!bMatchFound && item.isChanged) {\r\n newChangedFields[item.key] = { value: item.value, dataType: item.dataType, requiresImageOnChange: item.requiresImageOnChange };\r\n }\r\n\r\n // apply new list back to state\r\n dispatch(_updateChangedField( newChangedFields));\r\n };\r\n\r\n function _updateChangedField(changedFields) { return { type: detailsUpdateChangedFieldType, changedFields }; }\r\n}\r\n\r\n//M04 set image file\r\nfunction setImageFile(fileToRead) {\r\n return (dispatch) => {\r\n \r\n //determine if can preview file -- accepted file types\r\n let bcanPreviewFile = (fileToRead && (fileToRead.type == \"image/jpeg\" || fileToRead.type == \"image/png\" || fileToRead.type == \"image/gif\"));\r\n\r\n // get local URL for the image preview, storing in state object\r\n dispatch(_setImageFile(URL.createObjectURL(fileToRead), bcanPreviewFile ));\r\n\r\n };\r\n\r\n function _setImageFile(imageFile, canPreviewFile) {\r\n return { type: detailsSetImageFileType, imageFile, canPreviewFile };\r\n }\r\n}\r\n\r\n//M04 set image file - store loaded file type\r\nfunction setImageFile_StoreLoadedFile(readerResult) {\r\n return (dispatch, getState) => {\r\n\r\n // ... get the changedfields from state, and append with the image path\r\n var changedFields = getState().myDetails.changedFields;\r\n\r\n changedFields[imageKey] = { value: readerResult, dataType: \"1\", requiresImageOnChange: false };\r\n\r\n // ... return changedFields to state\r\n dispatch(_storeLoadedFile( changedFields ));\r\n\r\n };\r\n\r\n function _storeLoadedFile(changedFields) {\r\n return { type: detailsSetImageFileStoreLoadedFileType, changedFields: changedFields };\r\n }\r\n}\r\n\r\n//M04 set image file\r\nfunction setImageFile_NoFileSelected() {\r\n return (dispatch) => {\r\n\r\n //no file selected \r\n dispatch(_noFileSelected());\r\n };\r\n\r\n \r\n function _noFileSelected() { return { type: detailsSetImageFileNoFileSelectedType }; }\r\n}\r\n\r\n//M04 clearImageFile\r\nfunction clearImageFile() {\r\n return (dispatch, getState) => {\r\n\r\n //declare new changed fields object\r\n let newChangedFields = {};\r\n\r\n // ... get the changedfields from state, and append with the image path\r\n var changedFields = getState().myDetails.changedFields;\r\n\r\n\r\n //go through each changed field\r\n Object.keys(changedFields).forEach(function (key) {\r\n\r\n // if the ep change key\r\n if (key === imageKey) {\r\n\r\n //do nothing as will not be copied over, i.e. deleted\r\n\r\n } else {\r\n //doesn't match so copy over anyway\r\n newChangedFields[key] = { ...changedFields[key] };\r\n }\r\n });\r\n\r\n //clear image file\r\n dispatch(_clearImageFile(newChangedFields));\r\n };\r\n\r\n function _clearImageFile(changedFields) { return { type: detailsClearImageFileType, changedFields }; }\r\n}\r\n\r\n\r\nexport const reducer = (state, action) => {\r\n\tstate = state || initialState;\r\n\r\n\tif (action.type === detailsRequestType) {\r\n return { ...state, isLoading: true, canRequest: false, editing: false, hasSaveError: false }; //M04\r\n\t}\r\n\r\n\tif (action.type === detailsSavingType) {\r\n return { ...state, isLoading: true, canRequest: false, error: undefined, hasSaveError: false }; //M02 clear error M04\r\n\t}\r\n\r\n\tif (action.type === detailsSuccessType) {\r\n return {\r\n ...state, isLoading: false, canRequest: false, fields: action.fields, timestamp: Date.now(), editing: false, hasSaveError: false\r\n }; //M03 M04\r\n\t}\r\n\r\n\tif (action.type === detailsFailureType) {\r\n\t\treturn { ...state, isLoading: false, canRequest: true, error: action.error};\r\n }\r\n\r\n //M04 error saving\r\n if (action.type === detailsSavingFailureType) {\r\n return { ...state, isLoading: false, canRequest: true, error: action.error, hasSaveError: true };\r\n }\r\n\r\n\tif (action.type === detailsClearType) {\r\n\t\treturn { ...state, isLoading: false, canRequest: true, fields: [] };\r\n }\r\n\r\n //M04 set edit - simply sets editing flag to true\r\n if (action.type === detailsSetEditType) {\r\n return { ...state, editing: true };\r\n }\r\n\r\n //M04 cancel edit - return state to before any editing took place\r\n if (action.type === detailsCancelEditType) {\r\n return { ...state, editing: false, changedFields: {}, imageFile: null, canPreviewFile: false, error: undefined, hasSaveError: false};\r\n }\r\n\r\n //M04 update changed fields\r\n if (action.type === detailsUpdateChangedFieldType) {\r\n return { ...state, changedFields: action.changedFields };\r\n }\r\n\r\n //M04 set image file\r\n if (action.type === detailsSetImageFileType) {\r\n return { ...state, imageFile: action.imageFile, hasSaveError: false, canPreviewFile: action.canPreviewFile };\r\n }\r\n\r\n //M04 set image file - store loaded file type\r\n if (action.type === detailsSetImageFileStoreLoadedFileType) {\r\n return { ...state, changedFields: action.changedFields };\r\n }\r\n\r\n //M04 set image file - no file selected\r\n if (action.type === detailsSetImageFileNoFileSelectedType) {\r\n return { ...state, imageFile: null, canPreviewFile: false };\r\n }\r\n\r\n //M04 clear image file\r\n if (action.type === detailsClearImageFileType) {\r\n return { ...state, imageFile: null, canPreviewFile: false, hasSaveError: false, changedFields: action.changedFields };\r\n }\r\n\r\n\treturn state;\r\n};","import { fetchActions } from \"../FetchWrapper\";\r\nimport { userActions } from './Authentication';\r\n\r\nconst planRequestType = 'PLAN_REQUEST';\r\nconst planSuccessType = 'PLAN_SUCCESS';\r\nconst planFailureType = 'PLAN_FAILURE';\r\n\r\nconst initialState = {\r\n\titems: [],\r\n\tisLoading: false,\r\n\tcanRequest: true,\r\n\terror: undefined\r\n};\r\n\r\nexport const planActions = {\r\n\tget,\r\n\trefresh\r\n};\r\n\r\nfunction get() {\r\n\treturn (dispatch, getState) => {\r\n\t\tif (!getState().myPlan.canRequest)\r\n\t\t\treturn;\r\n\r\n\t\tdispatch(refresh());\r\n\t};\r\n}\r\n\r\nfunction refresh() {\r\n\treturn (dispatch, getState) => {\r\n\r\n\t\tif (!getState().clientConfiguration.isLoaded)\r\n\t\t\treturn;\r\n\r\n\t\tif (!getState().clientConfiguration.config.endpoint && !getState().authentication.user)\r\n\t\t\treturn;\r\n\r\n\t\tdispatch(_request());\r\n\r\n\t\tconst url = getState().clientConfiguration.config.endpoint + \"/plans\";\r\n\t\tconst ticket = getState().authentication.user.ticket;\r\n\r\n\t\tfetchActions.get(url, ticket)\r\n\t\t\t.then(\r\n\t\t\t\tresponse => {\r\n\t\t\t\t\tdispatch(_success(response.data));\r\n\t\t\t\t},\r\n\t\t\t\terror => {\r\n\t\t\t\t\tif (error.sessionExpired) {\r\n\t\t\t\t\t\tdispatch(userActions.sessionExpired());\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvar message = `Could not get my plan: ${error.message}`;\r\n\t\t\t\t\t\tdispatch(_failure(message));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t};\r\n\r\n\tfunction _request() { return { type: planRequestType }; }\r\n\tfunction _success(items) { return { type: planSuccessType, items }; }\r\n\tfunction _failure(error) { return { type: planFailureType, error }; }\r\n}\r\n\r\nexport const reducer = (state, action) => {\r\n\tstate = state || initialState;\r\n\r\n\tif (action.type === planRequestType) {\r\n\t\treturn { ...state, isLoading: true, canRequest: false };\r\n\t}\r\n\r\n\tif (action.type === planSuccessType) {\r\n\t\treturn { ...state, isLoading: false, canRequest: false, items: action.items };\r\n\t}\r\n\r\n\tif (action.type === planFailureType) {\r\n\t\treturn { ...state, isLoading: false, canRequest: true, error: action.error};\r\n\t}\r\n\r\n\treturn state;\r\n};","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: Lifetime \r\n// Details: Lifetime store\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 103782 10/12/19 JC M01 Expanded for training\r\n// 104759 11/12/19 JC M02 Navigator now soft coded, based on system control configuration\r\n//-------------------------------------------------------\r\n*/\r\nimport { systemControlActions } from './SystemControl';\r\nimport { itemActions } from './Items';\r\nimport { itemCategories } from '../constants/ItemCategories';\r\nimport { itemTypeActions } from './ItemTypes';\r\nimport { detailsActions } from './MyDetails';\r\nimport { planActions } from './MyPlan';\r\n\r\nexport const lifetimeActions = {\r\n onLogIn,\r\n onLogInExtended,\r\n\tonLogOut\r\n};\r\n\r\nfunction onLogIn() {\r\n\t// These actions get run when the user successfully logs in as \r\n\t// they require a valid authentication token\r\n\treturn (dispatch) => {\r\n\t\tdispatch(systemControlActions.get());\r\n\r\n //M02 moved to onLogInExtended\r\n\t\t//dispatch(itemActions.getPage(1, itemCategories.unreadNotices, -1));\r\n\t\t//dispatch(itemActions.getPage(1, itemCategories.unreadDocuments, -1));\r\n //dispatch(itemActions.getPage(1, itemCategories.unreadPay, -1));\r\n //dispatch(itemActions.getPage(1, itemCategories.uncompletedTraining, -1)); //M01\r\n\r\n\t\t// unread categories will be loaded by the pages above\r\n\t\t// so we only pre-load the read categoris here\r\n\r\n\t\tdispatch(itemTypeActions.get(itemCategories.readNotices));\r\n\t\tdispatch(itemTypeActions.get(itemCategories.readDocuments));\r\n dispatch(itemTypeActions.get(itemCategories.readPay));\r\n dispatch(itemTypeActions.get(itemCategories.completedTraining)); //M01\r\n\r\n\t\tdispatch(detailsActions.get());\r\n\t\tdispatch(planActions.get());\r\n\r\n\t};\r\n}\r\n\r\n//M02\r\nfunction onLogInExtended(configuration) {\r\n // These actions get run when the user successfully logs in as \r\n // they require a valid authentication token\r\n // BUT AFTER WE'VE GOT SYSTEM CONTROL\r\n return (dispatch) => {\r\n\r\n //check system control for each option\r\n if (configuration.epNoticesEnabled === true) {\r\n dispatch(itemActions.getPage(1, itemCategories.unreadNotices, -1));\r\n } else {\r\n dispatch(itemTypeActions.get(itemCategories.unreadNotices));\r\n }\r\n\r\n if (configuration.epDocumentsEnabled === true) {\r\n dispatch(itemActions.getPage(1, itemCategories.unreadDocuments, -1));\r\n } else {\r\n dispatch(itemTypeActions.get(itemCategories.unreadDocuments));\r\n }\r\n\r\n if (configuration.epMyPayEnabled === true) {\r\n dispatch(itemActions.getPage(1, itemCategories.unreadPay, -1));\r\n } else {\r\n dispatch(itemTypeActions.get(itemCategories.unreadPay));\r\n }\r\n\r\n if (configuration.epMyTrainingEnabled === true) {\r\n dispatch(itemActions.getPage(1, itemCategories.uncompletedTraining, -1));\r\n } else {\r\n dispatch(itemTypeActions.get(itemCategories.uncompletedTraining));\r\n } \r\n };\r\n}\r\n\r\nfunction onLogOut() {\r\n\tlocalStorage.removeItem('user');\r\n\tlocalStorage.removeItem('systemControl');\r\n}","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: PasswordManager\r\n// Details: Password Manager store\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 108946 27/07/20 JC M01 Pass current password when changing existing\r\n// 109897 18/09/20 JC M02 Added isForgottenPassword\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport { history } from '../history';\r\nimport { fetchActions } from \"../FetchWrapper\";\r\nimport { userActions } from './Authentication';\r\n\r\nexport const changePasswordRequiredType = \"CHANGE_PASSWORD_REQUIRED\";\r\nexport const changePasswordRequestType = \"CHANGE_PASSWORD_REQUEST\";\r\nexport const changePasswordSuccessType = \"CHANGE_PASSWORD_SUCCESS\";\r\nexport const changePasswordFailureType = \"CHANGE_PASSWORD_FAILURE\";\r\n\r\nconst initialState = {\r\n changingPassword: false,\r\n isPasswordChangeRequired: false,\r\n isForgottenPassword: false\r\n}; //M02\r\n\r\nexport const passwordActions = {\r\n\tchangeRequired,\r\n\tchange\r\n};\r\n\r\nfunction changeRequired(isForgottenPassword) {\r\n\treturn (dispatch) => {\r\n dispatch(_request(isForgottenPassword)); //M02\r\n\t};\r\n\r\n function _request(isForgottenPassword) { return { type: changePasswordRequiredType, isForgottenPassword: isForgottenPassword }; } //M02\r\n}\r\n\r\nfunction change(currentPassword, newPassword, repeatPassword) { //M01\r\n\treturn (dispatch, getState) => {\r\n\t\tif (!getState().clientConfiguration.config.endpoint)\r\n\t\t\treturn;\r\n\r\n\t\tdispatch(_request());\r\n\r\n\t\tconst url = getState().clientConfiguration.config.endpoint + \"/employees/changepassword\";\r\n\t\tconst ticket = getState().authentication.user.ticket;\r\n const data = { currentPassword: currentPassword, newPassword: newPassword, repeatPassword: repeatPassword }; //M01\r\n\r\n\t\tfetchActions.post(url, ticket, data)\r\n\t\t\t.then(\r\n () => {\r\n //M01 always show password changed\r\n\t\t\t\t\t//if (!getState().passwordManager.isPasswordChangeRequired) {\r\n\t\t\t\t\thistory.push('/passwordchanged');\r\n\t\t\t\t\tdispatch(userActions.loginCompleted());\r\n\t\t\t\t\t//}\r\n\t\t\t\t\tdispatch(_success());\r\n\t\t\t\t},\r\n\t\t\t\terror => {\r\n\t\t\t\t\tif (error.sessionExpired) {\r\n\t\t\t\t\t\tdispatch(userActions.sessionExpired());\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvar message = `Could not change password: ${error.message}`;\r\n\t\t\t\t\t\tdispatch(_failure(message));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t};\r\n\r\n\tfunction _request() { return { type: changePasswordRequestType }; }\r\n\tfunction _success() { return { type: changePasswordSuccessType }; }\r\n\tfunction _failure(error) { return { type: changePasswordFailureType, error }; }\r\n}\r\n\r\nexport const reducer = (state, action) => {\r\n\tstate = state || initialState;\r\n\r\n\tif (action.type === changePasswordRequiredType) {\r\n return {\r\n ...state, success: undefined, isPasswordChangeRequired: true, isForgottenPassword: action.isForgottenPassword,\r\n error: \"You must change your password to continue\" //M02\r\n };\r\n\t}\r\n\r\n\tif (action.type === changePasswordRequestType) {\r\n\t\treturn { ...state, success: undefined };\r\n\t}\r\n\r\n\tif (action.type === changePasswordSuccessType) {\r\n return { ...state, success: \"Your password has been changed.\", isPasswordChangeRequired: false, isForgottenPassword:false, error: undefined };//M02\r\n\t}\r\n\r\n\tif (action.type === changePasswordFailureType) {\r\n\t\treturn { ...state, error: action.error };\r\n\t}\r\n\r\n\treturn state;\r\n};","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: Authentication\r\n// Details: Authentication store\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 106380 30/04/20 JC M01 Added ssoLogin\r\n// 108946 11/08/20 JC M02 Hooked up loginPasswordChangeRequiredType in reducer\r\n// 109897 18/09/20 JC M03 Un-flag user.isForgottenPassword in forgotten password\r\n// 115273 15/11/21 JC M04JC ssoLogin needs to handle expired passwords\r\n//-------------------------------------------------------\r\n*/\r\nimport { history } from '../history';\r\nimport { fetchActions } from \"../FetchWrapper\";\r\nimport { lifetimeActions } from './Lifetime';\r\nimport { passwordActions } from './PasswordManager';\r\n\r\nexport const loginRequestType = 'LOGIN_REQUEST';\r\nexport const loginSuccessType = 'LOGIN_SUCCESS';\r\nexport const loginPasswordChangeRequiredType = \"LOGIN_PASSWORD_CHANGE_REQUIRED\";\r\nexport const loginAuthenticationRequiredType = \"LOGIN_AUTHENTICATION_REQUIRED\";\r\nexport const loginFailureType = 'LOGIN_FAILURE';\r\n\r\nexport const authenticationRequestType = 'AUTHENTICATION_REQUEST';\r\n\r\nexport const logoutRequestType = 'LOGOUT_REQUEST';\r\nexport const logoutSuccessType = 'LOGOUT_SUCCESS';\r\nexport const logoutFailureType = 'LOGOUT_FAILURE';\r\n\r\nexport const ssoLoginSuccessType = 'SSOLOGIN_SUCCESS'; //M01\r\n\r\nlet user = JSON.parse(localStorage.getItem('user'));\r\n\r\nconst initialState = user\r\n\t? {\r\n\t\tloggedIn: !(user.isPasswordChangeRequired || user.isAuthenticationRequired) ,\r\n\t\tuser,\r\n\t\tchangingPassword: false,\r\n loggingOut: false,\r\n ssoLoggedIn: false, //M01\r\n loggedOut: false //M01\r\n\t}\r\n\t: {\r\n\t\tloggedIn: false,\r\n\t\tchangingPassword: false,\r\n loggingOut: false,\r\n ssoLoggedIn: false, //M01\r\n loggedOut: false //M01\r\n\t};\r\n\r\nexport const userActions = {\r\n\tlogin,\r\n\tforgotPassword,\r\n\tauthenticate,\r\n\tloginCompleted,\r\n\tlogout,\r\n sessionExpired,\r\n ssoLogin //M01\r\n};\r\n\r\nfunction login(employeeCode, password) {\r\n\treturn (dispatch, getState) => {\r\n\t\tdispatch(_loginRequest());\r\n\r\n\t\tconst url = getState().clientConfiguration.config.endpoint + \"/sessions/login\";\r\n\t\tconst data = { user: employeeCode, password: password };\r\n\r\n\t\tfetchActions.post(url, null, data)\r\n\t\t\t.then(\r\n\t\t\t\tresponse => {\r\n\t\t\t\t\tlet user = response.data;\r\n\t\t\t\t\t// login successful if there's a token in the response\r\n\t\t\t\t\tif (user.ticket) {\r\n\t\t\t\t\t\t// store user details and token in local storage to keep user logged in between page refreshes\r\n\t\t\t\t\t\tlocalStorage.setItem('user', JSON.stringify(user));\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (user.isAuthenticationRequired) {\r\n\t\t\t\t\t\tdispatch(_authenticationRequired(user));\r\n\t\t\t\t\t\thistory.push('/authenticate');\r\n } else if (user.isPasswordChangeRequired) {\r\n //M03 get user isForgottenPassword, protecting against misisng data\r\n let isForgottenPassword = false;\r\n if (user.isForgottenPassword) {\r\n isForgottenPassword = true;\r\n }\r\n\t\t\t\t\t\tdispatch(_passwordChangeRequired(user));\r\n dispatch(passwordActions.changeRequired(isForgottenPassword)); //M03\r\n\t\t\t\t\t\thistory.push('/changepassword');\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tdispatch(_loginSuccess(user));\r\n\t\t\t\t\t\thistory.push('/');\r\n\t\t\t\t\t\tdispatch(lifetimeActions.onLogIn());\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\terror => {\r\n\t\t\t\t\tvar message = `Could not log in: ${error.message}`;\r\n\t\t\t\t\tdispatch(_loginFailure(message));\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t};\r\n}\r\n\r\nfunction forgotPassword(employeeCode, nicNumber, dateOfBirth) {\r\n\treturn (dispatch, getState) => {\r\n\t\tdispatch(_loginRequest());\r\n\r\n\t\tconst url = getState().clientConfiguration.config.endpoint + \"/sessions/forgottenlogin\";\r\n\r\n\t\tdateOfBirth = dateOfBirth.replace(/-/g, \"/\");\r\n\t\tconst data = { user: employeeCode, nicnumber: nicNumber, dateofbirth: dateOfBirth};\r\n\r\n\t\tfetchActions.post(url, null, data)\r\n\t\t\t.then(\r\n\t\t\t\tresponse => {\r\n\t\t\t\t\tlet user = response.data;\r\n\t\t\t\t\t// login successful if there's a token in the response\r\n\t\t\t\t\tif (user.ticket) {\r\n\t\t\t\t\t\t// store user details and token in local storage to keep user logged in between page refreshes\r\n\t\t\t\t\t\tlocalStorage.setItem('user', JSON.stringify(user));\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (user.isAuthenticationRequired) {\r\n\t\t\t\t\t\tdispatch(_authenticationRequired(user));\r\n\t\t\t\t\t\thistory.push('/authenticate');\r\n } else if (user.isPasswordChangeRequired) {\r\n //M03 get user isForgottenPassword, protecting against misisng data\r\n let isForgottenPassword = false;\r\n if (user.isForgottenPassword) {\r\n isForgottenPassword = true;\r\n }\r\n\t\t\t\t\t\tdispatch(_passwordChangeRequired(user));\r\n dispatch(passwordActions.changeRequired(isForgottenPassword)); //M03\r\n\t\t\t\t\t\thistory.push('/changepassword');\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tdispatch(_loginSuccess(user));\r\n\t\t\t\t\t\thistory.push('/');\r\n\t\t\t\t\t\tdispatch(lifetimeActions.onLogIn());\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\terror => {\r\n\t\t\t\t\tvar message = `Could not log in: ${error.message}`;\r\n\t\t\t\t\tdispatch(_loginFailure(message));\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t};\r\n}\r\n\r\nfunction authenticate(accessCode) {\r\n\treturn (dispatch, getState) => {\r\n\t\tdispatch(_authenicationRequest());\r\n\r\n\t\tconst url = getState().clientConfiguration.config.endpoint + \"/sessions/authenticate\";\r\n\t\tconst data = { accessCode: accessCode };\r\n\t\tconst ticket = getState().authentication.user.ticket;\r\n\r\n\t\tfetchActions.post(url, ticket, data)\r\n\t\t\t.then(\r\n\t\t\t\tresponse => {\r\n\t\t\t\t\tlet user = response.data;\r\n\t\t\t\t\t// store user details and token in local storage to keep user logged in between page refreshes\r\n\t\t\t\t\tif (user.ticket) {\r\n\t\t\t\t\t\t// store user details and token in local storage to keep user logged in between page refreshes\r\n\t\t\t\t\t\tlocalStorage.setItem('user', JSON.stringify(user));\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (user.isAuthenticationRequired) {\r\n\t\t\t\t\t\tdispatch(_authenticationRequired(user));\r\n } else if (user.isPasswordChangeRequired) {\r\n //M03 get user isForgottenPassword, protecting against misisng data\r\n let isForgottenPassword = false;\r\n if (user.isForgottenPassword) {\r\n isForgottenPassword = true;\r\n }\r\n\t\t\t\t\t\tdispatch(_passwordChangeRequired(user));\r\n dispatch(passwordActions.changeRequired(isForgottenPassword)); //M03\r\n\t\t\t\t\t\thistory.push('/changepassword');\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tdispatch(_loginSuccess(user));\r\n\t\t\t\t\t\thistory.push('/');\r\n\t\t\t\t\t\tdispatch(lifetimeActions.onLogIn());\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\terror => {\r\n\t\t\t\tif (error.sessionExpired) {\r\n\t\t\t\t\tdispatch(sessionExpired());\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tvar message = `Could not authenticate: ${error.message}`;\r\n\t\t\t\t\tdispatch(_loginFailure(message));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t);\r\n\t};\r\n}\r\n\r\nfunction loginCompleted() {\r\n\treturn (dispatch, getState) => {\r\n\t\tlet user = { ...getState().authentication.user };\r\n\t\tuser.isPasswordChangeRequired = false;\r\n user.isAuthenticationRequired = false;\r\n user.isForgottenPassword = false; //M03\r\n\t\tlocalStorage.setItem('user', JSON.stringify(user));\r\n\r\n\t\tdispatch(_loginCompleted(user));\r\n\t\tdispatch(lifetimeActions.onLogIn());\r\n\t};\r\n\r\n\tfunction _loginCompleted(user) { return { type: loginSuccessType, user: user }; }\r\n}\r\n\r\nfunction logout() {\r\n\treturn (dispatch, getState) => {\r\n\t\tdispatch(_logoutRequest());\r\n\r\n\t\tconst url = getState().clientConfiguration.config.endpoint + \"/sessions/logout\";\r\n\t\tconst ticket = getState().authentication.user.ticket;\r\n\r\n\t\tfetchActions.post(url, ticket)\r\n\t\t\t.then(\r\n\t\t\t\t() => {\r\n dispatch(_loggedout());\r\n history.push('/'); //M01\r\n\t\t\t\t},\r\n\t\t\t\terror => {\r\n\t\t\t\t\tif (error.sessionExpired) {\r\n\t\t\t\t\t\t// Log out failed as session expired? This is somewhat ironic...\r\n\t\t\t\t\t\t// go ahead and finish log out anyway as session is already invalidated\r\n\t\t\t\t\t\tdispatch(_loggedout());\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvar message = `Could not log out: ${error.message}`;\r\n\t\t\t\t\t\tdispatch(_logoutFailure(message));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t};\r\n}\r\n\r\nfunction sessionExpired() {\r\n\treturn (dispatch) => {\r\n\t\tdispatch(_loggedout());\r\n\t};\r\n\r\n\tfunction _loggedout() { return { type: logoutSuccessType, message: \"Your session has expired. Please log in again to continue\" }; }\r\n}\r\n\r\n//M01 -- sso Login function, but in reality just calls keep alive with SSO authentication ticket\r\nfunction ssoLogin(ssoAuthenticationTicket) {\r\n return (dispatch, getState) => {\r\n\r\n //don't continue if not already got config or authentication\r\n if (!getState().clientConfiguration || !getState().clientConfiguration.isLoaded || !getState().clientConfiguration.config ||\r\n !getState().clientConfiguration.config.endpoint) {\r\n return;\r\n }\r\n\r\n let loggingIn = getState().authentication.loggingIn;\r\n let ssoLoggedIn = getState().authentication.ssoLoggedIn;\r\n let loggedOut = getState().authentication.loggedOut;\r\n\r\n //don't continue if already logging in or sso logged in, or logged out\r\n if (loggingIn || ssoLoggedIn || loggedOut) {\r\n return;\r\n }\r\n\r\n dispatch(_loginRequest(ssoAuthenticationTicket));\r\n\r\n const url = getState().clientConfiguration.config.endpoint + \"/sessions/keepalive\";\r\n const ticket = ssoAuthenticationTicket;\r\n\r\n fetchActions.post(url, ticket)\r\n .then(\r\n response => {\r\n let user = response.data;\r\n // login successful if there's a token in the response\r\n if (user.ticket) {\r\n // store user details and token in local storage to keep user logged in between page refreshes\r\n localStorage.setItem('user', JSON.stringify(user));\r\n }\r\n\r\n\t\t\t\t\t//M04JC run same checks as login (though it will never return is authentication required)\r\n\t\t\t\t\tif (user.isAuthenticationRequired) {\r\n\t\t\t\t\t\tdispatch(_authenticationRequired(user));\r\n\t\t\t\t\t} else if (user.isPasswordChangeRequired) {\r\n\t\t\t\t\t\t//M03 get user isForgottenPassword, protecting against misisng data\r\n\t\t\t\t\t\tlet isForgottenPassword = false;\r\n\t\t\t\t\t\tif (user.isForgottenPassword) {\r\n\t\t\t\t\t\t\tisForgottenPassword = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdispatch(_passwordChangeRequired(user));\r\n\t\t\t\t\t\tdispatch(passwordActions.changeRequired(isForgottenPassword)); //M03\r\n\t\t\t\t\t\thistory.push('/changepassword');\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tdispatch(_loginSuccess(user));\r\n\t\t\t\t\t\thistory.push('/');\r\n\t\t\t\t\t\tdispatch(lifetimeActions.onLogIn());\r\n\t\t\t\t\t}\r\n },\r\n error => {\r\n var message = `Could not log in: ${error.message}`;\r\n dispatch(_loginFailure(message));\r\n }\r\n );\r\n };\r\n}\r\n\r\nfunction _loginRequest(ssoAuthenticationTicket) { return { type: loginRequestType, ssoAuthenticationTicket }; } //M01\r\nfunction _authenicationRequest() { return { type: authenticationRequestType }; }\r\nfunction _passwordChangeRequired(user) { return { type: loginPasswordChangeRequiredType, user }; }\r\nfunction _authenticationRequired(user) { return { type: loginAuthenticationRequiredType, user }; }\r\nfunction _loginSuccess(user) { return { type: loginSuccessType, user }; }\r\nfunction _loginFailure(error) { return { type: loginFailureType, error }; }\r\n\r\nfunction _logoutRequest() { return { type: logoutRequestType }; }\r\nfunction _loggedout() { return { type: logoutSuccessType }; }\r\nfunction _logoutFailure(error) { return { type: logoutFailureType, error }; }\r\n\r\nfunction _ssoLoginSuccess(user) { return { type: ssoLoginSuccessType, user }; } //M01\r\n\r\nexport const reducer = (state, action) => {\r\n\tstate = state || initialState;\r\n\r\n\t// Login\r\n\r\n if (action.type === loginRequestType) {\r\n return { loggingIn: true, loggedIn: false, ssoLoggedIn: false, loggedOut: false, error: undefined };//M01\r\n }\r\n\r\n\tif (action.type === loginSuccessType) {\r\n\t\treturn { ...state, loggingIn: false, loggedIn: true, user: action.user, error: undefined };\r\n\t}\r\n\r\n\tif (action.type === loginFailureType) {\r\n\t\treturn { ...state, loggingIn: false, error: action.error };\r\n\t}\r\n\r\n if (action.type === ssoLoginSuccessType) { //M01s\r\n return { ...state, loggingIn: false, loggedIn: true, ssoLoggedIn: true, user: action.user, error: undefined };\r\n }\r\n\r\n\t// Authentication\r\n\r\n\tif (action.type === authenticationRequestType) {\r\n\t\treturn { ...state, loggingIn: true, loggedIn: false, error: undefined };\r\n }\r\n\r\n //M02\r\n if (action.type === loginPasswordChangeRequiredType) {\r\n return { ...state, loggingIn: false, loggedIn: false, user: action.user, error: action.error };\r\n }\r\n\r\n\tif (action.type === loginAuthenticationRequiredType) {\r\n\t\treturn { ...state, loggingIn: false, loggedIn: false, user: action.user, error: action.error };\r\n\t}\r\n\r\n\t// Logout\r\n\r\n\tif (action.type === logoutRequestType) {\r\n\t\treturn { ...state, loggingOut: true, error: undefined };\r\n\t}\r\n\r\n\tif (action.type === logoutFailureType) {\r\n\t\treturn { ...state, loggingOut: false, error: action.error };\r\n\t}\r\n\r\n\t// Note: The LOGOUT_SUCCESS action is not required to be handled here as it's intercepted by the root reducer in configureStore.js\r\n\t// (It will still make it here but the application state is nerfed by the time we see it so there is no need)\r\n\r\n\treturn state;\r\n};","//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: Weeks\r\n// Details: Weeks store\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 103563 18/09/19 JHT M01 Variable styling (traffic lights)\r\n//-------------------------------------------------------\r\n\r\nimport { fetchActions } from \"../FetchWrapper\";\r\nimport { userActions } from './Authentication';\r\nimport moment from 'moment';\r\n\r\nconst weeksRequestType = 'WEEKS_REQUEST';\r\nconst weeksSuccessType = 'WEEKS_SUCCESS';\r\nconst weeksFailureType = 'WEEKS_FAILURE';\r\nvar epCalendarStyle; //M01\r\n\r\nconst stateLookup = [\r\n\t\"\",\r\n\t\"Holiday used\",\r\n\t\"Holiday pending\",\r\n\t\"Holiday approved\",\r\n\t\"Holiday rejected\",\r\n\t\"Absence used\",\r\n\t\"Absence pending\",\r\n\t\"Absence approved\",\r\n\t\"Absence rejected\"\r\n];\r\n\r\n//M01\r\nconst stateLookup_tl = [\r\n \"\",\r\n \"Holiday_tl used_tl\",\r\n \"Holiday_tl pending_tl\",\r\n \"Holiday_tl approved_tl\",\r\n \"Holiday_tl rejected_tl\",\r\n \"Absence_tl used_tl\",\r\n \"Absence_tl pending_tl\",\r\n \"Absence_tl approved_tl\",\r\n \"Absence_tl rejected_tl\"\r\n];\r\n\r\n\r\nconst initialState = {\r\n\tweeks: [],\r\n\tsiteId: undefined,\r\n\tmonth: 0,\r\n\tyear: 0,\r\n\tisLoading: false,\r\n\tcanRequest: true,\r\n\terror: undefined\r\n};\r\n\r\nexport const weeksActions = {\r\n getWeeks\r\n , getClassForStateSample //M01\r\n};\r\n\r\n\r\n// --------------------------------------------------------------\r\n//M01 get class for given state (sample)\r\nfunction getClassForStateSample(dayState) {\r\n return (dispatch) => {\r\n return getClassForState(dayState);\r\n };\r\n}\r\n\r\n// --------------------------------------------------------------\r\n//M01 get class for given state\r\nfunction getClassForState(dayState) {\r\n if (epCalendarStyle === \"trafficlights\") {\r\n return stateLookup_tl[dayState];\r\n }\r\n return stateLookup[dayState];\r\n}\r\n\r\nfunction getWeeks(siteId, year, month) {\r\n\treturn (dispatch, getState) => {\r\n\r\n\t\tif (!getState().clientConfiguration.isLoaded)\r\n\t\t\treturn;\r\n\r\n\t\tif (!getState().clientConfiguration.config.endpoint && !getState().authentication.user)\r\n\t\t\treturn;\r\n\r\n\t\tdispatch(_request());\r\n\r\n\t\tconst yearMonth = formatYearMonth(year, month);\r\n\r\n\t\tconst url = getState().clientConfiguration.config.endpoint + \"/weeks\";\r\n\t\tconst query = `?siteId=${siteId}&yearMonth=${encodeURIComponent(yearMonth)}`;\r\n const ticket = getState().authentication.user.ticket;\r\n\r\n epCalendarStyle = getState().clientConfiguration.config.calendarstyle; //M01\r\n\r\n\r\n\t\tfetchActions.get(url + query, ticket)\r\n\t\t\t.then(\r\n\t\t\t\tresponse => {\r\n\t\t\t\t\tconst weeks = mapWeeks(response.data);\r\n\t\t\t\t\tlet startDate;\r\n\r\n\t\t\t\t\tif (weeks.length !== 0) {\r\n\t\t\t\t\t\tstartDate = moment(weeks[0].weekStartDate);\r\n\t\t\t\t\t\tstartDate.add(7, \"days\");\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tstartDate = moment();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdispatch(_success(weeks, siteId, startDate.month() + 1, startDate.year()));\r\n\t\t\t\t},\r\n\t\t\t\terror => {\r\n\t\t\t\t\tif (error.sessionExpired) {\r\n\t\t\t\t\t\tdispatch(userActions.sessionExpired());\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvar message = `Could not get calendar information: ${error.message}`;\r\n\t\t\t\t\t\tdispatch(_failure(message));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t};\r\n\r\n\tfunction formatYearMonth(year, month) {\r\n\t\tif (!year || !month)\r\n\t\t\treturn 0;\r\n\r\n\t\treturn \"\" + year + (month < 10 ? \"0\" + month : month);\r\n\t}\r\n\r\n\tfunction mapWeeks(weeks) {\r\n\t\tif (weeks.length !== 0) {\r\n\t\t\tconst weekStart = moment(weeks[0].weekStartDate);\r\n\t\t\tconst actualMonth = weekStart.add(7, \"days\").month();\r\n\t\t\tconst today = moment();\r\n\r\n\t\t\treturn weeks.map((week, i) => {\r\n\t\t\t\tconst date = moment(week.weekStartDate);\r\n\r\n\t\t\t\tvar days = [];\r\n\r\n\t\t\t\tdays.push({\r\n\t\t\t\t\tdate: date.clone().format(),\r\n\t\t\t\t\tstate: week.monState,\r\n stateClass: getClassForState(week.monState),\r\n stateText: stateLookup[week.monState],\r\n\t\t\t\t\trequestId: week.monRequestId || 0,\r\n\t\t\t\t\tisInMonth: date.month() === actualMonth,\r\n\t\t\t\t\tisToday: date.isSame(today, 'day')\r\n\t\t\t\t});\r\n\r\n\t\t\t\tdate.add(1, \"days\");\r\n\r\n\t\t\t\tdays.push({\r\n\t\t\t\t\tdate: date.clone().format(),\r\n\t\t\t\t\tstate: week.tueState,\r\n stateClass: getClassForState(week.tueState),\r\n stateText: stateLookup[week.tueState],\r\n\t\t\t\t\trequestId: week.tueRequestId || 0,\r\n\t\t\t\t\tisInMonth: date.month() === actualMonth,\r\n\t\t\t\t\tisToday: date.isSame(today, 'day')\r\n\t\t\t\t});\r\n\r\n\t\t\t\tdate.add(1, \"days\");\r\n\r\n\t\t\t\tdays.push({\r\n\t\t\t\t\tdate: date.clone().format(),\r\n\t\t\t\t\tstate: week.wedState,\r\n stateClass: getClassForState(week.wedState),\r\n stateText: stateLookup[week.wedState],\r\n\t\t\t\t\trequestId: week.wedRequestId || 0,\r\n\t\t\t\t\tisInMonth: date.month() === actualMonth,\r\n\t\t\t\t\tisToday: date.isSame(today, 'day')\r\n\t\t\t\t});\r\n\r\n\t\t\t\tdate.add(1, \"days\");\r\n\r\n\t\t\t\tdays.push({\r\n\t\t\t\t\tdate: date.clone().format(),\r\n\t\t\t\t\tstate: week.thuState,\r\n stateClass: getClassForState(week.thuState),\r\n stateText: stateLookup[week.thuState],\r\n\t\t\t\t\trequestId: week.thuRequestId || 0,\r\n\t\t\t\t\tisInMonth: date.month() === actualMonth,\r\n\t\t\t\t\tisToday: date.isSame(today, 'day')\r\n\t\t\t\t});\r\n\r\n\t\t\t\tdate.add(1, \"days\");\r\n\r\n\t\t\t\tdays.push({\r\n\t\t\t\t\tdate: date.clone().format(),\r\n\t\t\t\t\tstate: week.friState,\r\n stateClass: getClassForState(week.friState),\r\n stateText: stateLookup[week.friState],\r\n\t\t\t\t\trequestId: week.friRequestId || 0,\r\n\t\t\t\t\tisInMonth: date.month() === actualMonth,\r\n\t\t\t\t\tisToday: date.isSame(today, 'day')\r\n\t\t\t\t});\r\n\r\n\t\t\t\tdate.add(1, \"days\");\r\n\r\n\t\t\t\tdays.push({\r\n\t\t\t\t\tdate: date.clone().format(),\r\n\t\t\t\t\tstate: week.satState,\r\n stateClass: getClassForState(week.satState),\r\n stateText: stateLookup[week.satState],\r\n\t\t\t\t\trequestId: week.satRequestId || 0,\r\n\t\t\t\t\tisInMonth: date.month() === actualMonth,\r\n\t\t\t\t\tisToday: date.isSame(today, 'day')\r\n\t\t\t\t});\r\n\r\n\t\t\t\tdate.add(1, \"days\");\r\n\r\n\t\t\t\tdays.push({\r\n\t\t\t\t\tdate: date.clone().format(),\r\n\t\t\t\t\tstate: week.sunState,\r\n stateClass: getClassForState(week.sunState),\r\n stateText: stateLookup[week.sunState],\r\n\t\t\t\t\trequestId: week.sunRequestId || 0,\r\n\t\t\t\t\tisInMonth: date.month() === actualMonth,\r\n\t\t\t\t\tisToday: date.isSame(today, 'day')\r\n\t\t\t\t});\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tweekStartDate: week.weekStartDate,\r\n\t\t\t\t\tweekNumber: week.weekNumber,\r\n\t\t\t\t\tdays : days\r\n\t\t\t\t};\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfunction _request() { return { type: weeksRequestType }; }\r\n\tfunction _success(weeks, siteId, month, year) { return { type: weeksSuccessType, weeks, siteId, month, year }; }\r\n\tfunction _failure(error) { return { type: weeksFailureType, error }; }\r\n}\r\n\r\n\r\nexport const reducer = (state, action) => {\r\n\tstate = state || initialState;\r\n\r\n\tif (action.type === weeksRequestType) {\r\n\t\treturn { ...state, isLoading: true, canRequest: false };\r\n\t}\r\n\r\n\tif (action.type === weeksSuccessType) {\r\n\t\treturn { ...state, isLoading: false, canRequest: true, weeks: action.weeks, siteId: action.siteId, month: action.month, year: action.year };\r\n\t}\r\n\r\n\tif (action.type === weeksFailureType) {\r\n\t\treturn { ...state, isLoading: false, canRequest: true, error: action.error};\r\n\t}\r\n\r\n\treturn state;\r\n};","export const requestTypes = {\r\n\tholiday: 1,\r\n\tabsence: 2\r\n};\r\n\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: ItemCategories\r\n// Details: Item categories constant\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 103782 10/12/19 JC M01 Added stringFromUTF8Array\r\n// 106452 04/03/20 JC M02 Added detectCompatibleBrowser, detectIE\r\n// 103839 06/04/20 JC M03 Added formatValue\r\n// 108238 09/06/20 JC M04 Added getDateFormat, getTimeFormat, getDateTimeFormat\r\n// 108958 24/08/20 JC M05 Added applyFrameKiller\r\n// 115164 12/10/21 JC M06JC Added FormatEnumString\r\n// WI2232 02/02/23 JC M07JC Added getDayFormat, getDayAndDateFormat, getDayAndDateTimeFormat\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport DOMPurify from \"dompurify\"; //M02\r\n\r\nexport const utils = {\r\n truncateDate,\r\n byteArrayToString, //M01\r\n getSafeHTML, //M01\r\n detectCompatibleBrowser, //M02\r\n formatValue, //M03\r\n getDateFormat, //M04\r\n getTimeFormat, //M04\r\n getDayFormat, //M07JC\r\n getDayAndDateFormat, //M07JC\r\n getDateTimeFormat, //M04\r\n getDayAndDateTimeFormat, //M07JC\r\n applyFrameKiller, //M05\r\n formatEnumString //M06JC\r\n};\r\n\r\nfunction truncateDate(date) {\r\n let pos = date.indexOf(\"T\");\r\n if (pos !== -1)\r\n return date.substr(0, pos);\r\n return date;\r\n}\r\n\r\n// M01 base64 encoded ascii to ucs-2 string\r\nfunction byteArrayToString(array) {\r\n return decodeURIComponent(escape(window.atob(array)));\r\n}\r\n\r\n// M01 base64 encoded ascii to ucs-2 string\r\nfunction getSafeHTML(htmlContent) {\r\n //default to blank string\r\n let html = \"\";\r\n\r\n //if we've got any note html conent\r\n if (htmlContent) {\r\n\r\n //convert to a string\r\n html = utils.byteArrayToString(htmlContent);\r\n\r\n //and purify using DOMPurify\r\n htmlContent = DOMPurify.sanitize(htmlContent)\r\n }\r\n\r\n return {\r\n //return in correct format\r\n __html: html\r\n };\r\n\r\n}\r\n\r\n// M02 detect compatible browser\r\nfunction detectCompatibleBrowser() {\r\n\r\n //any browser that isn't IE is compatible\r\n return !detectIE()\r\n}\r\n\r\n//M05 apply frame killer\r\nfunction applyFrameKiller() {\r\n\r\n //delegate to private\r\n return vApplyFrameKiller();\r\n}\r\n\r\n//M03 format value\r\nfunction formatValue(value, inputType, decimalPlaces) {\r\n if (inputType === \"checkbox\") {\r\n return value.toLowerCase() === \"true\" ? true : false;\r\n }\r\n else if (inputType === \"number\") {\r\n var numeric = parseFloat(value);\r\n return isNaN(numeric)\r\n ? \"\"\r\n : numeric.toFixed(decimalPlaces);\r\n }\r\n return value;\r\n}\r\n\r\n//M04 get date format - these are temporary for consistency across application, but should really be replaced with mooment locale settings at some point\r\nfunction getDateFormat() {\r\n return \"DD/MM/YYYY\";\r\n}\r\n\r\n//M04 get time format - these are temporary for consistency across application, but should really be replaced with mooment locale settings at some point\r\nfunction getTimeFormat() {\r\n return \"HH:mm\";\r\n}\r\n\r\n//M07JC get day format - these are temporary for consistency across application, but should really be replaced with mooment locale settings at some point\r\nfunction getDayFormat() {\r\n return \"ddd\";\r\n}\r\n\r\n//M07JC get day and date format - these are temporary for consistency across application, but should really be replaced with mooment locale settings at some point\r\nfunction getDayAndDateFormat() {\r\n return getDayFormat() + \" \" + getDateFormat();\r\n}\r\n\r\n//M04 get date time format - these are temporary for consistency across application, but should really be replaced with mooment locale settings at some point\r\nfunction getDateTimeFormat() {\r\n return getDateFormat() + \" \" + getTimeFormat();\r\n}\r\n\r\n//M07JC get day date time format - these are temporary for consistency across application, but should really be replaced with mooment locale settings at some point\r\nfunction getDayAndDateTimeFormat() {\r\n return getDayFormat() + \" \" + getDateTimeFormat();\r\n}\r\n\r\n//M06JC format enum string\r\nfunction formatEnumString(forString) {\r\n let sReturnString = \"\";\r\n\r\n //if a string passed\r\n if (typeof forString === 'string') {\r\n //start with passed string\r\n sReturnString = forString;\r\n\r\n //perform string replaces\r\n sReturnString = sReturnString.replaceAll(\"_\", \" \");\r\n\r\n //capitalise first letter\r\n sReturnString = sReturnString[0].toUpperCase() + sReturnString.substring(1)\r\n }\r\n\r\n //return\r\n return sReturnString\r\n}\r\n\r\n// #region Private functions\r\n\r\n// M02 detect if IE exists (private)\r\nfunction detectIE() {\r\n var ua = window.navigator.userAgent;\r\n\r\n var msie = ua.indexOf('MSIE ');\r\n if (msie > 0) {\r\n // IE 10 or older => return version number\r\n return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);\r\n }\r\n\r\n var trident = ua.indexOf('Trident/');\r\n if (trident > 0) {\r\n // IE 11 => return version number\r\n var rv = ua.indexOf('rv:');\r\n return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);\r\n }\r\n\r\n //commented out as Edge is okay \r\n //var edge = ua.indexOf('Edge/');\r\n //if (edge > 0) {\r\n // // Edge (IE 12+) => return version number\r\n // return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);\r\n //}\r\n\r\n // other browser\r\n return false;\r\n}\r\n\r\n// M05 apply frame killer\r\nfunction vApplyFrameKiller() {\r\n\r\n if (window.self == window.top) {\r\n document.documentElement.style.display = 'block';\r\n } else {\r\n window.top.location = window.self.location;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n// #endregion","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: Request.js\r\n// Object: Request\r\n// Details: Request store\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 101879 02/07/19 JC M01 Can now copy from another request\r\n// 84474 26/09/19 JC M02 Need to URI encode the site\r\n// 115164 12/10/21 JC M03JC\tAdded day parts, hours\r\n// WI2232 25/01/23 JC M04JC\tAdded SpecificDays\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport { history } from '../history';\r\nimport { fetchActions } from \"../FetchWrapper\";\r\nimport { userActions } from './Authentication';\r\nimport { requestTypes } from '../constants/RequestTypes';\r\nimport { utils } from '../utils/utils';\r\nimport { planActions } from './MyPlan';\r\n\r\nconst requestGetRequestType = 'REQUEST_GET_REQUEST';\r\nconst requestGetSuccessType = 'REQUEST_GET_SUCCESS';\r\nconst requestGetFailureType = 'REQUEST_GET_FAILURE';\r\n\r\nconst requestSaveRequestType = 'REQUEST_SAVE_REQUEST';\r\nconst requestSaveSuccessType = 'REQUEST_SAVE_SUCCESS';\r\nconst requestCheckSuccessType = 'REQUEST_CHECK_SUCCESS';\r\nconst requestSaveFailureType = 'REQUEST_SAVE_FAILURE';\r\n\r\nconst requestAckOrCancelRequestType = 'REQUEST_ACK_OR_CANCEL_REQUEST';\r\nconst requestAckOrCancelSuccessType = 'REQUEST_ACK_OR_CANCEL_SUCCESS';\r\nconst requestAckOrCancelFailureType = 'REQUEST_ACK_OR_CANCEL_FAILURE';\r\n\r\nconst requestCheckClearType = 'REQUEST_CHECK_CLEAR';\r\nconst requestFromCalendar = 'REQUEST_FROM_CALENDAR';\r\n\r\nconst requestCopyAcknowledge = 'REQUEST_COPYACKNOWLEDGE'; //M01 \r\n\r\nconst initialState = {\r\n\trequest: undefined,\r\n\tisLoading: false,\r\n\terror: undefined,\r\n\tcheckResponse: undefined,\r\n\tfromCalendar: undefined,\r\n\tcopyAcknowledge: false //M01\r\n};\r\n\r\nexport const requestActions = {\r\n\tget,\r\n\tsave,\r\n\tcheck,\r\n\tclearCheck,\r\n\tacknowledge,\r\n\tcancel,\r\n\tsetFromCalendar,\r\n\tsetCopyAcknowledge //M01\r\n};\r\n\r\nfunction get(id, date, copyfromid) {\r\n\treturn (dispatch, getState) => {\r\n\t\tif (!getState().clientConfiguration.isLoaded)\r\n\t\t\treturn;\r\n\r\n\t\tif (!getState().clientConfiguration.config.endpoint && !getState().authentication.user)\r\n\t\t\treturn;\r\n\r\n\t\tdispatch(_request());\r\n\r\n\t\tconst url = getState().clientConfiguration.config.endpoint + \"/requests/\" + id;\r\n\t\tconst query = `?copyfromid=${copyfromid}`; //M01 build up a query string, passing in the copy from id\r\n\t\tconst ticket = getState().authentication.user.ticket;\r\n\r\n\t\tfetchActions.get(url + query, ticket) //M01 add the query to the URL\r\n\t\t\t.then(\r\n\t\t\t\tresponse => {\r\n\t\t\t\t\tif (+id === 0 && date && date !== \"0\") {//M01 check we've not been passed a null date\r\n\t\t\t\t\t\tresponse.data.fromDate = utils.truncateDate(date);\r\n\t\t\t\t\t\tresponse.data.toDate = utils.truncateDate(date);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tresponse.data.fromDate = utils.truncateDate(response.data.fromDate);\r\n\t\t\t\t\t\tresponse.data.toDate = utils.truncateDate(response.data.toDate);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tresponse.data.timestamp = Date.now();\r\n\r\n\t\t\t\t\tdispatch(_success(response.data));\r\n\t\t\t\t},\r\n\t\t\t\terror => {\r\n\t\t\t\t\tif (error.sessionExpired) {\r\n\t\t\t\t\t\tdispatch(userActions.sessionExpired());\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvar message = `Could not get request: ${error.message}`;\r\n\t\t\t\t\t\tdispatch(_failure(message));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t};\r\n\r\n\tfunction _request() { return { type: requestGetRequestType }; }\r\n\tfunction _success(request) { return { type: requestGetSuccessType, request }; }\r\n\tfunction _failure(error) { return { type: requestGetFailureType, error }; }\r\n}\r\n\r\n\r\nfunction save(id, requestTypeId, absenceReasonId, fromDate, toDate, isSpecificDays, specificDays,\r\n\t\t\t sites, requestNote, dayPart, hours) { //M03JC\r\n\treturn saveOrCheck(id, requestTypeId, absenceReasonId, fromDate, toDate, isSpecificDays, specificDays,\r\n\t\t\t\t\t sites, requestNote, dayPart, hours, false); //M03JC M04JC\r\n}\r\n\r\nfunction check(id, requestTypeId, absenceReasonId, fromDate, toDate, isSpecificDays, specificDays,\r\n\t\t\t sites, requestNote, dayPart, hours) { //M03JC\r\n\treturn saveOrCheck(id, requestTypeId, absenceReasonId, fromDate, toDate, isSpecificDays, specificDays,\r\n\t\t\t\t\t sites, requestNote, dayPart, hours, true); //M03JC M04JC\r\n}\r\n\r\nfunction saveOrCheck(id, requestTypeId, absenceReasonId, fromDate, toDate, isSpecificDays, specificDays,\r\n\tsites, requestNote, dayPart, hours, check) { //M03JC M04JC\r\n\treturn (dispatch, getState) => {\r\n\t\tif (!getState().clientConfiguration.isLoaded)\r\n\t\t\treturn;\r\n\r\n\t\tif (!getState().clientConfiguration.config.endpoint && !getState().authentication.user)\r\n\t\t\treturn;\r\n\r\n\t\tdispatch(_request());\r\n\r\n\t\tconst url = getState().clientConfiguration.config.endpoint + \"/requests?checkHoliday=\" + check;\r\n\t\tconst ticket = getState().authentication.user.ticket;\r\n\r\n\t\tconst absenceReasons =\r\n\t\t\trequestTypeId === requestTypes.absence\r\n\t\t\t\t? [{ absenceReasonId, isSelected: true }]\r\n\t\t\t\t: [];\r\n\r\n\t\t//M04JC build return specific days\r\n\t\tlet returnSpecificDays = [];\r\n\t\tif (isSpecificDays) {\r\n\t\t\t//go through each specific day\r\n\t\t\tspecificDays.forEach(function (specificDay) {\r\n\t\t\t\t//and if included\r\n\t\t\t\tif (specificDay.isIncluded) {\r\n\t\t\t\t\t//add to the return\r\n\t\t\t\t\treturnSpecificDays.push(specificDay.specificDate);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst data = {\r\n\t\t\tid, requestTypeId, absenceReasons, fromDate, toDate, sites, requestNote, dayPart, hours,\r\n\t\t\tisSpecificDays, specificDays: returnSpecificDays\r\n\t\t}; //M03JC M04JC\r\n\r\n\t\tfetchActions.post(url, ticket, data)\r\n\t\t\t.then(\r\n\t\t\t\tresponse => {\r\n\t\t\t\t\tif (check) {\r\n\t\t\t\t\t\tdispatch(_checkSuccess(response.data));\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tdispatch(_saveSuccess());\r\n\t\t\t\t\t\tnavigateAwayFromRequest(dispatch, getState);\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\terror => {\r\n\t\t\t\t\tif (error.sessionExpired) {\r\n\t\t\t\t\t\tdispatch(userActions.sessionExpired());\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvar message = `Could not ${check ? \"check\" : \"save\"} request: ${error.message}`;\r\n\t\t\t\t\t\tdispatch(_failure(message));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t};\r\n\r\n\tfunction _request() { return { type: requestSaveRequestType }; }\r\n\tfunction _saveSuccess() { return { type: requestSaveSuccessType }; }\r\n\tfunction _checkSuccess(checkResponse) { return { type: requestCheckSuccessType, checkResponse }; }\r\n\tfunction _failure(error) { return { type: requestSaveFailureType, error }; }\r\n}\r\n\r\nfunction clearCheck() {\r\n\treturn (dispatch) => {\r\n\t\tdispatch({ type: requestCheckClearType });\r\n\t};\r\n}\r\n\r\nfunction acknowledge(id) {\r\n\treturn (dispatch, getState) => {\r\n\r\n\t\tif (!getState().clientConfiguration.isLoaded)\r\n\t\t\treturn;\r\n\r\n\t\tif (!getState().clientConfiguration.config.endpoint && !getState().authentication.user)\r\n\t\t\treturn;\r\n\r\n\t\tdispatch(_request());\r\n\r\n\t\tconst url = getState().clientConfiguration.config.endpoint + \"/requests/acknowledge/\" + id;\r\n\t\tconst ticket = getState().authentication.user.ticket;\r\n\r\n\t\tfetchActions.post(url, ticket)\r\n\t\t\t.then(\r\n\t\t\t\tresponse => {\r\n\t\t\t\t\tdispatch(_success());\r\n\t\t\t\t\tnavigateAwayFromRequest(dispatch, getState);\r\n\t\t\t\t},\r\n\t\t\t\terror => {\r\n\t\t\t\t\tif (error.sessionExpired) {\r\n\t\t\t\t\t\tdispatch(userActions.sessionExpired());\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvar message = `Could not acknowledge request: ${error.message}`;\r\n\t\t\t\t\t\tdispatch(_failure(message));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t};\r\n\r\n\tfunction _request() { return { type: requestAckOrCancelRequestType }; }\r\n\tfunction _success() { return { type: requestAckOrCancelSuccessType }; }\r\n\tfunction _failure(error) { return { type: requestAckOrCancelFailureType, error }; }\r\n}\r\n\r\nfunction cancel(id) {\r\n\treturn (dispatch, getState) => {\r\n\r\n\t\tif (!getState().clientConfiguration.isLoaded)\r\n\t\t\treturn;\r\n\r\n\t\tif (!getState().clientConfiguration.config.endpoint && !getState().authentication.user)\r\n\t\t\treturn;\r\n\r\n\t\tdispatch(_request());\r\n\r\n\t\tconst url = getState().clientConfiguration.config.endpoint + \"/requests/cancel/\" + id;\r\n\t\tconst ticket = getState().authentication.user.ticket;\r\n\r\n\t\tfetchActions.post(url, ticket)\r\n\t\t\t.then(\r\n\t\t\t\tresponse => {\r\n\t\t\t\t\tdispatch(_success());\r\n\t\t\t\t\tnavigateAwayFromRequest(dispatch, getState);\r\n\t\t\t\t},\r\n\t\t\t\terror => {\r\n\t\t\t\t\tif (error.sessionExpired) {\r\n\t\t\t\t\t\tdispatch(userActions.sessionExpired());\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvar message = `Could not cancel request: ${error.message}`;\r\n\t\t\t\t\t\tdispatch(_failure(message));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t};\r\n\r\n\tfunction _request() { return { type: requestAckOrCancelRequestType }; }\r\n\tfunction _success() { return { type: requestAckOrCancelSuccessType }; }\r\n\tfunction _failure(error) { return { type: requestAckOrCancelFailureType, error }; }\r\n}\r\n\r\nfunction setFromCalendar(fromCalendar) {\r\n\treturn (dispatch) => {\r\n\t\tdispatch({ type: requestFromCalendar, fromCalendar });\r\n\t};\r\n}\r\n\r\n//M01 set copy acknowledge\r\n//function setCopyAcknowledge(_copyAcknowledge) {\r\n// //this.copyAcknowledge = _copyAcknowledge;\r\n// //const { copyAcknowledge } = getState().request;\r\n// //copyAcknowledge = true;\r\n// this.setState({ copyAcknowledge: _copyAcknowledge})\r\n//}\r\n\r\n//M01 set copy acknowledge\r\nfunction setCopyAcknowledge(copyAcknowledge) {\r\n\treturn (dispatch) => {\r\n\t\tdispatch({ type: requestCopyAcknowledge, copyAcknowledge });\r\n\t};\r\n}\r\n\r\nfunction navigateAwayFromRequest(dispatch, getState) {\r\n\tconst { fromCalendar, copyAcknowledge } = getState().request; //M01 also get copyAcknowledge\r\n\tdispatch(planActions.refresh());\r\n\r\n\t//M01 get the id from the request\r\n\tvar requestId = getState().request.request.id\r\n\r\n\t//M01 - if copy acknowledge, push to new, making copy of original\r\n\tif (copyAcknowledge) {\r\n\r\n\t\t//push back to the history page using a copy request, passing in id of 0 for new, a null date and the request id\r\n\t\t//if attempting to do this without a new private route the page simply doesn't load\r\n\t\thistory.push(`/myrequests_copy/detail/0/0/${requestId}`);\r\n\t}\r\n\telse {\r\n\t\tif (fromCalendar) {\r\n\t\t\tconst { siteId, site, year, month } = fromCalendar;\r\n\t\t\thistory.push(`/myplan/site/${siteId}/${encodeURIComponent(site)}/${year}/${month}`); //M02\r\n\t\t}\r\n\t\telse {\r\n\t\t\thistory.push(`/myrequests`);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport const reducer = (state, action) => {\r\n\tstate = state || initialState;\r\n\r\n\t// Get request\r\n\tif (action.type === requestGetRequestType) {\r\n\t\treturn { ...state, isLoading: true, error: undefined };\r\n\t}\r\n\r\n\tif (action.type === requestGetSuccessType) {\r\n\t\treturn { ...state, isLoading: false, request: action.request, checkResponse: undefined };\r\n\t}\r\n\r\n\tif (action.type === requestGetFailureType) {\r\n\t\treturn { ...state, isLoading: false, error: action.error };\r\n\t}\r\n\r\n\t// Save and check\r\n\tif (action.type === requestSaveRequestType) {\r\n\t\treturn { ...state, isLoading: true, error: undefined, checkResponse: undefined };\r\n\t}\r\n\r\n\tif (action.type === requestSaveSuccessType) {\r\n\t\treturn { ...state, isLoading: false, checkResponse: undefined };\r\n\t}\r\n\r\n\tif (action.type === requestCheckSuccessType) {\r\n\t\treturn { ...state, isLoading: false, checkResponse: action.checkResponse };\r\n\t}\r\n\r\n\tif (action.type === requestSaveFailureType) {\r\n\t\treturn { ...state, isLoading: false, error: action.error, checkResponse: undefined };\r\n\t}\r\n\r\n\tif (action.type === requestCheckClearType) {\r\n\t\treturn { ...state, checkResponse: undefined };\r\n\t}\r\n\r\n\t// Ack or cancel\r\n\tif (action.type === requestAckOrCancelRequestType) {\r\n\t\treturn { ...state, isLoading: true, error: undefined };\r\n\t}\r\n\r\n\tif (action.type === requestAckOrCancelSuccessType) {\r\n\t\treturn { ...state, isLoading: false, error: undefined, checkResponse: undefined };\r\n\t}\r\n\r\n\tif (action.type === requestAckOrCancelFailureType) {\r\n\t\treturn { ...state, isLoading: false, error: action.error };\r\n\t}\r\n\r\n\t// From calendar\r\n\tif (action.type === requestFromCalendar) {\r\n\t\treturn { ...state, fromCalendar: action.fromCalendar };\r\n\t}\r\n\r\n\t// M01 copy acknowledge\r\n\tif (action.type === requestCopyAcknowledge) {\r\n\t\treturn { ...state, copyAcknowledge: action.copyAcknowledge };\r\n\t}\r\n\r\n\treturn state;\r\n};","const printViewShow = 'ALERT_SUCCESS';\r\nconst printViewHide = 'ALERT_CLEAR';\r\n\r\nconst initialState = {\r\n\titem: undefined\r\n};\r\n\r\nexport const printViewActions = {\r\n\tshow,\r\n\thide\r\n};\r\n\r\nfunction show(item) {\r\n\treturn { type: printViewShow, item };\r\n}\r\n\r\nfunction hide() {\r\n\treturn { type: printViewHide };\r\n}\r\n\r\n\r\nexport const reducer = (state, action) => {\r\n\tstate = state || initialState;\r\n\r\n\tif (action.type === printViewShow) {\r\n\t\treturn { ...state, item: action.item };\r\n\t}\r\n\r\n\tif (action.type === printViewHide) {\r\n\t\treturn { ...state, item: undefined };\r\n\t}\r\n\r\n\treturn state;\r\n};","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2020 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: PortalRedirect\r\n// Details: PortalRedirect store\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 106380 30/04/20 JC New\r\n// 103839 13/05/20 JC M01 Added TeamPortal redirect\r\n//-------------------------------------------------------\r\n*/\r\nimport { fetchActions } from \"../FetchWrapper\";\r\nimport { history } from '../history';\r\n\r\nexport const toPortalRequestType = 'PORTALREDIRECT_TOPORTAL_REQUEST';\r\nexport const toPortalSuccessType = 'PORTALREDIRECT_TOPORTAL_SUCCESS';\r\nexport const toPortalFailureType = 'PORTALREDIRECT_TOPORTAL_FAILURE';\r\nexport const cleanUpType = 'PORTALREDIRECT_CLEANUP';\r\n\r\nconst initialState = {\r\n isLoading: false,\r\n ssoAuthenticationTicket: \"\"\r\n};\r\n\r\nexport const portalRedirectActions = {\r\n toPortal,\r\n cleanUp\r\n};\r\n\r\nfunction toPortal(portalRedirectType, portalLoginURL) { //M01\r\n return (dispatch, getState) => {\r\n dispatch(_toPortalRequest());\r\n \r\n const url = getState().clientConfiguration.config.endpoint + \"/Redirect/ToPortal\";\r\n const ticket = getState().authentication.user.ticket;\r\n const query = `?PortalRedirectType=${portalRedirectType}`;\r\n\r\n fetchActions.post(url + query, ticket)\r\n .then(\r\n response => {\r\n let data = response.data;\r\n // login successful if there's a token in the response\r\n if (data.ticket) {\r\n\r\n //dispath success\r\n dispatch(_toPortalSuccess(data.ticket));\r\n\r\n //get the link\r\n let link = \"\";\r\n if (portalLoginURL && data.ticket && data.ticket != \"\") { //M01\r\n link = `${portalLoginURL}login/ssoAuthenticationTicket/${data.ticket}`; //M01\r\n }\r\n\r\n //open the url in a new tab\r\n window.open(link, \"_blank\"); \r\n\r\n //push back to main page\r\n history.push(\"/\")\r\n\r\n } else {\r\n var message = \"Could not log in\";\r\n dispatch(_toPortalFailure(message));\r\n } \r\n },\r\n error => {\r\n var message = `Could not log in: ${error.message}`;\r\n dispatch(_toPortalFailure(message));\r\n }\r\n );\r\n };\r\n}\r\n\r\nfunction cleanUp() {\r\n return (dispatch) => {\r\n dispatch(_cleanUp());\r\n };\r\n}\r\n\r\nfunction _toPortalRequest() { return { type: toPortalRequestType }; }\r\nfunction _toPortalSuccess(ticket) { return { type: toPortalSuccessType, ticket }; }\r\nfunction _toPortalFailure(error) { return { type: toPortalFailureType, error }; }\r\nfunction _cleanUp() { return { type: cleanUpType }; }\r\n\r\nexport const reducer = (state, action) => {\r\n state = state || initialState;\r\n\r\n if (action.type === toPortalRequestType) {\r\n return { ...state, isLoading: true, error: undefined, ssoAuthenticationTicket: \"\" };\r\n }\r\n\r\n if (action.type === toPortalSuccessType) {\r\n return { ...state, isLoading: false, ssoAuthenticationTicket: action.ticket, error: undefined };\r\n }\r\n\r\n if (action.type === toPortalFailureType) {\r\n return { ...state, isLoading: false, error: action.error };\r\n }\r\n\r\n if (action.type === cleanUpType) {\r\n return { ...state, isLoading: false, error: undefined, ssoAuthenticationTicket: \"\" };\r\n }\r\n \r\n return state;\r\n};","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2024 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: DataFormDataTypes\r\n// Details: DataFormDataTypes constant\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// WI3713 25/01/24 JC Added\r\n//-------------------------------------------------------\r\n*/\r\n//in line with TCMS INXGlobals.DataFormDataTypeEnum, but only containing relevant data form types\r\nexport const dataFormDataTypes = {\r\n\tnone: 0,\r\n\ttext: 1,\r\n\tcheck_box: 2,\r\n\tdate_and_time: 4,\r\n\tlist: 5,\r\n\tnumeric_0dp: 6,\r\n\tnumeric_1dp: 7,\r\n\tnumeric_2dp: 8,\r\n\tnumeric_3dp: 9,\r\n\tnumeric_4dp: 10,\r\n\timage: 11,\r\n\tsignature_box: 13,\r\n\tmultiline_text: 15,\r\n\tsection_heading: 17,\r\n\turl: 24\r\n};\r\n","//-------------------------------------------------------\r\n// Copyright (c) 2024 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: DataForm\r\n// Details: DataForm store\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// WI3713 24/01/24 JC\t\tNew\r\n//-------------------------------------------------------\r\n\r\nimport { fetchActions } from \"../FetchWrapper\";\r\nimport { userActions } from './Authentication';\r\nimport { dataFormDataTypes } from \"../constants/DataFormDataTypes\";\r\n\r\nconst dataFormRequestType = 'DATAFORM_REQUEST';\r\nconst dataFormSuccessType = 'DATAFORM_SUCCESS';\r\nconst dataFormFailureType = 'DATAFORM_FAILURE';\r\nconst dataFormUpdateChangedAnswerType = \"DATAFORM_UPDATECHANGEDANSWER\";\r\nconst dataFormSaveType = 'DATAFORM_SAVE';\r\nconst dataFormSaveFailureType = \"DATAFORM_SAVEFAILURE\";\r\nconst dataFormValidatedErrorType = 'DATAFORM_VALIDATEDERROR';\r\nconst dataFormRemoveMessageBoxTextType = 'DATAFORM_REMOVEMESSAGEBOXTEXT';\r\n\r\nconst initialState = {\r\n\tdataForm: undefined,\r\n\tchangedAnswers: {},\r\n\tvalidatedAnswers: {},\r\n\townerId: 0,\r\n\townerType: 0,\r\n\tisLoading: false,\r\n\tcanRequest: true,\r\n\terror: undefined,\r\n\tvalidationError: undefined,\r\n\thasSaveError: false,\r\n\tmessageBoxText: undefined\r\n};\r\n\r\nexport const dataFormActions = {\r\n\tgetDataForm,\r\n\tupdateAnswer,\r\n\tsave,\r\n\tremoveMessageBoxText\r\n};\r\n\r\nfunction getDataForm(ownerId, ownerType) {\r\n\treturn (dispatch, getState) => {\r\n\r\n\t\tif (!getState().clientConfiguration.isLoaded)\r\n\t\t\treturn;\r\n\r\n\t\tif (!getState().clientConfiguration.config.endpoint && !getState().authentication.user)\r\n\t\t\treturn;\r\n\r\n\t\tdispatch(_request());\r\n\r\n\t\tconst url = getState().clientConfiguration.config.endpoint + \"/EmployeeDataForms/Get\";\r\n\t\tconst query = `?ownerId=${ownerId}&ownerType=${ownerType}`;\r\n const ticket = getState().authentication.user.ticket;\r\n\r\n\r\n\t\tfetchActions.get(url + query, ticket)\r\n\t\t\t.then(\r\n\t\t\t\tresponse => {\r\n\t\t\t\t\tconst dataForm = response.data;\r\n\t\t\t\t\tdatesToHtml(dataForm);\r\n\t\t\t\t\tdispatch(_success(dataForm, ownerId, ownerType));\r\n\t\t\t\t},\r\n\t\t\t\terror => {\r\n\t\t\t\t\tif (error.sessionExpired) {\r\n\t\t\t\t\t\tdispatch(userActions.sessionExpired());\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvar message = `Could not get data form: ${error.message}`;\r\n\t\t\t\t\t\tdispatch(_failure(message));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t};\r\n\r\n\tfunction datesToHtml(dataForm) {\r\n\t\treturn dataForm.dataFormItems.map((item, i) => {\r\n\t\t\tif (item.dataType === dataFormDataTypes.date_and_time) // DateTime\r\n\t\t\t\titem.answer = item.answer.replace(/\\//g, \"-\");\r\n\t\t\treturn item;\r\n\t\t});\r\n\t}\r\n\r\n\tfunction _request() { return { type: dataFormRequestType }; }\r\n\tfunction _success(dataForm, ownerId, ownerType) { return { type: dataFormSuccessType, dataForm, ownerId, ownerType }; }\r\n\tfunction _failure(error) { return { type: dataFormFailureType, error }; }\r\n}\r\n\r\nfunction updateAnswer(item) {\r\n\treturn (dispatch, getState) => {\r\n\r\n\t\t//declare new changed answers object\r\n\t\tlet newChangedAnswers = {};\r\n\r\n\t\t//determine if we've found a match\r\n\t\tlet bMatchFound = false;\r\n\r\n\t\t//get state objects\r\n\t\tconst { dataForm, changedAnswers, validatedAnswers } = getState().dataForm;\r\n\r\n\t\t//go through each changed answer\r\n\t\tObject.keys(changedAnswers).forEach(function (lineNumber) {\r\n\r\n\t\t\t// if the lineNumber matches\r\n\t\t\tif (lineNumber.toString() === item.lineNumber.toString()) {\r\n\r\n\t\t\t\t//flag as match found\r\n\t\t\t\tbMatchFound = true;\r\n\r\n\t\t\t\t//if changed\r\n\t\t\t\tif (item.isChanged) {\r\n\t\t\t\t\t// if changed, add to new changed answers\r\n\t\t\t\t\tnewChangedAnswers[lineNumber] = { answer: item.answer};\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t//do nothing as will not be copied over, i.e. deleted\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t//doesn't match so copy over anyway\r\n\t\t\t\tnewChangedAnswers[lineNumber] = { ...changedAnswers[lineNumber] };\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t//not found & item is changed so add\r\n\t\tif (!bMatchFound && item.isChanged) {\r\n\t\t\tnewChangedAnswers[item.lineNumber] = { answer: item.answer};\r\n\t\t}\r\n\r\n\t\t//validate - specifically for this item's line number\r\n\t\tlet validateAnswersWrapper = { validatedAnswers: {}, validationError: undefined, messageBoxText: undefined };\r\n\t\tvalidate(false, dataForm, newChangedAnswers, validatedAnswers, validateAnswersWrapper, item.lineNumber);\r\n\r\n\t\t// apply new list back to state\r\n\t\tdispatch(_updateChangedAnswer(newChangedAnswers, validateAnswersWrapper.validatedAnswers, validateAnswersWrapper.validationError));\r\n\t};\r\n\r\n\tfunction _updateChangedAnswer(changedAnswers, validatedAnswers, validationError) {\r\n\t\treturn { type: dataFormUpdateChangedAnswerType, changedAnswers, validatedAnswers, validationError };\r\n\t}\r\n}\r\n\r\nfunction save(complete) {\r\n\treturn (dispatch, getState) => {\r\n\t\tif (!getState().clientConfiguration.config.endpoint)\r\n\t\t\treturn;\r\n\r\n\t\t// get changed answers from state\r\n\t\tlet { changedAnswers, validatedAnswers, dataForm } = getState().dataForm;\r\n\r\n\t\t//get data form details\r\n\t\tlet { id, dataFormOwnerType } = dataForm;\r\n\r\n\t\t// if any changes in state, or complete\r\n\t\tif (changedAnswers.length !== 0 || complete) {\r\n\r\n\t\t\t//validate\r\n\t\t\tlet validateAnswersWrapper = { validatedAnswers: {}, validationError: undefined, messageBoxText: undefined };\r\n\t\t\tif (validate(complete, dataForm, changedAnswers, validatedAnswers, validateAnswersWrapper, 0)) {\r\n\r\n\t\t\t\tdispatch(_saving(validateAnswersWrapper.validatedAnswers));\r\n\r\n\t\t\t\t//let hasImage = getState().myDetails.imageFile !== null;\r\n\r\n\t\t\t\t//set URL and auth ticket\r\n\t\t\t\tconst url = getState().clientConfiguration.config.endpoint + \"/EmployeeDataForms/Put\";\r\n\t\t\t\tconst query = `?ownerId=${id}&ownerType=${dataFormOwnerType}&complete=${complete}`;\r\n\t\t\t\tconst ticket = getState().authentication.user.ticket;\r\n\t\t\t\tvar data = [];\r\n\r\n\t\t\t\t//build 'data' array from list of changedAnswer\r\n\t\t\t\tObject.keys(changedAnswers).forEach(function (lineNumber) {\r\n\r\n\t\t\t\t\t//get the answer\r\n\t\t\t\t\tlet answer = changedAnswers[lineNumber].answer;\r\n\t\t\t\t\t//add to the data\r\n\t\t\t\t\tdata.push({ key: lineNumber, value: answer });\r\n\t\t\t\t});\r\n\r\n\t\t\t\t//post to the API\r\n\t\t\t\tfetchActions.post(url + query, ticket, data)\r\n\t\t\t\t\t.then(\r\n\t\t\t\t\t\tresponse => {\r\n\t\t\t\t\t\t\tif (response.data) {\r\n\t\t\t\t\t\t\t\tvar message = `Error saving data form: ${response.data}`;\r\n\t\t\t\t\t\t\t\tdispatch(_failure(message));\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tsetTimeout(function () {\r\n\t\t\t\t\t\t\t\tdispatch(dataFormActions.getDataForm(id, dataFormOwnerType));\r\n\t\t\t\t\t\t\t}, 500);\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\terror => {\r\n\t\t\t\t\t\t\tif (error.sessionExpired) {\r\n\t\t\t\t\t\t\t\tdispatch(userActions.sessionExpired());\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tvar message = `Could not save data form: ${error.message}`;\r\n\t\t\t\t\t\t\t\tdispatch(_failure(message));\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t);\r\n\t\t\t} else {\r\n\t\t\t\tdispatch(_validate(validateAnswersWrapper.validatedAnswers, validateAnswersWrapper.validationError, validateAnswersWrapper.messageBoxText));\r\n\t\t\t}//validate end\r\n\t\t}//can save/complete end\r\n\t};\r\n\r\n\tfunction _saving(validatedAnswers) { return { type: dataFormSaveType, validatedAnswers }; }\r\n\tfunction _failure(error) { return { type: dataFormSaveFailureType, error }; }\r\n\tfunction _validate(validatedAnswers, validationError, messageBoxText) {\r\n\t\treturn { type: dataFormValidatedErrorType, validatedAnswers, validationError, messageBoxText };\r\n\t}\r\n}\r\n\r\nfunction removeMessageBoxText() {\r\n\treturn (dispatch) => {\r\n\t\tdispatch(_removeMessageBoxText());\r\n\t};\r\n\tfunction _removeMessageBoxText() { return { type: dataFormRemoveMessageBoxTextType }; }\r\n}\r\n\r\nfunction validate(forComplete, dataForm, changedAnswers, validatedAnswers, validatedAnswersWrapper, specificLineNumber) {\r\n\t//---------------------------------------------\r\n\t//validate a data form for save / complete\r\n\t//---------------------------------------------\r\n\t//build a new validated answers & error\r\n\tlet newValidatedAnswers = {};\r\n\tlet newValidationError = undefined;\r\n\tlet newMessageBoxText = undefined;\r\n\t\r\n\t//iterate through each data form item\r\n\tdataForm.dataFormItems.forEach(function (dataFormItem) {\r\n\t\t//image or signature?\r\n\t\tlet bImageOrSignature = (dataFormItem.dataType === dataFormDataTypes.image || dataFormItem.dataType === dataFormDataTypes.signature_box);\r\n\t\t\r\n\t\t//if looking for a specific line number which isn't this item, then just copy over the validated answer\r\n\t\tlet bValidate = true;\r\n\t\tlet bValidateMandatory = false;\r\n\t\tif (specificLineNumber !== 0) {\r\n\t\t\tif (dataFormItem.lineNumber !== specificLineNumber) {\r\n\t\t\t\tif (dataFormItem.lineNumber in validatedAnswers) {\r\n\t\t\t\t\tnewValidatedAnswers[dataFormItem.lineNumber] = validatedAnswers[dataFormItem.lineNumber];\r\n\t\t\t\t}\r\n\t\t\t\tbValidate = false;\r\n\t\t\t} else {\r\n\t\t\t\t//if for the specific entry, validate mandatory if there's a mandatory error already\r\n\t\t\t\tif (dataFormItem.lineNumber in validatedAnswers) {\r\n\t\t\t\t\tbValidateMandatory = validatedAnswers[dataFormItem.lineNumber].hasMandatoryError;\r\n\t\t\t\t}\t\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//i okay to validate\r\n\t\tif (bValidate) {\r\n\r\n\t\t\t//find the answer & whether there's document content\r\n\t\t\tlet answer = dataFormItem.answer;\r\n\t\t\tlet hasDocumentContent = dataFormItem.hasDocumentContent;\r\n\t\t\tObject.keys(changedAnswers).forEach(function (lineNumber) {\r\n\t\t\t\tif (lineNumber.toString() === dataFormItem.lineNumber.toString()) {\r\n\t\t\t\t\t//got a changed answer?\r\n\t\t\t\t\tanswer = changedAnswers[lineNumber].answer;\r\n\r\n\t\t\t\t\t//if the item allows image upload or is a signature, get the updated hasDocumentContent\r\n\t\t\t\t\tif (bImageOrSignature && (dataFormItem.allowsImageUpload || dataFormItem.dataType === dataFormDataTypes.signature_box)) {\r\n\t\t\t\t\t\thasDocumentContent = answer.length > 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t//mandatory - for complete only or must validate mandatory - either no answer or image/signature and no document content\r\n\t\t\tif (dataFormItem.isMandatory && (forComplete || bValidateMandatory) && (\r\n\t\t\t\t(!bImageOrSignature && answer.length === 0) || (bImageOrSignature && !hasDocumentContent)\r\n\t\t\t)) {\r\n\t\t\t\t//get the correct message\r\n\t\t\t\tlet messageSuffix = \": Mandatory answer missing\";\r\n\t\t\t\tif (dataFormItem.dataType === dataFormDataTypes.image) {\r\n\t\t\t\t\tmessageSuffix = \": Mandatory image missing\";\r\n\t\t\t\t} else if (dataFormItem.dataType === dataFormDataTypes.signature_box) {\r\n\t\t\t\t\tmessageSuffix = \": Mandatory signature missing\";\r\n\t\t\t\t}\r\n\r\n\t\t\t\tnewValidatedAnswers[dataFormItem.lineNumber] = {\r\n\t\t\t\t\thasError: true,\r\n\t\t\t\t\thasMandatoryError: true,\r\n\t\t\t\t\tmessage: dataFormItem.lineText + messageSuffix\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\t//validate - only for certain data types\r\n\t\t\tswitch (dataFormItem.dataType) {\r\n\t\t\t\tcase dataFormDataTypes.numeric_0dp:\r\n\t\t\t\tcase dataFormDataTypes.numeric_1dp:\r\n\t\t\t\tcase dataFormDataTypes.numeric_2dp:\r\n\t\t\t\tcase dataFormDataTypes.numeric_3dp:\r\n\t\t\t\tcase dataFormDataTypes.numeric_4dp:\r\n\t\t\t\t\t//if there's a min or a max value, check we've got an entered value and that it fits in the min/max, treating blank answer as 0\r\n\t\t\t\t\tlet handledAnwser = parseFloat(answer.length === 0 ? 0 : answer);\r\n\t\t\t\t\tif (dataFormItem.maxValue !== 0 &&\r\n\t\t\t\t\t\t(handledAnwser <= dataFormItem.minValue || handledAnwser >= dataFormItem.maxValue)) {\r\n\t\t\t\t\t\tnewValidatedAnswers[dataFormItem.lineNumber] = {\r\n\t\t\t\t\t\t\thasError: true,\r\n\t\t\t\t\t\t\thasMandatoryError: false,\r\n\t\t\t\t\t\t\tmessage: dataFormItem.lineText + \": value must be between \" + dataFormItem.minValue + \" and \" + dataFormItem.maxValue\r\n\t\t\t\t\t\t};\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\t//build up the new validation error based on the validated answers\r\n\tObject.keys(newValidatedAnswers).forEach(function (lineNumber) {\r\n\t\tnewValidationError = (newValidationError === undefined ? \"\" : newValidationError + \"\\n\") + newValidatedAnswers[lineNumber].message;\r\n\t})\t\r\n\r\n\t//return no validated answers\r\n\tlet bOK = Object.keys(newValidatedAnswers).length === 0;\r\n\r\n\t//add message box text if no specific line number\r\n\tif (!bOK && specificLineNumber === 0) {\r\n\t\tnewMessageBoxText = \"Could not \" + (!forComplete ? \"save\" : \"complete\") + \" due to errors\";\r\n\t}\r\n\r\n\t//return new details onto the wrapper to fake byref\r\n\tvalidatedAnswersWrapper.validatedAnswers = newValidatedAnswers;\r\n\tvalidatedAnswersWrapper.validationError = newValidationError;\r\n\tvalidatedAnswersWrapper.messageBoxText = newMessageBoxText;\r\n\t\r\n\treturn bOK;\r\n}\r\n\r\nexport const reducer = (state, action) => {\r\n\tstate = state || initialState;\r\n\r\n\tif (action.type === dataFormRequestType) {\r\n\t\treturn { ...state, isLoading: true, canRequest: false, error: undefined, validationError: undefined, undefined:undefined };\r\n\t}\r\n\r\n\tif (action.type === dataFormSuccessType) {\r\n\t\treturn {\r\n\t\t\t...state, isLoading: false, canRequest: true, dataForm: action.dataForm, ownerId: action.ownerId, ownerType: action.ownerType, error: undefined,\r\n\t\t\tchangedAnswers: {}, validatedAnswers: {}\r\n\t\t};\r\n\t}\r\n\r\n\tif (action.type === dataFormFailureType) {\r\n\t\treturn { ...state, isLoading: false, canRequest: true, error: action.error};\r\n\t}\r\n\r\n\t//update changed answers\r\n\tif (action.type === dataFormUpdateChangedAnswerType) {\r\n\t\treturn { ...state, changedAnswers: action.changedAnswers, validatedAnswers: action.validatedAnswers, validationError: action.validationError };\r\n\t}\r\n\r\n\t//validated error\r\n\tif (action.type === dataFormValidatedErrorType) {\r\n\t\treturn { ...state, validatedAnswers: action.validatedAnswers, validationError: action.validationError, messageBoxText: action.messageBoxText };\r\n\t}\r\n\r\n\t//save\r\n\tif (action.type === dataFormSaveType) {\r\n\t\treturn { ...state, isLoading: true, canRequest: false, error: undefined, hasSaveError: false, validatedAnswers: action.validatedAnswers };\r\n\t}\r\n\r\n\t//error saving\r\n\tif (action.type === dataFormSaveFailureType) {\r\n\t\treturn { ...state, isLoading: false, canRequest: true, error: action.error, hasSaveError: true };\r\n\t}\r\n\r\n\t//remove message box text \r\n\tif (action.type === dataFormRemoveMessageBoxTextType) {\r\n\t\treturn { ...state, messageBoxText: undefined };\r\n\t}\r\n\r\n\treturn state;\r\n};","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2024 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: RedirectController\r\n// Details: RedirectController store\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// WI3713 24/01/24 JC\t\tNew.\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport { history } from '../history';\r\n\r\nexport const redirectRequestType = \"REDIRECT_REQUEST\";\r\nexport const clearRedirectRequestType = \"CLEAR_REDIRECT_REQUEST\";\r\n\r\nconst initialState = {\r\n\tpreviousPageArgs: undefined\r\n}; \r\n\r\nexport const redirectControllerActions = {\r\n\tredirect,\r\n\tclearRedirect\r\n};\r\n\r\nfunction redirect(redirectTo, previousPageArgs) {\r\n\treturn (dispatch) => {\r\n\t\tdispatch(_request(previousPageArgs));\r\n\r\n\t\t//push to the correct page\r\n\t\thistory.push(redirectTo);\r\n\t};\r\n\r\n\tfunction _request(previousPageArgs) { return { type: redirectRequestType, previousPageArgs: previousPageArgs }; }\r\n}\r\n\r\nfunction clearRedirect() {\r\n\treturn (dispatch) => {\r\n\t\tdispatch(_request());\r\n\t};\r\n\r\n\tfunction _request() { return { type: clearRedirectRequestType}; }\r\n}\r\n\r\nexport const reducer = (state, action) => {\r\n\tstate = state || initialState;\r\n\r\n\tif (action.type === redirectRequestType) {\r\n\t\treturn { ...state, previousPageArgs: action.previousPageArgs };\r\n\t}\r\n\r\n\tif (action.type === clearRedirectRequestType) {\r\n\t\treturn { ...state, previousPageArgs: undefined };\r\n\t}\r\n\r\n\treturn state;\r\n};","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Route, Redirect } from 'react-router-dom';\r\n\r\nexport const PrivateRoute = ({ component: Component, ...rest }) =>\r\n\t (\r\n\t\tlocalStorage.getItem('user')\r\n\t\t\t? \r\n\t\t\t: \r\n\t)}\r\n\t/>;\r\n\r\n\r\nPrivateRoute.propTypes = {\r\n\tlocation: PropTypes.string\r\n};\r\n\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: Nav Menu\r\n// Details: Nav Menu\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 101885 26/06/19 AJ M01 Added Links\r\n// 102715 15/08/19 JC M02 Added Contacts\r\n// 104759 21/11/19 JC M03 Whole menu now soft-coded\r\n// 103782 10/12/19 JC M04 Added MyTraining\r\n// 106380 30/04/20 JC M05 Added authentication, ManagerPortal / PortalRedirect page\r\n// 103839 13/05/20 JC M06 Added TeamPortal redirect\r\n// 110638 09/02/21 JC Now uses material-ui\r\n// 115432 17/02/22 JC M07JC Handle logo sizing better\r\n// WI2583 24/01/23 JC M08JC Fix needsSmallMenu prop type\r\n//-------------------------------------------------------\r\n*/\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Link } from 'react-router-dom';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { Col } from \"react-bootstrap\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { AppBar, Container, Divider, Drawer, MenuItem, Toolbar } from '@material-ui/core';\r\nimport { makeStyles, createStyles } from '@material-ui/core/styles';\r\n//import './css/NavMenu.css';\r\n//import { isNullOrndefined } from 'util';\r\n\r\nconst useStyles = makeStyles((theme) =>\r\n createStyles({\r\n logo: {\r\n width: 'auto', // M07JC was 100%\r\n height: 'auto', // M07JC was 100%\r\n maxWidth: '230px',\r\n maxHeight: '72px', // M07JC match paperToolbar maxHeight\r\n },\r\n companyNameLarge: {\r\n color: 'white',\r\n fontSize: '20px',\r\n paddingLeft: theme.spacing(2.5),\r\n },\r\n companyNameSmall: {\r\n color: 'white',\r\n fontSize: '14px',\r\n paddingLeft: theme.spacing(2),\r\n paddingTop: theme.spacing(1.5),\r\n paddingBottom: theme.spacing(1.5),\r\n },\r\n menuItem: {\r\n color: 'white',\r\n textTransform: 'uppercase',\r\n fontSize: '14px',\r\n paddingLeft: theme.spacing(2),\r\n paddingTop: theme.spacing(1.5),\r\n paddingBottom: theme.spacing(1.5),\r\n paddingRight: theme.spacing(2),\r\n '&:hover': {\r\n background: '#88B4DB',\r\n color: 'black',\r\n },\r\n },\r\n activeMenuItem: {\r\n background: '#88B4DB',\r\n color: 'black',\r\n textTransform: 'uppercase',\r\n fontSize: '14px',\r\n paddingLeft: theme.spacing(2),\r\n paddingTop: theme.spacing(1.5),\r\n paddingBottom: theme.spacing(1.5),\r\n paddingRight: theme.spacing(2),\r\n '&:hover': {\r\n background: '#88B4DB',\r\n color: 'black',\r\n },\r\n },\r\n drawerPaperSmall: {\r\n background: '#4C565B;',\r\n height: '100%',\r\n },\r\n drawerPaperLarge: {\r\n background: '#4C565B;',\r\n width: '25%',\r\n },\r\n appBarSmall: {\r\n flexGrow: 1,\r\n background: '#4C565B;',\r\n zIndex: theme.zIndex.drawer + 1, // this pushes the appbar above the paper\r\n },\r\n appBarLarge: {\r\n flexGrow: 1,\r\n background: '#4C565B;',\r\n zIndex: theme.zIndex.drawer + 1, // this pushes the appbar above the paper\r\n },\r\n divider: {\r\n background: 'black',\r\n },\r\n paperToolbar: {\r\n minHeight: '72px', // overridden from normal 64px to better fit page\r\n }\r\n }),\r\n);\r\n\r\nconst NavMenu = (props) => {\r\n\r\n const classes = useStyles();\r\n const [openDrawer, setOpenDrawer] = React.useState(false);\r\n\r\n const handleDrawerBurderClick = () => {\r\n setOpenDrawer(!openDrawer);\r\n };\r\n const handleDrawerClose = () => {\r\n setOpenDrawer(false);\r\n };\r\n\r\n const renderMenuItems = () => {\r\n return (\r\n <>\r\n\r\n {/* M03 notices, if enabled */}\r\n {props.systemControl.configuration && props.systemControl.configuration.epNoticesEnabled\r\n ?\r\n \r\n \r\n Notices\r\n \r\n \r\n : []\r\n }\r\n\r\n {/* M03 documents, if enabled */}\r\n {props.systemControl.configuration && props.systemControl.configuration.epDocumentsEnabled\r\n ?\r\n \r\n \r\n Documents\r\n \r\n \r\n : []\r\n }\r\n\r\n {/* M03 my pay, if enabled */}\r\n {props.systemControl.configuration && props.systemControl.configuration.epMyPayEnabled\r\n ?\r\n \r\n \r\n My Pay\r\n \r\n \r\n : []\r\n }\r\n\r\n {/* M03 my details, if enabled */}\r\n {props.systemControl.configuration && props.systemControl.configuration.epMyDetailsEnabled\r\n ?\r\n \r\n \r\n My Details\r\n \r\n \r\n : []\r\n }\r\n\r\n {/* M03 my plan, if enabled */}\r\n {props.systemControl.configuration && props.systemControl.configuration.epMyPlanEnabled\r\n ?\r\n \r\n \r\n My Plan\r\n \r\n \r\n : []\r\n }\r\n\r\n {/* M03 my requests, if enabled */}\r\n {props.systemControl.configuration && props.systemControl.configuration.epMyRequestsEnabled\r\n ?\r\n \r\n \r\n My Requests\r\n \r\n \r\n : []\r\n }\r\n\r\n {/* M04 my training, if enabled */}\r\n {props.systemControl.configuration && props.systemControl.configuration.epMyTrainingEnabled\r\n ?\r\n \r\n \r\n My training\r\n \r\n \r\n : []\r\n }\r\n\r\n {/* M03 contacts, if enabled */}\r\n {props.systemControl.configuration && props.systemControl.configuration.epContactsEnabled\r\n ?\r\n \r\n \r\n Contacts\r\n \r\n \r\n : []\r\n }\r\n\r\n {/* M03 change password, if enabled */}\r\n {props.systemControl.configuration && props.systemControl.configuration.epChangePasswordEnabled\r\n ?\r\n \r\n \r\n Change Password\r\n\t\t\t\t\t \r\n \r\n : []\r\n }\r\n\r\n {/* M05 manager portal, if enabled */}\r\n {props.systemControl.configuration && props.systemControl.configuration.epManagerPortalEnabled &&\r\n props.authentication && props.authentication.user && props.authentication.user.isEnabledForMP\r\n ?\r\n \r\n \r\n Manager Portal\r\n\t\t\t\t\t \r\n \r\n : []\r\n }\r\n\r\n {/* M06 team portal, if enabled */}\r\n {props.systemControl.configuration && props.systemControl.configuration.epTeamPortalEnabled &&\r\n props.authentication && props.authentication.user && props.authentication.user.isEnabledForTP\r\n ?\r\n \r\n \r\n Team Portal\r\n\t\t\t\t\t \r\n \r\n : []\r\n }\r\n\r\n {/* M07AJ Third Party Return Point, if enabled */}\r\n {props.authentication.user.thirdPartyMenuTitle && props.authentication.user.thirdPartyMenuTitle.length > 0\r\n ?\r\n /*This is deliberate! We need a link container so the menu items render correctly UI wise, we have to enter a 'to', or else the nav bar errors,\r\n and because it's the home page we set the active menu item class to the same as the non-active so it's not highlighted*/\r\n\r\n \r\n {\r\n /*Open the url in a new tab*/\r\n window.open(props.authentication.user.thirdPartyMenuURL, '_blank');\r\n /*This will force the focus away from the link item*/\r\n document.activeElement.blur();\r\n /*Close drawer if necessary*/\r\n handleDrawerBurderClick();\r\n }} >\r\n {props.authentication.user.thirdPartyMenuTitle}\r\n \r\n \r\n : []\r\n }\r\n\r\n {props.systemControl.configuration && props.systemControl.configuration.epLink1Enabled &&\r\n props.systemControl.configuration.epLink1Title && props.systemControl.configuration.epLink1Title.length > 0 /*M03*/\r\n ?\r\n /*This is deliberate! We need a link container so the menu items render correctly UI wise, we have to enter a 'to', or else the nav bar errors,\r\n and because it's the home page we set the active menu item class to the same as the non-active so it's not highlighted*/\r\n \r\n {\r\n /*Open the url in a new tab*/\r\n window.open(props.systemControl.configuration.epLink1URL, '_blank'); /*M03*/\r\n /*This will force the focus away from the link item*/\r\n document.activeElement.blur();\r\n /*Close drawer if necessary*/\r\n handleDrawerBurderClick();\r\n }} >\r\n {props.systemControl.configuration.epLink1Title} {/*M03*/}\r\n \r\n \r\n : []\r\n }\r\n\r\n {props.systemControl.configuration && props.systemControl.configuration.epLink2Enabled &&\r\n props.systemControl.configuration.epLink2Title && props.systemControl.configuration.epLink2Title.length > 0 /*M03*/\r\n ?\r\n /*This is deliberate! We need a link container so the menu items render correctly UI wise, we have to enter a 'to', or else the nav bar errors,\r\n and because it's the home page we set the active menu item class to the same as the non-active so it's not highlighted*/\r\n \r\n {\r\n /*Open the url in a new tab*/\r\n window.open(props.systemControl.configuration.epLink2URL, '_blank'); /*M03*/\r\n /*This will force the focus away from the link item*/\r\n document.activeElement.blur();\r\n /*Close drawer if necessary*/\r\n handleDrawerBurderClick();\r\n }} >\r\n {props.systemControl.configuration.epLink2Title} {/*M03*/}\r\n \r\n \r\n : []\r\n }\r\n\r\n \r\n \r\n Log Out\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n const renderSmallMenu = () => {\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \"Employee\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n {/* below toolbar is what actually pushes the menu items down */}\r\n \r\n {/* company name */}\r\n {props.systemControl.configuration && props.systemControl.configuration.companyName ?\r\n {props.systemControl.configuration && props.systemControl.configuration.companyName} Employee Portal : []}\r\n \r\n\r\n {renderMenuItems()}\r\n \r\n
\r\n );\r\n };\r\n\r\n const renderLargeMenu = () => {\r\n return (\r\n
\r\n \r\n {/*M08JC was true */}\r\n \r\n \"Employee\r\n {props.systemControl.configuration && props.systemControl.configuration.companyName ?\r\n {props.systemControl.configuration && props.systemControl.configuration.companyName} Employee Portal : []}\r\n \r\n \r\n \r\n \r\n {/* below toolbar is what actually pushes the menu items down */}\r\n \r\n {renderMenuItems()}\r\n \r\n
\r\n );\r\n };\r\n\r\n\r\n\r\n return (\r\n <>\r\n {props.needsSmallMenu ?\r\n renderSmallMenu() :\r\n renderLargeMenu()}\r\n \r\n );\r\n};\r\nNavMenu.propTypes = {\r\n //M03 just pass down the whole of system control\r\n //companyName: PropTypes.string.isRequired,\r\n //link1Title: PropTypes.string.isRequired, //M01\r\n //link1URL: PropTypes.string.isRequired, //M01\r\n //link2Title: PropTypes.string.isRequired, //M01\r\n //link2URL: PropTypes.string.isRequired //M01\r\n systemControl: PropTypes.object.isRequired, //M04\r\n authentication: PropTypes.object.isRequired, //M05\r\n needsSmallMenu: PropTypes.bool //M08JC\r\n};\r\n\r\nexport default NavMenu;","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2020 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: DateTimeTypes\r\n// Details: Date time types constant\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 108238 10/06/20 JC Added\r\n//-------------------------------------------------------\r\n*/\r\n\r\nexport const dateTimeTypes = {\r\n dateTime: 1,\r\n date: 2,\r\n time: 3\r\n};\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2020 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: DateTime.js\r\n// Details: DateTime.js\r\n//\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 108238 10/06/20 JC Added\r\n// 112846 13/04/21 JC M01 Added UTC support\r\n// WI3713 06/02/24 JC M02JC Extended UTC support\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport React, { Component } from 'react';\r\nimport { utils } from '../utils/utils';\r\nimport * as Datetime from 'react-datetime';\r\nimport 'react-datetime/css/react-datetime.css';\r\nimport moment from 'moment';\r\nimport Moment from 'react-moment';\r\nimport { dateTimeTypes } from '../constants/DateTimeTypes';\r\n\r\nclass DateTime extends Component {\r\n\r\n render() {\r\n const { componentKey, componentName, className, dateTimeType, value, onBlur, onChange, disabled, disabledFormat,\r\n dateIsUtc } = this.props; //M02JC\r\n\r\n //get the default formats\r\n const globalsDateTimeFormat = utils.getDateTimeFormat()\r\n const globalsDateFormat = utils.getDateFormat()\r\n const globalsTimeFormat = utils.getTimeFormat()\r\n\r\n //if no component disabled passed in, default to false\r\n let localDisabled = (disabled === undefined ? false : disabled);\r\n\r\n //default close on select to false\r\n let closeOnSelect = false;\r\n\r\n //default to global values\r\n let dateTimeFormat = globalsDateTimeFormat;\r\n let dateFormat = globalsDateFormat;\r\n let timeFormat = globalsTimeFormat;\r\n\r\n if (dateTimeType === dateTimeTypes.date) {\r\n //if using date only, set up control as such\r\n dateTimeFormat = globalsDateFormat;\r\n dateFormat = globalsDateFormat;\r\n timeFormat = false;\r\n closeOnSelect = true; // set close on select to true\r\n }\r\n else if (dateTimeType === dateTimeTypes.time) {\r\n //if using time only, set up control as such\r\n dateTimeFormat = globalsTimeFormat;\r\n dateFormat = false;\r\n timeFormat = globalsTimeFormat;\r\n closeOnSelect = true; // set close on select to true\r\n }\r\n\r\n //handle blank sting as null in passed in value\r\n let localValue = (value === \"\" ? null : value);\r\n\r\n //M02JC handle missing dateIsUTC\r\n let localDateIsUtc = (dateIsUtc === undefined ? false : dateIsUtc);\r\n\r\n //show different component dependent on whether enabled or disabled\r\n if (localDisabled) {\r\n\r\n //got an override disabled format?\r\n if (disabledFormat !== undefined) {\r\n dateTimeFormat = disabledFormat;\r\n }\r\n\r\n //disabled with date value - show react-moment\r\n if (localValue !== null) {\r\n\r\n return (\r\n \r\n );\r\n }\r\n //disabled without date value - nothing\r\n else { return [] }\r\n }\r\n else {//enabled - show react-dateime\r\n\r\n //if local value is not null, construct a date using moment and format with date time format\r\n if (localValue !== null) { localValue = moment.utc(value).format(dateTimeFormat) } //M01\r\n\r\n return (\r\n );\r\n }\r\n }\r\n}\r\n\r\nexport default DateTime; \r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2020 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: noteTypes\r\n// Details: note Types constant\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 104762 28/02/20 JC New\r\n//-------------------------------------------------------\r\n*/\r\n\r\nexport const noteTypes = {\r\n text: 0,\r\n html: 1\r\n};\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: PrintView.js\r\n// Details: PrintView.js\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 105066 06/01/20 JC M01 Added font awesome\r\n// 104762 02/03/20 JC M02 Notices can now pass html rather than a note\r\n// 103839 06/04/20 JC M03 React upgrade\r\n// 108238 08/06/20 JC M04 Re-wrote datetime components\r\n//-------------------------------------------------------\r\n//-------------------------------------------------------\r\n*/\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\n//M04 import DateTimeLabel from './DateTimeLabel'; //M04\r\nimport DateTime from './DateTime'; //M04\r\nimport { dateTimeTypes } from '../constants/DateTimeTypes'; //M04\r\nimport { Button } from 'react-bootstrap'; //M01 removed glyphicon\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"; //M01\r\nimport { itemTypes } from '../constants/ItemTypes'; //M02\r\nimport { noteTypes } from '../constants/NoteTypes'; //M02\r\nimport { utils } from '../utils/utils'; //M02\r\nimport './css/PrintView.css';\r\n\r\nclass PrintView extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\texpanded: false\r\n\t\t};\r\n\r\n\t\tthis.handlePrint = this.handlePrint.bind(this);\r\n\t\tthis.handleClose = this.handleClose.bind(this);\r\n\t}\r\n\r\n\thandlePrint = event => {\r\n\t\tevent.preventDefault();\r\n\t\twindow.print();\r\n\t}\r\n\r\n\thandleClose = event => {\r\n\t\tevent.preventDefault();\r\n\t\tthis.props.closeView();\r\n\t}\r\n\r\n\trender() {\r\n\t\tconst { item } = this.props;\r\n\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
\r\n \r\n Print{/* M01 */}\r\n\t\t\t\t\t\r\n \r\n Close{/* M01 */}\r\n\t\t\t\t\t\r\n\t\t\t\t
\r\n\r\n\t\t\t\t

{item.subject}

\r\n\t\t\t\t

{item.typeName}

\r\n

{/*M04*/}\r\n\r\n {item.itemType === itemTypes.notice && item.noteType === noteTypes.html\r\n ? \r\n /* M02 notice only if html - set passed in html */\r\n
\r\n : \r\n /* M02 everything else just split the note */\r\n item.note.split('\\n').map((i, k) => {\r\n return {i}
;\r\n })\r\n }\r\n\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nPrintView.propTypes = {\r\n\titem: PropTypes.shape({\r\n\t\tsubject: PropTypes.string,\r\n\t\ttypeName: PropTypes.string, //M02 no longer required isRequired,\r\n postedDate: PropTypes.instanceOf(Date), //M03 was PropTypes.DateTime,\r\n\t\tnote: PropTypes.string,\r\n itemType: PropTypes.oneOf([itemTypes.notice]) //M02 was ['noticeType']\r\n\t}),\r\n\tcloseView: PropTypes.func.isRequired\r\n};\r\n\r\nexport default connect()(PrintView);\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: AlertPanel.js\r\n// Details: AlertPanel.js\r\n//\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 105066 06/01/20 JC M01 Added font awesome\r\n// WI3713 30/01/24 JC M02JC\tHandled multi-line alerts\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\n//M01 import { Glyphicon } from 'react-bootstrap';\r\nimport './css/AlertPanel.css';\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"; //M01\r\nimport { Col, Row } from 'react-bootstrap'; //M02JC\r\n\r\nclass AlertPanel extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.handleClear = this.handleClear.bind(this);\r\n\t}\r\n\r\n\thandleClear = event => {\r\n\t\tevent.preventDefault();\r\n\t\tif (typeof this.props.clear === \"function\") {\r\n\t\t\tthis.props.clear();\r\n\t\t}\r\n\t}\r\n\r\n\trender() {\r\n\t\tconst { type, message, clear } = this.props;\r\n\t\tconst hasClear = typeof clear === \"function\";\r\n\r\n\t\treturn(\r\n\t\t\t
\r\n {type === \"danger\" ? : [] /*M01*/}\r\n {type === \"info\" ? : [] /*M01*/}\r\n {type === \"success\" ? : [] /*M01*/}\r\n {type === \"pending\" ? : [] /*M01*/}\t\t\t\t\r\n\t\t\t\t {/*M02JC*/}\r\n\t\t\t\t\t{message.split(\"\\n\").map((splitMessage, k) => {\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t{splitMessage} /*M02JC*/\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t})}\r\n\t\t\t\t\r\n\t\t\t\t{hasClear\r\n ? /*M01*/\r\n\t\t\t\t\t: []}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nAlertPanel.propTypes = {\r\n\ttype: PropTypes.oneOf(['danger', 'info', 'success', 'pending']),\r\n\tmessage: PropTypes.string.isRequired,\r\n\tclear: PropTypes.func\r\n};\r\n\r\n\r\nexport default connect(\r\n\tstate => state\r\n)(AlertPanel);\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: Layout\r\n// Details: Layout\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 101885 26/06/19 AJ M01 Added Links\r\n// 104759 21/11/19 JC M02 Whole menu now soft-coded\r\n// 106380 30/04/20 JC M03 Added authentication\r\n// 110638 28/01/21 JC Bootstrap upgrade\r\n//-------------------------------------------------------\r\n*/\r\nimport React, { useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Col, Container, Row } from 'react-bootstrap';\r\nimport NavMenu from './NavMenu';\r\nimport PrintView from './PrintView';\r\nimport AlertPanel from '../components/AlertPanel';\r\n\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\r\n\r\nconst Layout = (props) => {\r\n const [needsSmallMenu, setNeedsSmallMenu] = React.useState(false);\r\n\r\n const smallScreenSizeQuery = \"(max-width:767px)\";\r\n\r\n const mediaQueryNeedsSmallMenu = useMediaQuery(smallScreenSizeQuery);\r\n\r\nuseEffect(() => {\r\n if (needsSmallMenu !== mediaQueryNeedsSmallMenu) {\r\n //handleDrawerClose();\r\n //handleProfileMenuClose();\r\n }\r\n setNeedsSmallMenu(mediaQueryNeedsSmallMenu);\r\n}, [mediaQueryNeedsSmallMenu]);\r\n\r\nconst renderPrintView = () => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst renderNavMenu = () => {\r\n return (\r\n /*M01 M02 M03*/ \r\n < NavMenu\r\n systemControl={props.systemControl}\r\n authentication={props.authentication}\r\n needsSmallMenu={needsSmallMenu || !props.isNavbarVisible}\r\n /> \r\n );\r\n};\r\n\r\nconst renderComponents = () => {\r\n return (\r\n <>\r\n {props.alerts.map((alert, index) =>\r\n \r\n )}\r\n {props.children}\r\n \r\n );\r\n};\r\n\r\nconst renderSmallMenuLayout = () => {\r\n return (\r\n \r\n {/* if the navbar's visible then render a menu */\r\n props.isNavbarVisible ?\r\n renderNavMenu()\r\n : []}\r\n \r\n {renderComponents()}\r\n \r\n \r\n );\r\n};\r\n\r\nconst renderLargeMenuLayout = () => {\r\n return (\r\n \r\n \r\n {renderNavMenu()}\r\n \r\n \r\n {renderComponents()}\r\n \r\n \r\n );\r\n};\r\n\r\nconst renderLayout = () => {\r\n return (\r\n \r\n {\r\n /* if we need a small menu, or the navbar's not visible then render a small menu layout */\r\n needsSmallMenu || !props.isNavbarVisible ? renderSmallMenuLayout() : renderLargeMenuLayout()\r\n }\r\n \r\n );\r\n};\r\n\r\nreturn (\r\n <>\r\n {\r\n props.printViewItem ? renderPrintView() : renderLayout()\r\n }\r\n \r\n);\r\n\r\n};\r\n\r\nLayout.propTypes = {\r\n\tprintViewItem: PropTypes.any,\r\n\talerts: PropTypes.arrayOf(PropTypes.any),\r\n\tchildren: PropTypes.any,\r\n\tclear: PropTypes.func.isRequired,\r\n closeView: PropTypes.func.isRequired,\r\n //M02 just pass down the whole of system control\r\n //companyName: PropTypes.string.isRequired,\r\n //link1Title: PropTypes.string.isRequired, //M01\r\n //link1URL: PropTypes.string.isRequired, //M01\r\n //link2Title: PropTypes.string.isRequired, //M01\r\n //link2URL: PropTypes.string.isRequired //M01\r\n systemControl: PropTypes.object.isRequired, //M02\r\n authentication: PropTypes.object.isRequired //M03\r\n};\r\n\r\nexport default Layout;","import React from 'react';\r\nimport './css/Loading.css';\r\n\r\nexport default () => (\r\n\t
\r\n\t\t
\r\n\t\t\t\"Loading\"/\r\n\t\t\tLoading...\r\n\t\t
\r\n\t
\r\n);\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: Login\r\n// Details: Login page\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 101871 13/06/19 JHT M01 Added 'first time user'\r\n// 106452 04/03/20 JC M02 Ensure a compatible browser is used\r\n// 106380 30/04/20 JC M03 Added SSO\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport React, { Component } from 'react';\r\nimport { Button, FormGroup, FormControl, FormLabel, Col } from \"react-bootstrap\";\r\nimport { bindActionCreators } from 'redux';\r\nimport { history } from '../history';\r\nimport { connect } from 'react-redux';\r\nimport { userActions } from '../store/Authentication';\r\nimport Loading from '../components/Loading';\r\nimport AlertPanel from '../components/AlertPanel';\r\nimport { utils } from '../utils/utils'; //M02\r\n\r\nclass Login extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.state = {\r\n\t\t\temployeeCode: '',\r\n\t\t\tpassword: '',\r\n accessCode: '',\r\n browserError: !utils.detectCompatibleBrowser() //M02 detect compatible browser\r\n\t\t};\r\n\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t\tthis.handleLogin = this.handleLogin.bind(this);\r\n this.handleForgotPassword = this.handleForgotPassword.bind(this);\r\n\t}\r\n\r\n // M03 This method runs when the component is first added to the page\r\n componentDidMount() {\r\n\r\n //pulls compnents off the route path paramers...\r\n const { ssoAuthenticationTicket } = this.props.match.params;\r\n\r\n //if exists\r\n if (ssoAuthenticationTicket) {\r\n\r\n //auto login with SSO login method\r\n this.props.ssoLogin(ssoAuthenticationTicket);\r\n }\r\n }\r\n\r\n\tvalidateForm() {\r\n\t\treturn this.state.employeeCode.length > 0\r\n\t\t\t&& this.state.password.length > 0;\r\n\t}\r\n\r\n\thandleChange = event => {\r\n\t\tthis.setState({\r\n\t\t\t[event.target.id]: event.target.value\r\n\t\t});\r\n\t}\r\n\r\n\thandleLogin = event => {\r\n event.preventDefault();\r\n //M02 not if there's a browser error\r\n if (!this.state.browserError) {\r\n this.props.login(this.state.employeeCode, this.state.password);\r\n }\r\n\t}\r\n\r\n\thandleForgotPassword = event => {\r\n event.preventDefault();\r\n //M02 not if there's a browser error\r\n if (!this.state.browserError) {\r\n history.push('/forgotpassword');\r\n }\r\n\t}\r\n\r\n\trender() {\r\n const { authentication } = this.props;\r\n const { browserError } = this.state; //M02\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t\t\"Employee\r\n\t\t\t\t
\r\n\t\t\t\t

Log In

\r\n
\r\n {/*M02 browser error exists? */\r\n browserError ? : []}\r\n\t\t\t\t\t{authentication.message ? : []}\r\n {authentication.error ? : []}\r\n\r\n\t\t\t\t\t{authentication.loggingIn ? : []}\r\n\t\t\t\t\t{!authentication.loggingIn ?\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tEmployee code\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tPassword\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t
\r\n \r\n\t\t\t\t\t\t\t\tLog In\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
\r\n \r\n\t\t\t\t\t\t\t\tForgotten password\r\n\t\t\t\t\t\t\t\r\n\r\n {/*M01*/}\r\n \r\n First time user\r\n\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t: []}\r\n\t\t\t\t
\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n}\r\n\r\nexport default connect(\r\n\tstate => ({ authentication: state.authentication, alerts: state.alerts.alerts }),\r\n\tdispatch => bindActionCreators(userActions, dispatch)\r\n)(Login);","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport './css/Header.css';\r\n\r\nconst Header = props => (\r\n\t
\r\n\t\t

{props.title}

\r\n\t\t{props.children}\r\n\t
\r\n);\r\n\r\nHeader.propTypes = {\r\n\ttitle: PropTypes.string.isRequired,\r\n\tchildren: PropTypes.any\r\n};\r\n\r\nexport default Header;","import React, { Component } from 'react';\r\nimport { Col } from 'react-bootstrap';\r\nimport { Button } from \"react-bootstrap\";\r\nimport { bindActionCreators } from 'redux';\r\nimport { connect } from 'react-redux';\r\nimport { userActions } from '../store/Authentication';\r\nimport Header from '../components/Header';\r\nimport AlertPanel from '../components/AlertPanel';\r\nimport Loading from '../components/Loading';\r\n\r\nclass Logout extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.handleSubmit = this.handleSubmit.bind(this);\r\n\t}\r\n\r\n\thandleSubmit = event => {\r\n\t\tevent.preventDefault();\r\n\r\n\t\t// reset ogout status\r\n\t\tthis.props.logout();\r\n\t}\r\n\r\n\trender() {\r\n\t\tconst { error, loggingOut } = this.props;\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{error ? : []}\r\n\t\t\t\t\t

Do you really want to log out?

\r\n\t\t\t\t\t\t{loggingOut\r\n\t\t\t\t\t\t\t? \r\n : \r\n\t\t\t\t\t\t\t\tLog Out\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nexport default connect(\r\n\tstate => state.authentication,\r\n\tdispatch => bindActionCreators(userActions, dispatch)\r\n)(Logout);","import React from 'react';\r\nimport './css/NoItems.css';\r\n\r\nexport default () => (\r\n\tNo items to show.\r\n);\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport './css/TileIcon.css';\r\n\r\nclass TileIcon extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.handleClick = this.handleClick.bind(this);\r\n\t}\r\n\r\n\thandleClick = event => {\r\n\t\tevent.preventDefault();\r\n\t\tif (!this.props.disabled && typeof this.props.onSelected === \"function\") {\r\n\t\t\tthis.props.onSelected(this.props.id);\r\n\t\t}\r\n\t}\r\n\r\n\tdecimalToHexString = number => {\r\n\t\tif (number === undefined)\r\n\t\t\treturn \"#FFF\";\r\n\r\n\t\tif (number < 0) {\r\n\t\t\tnumber = 0xFFFFFFFF + number + 1;\r\n\t\t}\r\n\t\tvar hex = \"#\" + (\"000000\" + number.toString(16).toUpperCase()).substr(-6);\r\n\t\treturn hex;\r\n\t}\r\n\r\n\trender() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t{this.props.tileText}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nTileIcon.propTypes = {\r\n\tid: PropTypes.number,\r\n\tbackColour: PropTypes.number.isRequired,\r\n\ttextColour: PropTypes.number.isRequired,\r\n\tborderColour: PropTypes.number.isRequired,\r\n\ttileText: PropTypes.string.isRequired,\r\n\tdisabled: PropTypes.bool,\r\n\tclassName: PropTypes.string,\r\n\tonSelected: PropTypes.func\r\n};\r\n\r\nexport default connect()(TileIcon);\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport TileIcon from '../components/TileIcon';\r\nimport './css/ItemTypeControl.css';\r\n\r\nclass ItemTypeControl extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.handleSelected = this.handleSelected.bind(this);\r\n\t}\r\n\r\n\thandleSelected = id => {\r\n\t\tthis.props.selectItemType(id);\r\n\t}\r\n\r\n\trender() {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t{this.props.items.map(item =>\r\n\t\t\t\t\t\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nItemTypeControl.propTypes = {\r\n\titemCategory: PropTypes.string,\r\n\titems: PropTypes.arrayOf(PropTypes.any),\r\n\titemTypeId: PropTypes.number,\r\n\tselectItemType: PropTypes.func.isRequired\r\n};\r\n\r\nexport default connect()(ItemTypeControl);","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: FileDLView (was PdfView)\r\n// Details: FileDLView (was PdfView) compoment\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 101877 27/06/19 JC M01 Changed to FileDLView\r\n// 102715 16/08/19 JC M02 Fix to itemType propTypes\r\n// 103782 15/12/19 JC M03 Expanded for training\r\n// 105066 06/01/20 JC M04 Added font awesome\r\n// 105750 17/01/20 JC M05 M03 broke employee pay record retrieval\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport { itemTypes } from '../constants/ItemTypes';\r\n//M04 import { Glyphicon } from 'react-bootstrap';\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"; //M04\r\nimport './css/Item.css';\r\n\r\nclass FileDLView extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n // attach handlers for item & button clicks\r\n this.handleStartTrainingClick = this.handleStartTrainingClick.bind(this); //M03\r\n }\r\n \r\n //M03 handler for start training\r\n handleStartTrainingClick = event => {\r\n event.preventDefault();\r\n //get the item\r\n const { item } = this.props;\r\n\r\n //pass to start training function for item\r\n if (this.props.startTraining) {\r\n this.props.startTraining(item);\r\n }\r\n }\r\n\r\n\trender() {\r\n const { item, itemType, startTraining, isAnsweringTraining } = this.props;\r\n\t\tconst user = JSON.parse(localStorage.getItem('user'));\r\n\t\tconst ticket = user.ticket;\r\n var action = \"filedl/employeedocument\"; //M03 default to employee document, then override as required\r\n if (itemType === itemTypes.payRecord) { action = \"filedl/employeepayrecord\"; } //M03 M05 was incorrectly employeedocument\r\n if (itemType === itemTypes.training) { action = \"filedl/employeetraining\"; } //M03\r\n\r\n return (\r\n
\r\n
\r\n {/* M03 was id */}\r\n\t\t\t\t \r\n {/* M04 */}\r\n\r\n {item.itemType === itemTypes.training && !item.isCompleted && !isAnsweringTraining && startTraining\r\n /* M03 if training, not completed and not answering training, show start training button*/\r\n ? /* M04 */\r\n : []}\r\n \r\n
\r\n \r\n
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nFileDLView.propTypes = {\r\n //M03 id: PropTypes.number.isRequired,\r\n item: PropTypes.object.isRequired, //M03\r\n\t//M02 itemType: PropTypes.oneOf(['documentType', 'payRecordType'])\r\n itemType: PropTypes.oneOf([itemTypes.document, itemTypes.payRecord, itemTypes.training]), //M02 M03\r\n startTraining: PropTypes.func, //M03\r\n isAnsweringTraining: PropTypes.bool //M03\r\n}; //M01\r\n\r\nexport default connect()(FileDLView); //M01\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: TrainingQuestionsPanel\r\n// Details: TrainingQuestionsPanel component\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 103782 10/12/19 JC New\r\n// 105066 06/01/20 JC M01 Added font awesome\r\n//-------------------------------------------------------\r\n*/\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\n//M01 import { Glyphicon } from 'react-bootstrap';\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"; //M01\r\nimport './css/Item.css';\r\n\r\nclass TrainingQuestionsPanel extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n this.handlePrev = this.handlePrev.bind(this);\r\n this.handleNext = this.handleNext.bind(this);\r\n this.handleChangeAnswer = this.handleChangeAnswer.bind(this);\r\n this.handleComplete = this.handleComplete.bind(this);\r\n\t}\r\n\r\n handlePrev = event => {\r\n event.preventDefault();\r\n const { item } = this.props;\r\n this.props.changeTrainingQuestion(item, false);\r\n }\r\n\r\n handleNext = event => {\r\n event.preventDefault();\r\n const { item} = this.props;\r\n this.props.changeTrainingQuestion(item, true);\r\n }\r\n\r\n handleChangeAnswer = event => {\r\n //get the new answer index\r\n var newAnswerIndex = Number(event.target.value);\r\n\r\n //pass to parent to update\r\n const { item } = this.props;\r\n this.props.answerTrainingQuestion(item, newAnswerIndex);\r\n }\r\n\r\n handleComplete = event => {\r\n event.preventDefault();\r\n const { item } = this.props;\r\n this.props.completeTraining(item);\r\n }\r\n\r\n\trender() {\r\n const { item } = this.props;\r\n\r\n //get the current question index & length\r\n var nCurrentQuestionIndex = item.currentQuestionIndex;\r\n var nQuestionsLength = item.questions.length;\r\n\r\n //get current question\r\n var currentQuestion = item.questions[nCurrentQuestionIndex];\r\n\r\n //get the currently selected answer\r\n var answer = item.employeeAnswers[nCurrentQuestionIndex];\r\n\r\n //get the current question text\r\n var currentQuestionText = `Question ${(nCurrentQuestionIndex + 1)} of ${nQuestionsLength}`;\r\n\r\n //determine if we can prev or next\r\n const canPrev = nCurrentQuestionIndex > 0; // not at the first question\r\n const canNext = ((nCurrentQuestionIndex + 1 < nQuestionsLength) && answer !== -1); //not at the last question, and an answer selected\r\n const canComplete = !canNext && !item.employeeAnswers.includes(-1); //not can next, and also does not contain an unanswered question\r\n\r\n return (\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n {/* print question position */}\r\n {currentQuestionText}

\r\n\r\n {/* display the question */\r\n currentQuestion.question.split('\\n').map((i, k) => {\r\n return {i}
;\r\n })}\r\n\r\n \r\n\r\n\r\n {/* bottom tray, prev & next */}\r\n
\r\n\r\n {/* answer drop down */}\r\n \r\n\r\n\r\n {/* buttons */}\r\n {/* M01 */}\r\n {/* M01 */}\r\n {/* M01 */}\r\n
\r\n
\r\n
\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nTrainingQuestionsPanel.propTypes = {\r\n item: PropTypes.object.isRequired,\r\n changeTrainingQuestion: PropTypes.func.isRequired,\r\n answerTrainingQuestion: PropTypes.func.isRequired,\r\n completeTraining: PropTypes.func.isRequired\r\n};\r\n\r\n\r\nexport default connect(\r\n\tstate => state\r\n)(TrainingQuestionsPanel);\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: Item\r\n// Details: Item compoment\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 101873 25/06/19 JC M01 Added IsAlwaysExpand to EmployeeNotices\r\n// 101878 26/06/19 JC M02 Added AttachedURL, AttachedURLDescription & HasAttachedURL to EmployeeNotices\r\n// 101877 27/06/19 JC M03 Changed pdf download to generic file download\r\n// 102715 18/08/19 JC M04 Added Contact item type\r\n// 103015 10/09/19 JC M05 Handle pay records without a tax year\r\n// 103782 10/12/19 JC M06 Added MyTraining\r\n// 105066 06/01/20 JC M07 Added font awesome\r\n// 104762 28/02/20 JC M08 Notices can now pass html\r\n// 103839 06/04/20 JC M09 React upgrade\r\n// 106380 01/05/20 JC M10 Just removed stamp datetime prop types check\r\n// 108238 08/06/20 JC M11 Re-wrote datetime components\r\n// WI2224 27/01/23 JC M12JC Apply formatEnumString to request requestStatus\r\n// WI3713 24/01/24 JC M13JC Expanded documents for data forms, moved isExpanded to Item in store\r\n//-------------------------------------------------------\r\n*/\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { bindActionCreators } from 'redux';\r\nimport { history } from '../history';\r\nimport { connect } from 'react-redux';\r\n//M11 import DateLabel from './DateLabel'; //M11\r\n//M11 import DateTimeLabel from './DateTimeLabel'; //M11\r\nimport DateTime from './DateTime'; //M11\r\nimport { dateTimeTypes } from '../constants/DateTimeTypes'; //M11\r\nimport TileIcon from './TileIcon';\r\nimport FileDLView from './FileDLView'; //M03\r\n//M07 import { Glyphicon } from 'react-bootstrap';\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"; //M07\r\nimport { printViewActions } from '../store/PrintView';\r\nimport { requestActions } from '../store/Request';\r\nimport { itemTypes } from '../constants/ItemTypes';\r\nimport TrainingQuestionsPanel from './TrainingQuestionsPanel'; //M06\r\nimport { noteTypes } from '../constants/NoteTypes'; //M08\r\nimport { utils } from '../utils/utils'; //M08\r\nimport './css/Item.css';\r\n\r\nclass Item extends Component {\r\n\tconstructor(props) {\r\n super(props);\r\n //M13JC removed\r\n // this.state = {\r\n // //M01 - expanded now conditional based on the isAlwaysExpand property\r\n // expanded: (this.props.item.isAlwaysExpand === true) //M01 was false \r\n\t\t//};\r\n\r\n // attach handlers for item & button clicks\r\n\t\tthis.handleItemClick = this.handleItemClick.bind(this);\r\n\t\tthis.handleMarkAsRead = this.handleMarkAsRead.bind(this);\r\n\t\tthis.handleMarkAsUnread = this.handleMarkAsUnread.bind(this);\r\n this.handlePrintView = this.handlePrintView.bind(this);\r\n this.handleAttachedURL = this.handleAttachedURL.bind(this); //M02\r\n this.handleEmailClick = this.handleEmailClick.bind(this); //M04\r\n this.handlePhoneClick = this.handlePhoneClick.bind(this); //M04\r\n this.handleStartTrainingClick = this.handleStartTrainingClick.bind(this); //M06\r\n this.handleStartTraining = this.handleStartTraining.bind(this); //M06\r\n this.handleDataFormClick = this.handleDataFormClick.bind(this); //M13JC\r\n\t}\r\n\r\n //item click event\r\n\thandleItemClick = event => {\r\n\t\tevent.preventDefault();\r\n\t\tconst { item } = this.props;\r\n\t\tif (item.itemType === itemTypes.request) {\r\n\t\t\tconst { id } = item;\r\n\t\t\tthis.props.setFromCalendar(undefined);\r\n\t\t\thistory.push(`/myrequests/detail/${id}`);\r\n\t\t} else {\r\n\r\n //M13JC now in item state\r\n\t\t\t//this.setState({\r\n\t\t\t//\texpanded: !this.state.expanded\r\n\t\t\t//});\r\n\r\n //M13JC pass to parent handle expanded/collapse function for item\r\n this.props.handleExpandedCollapse(item)\r\n\t\t}\r\n\t}\r\n\r\n //mark as read button click event\r\n\thandleMarkAsRead = event => {\r\n\t\tevent.preventDefault();\r\n\t\tif (typeof this.props.markAsUnread === \"function\") {\r\n\t\t\tthis.props.markAsRead(this.props.item);\r\n\t\t}\r\n\t}\r\n\r\n //mark as un-read button click event\r\n\thandleMarkAsUnread = event => {\r\n\t\tevent.preventDefault();\r\n\t\tif (typeof this.props.markAsUnread === \"function\") {\r\n\t\t\tthis.props.markAsUnread(this.props.item);\r\n\t\t}\r\n\t}\r\n\r\n //print view button event\r\n\thandlePrintView = event => {\r\n\t\tevent.preventDefault();\r\n\t\tthis.props.show(this.props.item);\r\n }\r\n\r\n //M02 handler for employee notice attached URL M06 or training\r\n handleAttachedURL = event => {\r\n event.preventDefault();\r\n //declare item as constant\r\n const { item } = this.props;\r\n //if the item has an attached URL\r\n if ((item.itemType === itemTypes.notice || item.itemType === itemTypes.training) && item.hasAttachedURL === true) { //M06\r\n //launch the attached URL in a new window\r\n window.open(item.attachedURL);\r\n }\r\n }\r\n\r\n //M04 handler for email click \r\n handleEmailClick = event => {\r\n event.preventDefault();\r\n //get the item\r\n const { item } = this.props;\r\n //if a contact with an e-mail\r\n if (item.itemType === itemTypes.contact && item.hasEPContactEmail) {\r\n //launch a mailto to the e-mail adderss\r\n window.location.href = `mailto:${item.epContactEmail}`;\r\n }\r\n }\r\n\r\n //M04 handler for phone click \r\n handlePhoneClick = event => {\r\n event.preventDefault();\r\n //get the item\r\n const { item } = this.props;\r\n //if a contact with a phone number\r\n if (item.itemType === itemTypes.contact && item.hasEPContactPhone) {\r\n //launch a tel to the phone\r\n window.location.href = `tel:${item.epContactPhone}`;\r\n }\r\n }\r\n\r\n //M06 handle start training click\r\n handleStartTrainingClick = event => {\r\n event.preventDefault();\r\n //declare item as constant\r\n const { item } = this.props;\r\n\r\n //pass to start training function for item\r\n this.props.startTraining(item);\r\n }\r\n\r\n //M06 handler for start training\r\n handleStartTraining(item) {\r\n \r\n //M06 if a training item & not completed, start training\r\n if (item.itemType === itemTypes.training && !item.isCompleted) {\r\n this.props.startTraining(this.props.item)\r\n }\r\n }\r\n\r\n //M13JC handler for data form click\r\n handleDataFormClick = event => {\r\n event.preventDefault();\r\n //declare item as constant\r\n const { item } = this.props;\r\n\r\n if (item.hasDataForm) {\r\n this.props.handleDataFormClick(item)\r\n }\r\n }\r\n\r\n\trender() {\r\n const { item, changeTrainingQuestion, answerTrainingQuestion, completeTraining } = this.props; //M06\r\n\r\n\t\tlet title = \"\";\r\n\t\tlet description = \"\";\r\n\r\n switch (item.itemType) {\r\n //M05 tax year may not be present\r\n case itemTypes.payRecord: \r\n if (item.payYear) {\r\n title = `Tax year ${item.payYear} ${item.payPeriod ? `period ${item.payPeriod}` : \"\"}`;\r\n } else {\r\n title = `${item.payPeriod ? `Period ${item.payPeriod}` : \"\"}`;\r\n }\r\n\t\t\t\t\r\n\t\t\t\tdescription = item.typeName;\r\n\t\t\t\tbreak;\r\n\t\t\tcase itemTypes.request:\r\n\t\t\t\tif (item.fromDate === item.toDate) {\r\n title =
: {item.formattedSites}
; /*M11*/\r\n\t\t\t\t} else {\r\n title =
to : {item.formattedSites}
; /*M11*/\r\n\t\t\t\t}\r\n\t\t\t\tdescription = item.requestNote.length > 80 ? item.requestNote.substr(0, 80) + \"...\" : item.requestNote;\r\n break;\r\n //M04 contact item type\r\n case itemTypes.contact:\r\n title = item.epContactDescription;\r\n description = '';\r\n break;\r\n\t\t\tdefault:\r\n\t\t\t\ttitle = item.subject;\r\n\t\t\t\tdescription = item.typeName;\r\n\t\t\t\tbreak;\r\n }\r\n\r\n var displayDate = item.postedDate //M06 default to posted date\r\n if (item.itemType === itemTypes.payRecord) { displayDate = item.payDate; } //if pay record, use pay date\r\n if (item.itemType === itemTypes.training && item.isCompleted) { displayDate = item.completedStamp; } //M06 if completed training, use completed date\r\n\t\t\t\r\n\t\tconst info = item.itemType === itemTypes.request\r\n ? utils.formatEnumString(item.requestStatus) //M12JC\r\n : ; /*M11*/\r\n\r\n //M06 determine if answering training\r\n const isAnsweringTraining = item && item.itemType === itemTypes.training && item.isAnsweringTraining && item.isAnsweringTraining === true;\r\n\r\n //M13JC determine if expanded\r\n const isExpanded = item && item.isExpanded === true;\r\n\r\n\t\treturn (\r\n\t\t\t
\r\n {/*M13JC*/}\r\n
\r\n {!this.props.simpleMode \r\n /* M04 don't show tile if in simple mode because no categories */\r\n ?
\r\n \r\n
\r\n : []\r\n }\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t
{title}
\r\n
{description}
\r\n\t\t\t\t\t\t\t
\r\n
\r\n {/*M06 if training & completed, display passed failed*/}\r\n {item.itemType === itemTypes.training && item.isCompleted && item.isPassed\r\n ? \r\n : []}\r\n {item.itemType === itemTypes.training && item.isCompleted && !item.isPassed\r\n ? \r\n : []}\r\n\r\n {/*M13JC if document, display data form status*/}\r\n {item.itemType === itemTypes.document && item.hasDataForm && !item.isStarted && !item.isAcknowledged\r\n //not started, not read\r\n ? \r\n : []}\r\n {item.itemType === itemTypes.document && item.hasDataForm && !item.isStarted && item.isAcknowledged\r\n //not started, but read\r\n ? \r\n : []}\r\n {item.itemType === itemTypes.document && item.hasDataForm && item.isStarted && !item.isCompleted\r\n //started but not completed\r\n ? \r\n : []}\r\n {item.itemType === itemTypes.document && item.hasDataForm && item.isStarted && item.isCompleted\r\n //completed \r\n ? \r\n : []}\r\n\r\n\r\n\r\n\t\t\t\t\t\t\t\t{item.isSticky\r\n ? \r\n\t\t\t\t\t\t\t\t\t: []}\r\n\t\t\t\t\t\t\t\t{info}\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t
\r\n {item.itemType === itemTypes.request\r\n /* M08 replaced bsSize=\"large\" with size=\"lg\" */\r\n ? \r\n : } {/*M13JC*/}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t{item.itemType !== itemTypes.request\r\n ?
{/*M13JC*/}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t
\r\n {(item.itemType === itemTypes.notice && item.noteType === noteTypes.text ) || (item.itemType === itemTypes.training && !isAnsweringTraining)\r\n /* M06 added training M08 notice only if text, added key */\r\n ? item.note.split('\\n').map((i, k) => {\r\n return {i}
;\r\n }) \r\n : []}\r\n {item.itemType === itemTypes.notice && item.noteType === noteTypes.html\r\n /* M08 notice only if html - set passed in html */\r\n ?
\r\n : []}\r\n\t\t\t\t\t\t\t\t\t{item.itemType === itemTypes.request\r\n\t\t\t\t\t\t\t\t\t\t?

{item.requestNote}

\r\n : []}\r\n {item.itemType === itemTypes.contact\r\n /* M04 add contact comments M08 added key*/\r\n ? item.epContactNameAndComment.split('\\n').map((i, k) => {\r\n return {i}
;\r\n })\r\n : []}\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\t{item.itemType === itemTypes.request\r\n\t\t\t\t\t\t\t\t\t\t\t?

{item.requestNote}

\r\n\t\t\t\t\t\t\t\t\t\t\t: []}\r\n\r\n\r\n {item.itemType === itemTypes.notice\r\n ? \r\n : []\r\n }\r\n\r\n {/*M13JC document file now optional*/}\r\n {(item.itemType === itemTypes.document && item.hasFile)|| item.itemType === itemTypes.payRecord ||\r\n (item.itemType === itemTypes.training && item.hasFile && !isAnsweringTraining)\r\n ?\r\n
\r\n \r\n
\r\n : []\r\n }\r\n\r\n {item.hasDataForm /*M13JC has data form? */\r\n ?\r\n < div className=\"button-group float-left\">\r\n \r\n
\r\n : []}\r\n \r\n {item.hasAttachedURL === true && !isAnsweringTraining\r\n /* M02 if the item has an attched URL, add a button for handle attached URL M04 renamed css*/\r\n ? \r\n : []}\r\n\r\n {item.itemType === itemTypes.training && item.hasAttachedURL && !item.isCompleted && !isAnsweringTraining\r\n /* M06 if training, has attached url not completed and not answering training, show start training button*/\r\n ? \r\n : []}\r\n\r\n\r\n {item.itemType === itemTypes.contact && item.hasEPContactEmail\r\n /* M04 if a contact and has a contact e-mail*/\r\n ? \r\n : []\r\n }\r\n\r\n {item.itemType === itemTypes.contact && item.hasEPContactPhone\r\n /* M04 if a contact and has a contact phone*/\r\n ? \r\n : []\r\n }\r\n\r\n
\r\n\r\n {item.itemType !== itemTypes.contact && item.itemType !== itemTypes.training ?\r\n /* M01 contacts can't be acknowledged so don't add acknowledge info M06 also training*/\r\n
\r\n {item.isAcknowledged\r\n ? Read on /*M11*/\r\n : []}\r\n {item.isAcknowledged\r\n ? \r\n : \r\n }\r\n
\r\n : []\r\n }\r\n\r\n\r\n {isAnsweringTraining ?\r\n /* M06 have we started training? */\r\n \r\n : []\r\n }\r\n\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t: []}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nItem.propTypes = {\r\n\titem: PropTypes.shape({\r\n\t\tid: PropTypes.number.isRequired,\r\n\t\tbackColour: PropTypes.number,//M04 no longer required .isRequired,\r\n\t\ttextColour: PropTypes.number.isRequired,\r\n\t\tisSticky: PropTypes.bool,\r\n\t\ttileText: PropTypes.string.isRequired,\r\n\t\tsubject: PropTypes.string,\r\n\t\ttypeName: PropTypes.string,\r\n //M10 postedDate: PropTypes.instanceOf(Date), //M09 was PropTypes.DateTime,\r\n\t\tisAcknowledged: PropTypes.bool,\r\n //M10 acknowledgedStamp: PropTypes.instanceOf(Date), //M09 was PropTypes.DateTime,\r\n\t\tsetAcknowledged: PropTypes.func,\r\n\t\tprintView: PropTypes.func,\r\n\t\tnote: PropTypes.string,\r\n itemType: PropTypes.oneOf([itemTypes.notice, itemTypes.document, itemTypes.payRecord, itemTypes.request, itemTypes.contact, itemTypes.training]), //M04\r\n isAlwaysExpand: PropTypes.bool, //M01\r\n attachedURL: PropTypes.string, //M02\r\n hasAttachedURL: PropTypes.bool, //M02\r\n attachedURLDescription: PropTypes.string, //M02\r\n itemExtension: PropTypes.string //M03\r\n\t}),\r\n\tmarkAsRead: PropTypes.func.isRequired,\r\n markAsUnread: PropTypes.func.isRequired,\r\n startTraining: PropTypes.func.isRequired, //M06\r\n changeTrainingQuestion: PropTypes.func.isRequired //M06\r\n};\r\n\r\n\r\nexport default connect(\r\n\tstate => state,\r\n\tdispatch => bindActionCreators({ ...printViewActions, ...requestActions }, dispatch)\r\n)(Item);\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: ItemList\r\n// Details: Item list compoment\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 102715 16/08/19 JC M01 Added Contacts handling\r\n// 103782 10/12/19 JC M02 Added MyTraining\r\n// 105066 06/01/20 JC M03 Added font awesome\r\n// 103839 06/04/20 JC M04 React upgrade\r\n// WI3713 24/01/24 JC M05JC Expanded documents for data forms, moved expanded to item store\r\n//-------------------------------------------------------\r\n*/\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { bindActionCreators } from 'redux';\r\nimport { connect } from 'react-redux';\r\nimport { itemActions } from '../store/Items';\r\nimport Loading from './Loading';\r\nimport NoItems from './NoItems';\r\n//M03 import { Glyphicon } from 'react-bootstrap';\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"; //M03\r\nimport AlertPanel from './AlertPanel';\r\nimport ItemTypeControl from './ItemTypeControl';\r\nimport Item from './Item';\r\nimport './css/ItemsList.css';\r\nimport { redirectControllerActions } from '../store/RedirectController'; //M05JC\r\nimport { red } from '@material-ui/core/colors';\r\n\r\nclass ItemsList extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.handleItemTypeSelect = this.handleItemTypeSelect.bind(this);\r\n\t\tthis.handlePrev = this.handlePrev.bind(this);\r\n\t\tthis.handleNext = this.handleNext.bind(this);\r\n\t\tthis.handleFirst = this.handleFirst.bind(this);\r\n\t\tthis.handleLast = this.handleLast.bind(this);\r\n\t\tthis.handleMarkAsRead = this.handleMarkAsRead.bind(this);\r\n\t\tthis.handleMarkAsUnread = this.handleMarkAsUnread.bind(this);\r\n this.handleNew = this.handleNew.bind(this);\r\n this.handleStartTraining = this.handleStartTraining.bind(this); //M02\r\n this.handleChangeTrainingQuestion = this.handleChangeTrainingQuestion.bind(this); //M02\r\n this.handleAnswerTrainingQuestion = this.handleAnswerTrainingQuestion.bind(this); //M02\r\n\t\tthis.handleCompleteTraining = this.handleCompleteTraining.bind(this); //M02\r\n\t\tthis.handleDataFormClick = this.handleDataFormClick.bind(this); //M05JC\r\n\t\tthis.handleExpandedCollapse = this.handleExpandedCollapse.bind(this); //M05JC\r\n\t}\r\n\r\n //M04 componentWillMount\r\n componentDidMount() {\r\n\t\t// This method runs when the component is first added to the page\r\n\t\t//M05JC added expandedItemId\r\n\t\tthis.props.getPage(this.props.page, this.props.itemCategory, this.props.itemTypeId, this.props.expandedItemId);\r\n\t}\r\n\r\n\thandleItemTypeSelect = itemTypeId => {\r\n\t\tthis.props.getPage(this.props.page, this.props.itemCategory, itemTypeId);\r\n\t}\r\n\r\n\thandleMarkAsRead = item => {\r\n\t\tthis.props.markAsRead(item.id, this.props.itemCategory, this.props.itemTypeId);\r\n\t}\r\n\r\n\thandleMarkAsUnread = item => {\r\n\t\tthis.props.markAsUnread(item.id, this.props.itemCategory, this.props.itemTypeId);\r\n\t}\r\n\r\n\thandleNew = event => {\r\n\t\tthis.props.onNewClick();\r\n }\r\n\r\n //M02 handle start training\r\n handleStartTraining = item => {\r\n this.props.startTraining(item.id, this.props.itemCategory, this.props.items);\r\n }\r\n\r\n //M02 handle change training question\r\n handleChangeTrainingQuestion = (item, forward) => {\r\n this.props.changeTrainingQuestion(item.id, this.props.itemCategory, this.props.items, forward);\r\n }\r\n\r\n //M02 handle answer training question\r\n handleAnswerTrainingQuestion = (item, answerIndex) => {\r\n this.props.answerTrainingQuestion(item.id, this.props.itemCategory, this.props.items, answerIndex);\r\n }\r\n\r\n //M02 handle complete training \r\n handleCompleteTraining = item => {\r\n this.props.completeTraining(item.id, this.props.itemCategory, this.props.itemTypeId, this.props.items);\r\n }\r\n\r\n\thandlePrev = event => {\r\n\t\tevent.preventDefault();\r\n\t\tconst { page } = this.props;\r\n\t\tif (page !== undefined && page > 1) {\r\n\t\t\tthis.props.getPage(page - 1, this.props.itemCategory, this.props.itemTypeId);\r\n\t\t}\r\n\t}\r\n\r\n\thandleNext = event => {\r\n\t\tevent.preventDefault();\r\n\t\tconst { page, maxPage } = this.props;\r\n\t\tif (page !== undefined && page < maxPage) {\r\n\t\t\tthis.props.getPage(page + 1, this.props.itemCategory, this.props.itemTypeId);\r\n\t\t}\r\n\t}\r\n\r\n\thandleFirst = event => {\r\n\t\tevent.preventDefault();\r\n\t\tconst { page } = this.props;\r\n\t\tif (page !== undefined && page > 1) {\r\n\t\t\tthis.props.getPage(1, this.props.itemCategory, this.props.itemTypeId);\r\n\t\t}\r\n\t}\r\n\r\n\thandleLast = event => {\r\n\t\tevent.preventDefault();\r\n\t\tconst { page, maxPage } = this.props;\r\n\t\tif (page !== undefined && page < maxPage) {\r\n\t\t\tthis.props.getPage(maxPage, this.props.itemCategory, this.props.itemTypeId);\r\n\t\t}\r\n\t}\r\n\r\n\t//M05JC handler for data form click\r\n\thandleDataFormClick = item => {\r\n\r\n\t\t//build prev page args\r\n\t\tlet prevPageArgs = {\r\n\t\t\tshowHistory: this.props.showHistory,\r\n\t\t\titemId: item.id\r\n\t\t}\r\n\t\t//and redirect page\r\n\t\tlet redirectPage = `/dataform/${item.id}/${item.dataFormOwnerType}`;\r\n\r\n\t\t//and pass to redirect controller\r\n\t\tthis.props.redirect(redirectPage, prevPageArgs);\r\n\t}\r\n\r\n\t//M05JC handler for item expand/collapse \r\n\thandleExpandedCollapse = (item) => {\r\n\t\tthis.props.updateIsExpanded(item.id, this.props.itemCategory, this.props.items);\r\n\t}\r\n\r\n\trender() {\r\n\t\tconst { isLoading, items, page, maxPage, showNewButton, newButtonText } = this.props;\r\n\t\tconst canNavigate = page !== undefined && !isLoading;\r\n\t\tconst canPrev = canNavigate && page > 1;\r\n\t\tconst canNext = canNavigate && page < maxPage;\r\n\r\n\t\treturn (\r\n\t\t\t
\r\n
\r\n {!this.props.simpleMode ?\r\n /* M01 don't show the categories if in all simple mode */\r\n \r\n : []}\r\n\t\t\t\t
\r\n\t\t\t\t{showNewButton\r\n\t\t\t\t\t?
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t: []}\r\n\t\t\t\t{this.props.error ? : []}\r\n\r\n\t\t\t\t{isLoading ? : []}\r\n\t\t\t\t{!isLoading && (items === undefined || items.length === 0)\r\n\t\t\t\t\t? \r\n\t\t\t\t\t:
\r\n\t\t\t\t\t\t{items.map(item =>\r\n\t\t\t\t\t\t\t/* pass simple mode to item */\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t
\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t{maxPage > 1\r\n\t\t\t\t\t?
\r\n\t\t\t\t\t\t
\r\n {/* M03 */}\r\n {/* M03 */}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\tPage {page} of {maxPage}\r\n\t\t\t\t\t\t
\r\n {/* M03 */}\r\n {/* M03 */}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t: []}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nItemsList.propTypes = {\r\n\titemCategory: PropTypes.string,\r\n\titemTypes: PropTypes.arrayOf(PropTypes.any),\r\n\titemTypeId: PropTypes.number,\r\n\titems: PropTypes.arrayOf(PropTypes.any),\r\n\tmaxPage: PropTypes.number,\r\n\tpage: PropTypes.number,\r\n\terror: PropTypes.string,\r\n\tisLoading: PropTypes.bool,\r\n\tgetPage: PropTypes.func.isRequired,\r\n\r\n\tshowNewButton: PropTypes.bool,\r\n\tnewButtonText: PropTypes.string,\r\n\tonNewClick: PropTypes.func\r\n};\r\n\r\nexport default connect(\r\n\tstate => state,\r\n\tdispatch => bindActionCreators({ ...itemActions, ...redirectControllerActions}, dispatch) //M05JC\r\n)(ItemsList);\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: ItemList\r\n// Details: Item list compoment\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 102715 16/08/19 JC M01 Added SimpleMode\r\n// 113775 15/06/21 JC M02JC\t'state' passed into handleSelect was string but needed to be handled as boolean\r\n// WI3713 24/01/24 JC M03JC Expanded documents for data forms\r\n//-------------------------------------------------------\r\n*/\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Tabs, Tab } from 'react-bootstrap';\r\nimport { bindActionCreators } from 'redux';//M03JC\r\nimport { connect } from 'react-redux';\r\nimport Header from '../components/Header';\r\nimport ItemsList from '../components/ItemsList';\r\nimport { itemActions } from '../store/Items';\r\nimport { redirectControllerActions } from '../store/RedirectController'; //M03JC\r\n\r\nclass ItemsPage extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.state = {\r\n\t\t\tusePrevPageArgs: false, //M03JC\r\n\t\t\tshowHistory: false,\r\n\t\t\texpandedItemId: 0 //M03JC\r\n\t\t\t//M03JC removed as unused //unread: 0\r\n //M03JC removed as unused //readPage: 0\r\n\t\t};\r\n\r\n\t\tthis.handleSelect = this.handleSelect.bind(this);\r\n\t}\r\n\r\n\t//M03JC\r\n\tstatic getDerivedStateFromProps(props, state) {\r\n\r\n\t\t//only if we have a match\r\n\t\tif (props.match != undefined) {\r\n\r\n\t\t\t//get values from props\r\n\t\t\tlet usePrevPageArgs = props.match.params.usePrevPageArgs;\r\n\t\t\t//interpret the value\r\n\t\t\tif (usePrevPageArgs != 1) { usePrevPageArgs = false } else { usePrevPageArgs = true };\r\n\r\n\t\t\tif (usePrevPageArgs !== state.usePrevPageArgs) {\r\n\r\n\t\t\t\t//get the previous page args\r\n\t\t\t\tlet previousPageArgs = props.redirectController.previousPageArgs;\r\n\t\t\t\t//and if they exist retrieve the details\r\n\t\t\t\tif (previousPageArgs) {\r\n\t\t\t\t\tlet showHistory = (previousPageArgs.showHistory != undefined ? previousPageArgs.showHistory : showHistory)\r\n\t\t\t\t\tlet itemId = (previousPageArgs.itemId != undefined ? previousPageArgs.itemId: 0)\r\n\r\n\t\t\t\t\t//clear the history\r\n\t\t\t\t\tprops.clearRedirect();\r\n\r\n\t\t\t\t\t//return new state\r\n\t\t\t\t\treturn ({\r\n\t\t\t\t\t\tusePrevPageArgs: usePrevPageArgs,\r\n\t\t\t\t\t\tshowHistory: showHistory,\r\n\t\t\t\t\t\texpandedItemId: itemId\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\t\r\n\r\n\t\t// Return null to indicate no change to state.\r\n\t\treturn null;\r\n\t}\r\n\r\n\thandleSelect(state) {\r\n\r\n\t\t //M02JC convert tab text to boolean\r\n\t\tvar bShowHistory = (state === 'true');\r\n\r\n\t\tthis.setState({ showHistory: bShowHistory }); //M02JC\r\n\t}\r\n\r\n\trender() {\r\n\t\treturn (\r\n\t\t\t
\r\n
\r\n {!this.props.simpleMode ?\r\n /* M01 don't show the tabs if in all simple mode */\r\n \r\n \r\n \r\n \r\n : []}\r\n\t\t\t\t
\r\n\r\n\t\t\t\t{!this.state.showHistory ?\r\n\t\t\t\t\t\r\n\t\t\t\t\t: []}\r\n\t\t\t\r\n\t\t\t\t{this.state.showHistory ?\r\n\t\t\t\t\t\r\n\t\t\t\t\t: []}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nItemsPage.propTypes = {\r\n\ttitle: PropTypes.string.isRequired,\r\n\r\n\tunreadItemCategory: PropTypes.string,\r\n\tunreadItemTypes: PropTypes.any,\r\n\tunread: PropTypes.shape({\r\n\t\titems: PropTypes.arrayOf(PropTypes.any),\r\n\t\tpages: PropTypes.number,\r\n\t\tpage: PropTypes.number,\r\n\t\terror: PropTypes.string,\r\n\t\tisLoading: PropTypes.bool\r\n\t}),\r\n\r\n\treadItemCategory: PropTypes.string,\r\n\treadItemTypes: PropTypes.any,\r\n\tread: PropTypes.shape({\r\n\t\titems: PropTypes.arrayOf(PropTypes.any),\r\n\t\tpages: PropTypes.number,\r\n\t\tpage: PropTypes.number,\r\n\t\terror: PropTypes.string,\r\n\t\tisLoading: PropTypes.bool\r\n\t})\r\n};\r\n\r\nexport default connect(\r\n\tstate => state,\r\n\tdispatch => bindActionCreators({ ...itemActions, ...redirectControllerActions }, dispatch) //M03JC\r\n)(ItemsPage);","import React, { Component } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport ItemsPage from '../components/ItemsPage';\r\nimport { itemCategories } from '../constants/ItemCategories';\r\n\r\nclass Notices extends Component {\r\n\trender() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n}\r\n\r\nexport default connect(\r\n\tstate => ({\r\n\t\tunread: state.unreadNotices,\r\n\t\tread: state.readNotices,\r\n\r\n\t\tunreadItemTypes: state.unreadNoticeTypes,\r\n\t\treadItemTypes: state.readNoticeTypes,\r\n\r\n\t\tunreadItemCategory: itemCategories.unreadNotices,\r\n\t\treadItemCategory: itemCategories.readNotices\r\n\t})\r\n)(Notices);","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: Documents\r\n// Details: Documents page\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// WI3713 24/01/24 JC M01JC\tExtended for data forms\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport React, { Component } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport ItemsPage from '../components/ItemsPage';\r\nimport { itemCategories } from '../constants/ItemCategories';\r\n\r\nclass Documents extends Component {\r\n\r\n\trender() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n}\r\n\r\nexport default connect(\r\n\tstate => ({\r\n\t\tunread: state.unreadDocuments,\r\n\t\tread: state.readDocuments,\r\n\r\n\t\tunreadItemTypes: state.unreadDocumentTypes,\r\n\t\treadItemTypes: state.readDocumentTypes,\r\n\r\n\t\tunreadItemCategory: itemCategories.unreadDocuments,\r\n\t\treadItemCategory: itemCategories.readDocuments,\r\n\r\n\t\tredirectController: state.redirectController //M01JC\r\n\t})\r\n)(Documents);","import React, { Component } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport ItemsPage from '../components/ItemsPage';\r\nimport { itemCategories } from '../constants/ItemCategories';\r\n\r\nclass Documents extends Component {\r\n\trender() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n}\r\n\r\nexport default connect(\r\n\tstate => ({\r\n\t\tunread: state.unreadPay,\r\n\t\tread: state.readPay,\r\n\r\n\t\tunreadItemTypes: state.unreadPayTypes,\r\n\t\treadItemTypes: state.readPayTypes,\r\n\r\n\t\tunreadItemCategory: itemCategories.unreadPay, \r\n\t\treadItemCategory: itemCategories.readPay \r\n\t})\r\n)(Documents);","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: DetailField\r\n// Details: Detail field (single row) for MyDetails\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 101886 02/07/19 JHT M01 Added requiresImageOnChange\r\n// 103839 06/04/20 JC M02 React upgrade\r\n// 108107 01/06/20 JC M03 Original value now passed in\r\n// 108238 08/06/20 JC M04 Use react-datetime component for datetime\r\n// WI3029 31/05/23 JC M05JC\thandleChecked now passes newValue as String to props.changed\r\n//-------------------------------------------------------\r\n*/\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\n//M04 import DateLabel from '../components/DateLabel'; //M04\r\n//M04 import DateTimeLabel from '../components/DateTimeLabel'; //M04\r\nimport DateTime from '../components/DateTime'; //M04\r\nimport { dateTimeTypes } from '../constants/DateTimeTypes'; //M04\r\nimport './css/DetailField.css';\r\nimport { utils } from '../utils/utils'; //M03\r\n\r\nclass DetailField extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tconst decimalPlaces = this.getDecimalPlaces(props.item.dataType);\r\n\t\tconst inputType = this.getInputType(props.item.dataType);\r\n const value = utils.formatValue(props.item.value, inputType, decimalPlaces); //M02\r\n const originalValue = utils.formatValue(props.item.originalValue, inputType, decimalPlaces); //M02\r\n\t\tthis.state = {\r\n\t\t\tinputType,\r\n\t\t\tdecimalPlaces,\r\n originalValue: originalValue, //M03 was value\r\n\t\t\tvalue: value,\r\n\t\t\tisPending: props.item.isPending,\r\n isChanged: false,\r\n propsediting: false, //M02\r\n propstimestamp: 0 //M02\r\n\t\t};\r\n\r\n\t\tthis.handleSelect = this.handleSelect.bind(this);\r\n\t\tthis.handleChecked = this.handleChecked.bind(this);\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n this.handleBlur = this.handleBlur.bind(this);\r\n this.handleDatetimeChange = this.handleDatetimeChange.bind(this); //M04\r\n this.handleDatetimeBlur = this.handleDatetimeBlur.bind(this); //M04\r\n\t}\r\n\r\n //M02\r\n\t//componentWillReceiveProps(nextProps) {\r\n\t//\tconst value = this.formatValue(nextProps.item.value, this.state.inputType, this.state.decimalPlaces);\r\n\t//\tthis.setState({\r\n\t//\t\tvalue: value,\r\n\t//\t\toriginalValue: value,\r\n\t//\t\tisPending: nextProps.item.isPending,\r\n\t//\t\tisChanged: false\r\n\t//\t});\r\n // }\r\n\r\n //M02\r\n static getDerivedStateFromProps(props, state) {\r\n let item = props.item;\r\n let value = utils.formatValue(item.value, state.inputType, state.decimalPlaces);\r\n let originalValue = utils.formatValue(item.originalValue, state.inputType, state.decimalPlaces);//M03\r\n\r\n //only if props editing changed, or timestamp refreshed\r\n if (props.editing !== state.propsediting || \r\n props.timestamp !== state.propstimestamp) {\r\n\r\n //return new state\r\n return {\r\n value: value,\r\n originalValue: originalValue, //M03 was value\r\n isPending: item.isPending,\r\n isChanged: false,\r\n propsediting: props.editing,\r\n propstimestamp: props.timestamp\r\n };\r\n }\r\n\r\n // Return null to indicate no change to state.\r\n return null;\r\n }\r\n\r\n\tdataTypes = [\"text\", \"checkbox\", \"date\", \"datetime\", \"select\", \"number\", \"number\", \"number\", \"number\", \"number\"];\r\n\r\n\tgetInputType(dataType) {\r\n\t\tif (dataType >= 1 && dataType <= 10)\r\n\t\t\treturn this.dataTypes[dataType - 1];\r\n\t\treturn \"text\";\r\n\t}\r\n\r\n\tgetDecimalPlaces(dataType) {\r\n\t\tif (dataType >= 6 && dataType <= 10)\r\n\t\t\treturn dataType - 6;\r\n\t\treturn null;\r\n\t}\r\n\r\n ///M02 moved to utils\r\n\t//formatValue(value, inputType, decimalPlaces) {\r\n\t//\tif (inputType === \"checkbox\") {\r\n\t//\t\treturn value.toLowerCase() === \"true\" ? true : false;\r\n\t//\t}\r\n\t//\telse if (inputType === \"number\") {\r\n\t//\t\tvar numeric = parseFloat(value);\r\n\t//\t\treturn isNaN(numeric)\r\n\t//\t\t\t? \"\"\r\n\t//\t\t\t: numeric.toFixed(decimalPlaces);\r\n\t//\t}\r\n\t//\treturn value;\r\n\t//}\r\n\r\n\thandleSelect = event => {\r\n\t\tvar newValue = event.target.value;\r\n\t\tvar isChanged = newValue !== this.state.originalValue;\r\n\t\tthis.setState({\r\n\t\t\tvalue: newValue,\r\n\t\t\tisChanged: isChanged\r\n\t\t});\r\n this.props.changed({ key: this.props.item.key, isChanged, value: newValue, dataType: this.props.item.dataType, requiresImageOnChange: this.props.item.requiresImageOnChange }); //M01\r\n\t}\r\n\r\n\thandleChecked = event => {\r\n\t\tvar newValue = event.target.checked;\r\n\t\tvar isChanged = newValue !== this.state.originalValue;\r\n\t\tthis.setState({\r\n\t\t\tvalue: newValue,\r\n\t\t\tisChanged: isChanged\r\n\t\t});\r\n\t\tthis.props.changed({\r\n\t\t\tkey: this.props.item.key, isChanged, value: newValue.toString(), //M05JC convert new value to string\r\n\t\t\tdataType: this.props.item.dataType, requiresImageOnChange: this.props.item.requiresImageOnChange\r\n\t\t}); //M01\r\n\t}\r\n\r\n\thandleChange = event => {\r\n\t\tthis.setState({\r\n value: event.target.value\r\n\t\t});\r\n\t}\r\n\r\n\thandleBlur = event => {\r\n\t\tevent.preventDefault();\r\n\t\tvar newValue = utils.formatValue(event.target.value, this.state.inputType, this.state.decimalPlaces); //M02 M04\r\n\t\tvar isChanged = newValue !== this.state.originalValue;\r\n\t\tthis.setState({\r\n\t\t\tvalue: newValue,\r\n isChanged: isChanged\r\n\t\t});\r\n this.props.changed({ key: this.props.item.key, isChanged, value: newValue, dataType: this.props.item.dataType, requiresImageOnChange: this.props.item.requiresImageOnChange }); //M01\r\n }\r\n\r\n //M04\r\n handleDatetimeChange = momentDate => {\r\n this.setState({\r\n value: momentDate\r\n });\r\n }\r\n\r\n //M04\r\n handleDatetimeBlur = momentDate => {\r\n var newValue = utils.formatValue(momentDate, this.state.inputType, this.state.decimalPlaces); //M04\r\n var isChanged = newValue !== this.state.originalValue;\r\n this.setState({\r\n value: newValue,\r\n isChanged: isChanged\r\n });\r\n this.props.changed({ key: this.props.item.key, isChanged, value: newValue, dataType: this.props.item.dataType, requiresImageOnChange: this.props.item.requiresImageOnChange }); //M01\r\n }\r\n\r\n\trender() {\r\n\t\tconst { item } = this.props;\r\n\t\tconst detailChangedClass = this.state.isChanged ? \"detail-changed\" : \"\";\r\n\t\tconst detailPendingClass = this.props.item.isPending ? \"detail-pending\" : \"\";\r\n\t\tif (!this.props.editing) {\r\n var field;\r\n /* M04 just use datetime component\r\n\t\t\tif (this.state.inputType === \"date\") {\r\n\t\t\t\tfield = ;\r\n\t\t\t}\r\n\t\t\telse if (this.state.inputType === \"datetime\") {\r\n\t\t\t\tfield = ;\r\n\t\t\t}\r\n */\r\n /* M04 */\r\n if (this.state.inputType === \"date\" || this.state.inputType === \"datetime\") {\r\n\r\n //get the correct date time type\r\n let dateTimeType = dateTimeTypes.dateTime;\r\n if (this.state.inputType === \"date\") { dateTimeType = dateTimeTypes.date }\r\n\r\n field = \r\n\r\n }\r\n\t\t\telse if (this.state.inputType === \"checkbox\") {\r\n\t\t\t\tfield = this.state.value ? \"Yes\" : \"No\";\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tfield = {this.state.value};\r\n\t\t\t}\r\n\r\n\t\t\treturn (\r\n\t\t\t\t
{field}
\r\n\t\t\t);\r\n\t\t}\r\n\t\t\r\n if (this.state.inputType === \"select\") {\r\n var options = [\"\", ...item.validValues.split(',')];\r\n return (\r\n \r\n {options.map((opt, i) => )}\r\n \r\n );\r\n }\r\n else if (this.state.inputType === \"checkbox\") {\r\n return (\r\n \r\n );\r\n }\r\n /* M04 date /datetime handling - use datetime component */\r\n else if (this.state.inputType === \"date\" || this.state.inputType === \"datetime\") {\r\n\r\n //get the correct date time type\r\n let dateTimeType = dateTimeTypes.dateTime;\r\n if (this.state.inputType === \"date\") { dateTimeType = dateTimeTypes.date }\r\n\r\n return (\r\n );\r\n }\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\n\r\nDetailField.propTypes = {\r\n\titem: PropTypes.shape({\r\n\t\tkey: PropTypes.string.isRequired,\r\n\t\tdataType: PropTypes.number.isRequired,\r\n\t\tvalidValues: PropTypes.string,\r\n\t\tvalue: PropTypes.any,\r\n requiresImageOnChange: PropTypes.bool.isRequired, //M01\r\n\t\tisPending: PropTypes.bool.isRequired\r\n\t}),\r\n\tchanged: PropTypes.func.isRequired\r\n};\r\n\r\nexport default connect()(DetailField);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst DetailButton = props => (\r\n\t
\r\n\t\t{!props.editing && }\r\n\t\t{props.editing &&\r\n\t\t\t
\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t
\r\n\t\t}\r\n\t
\r\n);\r\n\r\nDetailButton.propTypes = {\r\n\tlocation: PropTypes.string.isRequired,\r\n\tedit: PropTypes.func.isRequired,\r\n\tsave: PropTypes.func.isRequired,\r\n\tcancel: PropTypes.func.isRequired,\r\n\tisLoading: PropTypes.bool.isRequired\r\n};\r\n\r\nexport default DetailButton;","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: MyDetails\r\n// Details: My details page\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 101886 24/06/19 JHT M01 Added image upload\r\n// 103839 06/04/20 JC M02 React upgrade\r\n// 108107 29/05/20 JC M03 Don't preview file if not of accepted type, pushed a lot of logic into store\r\n// 110638 11/02/21 JC M04 React-upgrade\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { bindActionCreators } from 'redux';\r\nimport { connect } from 'react-redux';\r\nimport { Col, Row } from 'react-bootstrap';\r\nimport { detailsActions } from '../store/MyDetails';\r\nimport Loading from '../components/Loading';\r\nimport AlertPanel from '../components/AlertPanel';\r\nimport DetailField from '../components/DetailField';\r\nimport DetailButtons from '../components/DetailButtons';\r\nimport Header from '../components/Header';\r\nimport NoItems from '../components/NoItems';\r\n//M02 import { systemControlActions } from '../store/SystemControl';\r\n\r\nclass MyDetails extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n //M03 removed\r\n\t\t//this.state = {\r\n\t\t//\tediting: false,\r\n // changedFields: {},\r\n // isBlockSave: false,\r\n // imageFile: null\r\n // }; //M01 added imageFile and isBlockSave\r\n\r\n\t\tthis.handleFieldChanged = this.handleFieldChanged.bind(this);\r\n\t\tthis.handleEdit = this.handleEdit.bind(this);\r\n\t\tthis.handleSave = this.handleSave.bind(this);\r\n this.handleCancel = this.handleCancel.bind(this);\r\n\r\n\t}\r\n\r\n //M02 componentWillMount\r\n componentDidMount() {\r\n\t\t// This method runs when the component is first added to the page\r\n\t\tthis.props.get();\r\n\t}\r\n\r\n //M01\r\n\t//componentWillReceiveProps(nextProps) {\r\n\t//\t// This method runs when incoming props (e.g., route params) change\r\n\t//\tthis.props.get();\r\n // }\r\n\r\n //M01\r\n //static getDerivedStateFromProps(props, state) {\r\n // props.get();\r\n\r\n // // Return null to indicate no change to state.\r\n // return null;\r\n //}\r\n\r\n // --------------------------------------------------------------\r\n // field change handler\r\n handleFieldChanged = item => {\r\n // // get list of changes from state\r\n\t\t//var changedFields = this.state.changedFields;\r\n\r\n // if (item.isChanged) {\r\n // // if changed, update list with changed item\r\n\t\t//\tchangedFields[item.key] = { value: item.value, dataType: item.dataType, requiresImageOnChange: item.requiresImageOnChange }; //M01\r\n\t\t//}\r\n\t\t//else if (changedFields.hasOwnProperty(item.key)) {\r\n // // if item not changed, delete from list\r\n\t\t//\tdelete changedFields[item.key];\r\n // }\r\n // // apply list back to state\r\n // this.setState({ changedFields });\r\n\r\n //M03 pass to store to update\r\n this.props.updateChangedField(item);\r\n\t}\r\n\r\n // --------------------------------------------------------------\r\n // 'edit' button handler (begin editing)\r\n\thandleEdit = event => {\r\n event.preventDefault();\r\n\r\n //M01 store 'image requirement' in state for later reference\r\n // not now needed, as the image requirement now returned from API\r\n //var sysCtrl = systemControlActions.getLocal(); \r\n //this.setState({ changeImageRequired: sysCtrl.changeImageRequired });\r\n\r\n\t\t//M03 this.setState({ editing: true });\r\n this.props.setEdit(); //M03\r\n\t}\r\n\r\n // --------------------------------------------------------------\r\n // save handler\r\n\thandleSave = event => {\r\n event.preventDefault();\r\n // // if any changes in state, force save \r\n // if (this.state.changedFields.length !== 0) { \r\n // //M01 this.props.save(this.state.changedFields);\r\n // this.props.save(); //M01\r\n\t\t//}\r\n // this.setState({ editing: false, changedFields: {}, imageFile: null }); //M01\r\n\r\n this.props.save(); //M03\r\n\t}\r\n\r\n // --------------------------------------------------------------\r\n // cancel handler\r\n\thandleCancel = event => {\r\n\t\tevent.preventDefault();\r\n //M03 this.setState({ editing: false, changedFields: {}, imageFile: null}); \r\n //M01 clear selected file\r\n //M02 this.setState({ imageFile: null });\r\n\t\t//M03 this.props.get();\r\n this.props.cancelEdit(true) //M03\r\n }\r\n\r\n // --------------------------------------------------------------\r\n //M01 change of selected file\r\n handleImageFileChange = event => {\r\n //if (event.target.files.length !== 0) {\r\n // // get local URL for the image preview\r\n // this.setState({ imageFile: URL.createObjectURL(event.target.files[0]) });\r\n\r\n // // put image contents into the changedFields (in state)\r\n // // ... get the changedfields from state, and append with the image path\r\n // var changedFields = this.state.changedFields;\r\n // // ... read the image \r\n // var fileToRead = event.target.files[0];\r\n // var reader = new FileReader();\r\n // reader.onloadend = function () {\r\n // changedFields[\"~EPChange~image\"] = { value: reader.result, dataType: \"1\", requiresImageOnChange: false}; \r\n // };\r\n // reader.readAsDataURL(fileToRead);\r\n\r\n // // ... return changedFields to state\r\n // this.setState({ changedFields: changedFields }); \r\n //} else {\r\n // this.setState({ imageFile: null});\r\n //}\r\n\r\n //M03 if there's a file\r\n if (event.target.files.length !== 0) {\r\n\r\n //get the file\r\n var fileToRead = event.target.files[0];\r\n\r\n //M03 pass file to store\r\n this.props.setImageFile(fileToRead);\r\n\r\n //get a ref to the props to get round ref image in reader onloadend\r\n var localProps = this.props;\r\n\r\n // ... read the image \r\n var reader = new FileReader();\r\n reader.onloadend = function () {\r\n //M03 pass to store\r\n localProps.setImageFile_StoreLoadedFile(reader.result);\r\n };\r\n\r\n //read as data URL\r\n reader.readAsDataURL(fileToRead);\r\n\r\n } else {\r\n //M03 pass to store\r\n this.props.setImageFile_NoFileSelected();\r\n }\r\n }\r\n\r\n // --------------------------------------------------------------\r\n //M01 clear selected file\r\n handleImageFileClear = event => {\r\n //M03 this.setState({ imageFile: null });\r\n this.props.clearImageFile(); //M03\r\n }\r\n\r\n // --------------------------------------------------------------\r\n //M01 check image requirement\r\n checkImageRequired() {\r\n // skip if not editing, or we have a file upload selected\r\n if (this.props.editing && this.props.imageFile === null) //M03\r\n {\r\n var changedFields = this.props.changedFields; //M03\r\n var isImageRequired = false;\r\n // check the changed fields for any that require an image on change\r\n Object.values(changedFields).forEach(function (value) {\r\n isImageRequired = isImageRequired || value.requiresImageOnChange;\r\n });\r\n\r\n return isImageRequired;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n // --------------------------------------------------------------\r\n //M01 check image exists\r\n hasImage() {\r\n return this.props.imageFile !== null;\r\n }\r\n\r\n // --------------------------------------------------------------\r\n // Render\r\n\trender() {\r\n const { error, fields, isLoading, timestamp, canPreviewFile, editing, imageFile, changedFields, hasSaveError } = this.props; //M02 M03\r\n\t\tlet hasChangedDetails = fields.filter((item, i) => {\r\n\t\t\treturn item.isPending;\r\n }).length !== 0;\r\n \r\n return (\r\n
\r\n
\r\n\r\n {/*M01 show relevant buttons, conditioning 'save' to whether image is required*/}\r\n {fields.length === 0\r\n ? \"\"\r\n : /*M03*/\r\n }\r\n\r\n {error ? : []}\r\n {hasChangedDetails ? : []}\r\n\r\n\r\n {isLoading ? : []}\r\n {!isLoading && fields.length === 0\r\n ? \r\n :
\r\n {/*M01 render alert if image is required*/}\r\n {this.checkImageRequired()\r\n ? \r\n : []\r\n }\r\n {/*show a row for each detail item*/}\r\n {fields.map((item, i) => {\r\n\r\n /* M03 get the item, passing the value into a new original value field */\r\n let localItem = { ...item, originalValue: item.value };\r\n\r\n /* M03 if there's a changed field for the key then use this for the value instead */\r\n if (localItem.key in changedFields) {\r\n localItem = { ...localItem, value: changedFields[localItem.key].value };\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n\r\n {/*M01 render alert if image is required*/}\r\n {this.checkImageRequired()\r\n ? \r\n : []\r\n }\r\n\r\n {/*M03 repeat error at bottom of page if changed details exist M03 or there's a save error */\r\n error && (hasChangedDetails || hasSaveError) ? : []}\r\n\r\n {/*M01 when editing, show file select and preview*/}\r\n {editing ? /*M03*/\r\n
\r\n {this.hasImage() ?\r\n
\r\n \r\n
\r\n {/* M03 file type allows preview? */}\r\n {canPreviewFile ?\r\n /* M03 */\r\n :\r\n \r\n }\r\n
\r\n :\r\n
\r\n {/* M03 was accept=\"image/*\"*/}\r\n {/* M01 replaced custom-file-label with btn btn-default in className*/}\r\n
\r\n }\r\n
\r\n :[]}\r\n
\r\n\r\n\t\t\t\t}\r\n\r\n {/*M01 show relevant buttons, conditioning 'save' to whether image is required*/}\r\n {fields.length === 0\r\n\t\t\t\t\t? \"\"\r\n : /*M03*/\r\n\t\t\t\t}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nMyDetails.propTypes = {\r\n\terror: PropTypes.string,\r\n\tfields: PropTypes.arrayOf(PropTypes.any),\r\n\tisLoading: PropTypes.bool.isRequired\r\n};\r\n\r\nexport default connect(\r\n\tstate => state.myDetails,\r\n\tdispatch => bindActionCreators(detailsActions, dispatch)\r\n)(MyDetails);\r\n","//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: Plan\r\n// Details: Plan component\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 84474 26/09/19 JC M01 Need to URI encode the site\r\n// 105066 06/01/20 JC M02 Added font awesome\r\n// 105927 11/02/20 JC M03 Added bank holiday days\r\n// 104762 02/03/20 JC M04 M02 still using bsSize rather than size for font awesome\r\n// WI2470 20/01/23 JC M05JC\tRename/re-sequence of holiday details\r\n//-------------------------------------------------------\r\n\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { history } from '../history';\r\nimport { Col, Row } from 'react-bootstrap';\r\nimport { bindActionCreators } from 'redux';\r\nimport { weeksActions } from '../store/Weeks';\r\nimport { connect } from 'react-redux';\r\n//M02 import { Glyphicon } from 'react-bootstrap';\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"; //M02\r\nimport './css/Plan.css';\r\n\r\nclass Plan extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.handleClick = this.handleClick.bind(this);\r\n\t}\r\n\r\n\thandleClick = event => {\r\n\t\tevent.preventDefault();\r\n\t\tconst { site, siteId } = this.props.item;\r\n history.push(`/myplan/site/${siteId}/${encodeURIComponent(site)}`);//M01\r\n\t}\r\n\r\n\ttoDecimal = (x) => Number.parseFloat(x).toFixed(2);\r\n\r\n\trender() {\r\n\t\tconst { item } = this.props;\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t
{item.site} {item.holidayYear}
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t {/*M05JC changed from xs to get under holiday when on very small screens*/}\r\n\t\t\t\t\t\t\t\t
Holiday
\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{/* M05JC re-written below\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\tM03 bank holiday count\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t*/}\r\n\r\n\t\t\t\t\t\t\t\t\t\t{/*M05JC...*/}\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t{/* M03 bank holiday count */}\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
Entitlement{this.toDecimal(item.holEntitlementDays)}
Bank holiday{this.toDecimal(item.bankHolidayDays)}
Used{this.toDecimal(item.holUsedDays)}
Approved{this.toDecimal(item.holApprovedDays)}
Remaining{this.toDecimal(item.holRemainingDays)}
Pending{this.toDecimal(item.holRequestedDays)}
Overall entitlement{this.toDecimal(item.holEntitlementDays)}
Bank holidays remaining{this.toDecimal(item.bankHolidayDays)}
Holiday taken{this.toDecimal(item.holUsedDays)}
Holiday booked (approved){this.toDecimal(item.holApprovedDays)}
Holiday booked (pending){this.toDecimal(item.holRequestedDays)}
Holiday outstanding{this.toDecimal(item.holRemainingDays)}
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t {/*M05JC changed from xs to get under holiday when on very small screens*/}\r\n\t\t\t\t\t\t\t\t
Absence
\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
Used{this.toDecimal(item.absUsedDays)}
Approved{this.toDecimal(item.absApprovedDays)}
Pending{this.toDecimal(item.absRequestedDays)}
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n {/* M02 M04 */}\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nPlan.propTypes = {\r\n\titem: PropTypes.shape({\r\n\t\tid: PropTypes.number.isRequired,\r\n\t\tsiteId: PropTypes.number.isRequired,\r\n\t\tsite: PropTypes.string.isRequired,\r\n\t\tcontractTask: PropTypes.string.isRequired,\r\n\t\tholidayYear: PropTypes.string.isRequired,\r\n\t\tholEntitlementDays: PropTypes.number.isRequired,\r\n\t\tholUsedDays: PropTypes.number.isRequired,\r\n\t\tholApprovedDays: PropTypes.number.isRequired,\r\n\t\tholRemainingDays: PropTypes.number.isRequired,\r\n\t\tholRequestedDays: PropTypes.number.isRequired,\r\n\t\tabsUsedDays: PropTypes.number.isRequired,\r\n\t\tabsApprovedDays: PropTypes.number.isRequired,\r\n\t\tabsRequestedDays: PropTypes.number.isRequired\r\n\t})\r\n};\r\n\r\nexport default connect(\r\n\tstate => state,\r\n\tdispatch => bindActionCreators(weeksActions, dispatch)\r\n)(Plan);\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: MyPlan\r\n// Details: My Plan compoment\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 103839 06/04/20 JC M01 React upgrade\r\n// 106380 01/05/20 JC M02 Resolve error related to M01\r\n// 111318 23/12/20 JC M03 componentDidMount not needed\r\n//-------------------------------------------------------\r\n*/\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { bindActionCreators } from 'redux';\r\nimport { connect } from 'react-redux';\r\nimport { planActions } from '../store/MyPlan';\r\nimport Header from '../components/Header';\r\nimport Loading from '../components/Loading';\r\nimport NoItems from '../components/NoItems';\r\nimport Plan from '../components/Plan';\r\nimport AlertPanel from '../components/AlertPanel';\r\n\r\nclass MyPlan extends Component {\r\n\r\n //M02 define empty state to prevent warnings from getDerivedStateFromProps\r\n constructor(props) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n\r\n //M03 removed\r\n // //M01 componentWillMount\r\n // componentDidMount() {\r\n\t//\t// This method runs when the component is first added to the page\r\n\t//\tthis.props.get();\r\n\t//}\r\n\r\n //M01\r\n\t//componentWillReceiveProps(nextProps) {\r\n\t//\t// This method runs when incoming props (e.g., route params) change\r\n\t//\tthis.props.get();\r\n // }\r\n\r\n //M01\r\n static getDerivedStateFromProps(props, state) {\r\n props.get();\r\n\r\n // Return null to indicate no change to state.\r\n return null;\r\n }\r\n\r\n\trender() {\r\n\t\tconst { isLoading, items, error } = this.props;\r\n\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
\r\n\r\n\t\t\t\t
\r\n\t\t\t\t\t{error ? : []}\r\n\r\n\t\t\t\t\t{isLoading ? : []}\r\n\t\t\t\t\t{!isLoading && (items === undefined || items.length === 0)\r\n\t\t\t\t\t\t? \r\n\t\t\t\t\t\t:
\r\n\t\t\t\t\t\t\t{items.map(item =>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t}\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nMyPlan.propTypes = {\r\n\titems: PropTypes.arrayOf(PropTypes.any),\r\n\terror: PropTypes.string,\r\n\tisLoading: PropTypes.bool\r\n};\r\n\r\nexport default connect(\r\n\tstate => state.myPlan,\r\n\tdispatch => bindActionCreators(planActions, dispatch)\r\n)(MyPlan);\r\n","import React, { Component } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { history } from '../history';\r\nimport ItemsPage from '../components/ItemsPage';\r\nimport { itemCategories } from '../constants/ItemCategories';\r\n\r\nclass MyRequests extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.handleNewClick = this.handleNewClick.bind(this);\r\n\t}\r\n\r\n\thandleNewClick() {\r\n\t\thistory.push(`/myrequests/detail/0`);\r\n\t}\r\n\r\n\r\n\trender() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n}\r\n\r\nexport default connect(\r\n\tstate => ({\r\n\t\tunread: state.unreadRequests,\r\n\t\tread: state.readRequests,\r\n\r\n\t\tunreadItemTypes: state.unreadRequestTypes,\r\n\t\treadItemTypes: state.readRequestTypes,\r\n\r\n\t\tunreadItemCategory: itemCategories.unreadRequests,\r\n\t\treadItemCategory: itemCategories.readRequests\r\n\t})\r\n)(MyRequests);","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: MyPlan\r\n// Details: My Plan compoment\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 103839 06/04/20 JC M01 React upgrade\r\n//-------------------------------------------------------\r\n*/\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nclass Checkbox extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.state = { checked: this.props.checked };\r\n\r\n\t\tthis.handleChecked = this.handleChecked.bind(this);\r\n\t}\r\n\r\n //M01\r\n\t//componentWillReceiveProps(nextProps) {\r\n\t//\tif (nextProps.checked !== this.state.checked)\r\n\t//\t\tthis.setState({ checked: nextProps.checked });\r\n // }\r\n\r\n //M01\r\n static getDerivedStateFromProps(props, state) {\r\n\r\n //changed?\r\n if (props.checked !== state.checked) {\r\n\r\n //return new state\r\n return {\r\n checked: props.checked\r\n };\r\n }\r\n\r\n // Return null to indicate no change to state.\r\n return null;\r\n }\r\n\r\n\thandleChecked = event => {\r\n\t\t//event.preventDefault();\r\n\t\tthis.props.changed({ itemId: this.props.itemId, checked: !this.state.checked });\r\n\t}\r\n\r\n\trender() {\r\n\t\tconst { name, disabled } = this.props;\r\n\t\tconst { checked } = this.state;\r\n\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nCheckbox.propTypes = {\r\n\ttype: PropTypes.string,\r\n\tname: PropTypes.string.isRequired,\r\n\tchecked: PropTypes.bool,\r\n\tchanged: PropTypes.func.isRequired,\r\n\titemId: PropTypes.number\r\n};\r\n\r\nexport default Checkbox;","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: Dialog.js\r\n// Details: Dialog.js\r\n//\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// WI3713 30/01/24 JC M01JC\tCancel now optional\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport './css/Dialog.css';\r\n\r\nclass Dialog extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.handleConfirm = this.handleConfirm.bind(this);\r\n\t\tthis.handleCancel = this.handleCancel.bind(this);\r\n\t}\r\n\r\n\thandleConfirm = event => {\r\n\t\tevent.preventDefault();\r\n\t\tif (typeof this.props.onConfirm === \"function\") {\r\n\t\t\tthis.props.onConfirm();\r\n\t\t}\r\n\t}\r\n\r\n\thandleCancel = event => {\r\n\t\tevent.preventDefault();\r\n\t\tif (typeof this.props.onCancel === \"function\") {\r\n\t\t\tthis.props.onCancel();\r\n\t\t}\r\n\t}\r\n\r\n\trender() {\r\n\t\tconst { title, message, confirmClass, confirmText, hideCancel } = this.props; //M01JC\r\n\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t

{title}

\r\n\t\t\t\t\t

{message}

\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t{!hideCancel? //M01JC allow cancel to be hidden\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t: []}\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nDialog.propTypes = {\r\n\ttitle: PropTypes.string.isRequired,\r\n\tmessage: PropTypes.string.isRequired,\r\n\tconfirmClass: PropTypes.string.isRequired,\r\n\tconfirmText: PropTypes.string.isRequired,\r\n\tonConfirm: PropTypes.func.isRequired,\r\n\tonCancel: PropTypes.func,\r\n\thideCancel: PropTypes.bool\r\n};\r\n\r\n\r\nexport default connect()(Dialog);\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2021 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: DayPartEnum\r\n// Details: DayPartEnum constant\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 115164 12/10/21 JC Added\r\n//-------------------------------------------------------\r\n*/\r\n\r\nexport const dayPartEnum = {\r\n full_day: 0,\r\n half_day: 1,\r\n morning: 2,\r\n afternoon: 3,\r\n hours: 4\r\n};\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: RequestCheckResponse.js\r\n// Details: RequestCheckResponse.js\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 105066 06/01/20 JC M01 Added font awesome\r\n//-------------------------------------------------------\r\n*/\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\n//M01 import { Glyphicon } from 'react-bootstrap';\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"; //M01\r\nimport './css/RequestCheckResponse.css';\r\n\r\nconst RequestCheckResponse = props =>\r\n\t
\r\n\t\t
\r\n\t\t\t
{props.site}
\r\n\t\t\t{props.details}\r\n\t\t
\r\n {props.status === 0\r\n ?
Over
/* M01 */\r\n :
OK
/* M01 */\r\n\t\t}\r\n\t
\r\n;\r\n\r\nRequestCheckResponse.propTypes = {\r\n\tsite: PropTypes.string.isRequired,\r\n\tdetails: PropTypes.string.isRequired,\r\n\tstatus: PropTypes.number.isRequired\r\n};\r\n\r\nexport default RequestCheckResponse;","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2020 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: requestUtils\r\n// Details: Request utils constant\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 103839 06/04/20 JC New\r\n// 115164 12/10/21 JC M02JC\tAdded day parts, hours\r\n// WI2232 25/01/23 JC M03JC Added SpecificDays\r\n// WI2242 26/01/23 JC M04JC Added isAmendingApproved\r\n//-------------------------------------------------------\r\n*/\r\nimport moment from 'moment'; //M01JC\r\nimport { requestTypes } from '../constants/RequestTypes';\r\nimport { dayPartEnum } from '../constants/DayPartEnum'; //M02JC\r\n\r\nexport const requestUtils = {\r\n getStateObject,\r\n buildSpecificDays //M03JC\r\n};\r\n\r\nfunction getStateObject(props) {\r\n const { request } = props;\r\n\r\n let absenceReasonId = \"\";\r\n let sites = [];\r\n let specificDays = []; //M03JC\r\n\r\n if (request) {\r\n if (request.absenceReasons) {\r\n absenceReasonId = request.absenceReasons.filter((item, i) => {\r\n return item.isSelected;\r\n });\r\n\r\n if (absenceReasonId.length > 0)\r\n absenceReasonId = absenceReasonId[0].absenceReasonId;\r\n else\r\n absenceReasonId = \"\";\r\n }\r\n\r\n sites = request.sites.map((item, i) => {\r\n return { siteId: item.siteId, site: item.site, isSelected: item.isSelected };\r\n });\r\n\r\n //M03JC build specific days\r\n specificDays = buildSpecificDays(request.isSpecificDays, specificDays, moment.utc(request.fromDate).toDate(), moment.utc(request.toDate).toDate());\r\n }\r\n\r\n return {\r\n id: request ? request.id : 0,\r\n timestamp: request ? request.timestamp : 0,\r\n requestTypeId: request ? request.requestTypeId : requestTypes.holiday,\r\n fromDate: request ? moment.utc(request.fromDate).toDate() : undefined,\r\n toDate: request ? moment.utc(request.toDate).toDate() : undefined,\r\n isSpecificDays: request ? request.isSpecificDays : false, //M03JC\r\n specificDays: specificDays, //M03JC\r\n sites,\r\n absenceReasonId,\r\n requestNote: request ? (request.requestNote || \"\") : \"\",\r\n requestType: request ? (request.requestType || \"\") : \"\",\r\n requestStatus: request ? (request.requestStatus || \"\") : \"\",\r\n processedNote: request ? (request.processedNote || \"\") : \"\",\r\n requestStatusEnum: request ? (request.requestStatusEnum || 1) : 1,\r\n dayPart: request ? request.dayPart : dayPartEnum.full_day, //M02JC\r\n hours: request ? request.hours : 0, //M02JC\r\n\r\n canAmend: request ? request.canAmend : false,\r\n canCancel: request ? request.canCancel : false,\r\n canAcknowledge: request ? request.canAcknowledge : false,\r\n canChange: request ? request.canChange : false, //M01\r\n showCancelDialog: false,\r\n fromCalendar: request ? request.fromCalendar : undefined,\r\n editingHours: false, //M07JC\r\n isAmendingApproved: request ? request.isAmendingApproved : false //M04JC\r\n };\r\n}\r\n\r\nfunction buildSpecificDays(isSpecificDays, specificDays, fromDate, toDate) {\r\n let specificDaysReturn = []; //M03JC\r\n\r\n //if using specific days\r\n if (isSpecificDays) {\r\n\r\n let workingDate = moment.utc(fromDate);\r\n do {\r\n //determine if included, defaulting to true\r\n let bisIncluded = true;\r\n\r\n //is there a specific day for it already?\r\n specificDays.forEach(function (specificDay) {\r\n if (moment.utc(specificDay.specificDate).isSame(workingDate)) {\r\n //get the included value\r\n bisIncluded = specificDay.isIncluded;\r\n }\r\n });\r\n\r\n //construct new specific day\r\n specificDaysReturn.push(\r\n {\r\n specificDate: workingDate.toDate(),\r\n isIncluded: bisIncluded\r\n }\r\n );\r\n\r\n //increment the date & count\r\n workingDate = workingDate.add(1, 'days');\r\n }\r\n //while the from date's not after the to date\r\n while (!workingDate.isAfter(moment.utc(toDate)));\r\n }\r\n\r\n //return\r\n return specificDaysReturn;\r\n}","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2020 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: TCSInputNumeric.js\r\n// Details: TCSInputNumeric.js\r\n//\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 108737 14/08/20 JC Added\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport React from 'react';\r\n\r\nclass TCSInputNumeric extends React.Component {\r\n\r\n /* function to handle focus, forcing the select of the entire input */\r\n handleFocus = (event) => event.target.select();\r\n\r\n render() {\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default TCSInputNumeric; \r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: Request.js\r\n// Object: Request\r\n// Details: Request page\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 101879 03/07/19 JC M01 Can now copy from another request\r\n// 101888 05/07/19 JC M02 Can now cancel future dated accepted\r\n// 84474 26/09/19 JC M03 Need to URI encode the site\r\n// 105066 06/01/20 JC M04 Added font awesome\r\n// 103839 06/04/20 JC M05 React upgrade\r\n// 108238 09/06/20 JC M06 Re-wrote datetime components\r\n// 115164 12/10/21 JC M07JC\tAdded day parts, hours\r\n// WI2231 24/01/23 JC M08JC\tApplied key to dayPart label\r\n// WI2232 25/01/23 JC M09JC\tAdded SpecificDays\r\n// WI2242 26/01/23 JC M10JC\tAdded IsAmendingApproved\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport React, { Component } from 'react';\r\nimport { Col, Row } from \"react-bootstrap\";\r\nimport PropTypes from 'prop-types';\r\nimport { history } from '../history';\r\nimport { bindActionCreators } from 'redux';\r\nimport { connect } from 'react-redux';\r\n//M06JC import Moment from 'react-moment'; \r\nimport moment from 'moment';//M07JC\r\nimport DateTime from '../components/DateTime'; //M06\r\nimport { dateTimeTypes } from '../constants/DateTimeTypes'; //M06\r\nimport { requestActions } from '../store/Request';\r\nimport Header from '../components/Header';\r\nimport Loading from '../components/Loading';\r\nimport AlertPanel from '../components/AlertPanel';\r\nimport Checkbox from '../components/Checkbox';\r\nimport Dialog from '../components/Dialog';\r\nimport NoItems from '../components/NoItems';\r\n//M04 import { Glyphicon } from 'react-bootstrap';\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"; //M04\r\nimport { requestTypes } from '../constants/RequestTypes';\r\nimport { dayPartEnum } from '../constants/DayPartEnum'; //M07JC\r\nimport RequestCheckResponse from '../components/RequestCheckResponse';\r\nimport { requestUtils } from '../utils/requestUtils'; //M05\r\nimport { utils } from '../utils/utils'; //M06\r\nimport TCSInputNumeric from '../components/TCSInputNumeric' //M07JC\r\n\r\nconst requestStatuses = {\r\n\tpending: 1,\r\n\taccepted: 2,\r\n\trejected: 3,\r\n\tcancelled: 4, //M10JC\r\n\trejection_acknowledged: 5, //M10JC\r\n\tpending_amendment_approval: 6 //M10JC\r\n};\r\n\r\nclass Request extends Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.state = requestUtils.getStateObject(props); //M05\r\n\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t\tthis.handleFromDatetimeChange = this.handleFromDatetimeChange.bind(this); //M06\r\n\t\tthis.handleToDatetimeChange = this.handleToDatetimeChange.bind(this); //M06\r\n\t\tthis.handleIsSpecificDaysSelect = this.handleIsSpecificDaysSelect.bind(this); //M09JC\r\n\t\tthis.handleSpecificDaySelect = this.handleSpecificDaySelect.bind(this); //M09JC\r\n\t\tthis.handleReasonSelect = this.handleReasonSelect.bind(this);\r\n\t\tthis.handleSiteSelect = this.handleSiteSelect.bind(this);\r\n\t\tthis.handleTypeChanged = this.handleTypeChanged.bind(this);\r\n\t\tthis.handleDayPartTypeChanged = this.handleDayPartTypeChanged.bind(this); //M07JC\r\n\t\tthis.handleHoursChanged = this.handleHoursChanged.bind(this); //M07JC\r\n\t\tthis.handleHoursBlur = this.handleHoursBlur.bind(this); //M07JC\r\n\r\n\t\tthis.handleBack = this.handleBack.bind(this);\r\n\t\tthis.handleSave = this.handleSave.bind(this);\r\n\t\tthis.handleCheck = this.handleCheck.bind(this);\r\n\t\tthis.handleEdit = this.handleEdit.bind(this);\r\n\r\n\t\tthis.handleAcknowledge = this.handleAcknowledge.bind(this);\r\n\t\tthis.handleCancel = this.handleCancel.bind(this);\r\n\t\tthis.handleConfirmCancel = this.handleConfirmCancel.bind(this);\r\n\t\tthis.handleDismissCancel = this.handleDismissCancel.bind(this);\r\n\t\tthis.handleChangeAcknowledge = this.handleChangeAcknowledge.bind(this); //M01\r\n\t}\r\n\r\n\t//this code is called immediately before mounting occurs, including the render()\r\n\t//M05 componentWillMount\r\n\tcomponentDidMount() {\r\n\t\t//pulls compnents off the route path paramers...\r\n\t\tconst { requestId, date, copyfromid } = this.props.match.params; //M01 added copyfromid parameter\r\n\t\t//and passes into the props get\r\n\t\tthis.props.get(requestId, date, copyfromid); //added copyfromid to get\r\n\r\n\t\t//M01 ensure not set to copy acknowledge (as may be on the props if changing a rejected request)\r\n\t\tthis.props.setCopyAcknowledge(false);\r\n\t}\r\n\r\n\t//M05\r\n\t// componentWillReceiveProps(nextProps) {\r\n\t// //M01 also allow if copy acknowledge flagged\r\n\t//\tif (nextProps.request && nextProps.request.timestamp !== this.state.timestamp) {\r\n\t//\t\tthis.setState(this.getStateObject(nextProps));\r\n\t//\t}\r\n\t//}\r\n\r\n\t//M05\r\n\tstatic getDerivedStateFromProps(props, state) {\r\n\t\t//M01 also allow if copy acknowledge flagged\r\n\t\tif (props.request && props.request.timestamp !== state.timestamp) {\r\n\r\n\t\t\t//return new state\r\n\t\t\treturn requestUtils.getStateObject(props);\r\n\t\t}\r\n\r\n\t\t// Return null to indicate no change to state.\r\n\t\treturn null;\r\n\t}\r\n\r\n\t//M05 moved to requestUtils\r\n\t// getStateObject(props) {\r\n\t//\tconst { request } = props;\r\n\r\n\t//\tlet absenceReasonId = \"\";\r\n\t//\tlet sites = [];\r\n\r\n\t//\tif (request) {\r\n\t//\t\tif (request.absenceReasons) {\r\n\t//\t\t\tabsenceReasonId = request.absenceReasons.filter((item, i) => {\r\n\t//\t\t\t\treturn item.isSelected;\r\n\t//\t\t\t});\r\n\r\n\t//\t\t\tif (absenceReasonId.length > 0)\r\n\t//\t\t\t\tabsenceReasonId = absenceReasonId[0].absenceReasonId;\r\n\t//\t\t\telse\r\n\t//\t\t\t\tabsenceReasonId = \"\";\r\n\t//\t\t}\r\n\r\n\t//\t\tsites = request.sites.map((item, i)=> {\r\n\t//\t\t\treturn { siteId: item.siteId, site: item.site, isSelected: item.isSelected };\r\n\t//\t\t});\r\n\t//\t}\r\n\r\n\t//\treturn {\r\n\t//\t\tid: request ? request.id : 0,\r\n\t//\t\ttimestamp: request ? request.timestamp : 0,\r\n\t//\t\trequestTypeId: request ? request.requestTypeId : requestTypes.holiday,\r\n\t//\t\tfromDate: request ? request.fromDate : undefined,\r\n\t//\t\ttoDate: request ? request.toDate : undefined,\r\n\t//\t\tsites,\r\n\t//\t\tabsenceReasonId,\r\n\t//\t\trequestNote: request ? (request.requestNote || \"\") : \"\",\r\n\t//\t\trequestType: request ? (request.requestType || \"\") : \"\",\r\n\t//\t\trequestStatus: request ? (request.requestStatus || \"\") : \"\",\r\n\t//\t\tprocessedNote: request ? (request.processedNote || \"\") : \"\",\r\n\r\n\t//\t\trequestStatusEnum: request ? (request.requestStatusEnum || 1) : 1,\r\n\r\n\t//\t\tcanAmend: request ? request.canAmend : false,\r\n\t//\t\tcanCancel: request ? request.canCancel : false,\r\n\t// canAcknowledge: request ? request.canAcknowledge : false,\r\n\t// canChange: request ? request.canChange : false, //M01\r\n\t//\t\tshowCancelDialog: false,\r\n\t//\t\tfromCalendar: request ? request.fromCalendar : undefined\r\n\t//\t};\r\n\t//}\r\n\r\n\r\n\tvalidateForm() {\r\n\t\tconst sitesSelected = this.state.sites.filter((item, i) => {\r\n\t\t\treturn item.isSelected;\r\n\t\t});\r\n\r\n\t\t//M07JC added check to make sure hours exist if seleced\r\n\t\tconst isValid = sitesSelected.length > 0\r\n\t\t\t&& (this.state.requestTypeId !== requestTypes.absence || this.state.absenceReasonId !== \"\")\r\n\t\t\t&& (this.state.dayPart !== dayPartEnum.hours || this.state.hours > 0); //M07JC\r\n\r\n\t\treturn isValid;\r\n\t}\r\n\r\n\t// handle change of values event\r\n\thandleChange = event => {\r\n\t\tthis.setState({\r\n\t\t\t[event.target.id]: event.target.value\r\n\t\t});\r\n\t}\r\n\r\n\t//M06\r\n\thandleFromDatetimeChange = momentDate => {\r\n\t\t//M07JC if a moment date\r\n\t\tif (momentDate.hasOwnProperty(\"_isAMomentObject\")) {\r\n\r\n\t\t\t//M09JC get other details from state for specific days\r\n\t\t\tlet { isSpecificDays, specificDays } = this.state;\r\n\r\n\t\t\t//M07JC get the day part & hours from state\r\n\t\t\tlet { dayPart, hours, toDate } = this.state;\r\n\t\t\t//if the date's not the same then get rid of the daypart & hours\r\n\t\t\tif (!momentDate.isSame(toDate, 'day')) {\r\n\t\t\t\tdayPart = dayPartEnum.full_day;\r\n\t\t\t\thours = 0;\t\t\t\t\r\n\t\t\t} else {\r\n\t\t\t\t//M09JC if the same, then disable is specific days\r\n\t\t\t\tisSpecificDays = false; \r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t//M09JC get the specific days\r\n\t\t\tspecificDays = requestUtils.buildSpecificDays(isSpecificDays, specificDays, momentDate.toDate(), toDate);\r\n\r\n\t\t\tthis.setState({\r\n\t\t\t\tfromDate: momentDate.toDate(), //M07JC\r\n\t\t\t\tdayPart: dayPart, //M07JC\r\n\t\t\t\thours: hours, //M07JC\r\n\t\t\t\tisSpecificDays: isSpecificDays, //M09JC\r\n\t\t\t\tspecificDays: specificDays //M09JC\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t//M06\r\n\thandleToDatetimeChange = momentDate => {\r\n\t\t//M07JC if a moment date\r\n\t\tif (momentDate.hasOwnProperty(\"_isAMomentObject\")) {\r\n\r\n\t\t\t//M09JC get other details from state for specific days\r\n\t\t\tlet { isSpecificDays, specificDays } = this.state;\r\n\r\n\t\t\t//M07JC get the day part & hours from state\r\n\t\t\tlet { dayPart, hours, fromDate } = this.state;\r\n\t\t\t//if the date's not the same then get rid of the daypart & hours\r\n\t\t\tif (!momentDate.isSame(fromDate, 'day')) {\r\n\t\t\t\tdayPart = dayPartEnum.full_day;\r\n\t\t\t\thours = 0;\r\n\t\t\t} else {\r\n\t\t\t\t//M09JC if the same, then disable is specific days\r\n\t\t\t\tisSpecificDays = false;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t//M09JC get the specific days\r\n\t\t\tspecificDays = requestUtils.buildSpecificDays(isSpecificDays, specificDays, fromDate, momentDate.toDate());\r\n\r\n\t\t\tthis.setState({\r\n\t\t\t\ttoDate: momentDate.toDate(), //M07JC\r\n\t\t\t\tdayPart: dayPart, //M07JC\r\n\t\t\t\thours: hours, //M07JC\r\n\t\t\t\tisSpecificDays: isSpecificDays, //M09JC\r\n\t\t\t\tspecificDays: specificDays //M09JC\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// M09JC handle is specific days select\r\n\thandleIsSpecificDaysSelect = (item) => {\r\n\t\t//get the check state\r\n\t\tlet isSpecificDays = item.checked;\r\n\r\n\t\t//get other details from state\r\n\t\tlet { specificDays, fromDate, toDate } = this.state;\r\n\r\n\t\t//get the specific days\r\n\t\tspecificDays = requestUtils.buildSpecificDays(isSpecificDays, specificDays, fromDate, toDate);\r\n\r\n\t\tthis.setState({\r\n\t\t\tisSpecificDays: isSpecificDays,\r\n\t\t\tspecificDays: specificDays\r\n\t\t});\r\n\t}\r\n\r\n\t//M09JC handle specific date select handleSpecificDaySelect\r\n\thandleSpecificDaySelect = (item) => {\r\n\t\t//get the from date from the sate\r\n\t\tlet { fromDate } = this.state;\r\n\r\n\t\t//use this to get the specific date, note the item id is offset from the from date as itemId is a number\r\n\t\tlet specificDate = moment.utc(fromDate).add(item.itemId, 'days').toDate();\r\n\r\n\t\tconst specificDay = this.state.specificDays.filter((filterItem, i) => {\r\n\t\t\treturn moment.utc(filterItem.specificDate).isSame(moment.utc(specificDate), 'day');\r\n\t\t});\r\n\r\n\t\tif (specificDay.length) {\r\n\t\t\tconst modifySpecificDay= {\r\n\t\t\t\t...specificDay[0],\r\n\t\t\t\tisIncluded: item.checked\r\n\t\t\t};\r\n\r\n\t\t\tlet index = this.state.specificDays.indexOf(specificDay[0]);\r\n\t\t\tlet specificDays = this.state.specificDays.slice(0, index)\r\n\t\t\t\t.concat(modifySpecificDay)\r\n\t\t\t\t.concat(this.state.specificDays.slice(index + 1)\r\n\t\t\t\t);\r\n\t\t\tthis.setState({ specificDays: specificDays });\r\n\t\t}\r\n\t}\r\n\r\n\t// handle reason select event\r\n\thandleReasonSelect = event => {\r\n\t\tthis.setState({\r\n\t\t\tabsenceReasonId: event.target.value\r\n\t\t});\r\n\t}\r\n\r\n\t// handle site select event\r\n\thandleSiteSelect = (item) => {\r\n\t\tconst site = this.state.sites.filter((filterItem, i) => {\r\n\t\t\treturn filterItem.siteId === item.itemId;\r\n\t\t});\r\n\r\n\t\tif (site.length) {\r\n\t\t\tconst modifySite = {\r\n\t\t\t\t...site[0],\r\n\t\t\t\tisSelected: item.checked\r\n\t\t\t};\r\n\r\n\t\t\tlet index = this.state.sites.indexOf(site[0]);\r\n\t\t\tlet sites = this.state.sites.slice(0, index)\r\n\t\t\t\t.concat(modifySite)\r\n\t\t\t\t.concat(this.state.sites.slice(index + 1)\r\n\t\t\t\t);\r\n\t\t\tthis.setState({ sites: sites });\r\n\t\t}\r\n\t}\r\n\r\n\t// handle type changed event (holiday/absence at present)\r\n\thandleTypeChanged = event => {\r\n\t\tconst value = event.target.value;\r\n\t\tthis.setState({\r\n\t\t\trequestTypeId: +value\r\n\t\t});\r\n\t}\r\n\r\n\t// M07JC handle day part type changed event \r\n\thandleDayPartTypeChanged = event => {\r\n\t\tconst value = event.target.value;\r\n\r\n\t\t//M07JC get the hours from state\r\n\t\tlet { hours } = this.state;\r\n\t\t//if the date's not the same then get rid of the daypart & hours\r\n\t\tif (value !== dayPartEnum.hours) {\r\n\t\t\thours = 0;\r\n\t\t}\r\n\r\n\t\tthis.setState({\r\n\t\t\tdayPart: +value,\r\n\t\t\thours: hours\r\n\t\t});\r\n\t}\r\n\r\n\t// M07JC handle hours changed\r\n\thandleHoursChanged = event => {\r\n\t\t//simply set in state\r\n\t\tvar newHours = Number(event.target.value);\r\n\t\tthis.setState({\r\n\t\t\thours: newHours,\r\n\t\t\teditingHours: true\r\n\t\t});\r\n\t}\r\n\r\n\t// M07JC handle hours blur (leave)\r\n\thandleHoursBlur = event => {\r\n\t\tevent.preventDefault();\r\n\t\tvar newHours = utils.formatValue(event.target.value, \"number\", 2); //format as 2 dp number rather than using Number(event.target.value);\r\n\r\n\t\t//prevent being < 0 & > 24\r\n\t\tif (newHours < 0) { newHours = 0; }\r\n\t\tif (newHours > 24) { newHours = 24; }\r\n\r\n\t\tthis.setState({\r\n\t\t\thours: newHours,\r\n\t\t\teditingHours: false\r\n\t\t});\r\n\r\n\t\t//pass to parent to update\r\n\t\t//this.props.handleHoursBlur(this.props.index, newRate);\r\n\t}\r\n\r\n\t// handle save event\r\n\thandleSave = event => {\r\n\t\tevent.preventDefault();\r\n\t\tthis.props.save(\r\n\t\t\tthis.state.id,\r\n\t\t\tthis.state.requestTypeId,\r\n\t\t\tthis.state.absenceReasonId,\r\n\t\t\tthis.state.fromDate,\r\n\t\t\tthis.state.toDate,\r\n\t\t\tthis.state.isSpecificDays, //M09JC\r\n\t\t\tthis.state.specificDays, //M09JC\r\n\t\t\tthis.state.sites,\r\n\t\t\tthis.state.requestNote,\r\n\t\t\tthis.state.dayPart, //M07JC\r\n\t\t\tthis.state.hours //M07JC\r\n\t\t);\r\n\t}\r\n\r\n\t// handle back event\r\n\thandleBack = event => {\r\n\t\tevent.preventDefault();\r\n\t\tconst { fromCalendar } = this.props;\r\n\t\tif (fromCalendar) {\r\n\t\t\tconst { siteId, site, year, month } = fromCalendar;\r\n\t\t\thistory.push(`/myplan/site/${siteId}/${encodeURIComponent(site)}/${year}/${month}`); //M03\r\n\t\t}\r\n\t\telse {\r\n\t\t\thistory.push(`/myrequests`);\r\n\t\t}\r\n\t}\r\n\r\n\t// handle edit event\r\n\thandleEdit = event => {\r\n\t\tthis.props.clearCheck();\r\n\t}\r\n\r\n\t// handle acknowledge event\r\n\thandleAcknowledge = event => {\r\n\t\tconst { requestId } = this.props.match.params;\r\n\t\tthis.props.acknowledge(requestId);\r\n\t}\r\n\r\n\t//handle change acknowledge event\r\n\thandleChangeAcknowledge = event => {\r\n\r\n\t\t//flag to store that we're going to copy acknowledge (actual copy is done in store navigateAwayFromRequest after acknowledge)\r\n\t\tthis.props.setCopyAcknowledge(true)\r\n\r\n\t\t//and pass to handle acknowledge event\r\n\t\tthis.handleAcknowledge(event);\r\n\t}\r\n\r\n\t//handle cancel event\r\n\thandleCancel = event => {\r\n\t\tthis.setState({ showCancelDialog: true });\r\n\t}\r\n\r\n\t//handle confirm event\r\n\thandleConfirmCancel = event => {\r\n\t\tthis.setState({ showCancelDialog: false });\r\n\t\tconst { requestId } = this.props.match.params;\r\n\t\tthis.props.cancel(requestId);\r\n\t}\r\n\r\n\t//handle dismiss cancel event\r\n\thandleDismissCancel = event => {\r\n\t\tthis.setState({ showCancelDialog: false });\r\n\t}\r\n\r\n\t//handle check event\r\n\thandleCheck = event => {\r\n\t\tevent.preventDefault();\r\n\t\tthis.props.check(\r\n\t\t\tthis.state.id,\r\n\t\t\tthis.state.requestTypeId,\r\n\t\t\tthis.state.absenceReasonId,\r\n\t\t\tthis.state.fromDate,\r\n\t\t\tthis.state.toDate,\r\n\t\t\tthis.state.isSpecificDays, //M09JC\r\n\t\t\tthis.state.specificDays, //M09JC\r\n\t\t\tthis.state.sites,\r\n\t\t\tthis.state.requestNote,\r\n\t\t\tthis.state.dayPart, //M07JC\r\n\t\t\tthis.state.hours, //M07JC\r\n\t\t);\r\n\t}\r\n\r\n\trender() {\r\n\t\tconst { isLoading, request, error, checkResponse, fromCalendar } = this.props;\r\n\t\tconst { requestTypeId, absenceReasonId, fromDate, toDate, sites, canAmend, canCancel, canAcknowledge, showCancelDialog, canChange,\r\n\t\t\tdayPart, hours, editingHours, isSpecificDays, specificDays, isAmendingApproved } = this.state; //M01 added can change //M07JC M09JC M10JC\r\n\r\n\t\tconst isNewRequest = this.state.id === 0;\r\n\t\tconst disableEdit = requestTypeId === requestTypes.holiday && checkResponse;\r\n\r\n\t\tconst showSave = canAmend && (requestTypeId === requestTypes.absence || checkResponse);\r\n\t\tconst showCheck = canAmend && requestTypeId === requestTypes.holiday && !checkResponse;\r\n\t\tconst showEdit = canAmend && disableEdit;\r\n\r\n\t\tconst showAcknowledge = canAcknowledge;\r\n\t\tconst showCancel = canCancel && !disableEdit;\r\n\t\tconst showChange = canChange; //determine whether we should show change button\r\n\r\n\t\tconst backTitle = fromCalendar\r\n\t\t\t? \"Back to Calendar\"\r\n\t\t\t: \"Back to My Requests\";\r\n\r\n\t\tconst title = canAmend\r\n\t\t\t? `${isNewRequest ? \"New\" : \"Edit\"} Request`\r\n\t\t\t: \"Request Details\";\r\n\r\n\t\t//M09JC \r\n\t\tconst sameDay = fromDate !== undefined && toDate !== undefined && moment.utc(fromDate).isSame(moment.utc(toDate), 'day');\r\n\r\n\t\t//M07JC - determine if we should enable part - only when from date = to date\r\n\t\tconst enableDayPart = sameDay; //M09JC\r\n\r\n\t\t//M07JC - determine if we should enable hours - only when day part = hours\r\n\t\tconst enableHours = dayPart !== undefined && dayPart === dayPartEnum.hours;\r\n\r\n\t\t//M09JC - determine if we can show specific days - only if from date not the same as to date\r\n\t\tconst enableSpecificDays = !sameDay;\r\n\r\n\t\t//M09JC - show specific days - only if the request isn't accepted or pending amendment approval\r\n\t\tconst showSpecificDays = request && request.requestStatusEnum !== requestStatuses.accepted &&\r\n\t\t\trequest.requestStatusEnum !== requestStatuses.pending_amendment_approval\r\n\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
\r\n\r\n\t\t\t\t
\r\n\t\t\t\t\t {/* M04 */}\r\n\t\t\t\t
\r\n\r\n\t\t\t\t
\r\n\t\t\t\t\t{showCancelDialog\r\n\t\t\t\t\t\t? \r\n\t\t\t\t\t\t: []}\r\n\r\n\t\t\t\t\t{error ? : []}\r\n\r\n\r\n\t\t\t\t\t{(showSave && this.state.requestTypeId === requestTypes.holiday) ?\r\n\t\t\t\t\t\t/*M01 - if show save on holiday, need to put up an alert panel to inform user they still need to save */\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t: []\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t{isLoading ? : []}\r\n\t\t\t\t\t{request ?\r\n\t\t\t\t\t\tcanAmend\r\n\t\t\t\t\t\t\t?\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t   \r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\tAbsence\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{this.state.requestTypeId === requestTypes.absence\r\n\t\t\t\t\t\t\t\t\t? \r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t: []}\r\n\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{/* M06 re-written below \r\n\t\t\t\t\t\t\t\t\t\t */}\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{/* M06 */}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{/* M06 re-written below \r\n\t\t\t\t\t\t\t\t\t\t */}\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{/* M06 */}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\t{/* M09JC specific days checkbox? */\r\n\t\t\t\t\t\t\t\t\tshowSpecificDays ?\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t: []}\r\n\r\n\t\t\t\t\t\t\t\t{/* M09JC specific days? */\r\n\t\t\t\t\t\t\t\t\tisSpecificDays ?\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t{specificDays.map((item, key) =>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t: []}\r\n\r\n\t\t\t\t\t\t\t\t{/* M07JC day part type radio */}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{Object.values(dayPartEnum).map((i, j) =>\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\t{/* M07JC hours */}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{sites.map(item =>\r\n\t\t\t\t\t\t\t\t\t\t\t /*M10JC*/ \r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\r\n\r\n\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t{checkResponse\r\n\t\t\t\t\t\t\t\t\t? \r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t{checkResponse.length === 0\r\n\t\t\t\t\t\t\t\t\t\t\t\t? \r\n\t\t\t\t\t\t\t\t\t\t\t\t: []}\r\n\t\t\t\t\t\t\t\t\t\t\t{checkResponse.map(item =>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t: []}\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t{showSave ? : []}\r\n\t\t\t\t\t\t\t\t\t{showCheck ? : []}\r\n\t\t\t\t\t\t\t\t\t{showEdit ? : []}\r\n\t\t\t\t\t\t\t\t\t{showCancel ? : []} {/* M04 */}\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t:
\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{this.state.requestType}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{this.state.requestStatusEnum === requestStatuses.accepted ? : []} {/* M04 */}\r\n\t\t\t\t\t\t\t\t\t\t{this.state.requestStatusEnum === requestStatuses.rejected ? : []} {/* M04 */}\r\n\t\t\t\t\t\t\t\t\t\t {this.state.requestStatus}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{this.state.requestStatusEnum === requestStatuses.rejected && this.state.processedNote\r\n\t\t\t\t\t\t\t\t\t? \r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t
{this.state.processedNote}
\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t: []}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{/* M06 */}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{/* M06 */}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\t{/* M07JC day part - we iterate through each enum value and print the text if it matches */}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{Object.values(dayPartEnum).map((i, j) =>\r\n\t\t\t\t\t\t\t\t\t\t\tdayPart === i ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t: []\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{sites.map(item =>\r\n\t\t\t\t\t\t\t\t\t\t\t
{item.site}
\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t{this.state.requestNote\r\n\t\t\t\t\t\t\t\t\t? \r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t{this.state.requestNote.split('\\n').map((i, k) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\treturn {i}
;\r\n\t\t\t\t\t\t\t\t\t\t\t})}\r\n\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t: []}\r\n\t\t\t\t\t\t\t\t{(showAcknowledge || showChange || showCancel)\r\n\t\t\t\t\t\t\t\t\t/*M01 if we should show acknowledge or change M02 or cancel, add buttons for this */\r\n\t\t\t\t\t\t\t\t\t?
\r\n\t\t\t\t\t\t\t\t\t\t{showAcknowledge ? : []}\r\n\t\t\t\t\t\t\t\t\t\t{showChange ? : []}\r\n\t\t\t\t\t\t\t\t\t\t{showCancel ? : []} {/* M04 */}\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t: []}\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t: []\r\n\t\t\t\t\t}\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nRequest.propTypes = {\r\n\trequest: PropTypes.any,\r\n\terror: PropTypes.string,\r\n\tisLoading: PropTypes.bool,\r\n\tcheckResponse: PropTypes.any\r\n\r\n};\r\n\r\nexport default connect(\r\n\tstate => (state.request),\r\n\tdispatch => bindActionCreators(requestActions, dispatch)\r\n)(Request);\r\n","//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: CalendarDay\r\n// Details: CalendarDay component\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 105066 06/01/20 JC M01 Added font awesome\r\n// 108238 10/06/20 JC M02 Re-wrote datetime components\r\n//-------------------------------------------------------\r\n\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\n//M02 import Moment from 'react-moment';\r\nimport DateTime from './DateTime'; //M02\r\nimport { dateTimeTypes } from '../constants/DateTimeTypes'; //M02\r\n//M01 import { Glyphicon } from 'react-bootstrap';\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"; //M01\r\n\r\nclass CalendarDay extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.handleClick = this.handleClick.bind(this);\r\n\t}\r\n\r\n\thandleClick = event => {\r\n\t\tevent.preventDefault();\r\n\t\tthis.props.onSelected(this.props.requestId, this.props.date);\r\n\t}\r\n\r\n\trender() {\r\n\t\tconst glyphLookup = [\r\n\t\t\t[],\r\n , //M01\r\n , //M01\r\n , //M01\r\n , //M01\r\n , //M01\r\n , //M01\r\n , //M01\r\n //M01\r\n\t\t];\r\n\r\n\t\treturn (\r\n\t\t\t\r\n {/*M02*/}\r\n\t\t\t\t{glyphLookup[this.props.state]}\r\n\t\t\t\t{this.props.isInMonth ? [] : }\r\n\t\t\t\t{this.props.isToday ? : []}\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n}\r\n\r\nCalendarDay.propTypes = {\r\n\trequestId: PropTypes.number,\r\n\tdate: PropTypes.string.isRequired,\r\n\tstate: PropTypes.number.isRequired,\r\n\tisInMonth: PropTypes.bool.isRequired,\r\n\tisToday: PropTypes.bool.isRequired,\r\n\tonSelected: PropTypes.func\r\n};\r\n\r\nexport default connect()(CalendarDay);","//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: Calendar\r\n// Details: Calendar component\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 103563 18/09/19 JHT M01 added calendarstyle\r\n// 84474 26/09/19 JC M02 Need to URI encode the site\r\n// 105066 06/01/20 JC M03 Added font awesome\r\n// 108238 10/06/20 JC M04 Re-wrote datetime components\r\n//-------------------------------------------------------\r\n\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { bindActionCreators } from 'redux';\r\nimport { history } from '../history';\r\nimport { connect } from 'react-redux';\r\nimport { weeksActions } from '../store/Weeks';\r\nimport { utils } from '../utils/utils';\r\n//M04 import Moment from 'react-moment';\r\nimport DateTime from './DateTime'; //M04\r\nimport { dateTimeTypes } from '../constants/DateTimeTypes'; //M04\r\nimport moment from 'moment';\r\n//M03 import { Glyphicon } from 'react-bootstrap';\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"; //M03\r\nimport CalendarDay from './CalendarDay';\r\nimport './css/Calendar.css';\r\nimport { requestActions } from '../store/Request';\r\n\r\nclass Calendar extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.handleClick = this.handleClick.bind(this);\r\n\t\tthis.handlePrev = this.handlePrev.bind(this);\r\n\t\tthis.handleNext = this.handleNext.bind(this);\r\n\t}\r\n\r\n\thandleClick = (requestId, date) => {\r\n\t\tconst id = +requestId;\r\n\t\tconst { siteId, site, year, month } = this.props;\r\n\t\t\t\t\r\n\t\tif (id === 0) {\r\n\t\t\t// Only create new requests for dates for today and after\r\n\t\t\tif (moment().isSameOrBefore(date, \"day\")) {\r\n\t\t\t\tthis.props.setFromCalendar({ siteId, site, year, month });\r\n\t\t\t\thistory.push(`/myrequests/detail/${requestId}/${utils.truncateDate(date)}`);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if (id > 0) {\r\n\t\t\tthis.props.setFromCalendar({ siteId, site, year, month });\r\n\t\t\thistory.push(`/myrequests/detail/${requestId}`);\r\n\t\t}\t\t\r\n\t}\r\n\r\n\thandlePrev = event => {\r\n\t\tevent.preventDefault();\r\n\t\tlet { siteId, site, year, month } = this.props;\r\n\r\n\t\tmonth--;\r\n\t\tif (month < 1) {\r\n\t\t\tmonth += 12;\r\n\t\t\tyear--;\r\n\t\t}\r\n\r\n history.push(`/myplan/site/${siteId}/${encodeURIComponent(site)}/${year}/${month}`);//M02\r\n\t}\r\n\r\n\thandleNext = event => {\r\n\t\tevent.preventDefault();\r\n\t\tlet { siteId, site, year, month } = this.props;\r\n\r\n\t\tmonth++;\r\n\t\tif (month > 12) {\r\n\t\t\tmonth -= 12;\r\n\t\t\tyear++;\r\n\t\t}\r\n\r\n history.push(`/myplan/site/${siteId}/${encodeURIComponent(site)}/${year}/${month}`); //M02\r\n\t}\r\n\r\n //M01\r\n getClassForState(forState) {\r\n // delegate to weeks\r\n return this.props.getClassForStateSample(forState);\r\n }\r\n\r\n\r\n\trender() {\r\n\t\tconst { isLoading, weeks, year, month } = this.props;\r\n\t\tconst date = \"\" + (year < 10 ? \"0\" : \"\") + year + \"-\" + (month < 10 ? \"0\" : \"\") + month + \"-01\";\r\n\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n {/*M03*/}\r\n\t\t\t\t\t
\r\n {/*M04*/}\r\n\t\t\t\t\t
\r\n {/*M03*/}\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{weeks.map(week => {\r\n\t\t\t\t\t\t\treturn week.days && week.days.length\r\n\t\t\t\t\t\t\t\t? \r\n\t\t\t\t\t\t\t\t\t{week.days.map(day => {\r\n\t\t\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t: [];\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t\r\n\t\t\t\t
Mon
Tue
Wed
Thu
Fri
Sat
Sun
\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t
\r\n\r\n\r\n\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t
Key
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n \r\n \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n \r\n \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n \r\n \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
Holiday
Absence
{/*M01 M03*/} \r\n Pending\r\n\t\t\t\t\t\t\t {/*M01 M03*/} \r\n Pending\r\n\t\t\t\t\t\t\t
{/*M01 M03*/} \r\n Approved/used\r\n\t\t\t\t\t\t\t {/*M01 M03*/} \r\n Approved/used\r\n\t\t\t\t\t\t\t
{/*M01 M03*/} \r\n Rejected\r\n\t\t\t\t\t\t\t {/*M01 M03*/} \r\n Rejected\r\n\t\t\t\t\t\t\t
\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nCalendar.propTypes = {\r\n\tweeks: PropTypes.arrayOf(\r\n\t\tPropTypes.shape({\r\n\t\t\tdays: PropTypes.arrayOf(\r\n\t\t\t\tPropTypes.shape({\r\n\t\t\t\t\tstateClass: PropTypes.string.isRequired,\r\n\t\t\t\t\tstateText: PropTypes.string.isRequired,\r\n\t\t\t\t\trequestId: PropTypes.number,\r\n\t\t\t\t\tdate: PropTypes.string.isRequired,\r\n\t\t\t\t\tstate: PropTypes.number.isRequired,\r\n\t\t\t\t\tisInMonth: PropTypes.bool.isRequired,\r\n\t\t\t\t\tisToday: PropTypes.bool.isRequired\r\n\t\t\t\t})\r\n\t\t\t)\r\n\t\t})\r\n\t)\r\n};\r\n\r\nexport default connect(\r\n\tnull,\r\n\tdispatch => bindActionCreators({ ...weeksActions, ...requestActions}, dispatch)\r\n)(Calendar);\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: SiteCalendar.js\r\n// Object: SiteCalendar\r\n// Details: SiteCalendar Component\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 84474 26/09/19 JC M01 Need to URI decode the site\r\n// 103839 06/04/20 JC M02 React upgrade\r\n// 111318 23/12/20 JC M03 componentWillReceiveProps should have been removed in M02\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { bindActionCreators } from 'redux';\r\nimport { connect } from 'react-redux';\r\nimport { weeksActions } from '../store/Weeks';\r\nimport Header from '../components/Header';\r\nimport Loading from '../components/Loading';\r\nimport NoItems from '../components/NoItems';\r\nimport Calendar from '../components/Calendar';\r\nimport AlertPanel from '../components/AlertPanel';\r\n\r\nclass SiteCalendar extends Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.state = {\r\n\t\t\tsiteId: undefined,\r\n\t\t\tyear: undefined,\r\n\t\t\tmonth: undefined\r\n\t\t};\r\n\t}\r\n\r\n //M03 simply not needed as handled in getDerivedStateFromProps\r\n // //M02 componentWillMount\r\n // componentDidMount() {\r\n\t\t//// This method runs when the component is first added to the page\r\n\t\t//const { siteId, year, month } = this.props.match.params;\r\n\r\n\t\t//this.setState({\r\n\t\t//\tsiteId: siteId,\r\n\t\t//\tyear: year,\r\n\t\t//\tmonth: month\r\n\t\t//});\r\n\r\n\t\t//this.props.getWeeks(siteId, year, month);\r\n //}\r\n\r\n //M03 re-written below\r\n\t//componentWillReceiveProps(nextProps) {\r\n\t//\tconst { siteId, year, month } = nextProps.match.params;\r\n\t//\tconst state = this.state;\r\n\r\n\t//\tif (siteId !== state.siteId || year !== state.year || month !== state.month) {\r\n\t//\t\tthis.setState({\r\n\t//\t\t\tsiteId: siteId,\r\n\t//\t\t\tyear: year,\r\n\t//\t\t\tmonth: month\r\n\t//\t\t});\r\n\t//\t\tthis.props.getWeeks(siteId, year, month);\r\n\t//\t}\r\n // }\r\n\r\n //M03\r\n static getDerivedStateFromProps(props, state) {\r\n\r\n //get values from props\r\n let siteId = props.match.params.siteId;\r\n let year = props.match.params.year;\r\n let month = props.match.params.month;\r\n\r\n //change of props?\r\n if (siteId !== state.siteId || year !== state.year || month !== state.month) {\r\n \r\n //get weeks\r\n props.getWeeks(siteId, year, month);\r\n\r\n //return new state\r\n return ({\r\n siteId: siteId,\r\n year: year,\r\n month: month\r\n });\r\n }\r\n\r\n // Return null to indicate no change to state.\r\n return null;\r\n }\r\n\r\n\trender() {\r\n\t\tconst { isLoading, weeks, year, month } = this.props;\r\n const { siteId, site } = this.props.match.params;\r\n\r\n //M01 decode the site\r\n var decodedSite = decodeURIComponent(site);\r\n\r\n ;\r\n\t\treturn (\r\n
\r\n {/* M01 use decoded site */}\r\n
\r\n\r\n\t\t\t\t
\r\n\t\t\t\t\t{this.props.error ? : []}\r\n\r\n\t\t\t\t\t{isLoading ? : []}\r\n\t\t\t\t\t{!isLoading && (weeks === undefined || weeks.length === 0)\r\n ? \r\n /* M01 use decoded site */\r\n : \r\n\t\t\t\t\t}\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nSiteCalendar.propTypes = {\r\n\tweeks: PropTypes.arrayOf(PropTypes.any),\r\n\terror: PropTypes.string,\r\n\tisLoading: PropTypes.bool\r\n};\r\n\r\nexport default connect(\r\n\tstate => state.weeks,\r\n\tdispatch => bindActionCreators(weeksActions, dispatch)\r\n)(SiteCalendar);\r\n","import React, { Component } from 'react';\r\nimport { Button, FormGroup, FormControl, FormLabel, Col } from \"react-bootstrap\";\r\nimport { bindActionCreators } from 'redux';\r\nimport { connect } from 'react-redux';\r\nimport { userActions } from '../store/Authentication';\r\nimport Loading from '../components/Loading';\r\nimport AlertPanel from '../components/AlertPanel';\r\n\r\nclass Authenticate extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.state = {\r\n\t\t\temployeeCode: '',\r\n\t\t\tpassword: '',\r\n\t\t\taccessCode: ''\r\n\t\t};\r\n\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t\tthis.handleAuthenticate = this.handleAuthenticate.bind(this);\r\n\t}\r\n\r\n\tvalidateForm() {\r\n\t\treturn this.state.accessCode.length > 0;\r\n\t}\r\n\r\n\thandleChange = event => {\r\n\t\tthis.setState({\r\n\t\t\t[event.target.id]: event.target.value\r\n\t\t});\r\n\t}\r\n\r\n\thandleAuthenticate = event => {\r\n\t\tevent.preventDefault();\r\n\t\tthis.props.authenticate(this.state.accessCode);\r\n\t}\r\n\r\n\trender() {\r\n\t\tconst { authentication } = this.props;\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t\t\"Employee\r\n\t\t\t\t
\r\n\t\t\t\t

Log In

\r\n\t\t\t\t
\r\n\t\t\t\t\t{authentication.message ? : []}\r\n\t\t\t\t\t{authentication.error ? : []}\r\n\r\n\t\t\t\t\t{authentication.loggingIn ? : []}\r\n\t\t\t\t\t{!authentication.loggingIn ?\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\t \r\n\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tPIN\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n \r\n\t\t\t\t\t\t\t\tContinue\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t: []}\r\n\t\t\t\t
\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n}\r\n\r\nexport default connect(\r\n\tstate => ({ authentication: state.authentication, alerts: state.alerts.alerts }),\r\n\tdispatch => bindActionCreators(userActions, dispatch)\r\n)(Authenticate);","import React, { Component } from 'react';\r\nimport { Button, FormGroup, FormControl, FormLabel, Col } from \"react-bootstrap\";\r\nimport { bindActionCreators } from 'redux';\r\nimport { history } from '../history';\r\nimport { connect } from 'react-redux';\r\nimport { userActions } from '../store/Authentication';\r\nimport Loading from '../components/Loading';\r\nimport AlertPanel from '../components/AlertPanel';\r\n\r\nclass ForgotPassword extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.state = {\r\n\t\t\temployeeCode: '',\r\n\t\t\tnicNumber: '',\r\n\t\t\tdateOfBirth: ''\r\n\t\t};\r\n\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t\tthis.handleLogin = this.handleLogin.bind(this);\r\n\t\tthis.handleBackToLogin = this.handleBackToLogin.bind(this);\r\n\t}\r\n\r\n\tvalidateForm() {\r\n\t\treturn this.state.employeeCode.length > 0\r\n\t\t\t&& this.state.nicNumber.length > 0\r\n\t\t\t&& this.state.dateOfBirth.length > 0;\r\n\t}\r\n\r\n\thandleChange = event => {\r\n\t\tthis.setState({\r\n\t\t\t[event.target.id]: event.target.value\r\n\t\t});\r\n\t}\r\n\r\n\thandleLogin = event => {\r\n\t\tevent.preventDefault();\r\n\t\tthis.props.forgotPassword(this.state.employeeCode, this.state.nicNumber, this.state.dateOfBirth);\r\n\t}\r\n\r\n\thandleBackToLogin = event => {\r\n\t\tevent.preventDefault();\r\n\t\thistory.push('/login');\r\n\t}\r\n\r\n\trender() {\r\n\t\tconst { authentication } = this.props;\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t\t\"Employee\r\n\t\t\t\t
\r\n\t\t\t\t

Log In

\r\n\t\t\t\t
\r\n\t\t\t\t\t{authentication.message ? : []}\r\n\t\t\t\t\t{authentication.error ? : []}\r\n\r\n\t\t\t\t\t{authentication.loggingIn ? : []}\r\n\t\t\t\t\t{!authentication.loggingIn ?\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tEmployee code\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tNI number\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tDate of birth\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t
\r\n \r\n\t\t\t\t\t\t\t\tLog In\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
\r\n \r\n\t\t\t\t\t\t\t\tCancel\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t: []}\r\n\t\t\t\t
\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n}\r\n\r\nexport default connect(\r\n\tstate => ({ authentication: state.authentication, alerts: state.alerts.alerts }),\r\n\tdispatch => bindActionCreators(userActions, dispatch)\r\n)(ForgotPassword);","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: ChangePassword\r\n// Details: Change Password page\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 108946 27/07/20 JC M01 Pass current password when changing existing\r\n// 109897 18/09/20 JC M02 Hide current password if User.isForgottenPassword\r\n//-------------------------------------------------------\r\n*/\r\nimport React, { Component } from 'react';\r\nimport { Button, FormGroup, FormControl, FormLabel, Col } from \"react-bootstrap\";\r\nimport { bindActionCreators } from 'redux';\r\nimport { connect } from 'react-redux';\r\nimport { passwordActions } from '../store/PasswordManager';\r\nimport Header from '../components/Header';\r\nimport Loading from '../components/Loading';\r\nimport AlertPanel from '../components/AlertPanel';\r\n\r\nclass ChangePassword extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n this.state = {\r\n currentPassword: '', //M01\r\n newPassword: '', //M01\r\n\t\t\trepeatPassword: ''\r\n\t\t};\r\n\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t\tthis.handleSubmit = this.handleSubmit.bind(this);\r\n\t}\r\n\r\n\tvalidateForm() {\r\n return (this.props.passwordManager.isForgottenPassword || this.state.currentPassword.length > 0)\r\n && this.state.newPassword.length > 0\r\n && this.state.repeatPassword.length > 0; //M01 M02 don't validate current password if is forgotten password\r\n\t}\r\n\r\n\thandleChange = event => {\r\n\t\tthis.setState({\r\n\t\t\t[event.target.id]: event.target.value\r\n\t\t});\r\n\t}\r\n\r\n\thandleSubmit = event => {\r\n\t\tevent.preventDefault();\r\n\t\tthis.props.change(this.state.currentPassword, this.state.newPassword, this.state.repeatPassword); //M01\r\n\t}\r\n\r\n\trender() {\r\n const { passwordManager } = this.props;\r\n\r\n return (\r\n
\r\n
\r\n {passwordManager.success ? : []}\r\n {passwordManager.error ? : []}\r\n\r\n \r\n {passwordManager.changingPassword ? : []}\r\n {!passwordManager.changingPassword ?\r\n\r\n
\r\n {/* M01 current password M02 unless user is forgotten password */\r\n !passwordManager.isForgottenPassword ?\r\n \r\n Current Password\r\n \r\n \r\n : []}\r\n {/* M01 */}\r\n\t\t\t\t\t\t\t\tNew Password\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tRepeat Password\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n \r\n\t\t\t\t\t\t\tChange Password\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t: []}\r\n\t\t\t\t\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nexport default connect(\r\n state => ({ passwordManager: state.passwordManager, message: state.passwordManager.message}), \r\n\tdispatch => bindActionCreators(passwordActions, dispatch)\r\n)(ChangePassword);","import React, { Component } from 'react';\r\nimport { Col } from 'react-bootstrap';\r\nimport { Button } from \"react-bootstrap\";\r\nimport { connect } from 'react-redux';\r\nimport { history } from '../history';\r\nimport Header from '../components/Header';\r\nimport AlertPanel from '../components/AlertPanel';\r\n\r\nclass PasswordChanged extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.handleSubmit = this.handleSubmit.bind(this);\r\n\t}\r\n\r\n\thandleSubmit = event => {\r\n\t\tevent.preventDefault();\r\n\r\n\t\t// continue\r\n\t\thistory.push('/');\r\n\t}\r\n\r\n\trender() {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t
\r\n \r\n\t\t\t\t\t\t\tContinue\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nexport default connect()(PasswordChanged);","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: Contacts\r\n// Details: Contacts page\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 102715 16/08/19 JC New\r\n//-------------------------------------------------------\r\n*/import React, { Component } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport ItemsPage from '../components/ItemsPage';\r\nimport { itemCategories } from '../constants/ItemCategories';\r\n\r\nclass Contacts extends Component {\r\n\trender() {\r\n\t\treturn (\r\n \r\n\t\t);\r\n\t}\r\n}\r\n\r\nexport default connect(\r\n\tstate => ({\r\n unread: state.allContacs,\r\n //read: state.allContacs,\r\n simpleMode: true,\r\n\r\n\t\tunreadItemTypes: state.allContactTypes,\r\n //readItemTypes: state.allContactTypes,\r\n\r\n\t\tunreadItemCategory: itemCategories.allContacts,\r\n //readItemCategory: itemCategories.allContacts\r\n\t})\r\n)(Contacts);","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: MyTraining page \r\n// Details: My Training page\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 103782 10/12/19 JC New\r\n//-------------------------------------------------------\r\n*/\r\nimport React, { Component } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport ItemsPage from '../components/ItemsPage';\r\nimport { itemCategories } from '../constants/ItemCategories';\r\n\r\nclass MyTraining extends Component {\r\n\trender() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n}\r\n\r\nexport default connect(\r\n\tstate => ({\r\n uncompleted: state.uncompletedTraining,\r\n completed: state.completedTraining,\r\n\r\n\t\tuncompletedItemTypes: state.uncompletedTrainingTypes,\r\n\t\tcompletedItemTypes: state.completedTrainingTypes,\r\n\r\n uncompletedItemCategory: itemCategories.uncompletedTraining,\r\n completedItemCategory: itemCategories.completedTraining\r\n\t})\r\n)(MyTraining);","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2020 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: PortalRedirectTypes\r\n// Details: PortalRedirectTypes constant\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 106380 30/04/20 JC New\r\n// 103839 13/05/20 JC M01 Added teamPortal\r\n//-------------------------------------------------------\r\n*/\r\n\r\nexport const portalRedirectTypes = {\r\n managerPortal: 2\r\n ,teamPortal: 3 //M01\r\n};\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2020 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: PortalRedirect\r\n// Details: PortalRedirect compoment\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 106380 30/04/20 JC New\r\n// 103839 13/05/20 JC M01 Added TeamPortal redirect\r\n//-------------------------------------------------------\r\n*/\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { bindActionCreators } from 'redux';\r\nimport { connect } from 'react-redux';\r\nimport { portalRedirectActions } from '../store/PortalRedirect';\r\nimport { systemControlActions } from '../store/SystemControl';\r\nimport Header from '../components/Header';\r\nimport Loading from '../components/Loading';\r\nimport AlertPanel from '../components/AlertPanel';\r\nimport { portalRedirectTypes } from '../constants/PortalRedirectTypes';\r\n\r\nclass PortalRedirect extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n portalredirecttype: -1\r\n };\r\n }\r\n\r\n // This method runs when the component is first added to the page\r\n componentDidMount() {\r\n\t\t\r\n //pulls compnents off the route path paramers...\r\n const { portalredirecttype } = this.props.match.params;\r\n\r\n const { systemControl } = this.props;\r\n\r\n //set in page state\r\n this.setState({\r\n portalredirecttype: portalredirecttype\r\n });\r\n\r\n //get the LoginURL \r\n let portalLoginURL = \"\"; //M01\r\n //M01 based on portal redirect type\r\n if (systemControl) {\r\n if (portalredirecttype == portalRedirectTypes.managerPortal && systemControl.configuration && systemControl.configuration.mpLoginURL) {\r\n portalLoginURL = systemControl.configuration.mpLoginURL;\r\n } else if (portalredirecttype == portalRedirectTypes.teamPortal && systemControl.configuration && systemControl.configuration.tpLoginURL) {\r\n portalLoginURL = systemControl.configuration.tpLoginURL;\r\n }\r\n }\r\n\r\n //and passes into the props toPortal\r\n this.props.toPortal(portalredirecttype, portalLoginURL); //M01\r\n\r\n //force the focus away from the link item\r\n document.activeElement.blur();\r\n }\r\n\r\n // This method runs when the component is unmounting to clear up the portal redirect\r\n componentWillUnmount() {\r\n\r\n //clean up the store\r\n this.props.cleanUp(); \r\n }\r\n \r\n\trender() {\r\n let { isLoading, error, portalRedirectType, portalRedirect } = this.props;\r\n\r\n //get the title\r\n let title = \"\";\r\n switch (portalRedirectType) {\r\n case portalRedirectTypes.managerPortal:\r\n title=\"Manager Portal\"\r\n break;\r\n case portalRedirectTypes.teamPortal: //M01\r\n title = \"Team Portal\"\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n //no error, but an error on portalRedirect?\r\n if (!error && portalRedirect && portalRedirect.error) {\r\n error = portalRedirect.error;\r\n }\r\n \r\n\t\treturn (\r\n\t\t\t
\r\n
\r\n\r\n\t\t\t\t
\r\n\t\t\t\t\t{error ? : []}\r\n\r\n\t\t\t\t\t{isLoading ? : []}\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nPortalRedirect.propTypes = {\r\n ssoAuthenticationTicket: PropTypes.string,\r\n\terror: PropTypes.string,\r\n\tisLoading: PropTypes.bool\r\n};\r\n\r\nexport default connect(\r\n state => ({ portalRedirect: state.portalRedirect, systemControl: state.systemControl }),\r\n dispatch => bindActionCreators({ ...portalRedirectActions, ...systemControlActions }, dispatch)\r\n)(PortalRedirect);\r\n","import React from 'react';\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\n\r\nconst DataFormButton = props => (\r\n\t
\r\n\t\t{/*{!props.editing && }*/}\r\n\t\t{/*{props.editing &&*/}\r\n\t\t{/*\t
*/}\r\n\t\t{/*\t*/}\r\n\t\t{/*\t*/}\r\n\t\t{/*\t
*/}\r\n\t\t{/*}*/}\r\n\t\t\r\n\t\t{props.canEdit ? : []}\r\n\t\t{props.canEdit ? : []}\r\n\t
\r\n);\r\n\r\nexport default DataFormButton;","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2024 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: DataFormField\r\n// DataForms: DataForm field for DataForm\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// WI3713 26/01/24 JC\t\tNew\r\n//-------------------------------------------------------\r\n*/\r\nimport React, { Component } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport DateTime from './DateTime'; \r\nimport { dateTimeTypes } from '../constants/DateTimeTypes';\r\nimport { dataFormDataTypes } from '../constants/DataFormDataTypes'\r\nimport './css/DataFormField.css';\r\nimport { utils } from '../utils/utils'; \r\n\r\nclass DataFormField extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tconst decimalPlaces = this.getDecimalPlaces(props.item.dataType);\r\n\t\tconst inputType = this.getInputType(props.item.dataType);\r\n const answer = utils.formatValue(props.item.answer, inputType, decimalPlaces); \r\n const originalAnswer = utils.formatValue(props.item.originalAnswer, inputType, decimalPlaces); \r\n\t\tthis.state = {\r\n\t\t\tinputType,\r\n\t\t\tdecimalPlaces,\r\n originalAnswer: originalAnswer,\r\n\t\t\tanswer: answer,\r\n\t\t\tisPending: props.item.isPending,\r\n isChanged: false,\r\n propsediting: false\r\n\t\t};\r\n\r\n\t\tthis.handleSelect = this.handleSelect.bind(this);\r\n\t\tthis.handleChecked = this.handleChecked.bind(this);\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n this.handleBlur = this.handleBlur.bind(this);\r\n this.handleDatetimeChange = this.handleDatetimeChange.bind(this);\r\n this.handleDatetimeBlur = this.handleDatetimeBlur.bind(this);\r\n\t}\r\n\r\n static getDerivedStateFromProps(props, state) {\r\n let item = props.item;\r\n let answer = utils.formatValue(item.answer, state.inputType, state.decimalPlaces);\r\n let originalAnswer = utils.formatValue(item.originalAnswer, state.inputType, state.decimalPlaces);\r\n\r\n //only if props editing changed\r\n if (props.editing !== state.propsediting ) {\r\n\r\n //return new state\r\n return {\r\n answer: answer,\r\n originalAnswer: originalAnswer, \r\n isPending: item.isPending,\r\n isChanged: false,\r\n propsediting: props.editing\r\n };\r\n }\r\n\r\n // Return null to indicate no change to state.\r\n return null;\r\n }\r\n\r\n getInputType(dataType) {\r\n //this is based on DetailField, and for the purposes of reusing that logic we're just going to convert DataFormDataTypes to text\r\n switch (dataType) {\r\n case dataFormDataTypes.none:\r\n case dataFormDataTypes.text:\r\n return \"text\";\r\n break;\r\n case dataFormDataTypes.check_box:\r\n return \"checkbox\";\r\n break;\r\n case dataFormDataTypes.date_and_time:\r\n return \"datetime\";\r\n break;\r\n case dataFormDataTypes.list:\r\n return \"select\";\r\n break;\r\n case dataFormDataTypes.numeric_0dp:\r\n case dataFormDataTypes.numeric_1dp:\r\n case dataFormDataTypes.numeric_2dp:\r\n case dataFormDataTypes.numeric_3dp:\r\n case dataFormDataTypes.numeric_4dp:\r\n return \"number\";\r\n break;\r\n case dataFormDataTypes.multiline_text: \r\n return \"textarea\";\r\n break;\r\n case dataFormDataTypes.url:\r\n return \"text\";\r\n break;\r\n default:\r\n //should not happen\r\n return \"text\";\r\n break;\r\n }\r\n\t}\r\n\r\n\tgetDecimalPlaces(dataType) {\r\n switch (dataType) { \r\n case dataFormDataTypes.numeric_0dp:\r\n return 0;\r\n break;\r\n case dataFormDataTypes.numeric_1dp:\r\n return 1;\r\n break;\r\n case dataFormDataTypes.numeric_2dp:\r\n return 2;\r\n break;\r\n case dataFormDataTypes.numeric_3dp:\r\n return 3;\r\n break;\r\n case dataFormDataTypes.numeric_4dp:\r\n return 4;\r\n break; \r\n default:\r\n return null;\r\n break;\r\n }\r\n\t}\r\n\r\n\thandleSelect = event => {\r\n\t\tvar newAnswer = event.target.value;\r\n\t\tvar isChanged = newAnswer !== this.state.originalAnswer;\r\n\t\tthis.setState({\r\n\t\t\tanswer: newAnswer,\r\n\t\t\tisChanged: isChanged\r\n\t\t});\r\n this.props.changed({ lineNumber: this.props.item.lineNumber, isChanged, answer: newAnswer, dataType: this.props.item.dataType});\r\n\t}\r\n\r\n\thandleChecked = event => {\r\n\t\tvar newAnswer = event.target.checked;\r\n\t\tvar isChanged = newAnswer !== this.state.originalAnswer;\r\n\t\tthis.setState({\r\n\t\t\tanswer: newAnswer,\r\n\t\t\tisChanged: isChanged\r\n\t\t});\r\n\t\tthis.props.changed({\r\n lineNumber: this.props.item.lineNumber, isChanged, answer: newAnswer.toString(), // convert new answer to string\r\n\t\t\tdataType: this.props.item.dataType\r\n\t\t}); //M01\r\n\t}\r\n\r\n\thandleChange = event => {\r\n\t\tthis.setState({\r\n answer: event.target.value\r\n\t\t});\r\n\t}\r\n\r\n\thandleBlur = event => {\r\n event.preventDefault();\r\n //replace \\n (with or without \\r at start with \\r\\n so we don't get dirty flags being set unnecessarily on text areas\r\n var newAnswer = utils.formatValue(event.target.value, this.state.inputType, this.state.decimalPlaces).replace(/\\r?\\n/g, \"\\r\\n\");\r\n\t\tvar isChanged = newAnswer !== this.state.originalAnswer;\r\n\t\tthis.setState({\r\n\t\t\tanswer: newAnswer,\r\n isChanged: isChanged\r\n\t\t});\r\n this.props.changed({ lineNumber: this.props.item.lineNumber, isChanged, answer: newAnswer, dataType: this.props.item.dataType}); //M01\r\n }\r\n\r\n handleDatetimeChange = momentDate => {\r\n this.setState({\r\n answer: momentDate\r\n });\r\n }\r\n\r\n handleDatetimeBlur = momentDate => {\r\n var newAnswer = utils.formatValue(momentDate, this.state.inputType, this.state.decimalPlaces);\r\n var isChanged = newAnswer !== this.state.originalAnswer;\r\n this.setState({\r\n answer: newAnswer,\r\n isChanged: isChanged\r\n });\r\n this.props.changed({ lineNumber: this.props.item.lineNumber, isChanged, answer: newAnswer, dataType: this.props.item.dataType}); //M01\r\n }\r\n\r\n render() {\r\n\t\tconst { item } = this.props;\r\n\t\tconst dataFormChangedClass = this.state.isChanged ? \"dataform-changed\" : \"\";\r\n const dataFormPendingClass = this.props.item.isPending ? \"dataform-pending\" : \"\";\r\n const dataFormErrorClass = this.props.item.hasError ? \"dataform-error\" : \"\";\r\n\r\n //build the url text - prefix with htpp if necessary\r\n let sURL = \"\";\r\n if (item.dataType === dataFormDataTypes.url && item.defaultValue.length > 0) {\r\n sURL = item.defaultValue;\r\n if (!sURL.toLowerCase().startsWith(\"http\")) {\r\n sURL = \"http://\" + sURL;\r\n }\r\n }\r\n\r\n\t\tif (!this.props.editing ) {\r\n var field;\r\n \r\n if (this.state.inputType === \"date\" || this.state.inputType === \"datetime\") {\r\n\r\n //get the correct date time type\r\n let dateTimeType = dateTimeTypes.dateTime;\r\n if (this.state.inputType === \"date\") { dateTimeType = dateTimeTypes.date }\r\n\r\n field = \r\n\r\n }\r\n\t\t\telse if (this.state.inputType === \"checkbox\") {\r\n\t\t\t\tfield = this.state.answer ? \"Yes\" : \"No\";\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tfield = {this.state.answer};\r\n\t\t\t}\r\n\r\n\t\t\treturn (\r\n
{field}
\r\n\t\t\t);\r\n\t\t}\r\n\t\t\r\n if (this.state.inputType === \"select\") {\r\n return (\r\n \r\n {!item.hasAnswer ? : [] /* add a blank option if there's no answer */}\r\n {item.itemValues.map((opt, i) => )}\r\n \r\n );\r\n }\r\n else if (this.state.inputType === \"checkbox\") {\r\n return (\r\n \r\n );\r\n }\r\n /* M04 date /datetime handling - use datetime component */\r\n else if (this.state.inputType === \"date\" || this.state.inputType === \"datetime\") {\r\n\r\n //get the correct date time type\r\n let dateTimeType = dateTimeTypes.dateTime;\r\n if (this.state.inputType === \"date\") { dateTimeType = dateTimeTypes.date }\r\n\r\n return (\r\n );\r\n }\r\n /* textarea */\r\n else if (this.state.inputType === \"textarea\") {\r\n return (\r\n );\r\n }\r\n /* handle url - blank attribute opens in new window/tab */\r\n else if (sURL.length > 0) {\r\n return {this.state.answer};\r\n }\r\n\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nexport default connect()(DataFormField);","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2024 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: EPSignaturePad.js\r\n// Details: EPSignaturePad.js\r\n//\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// WI3713 31/01/24 JC Added\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport React, { Component } from 'react';\r\nimport SignatureCanvas from 'react-signature-canvas'\r\nimport './css/EPSignaturePad.css';\r\n\r\nclass EPSignaturePad extends Component {\r\n sigPad = {}\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n isEmpty: true,\r\n isEnabled: true\r\n };\r\n\r\n // attach handlers\r\n this.handleClear = this.handleClear.bind(this);\r\n this.handleAccept = this.handleAccept.bind(this);\r\n this.handleOnEnd = this.handleOnEnd.bind(this);\r\n }\r\n\r\n //handle clear\r\n handleClear = () => {\r\n //clear the pad\r\n this.sigPad.clear();\r\n\r\n //if we've got a handle image set method passed in then use\r\n if (this.props.handleImageSet !== undefined) {\r\n this.props.handleImageSet(\"\");\r\n }\r\n\r\n //enable sig pad in case disabled\r\n this.sigPad.on()\r\n\r\n //flag as empty & enabled\r\n this.setState({\r\n isEmpty: true,\r\n isEnabled: true\r\n });\r\n\r\n //if we've got a handle image clear method passed in then use\r\n if (this.props.handleImageClear !== undefined) {\r\n this.props.handleImageClear();\r\n }\r\n }\r\n\r\n //handle accept\r\n handleAccept = () => {\r\n\r\n //get the image as base 64\r\n let base64Image = this.sigPad.getCanvas().toDataURL('image/png');\r\n\r\n //if we've got a handle image set method passed in then use\r\n if (this.props.handleImageSet !== undefined) {\r\n this.props.handleImageSet(base64Image);\r\n }\r\n\r\n //disable sig pad\r\n this.sigPad.off()\r\n\r\n //flag as disabled\r\n this.setState({\r\n isEnabled: false\r\n });\r\n }\r\n\r\n //handle on end\r\n handleOnEnd = () => {\r\n\r\n //get is empty status from canvas\r\n let isEmpty = this.sigPad.isEmpty();\r\n\r\n //set canvas is empty in state\r\n this.setState({\r\n isEmpty: isEmpty\r\n });\r\n }\r\n\r\n render() {\r\n\r\n let { isEmpty, isEnabled } = this.state;\r\n\r\n //default disabled to false\r\n let { disabled, signature } = this.props;\r\n if (disabled === undefined) { disabled = false; }\r\n\r\n //clear disabled = either disabled or empty\r\n let clearDisabled = disabled || isEmpty;\r\n\r\n //accept disabled = either disabled, empty, or not enabled\r\n let acceptDisabled = disabled || isEmpty || !isEnabled;\r\n\r\n return
\r\n {/* enabled? - show signature canvas & buttons */\r\n !disabled ?\r\n
\r\n { this.sigPad = ref }}\r\n onEnd={this.handleOnEnd}\r\n />\r\n
\r\n \r\n \r\n
\r\n
\r\n :\r\n /* otherwise show image, assuming we have one */\r\n
\r\n {signature !== undefined && signature !== null && signature.length > 0 ?\r\n \r\n : []}\r\n
\r\n }\r\n
\r\n }\r\n\r\n}\r\n\r\nexport default EPSignaturePad;\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2024 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: DataFormImage\r\n// DataForms: DataForm field for DataForm\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// WI3713 31/01/24 JC\t\tNew\r\n//-------------------------------------------------------\r\n*/\r\nimport React, { Component } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { Col, Row } from 'react-bootstrap';\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport EPSignaturePad from './EPSignaturePad'; \r\nimport { dataFormDataTypes } from '../constants/DataFormDataTypes';\r\n\r\nclass DataFormImage extends Component {\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.handleRemoveButtonOnClick = this.handleRemoveButtonOnClick.bind(this);\r\n\t\tthis.handleImageFileAdded = this.handleImageFileAdded.bind(this);\r\n\t\tthis.handleSignatureImageFileRemoved = this.handleSignatureImageFileRemoved.bind(this);\r\n\t\tthis.handleSignatureImageFileAdded = this.handleSignatureImageFileAdded.bind(this);\r\n\t}\r\n\r\n\thandleRemoveButtonOnClick = event => {\r\n\t\tevent.preventDefault();\r\n\r\n\t\t//pass to parent component's changed event\r\n\t\tthis.props.changed({ lineNumber: this.props.item.lineNumber, isChanged: true, answer: '', dataType: this.props.item.dataType });\r\n\t}\r\n\r\n\t// handle image file added\r\n\thandleImageFileAdded = (event) => {\r\n\r\n\t\tif (event.target.files.length !== 0) {\r\n\r\n\t\t\t//get the file\r\n\t\t\tvar fileToRead = event.target.files[0];\r\n\r\n\t\t\t//reinforce the file extension\r\n\t\t\tif (fileToRead != null && fileToRead.name != null &&\r\n\t\t\t\t(fileToRead.name.endsWith(\".gif\") || fileToRead.name.endsWith(\".jpg\") || fileToRead.name.endsWith(\".png\"))) {\r\n\r\n\t\t\t\t//get a ref to the props to get round ref image in reader onloadend\r\n\t\t\t\tvar localProps = this.props;\r\n\r\n\t\t\t\t// ... read the image \r\n\t\t\t\tvar reader = new FileReader();\r\n\t\t\t\treader.onloadend = function () {\r\n\r\n\t\t\t\t\t//pass to parent component's changed event\r\n\t\t\t\t\tlocalProps.changed({ lineNumber: localProps.item.lineNumber, isChanged: true, answer: reader.result, dataType: localProps.item.dataType });\r\n\t\t\t\t};\r\n\r\n\t\t\t\t//read as data URL\r\n\t\t\t\treader.readAsDataURL(fileToRead);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// handle signature image file removed\r\n\thandleSignatureImageFileRemoved = () => {\r\n\r\n\t\t//pass to parent component's changed event\r\n\t\tthis.props.changed({ lineNumber: this.props.item.lineNumber, isChanged: true, answer: '', dataType: this.props.item.dataType });\r\n\t}\r\n\r\n\t// handle signature image file added\r\n\thandleSignatureImageFileAdded = (newValue) => {\r\n\r\n\t\t//pass to parent component's changed event\r\n\t\tthis.props.changed({ lineNumber: this.props.item.lineNumber, isChanged: true, answer: newValue, dataType: this.props.item.dataType });\r\n\t}\r\n\r\n\trender() {\r\n\t\tconst { item, editing } = this.props;\r\n\r\n\t\t//always treat a signature box as allowing image upload\r\n\t\tconst editingAndAllowsImageUpload = editing && (item.allowsImageUpload || item.dataType === dataFormDataTypes.signature_box );\r\n\r\n\t\t//get document content details as different if user entered\r\n\t\tlet hasDocumentContent = item.hasDocumentContent;\r\n\t\tlet documentSource = `data:image/${item.documentExtension};base64,${item.documentContent}`;\r\n\t\tif (item.hasNewAnswer && editingAndAllowsImageUpload)\r\n\t\t{\r\n\t\t\tdocumentSource = item.answer;\r\n\t\t\thasDocumentContent = item.answer.length > 0;\r\n\t\t}\r\n\r\n\t\t//show image or signature pad? - it's an image or a signature box when either we're not editing, or there's document content\r\n\t\tconst showImage = item.dataType === dataFormDataTypes.image || (item.dataType === dataFormDataTypes.signature_box && (!editing || hasDocumentContent));\r\n\r\n\t\treturn (\r\n\r\n\t\t\t//show image?\r\n\t\t\tshowImage ?\r\n\r\n\t\t\t\t/* ---------------------------------------------\r\n\t\t\t\t * not editing, or item doesn't allow image upload \r\n\t\t\t\t--------------------------------------------- */\r\n\t\t\t\t!editingAndAllowsImageUpload ?\r\n\r\n\t\t\t\t\t/*photo column, full width if we have an image*/\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t< Col sm={12} className=\"text-col\">\r\n\t\t\t\t\t\t\t{hasDocumentContent ?\r\n\t\t\t\t\t\t\t\t{item.lineText}\r\n\t\t\t\t\t\t\t\t: []}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t:\r\n\t\t\t\t/* ---------------------------------------------\r\n\t\t\t\t* editing and allows image upload\r\n\t\t\t\t--------------------------------------------- */\r\n\r\n\t\t\t\t\t/* if the item has document content */\r\n\t\t\t\t\thasDocumentContent ?\r\n\t\t\t\t\t\t/*photo column*/\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t< Col sm={10} className=\"text-col\">\r\n\t\t\t\t\t\t\t\t{item.lineText}/\r\n\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t{/*remove button column\t*/}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{editingAndAllowsImageUpload ?\r\n\t\t\t\t\t\t\t\t\t/* only show if relevant*/\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t: []}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t:\r\n\t\t\t\t\t\t/* no existing document content */\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\t\tevent.target.value = null\r\n\t\t\t\t\t\t\t\t\t}} /* clear existing value each time clicked to allow multiple upload of same file e.g. if failure */\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t:\r\n\t\t\t\t/*photo column, full width if we have an image*/\r\n\t\t\t\t\r\n\t\t\t\t\t< Col sm={10} className=\"text-col\">\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\r\n\t\t) //end return\r\n\r\n\t}//end render\r\n}//end component\r\n\r\n\r\nexport default connect()(DataFormImage);","import React, { Component } from 'react';\r\nimport { Col, Row } from 'react-bootstrap';\r\nimport DataFormField from './DataFormField';\r\nimport DataFormImage from './DataFormImage';\r\nimport { dataFormDataTypes } from '../constants/DataFormDataTypes'\r\nimport { faBorderNone } from '@fortawesome/free-solid-svg-icons';\r\n\r\n\r\nclass DataFormRow extends Component {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n\r\n //different behaviour handling based on certain data types\r\n let showMultiLineAnswerText = false;\r\n let showImage = false;\r\n let showField = true;\r\n let sectionHeading = false;\r\n\r\n switch (this.props.item.dataType) {\r\n case dataFormDataTypes.none:\r\n //no field for labels\r\n showField = false;\r\n break;\r\n case dataFormDataTypes.multiline_text:\r\n //show answer text? - only if can't edit & for certain data types\r\n showMultiLineAnswerText = !this.props.canEdit;\r\n break;\r\n case dataFormDataTypes.image:\r\n case dataFormDataTypes.signature_box:\r\n //show image\r\n showImage = true;\r\n break;\r\n case dataFormDataTypes.section_heading:\r\n //section heading row\r\n sectionHeading = true;\r\n break;\r\n default:\r\n }\r\n showField = showField && !showMultiLineAnswerText && !showImage ;\r\n\r\n return (\r\n
\r\n {!sectionHeading\r\n ?\r\n \r\n \r\n {this.props.item.lineText.split(\"\\n\").map((lineText, k) => {\r\n return (\r\n \r\n {/* applying the class name here gets the css applied to the label properly when not directly within a column*/}\r\n \r\n \r\n )\r\n })}\r\n \r\n \r\n {/* show multi-line answer text? */\r\n showMultiLineAnswerText ?\r\n this.props.item.answer.split(\"\\n\").map((answer, k) => {\r\n return (\r\n \r\n {/* applying the class name here gets the css applied to the label properly when not directly within a column*/}\r\n \r\n \r\n )\r\n })\r\n : []}\r\n {/* show image */\r\n showImage ?\r\n \r\n : []}\r\n {/* show field */\r\n showField ?\r\n \r\n : []}\r\n \r\n \r\n :\r\n /* section heading spans columns*/\r\n \r\n \r\n {this.props.item.lineText.split(\"\\n\").map((lineText, k) => {\r\n return (\r\n \r\n {/* applying the class name here gets the css applied to the label properly when not directly within a column*/}\r\n \r\n \r\n )\r\n })}\r\n \r\n \r\n }\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default DataFormRow;\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2024 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: DataFormOwnerTypes\r\n// Details: DataFormOwnerTypes constant\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// WI3713 24/01/24 JC Added\r\n//-------------------------------------------------------\r\n*/\r\nexport const dataFormOwnerTypes = {\r\n\tnone: 0,\r\n\tdocument: 1\r\n};\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2024 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: DataForm\r\n// Details: DataForm page\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// WI3713 24/01/24 JC New\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { bindActionCreators } from 'redux';\r\nimport { connect } from 'react-redux';\r\nimport { dataFormActions } from '../store/DataForm';\r\nimport Loading from '../components/Loading';\r\nimport AlertPanel from '../components/AlertPanel';\r\nimport DataFormButtons from '../components/DataFormButtons';\r\nimport DataFormRow from '../components/DataFormRow';\r\nimport Header from '../components/Header';\r\nimport NoItems from '../components/NoItems';\r\nimport Dialog from '../components/Dialog';\r\nimport { history } from '../history';\r\nimport { dataFormOwnerTypes } from '../constants/DataFormOwnerTypes';\r\n\r\nclass DataForm extends Component {\r\n\tconstructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n ownerId: undefined,\r\n ownerType: undefined\r\n };\r\n\r\n //handlers\r\n\t\tthis.handleFieldChanged = this.handleFieldChanged.bind(this);\r\n this.handleSave = this.handleSave.bind(this);\r\n this.handleComplete = this.handleComplete.bind(this);\r\n this.handleMessageBoxClose = this.handleMessageBoxClose.bind(this); \r\n this.handlePrev = this.handlePrev.bind(this);\r\n\r\n\t}\r\n\r\n static getDerivedStateFromProps(props, state) {\r\n\r\n //get values from props\r\n let ownerId = props.match.params.ownerId;\r\n let ownerType = props.match.params.ownerType;\r\n\r\n //change of props?\r\n if (ownerId !== state.ownerId || ownerType !== state.ownerType) {\r\n\r\n //get data form\r\n props.getDataForm(ownerId, ownerType);\r\n\r\n //return new state\r\n return ({\r\n ownerId: ownerId,\r\n ownerType: ownerType\r\n });\r\n }\r\n\r\n // Return null to indicate no change to state.\r\n return null;\r\n }\r\n\r\n\r\n // --------------------------------------------------------------\r\n // field change handler\r\n handleFieldChanged = item => {\r\n\r\n\r\n //pass to store to update\r\n this.props.updateAnswer(item);\r\n\t}\r\n\r\n\r\n // --------------------------------------------------------------\r\n // save handler\r\n\thandleSave = event => {\r\n event.preventDefault();\r\n\r\n //save without complete\r\n this.props.save(false);\r\n }\r\n\r\n // --------------------------------------------------------------\r\n // complete handler\r\n handleComplete = event => {\r\n event.preventDefault();\r\n\r\n //save with complete\r\n this.props.save(true);\r\n }\r\n\r\n // --------------------------------------------------------------\r\n // message box close handler\r\n handleMessageBoxClose = event => {\r\n \r\n //handle message box closed\r\n this.props.removeMessageBoxText();\r\n }\r\n\r\n //handler for prev click\r\n handlePrev = event => {\r\n event.preventDefault();\r\n \r\n history.push(`/documents/1`);\r\n }\r\n\r\n // --------------------------------------------------------------\r\n // Render\r\n render() {\r\n const { error, isLoading, changedAnswers, validatedAnswers, validationError, messageBoxText, dataForm } = this.props; \r\n\r\n const header = isLoading || !dataForm ? \"Data form\" : dataForm.dataFormSubject;\r\n\r\n let previousText = \"Back\"\r\n if (dataForm) {\r\n switch (dataForm.dataFormOwnerType) {\r\n case dataFormOwnerTypes.document:\r\n previousText = \"Documents\";\r\n break;\r\n default:\r\n }\r\n }\r\n\r\n const hasItems = (dataForm !== undefined && dataForm.dataFormItems !== undefined && dataForm.dataFormItems.length !== 0);\r\n\r\n return (\r\n
\r\n
\r\n \r\n {isLoading\r\n ? \"\"\r\n : \r\n }\r\n\r\n {error ? : []}\r\n\r\n\r\n {isLoading ? \r\n :\r\n !hasItems ?\r\n \r\n :\r\n
\r\n {/* message box text? */\r\n messageBoxText !== undefined\r\n ? \r\n : []}\r\n\r\n {/*validation error*/}\r\n {validationError !== undefined\r\n ? \r\n : []\r\n }\r\n\r\n {/*show a row for each dataform item*/}\r\n {dataForm.dataFormItems.map((item, i) => {\r\n\r\n /* get the item, passing the answer into a new original answer field */\r\n let localItem = { ...item, originalAnswer: item.answer };\r\n\r\n if (localItem.lineNumber in changedAnswers) {\r\n //if there's a changed answer for the linenumber then use this for the answer instead\r\n localItem = {\r\n ...localItem, answer: changedAnswers[localItem.lineNumber].answer,\r\n hasNewAnswer: true\r\n };\r\n }\r\n\r\n if (localItem.lineNumber in validatedAnswers) {\r\n // if there's a validated anwer for the line number then get this as well\r\n localItem = { ...localItem, hasError: validatedAnswers[localItem.lineNumber].hasError };\r\n }\r\n\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n }\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\r\nDataForm.propTypes = {\r\n\t//error: PropTypes.string,\r\n\t//fields: PropTypes.arrayOf(PropTypes.any),\r\n\tisLoading: PropTypes.bool.isRequired\r\n};\r\n\r\nexport default connect(\r\n\tstate => state.dataForm,\r\n\tdispatch => bindActionCreators(dataFormActions, dispatch)\r\n)(DataForm);\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: App\r\n// Details: App\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 101885 26/06/19 AJ M01 Added Links\r\n// 101879 02/07/19 JC M02 Added new to /myrequests_copy/detail private route\r\n// 102715 15/08/19 JC M03 Added Contacts\r\n// 104759 21/11/19 JC M04 Whole menu now soft-coded\r\n// 103782 10/12/19 JC M05 Added MyTraining\r\n// 105726 16/01/19 JC M06 M04 change - allow access to change password if not logged in\r\n// 106380 30/04/20 JC M07 Added ManagerPortal / PortalRedirect page, login route with authentication ticket\r\n// 103839 13/05/20 JC M08 Added TeamPortal redirect\r\n// 108958 24/08/20 JC M09 Added applyFrameKiller in render\r\n// WI3713 24/01/24 JC M10JC Added data forms\r\n//-------------------------------------------------------\r\n*/\r\nimport React, { Component } from 'react';\r\nimport { Route } from 'react-router';\r\nimport { withRouter } from 'react-router-dom';\r\nimport { PrivateRoute } from './components/PrivateRoute';\r\nimport { bindActionCreators } from 'redux';\r\nimport { connect } from 'react-redux';\r\nimport { configActions } from './store/ClientConfiguration';\r\nimport { alertActions } from './store/Alerts';\r\nimport { printViewActions } from './store/PrintView';\r\nimport { utils } from './utils/utils'; //M09\r\nimport Layout from './components/Layout';\r\nimport Loading from './components/Loading';\r\nimport Login from './pages/Login';\r\nimport Logout from './pages/Logout';\r\nimport Notices from './pages/Notices';\r\nimport Documents from './pages/Documents';\r\nimport MyPay from './pages/MyPay';\r\nimport MyDetails from './pages/MyDetails';\r\nimport MyPlan from './pages/MyPlan';\r\nimport MyRequests from './pages/MyRequests';\r\nimport Request from './pages/Request';\r\nimport SiteCalendar from './pages/SiteCalendar';\r\nimport Authenticate from './pages/Authenticate';\r\nimport ForgotPassword from './pages/ForgotPassword';\r\nimport ChangePassword from './pages/ChangePassword';\r\nimport PasswordChanged from './pages/PasswordChanged';\r\nimport Contacts from './pages/Contacts'; //M03\r\nimport MyTraining from './pages/MyTraining'; //M05\r\nimport PortalRedirect from './pages/PortalRedirect'; //M07\r\nimport DataForm from './pages/DataForm'; //M10JC\r\n\r\n\r\nclass App extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n props.requestClientConfig();\r\n }\r\n\r\n render() {\r\n\r\n //M09 apply frame killer\r\n utils.applyFrameKiller();\r\n\r\n //get the root default path\r\n var rootDefaultPath = Login;\r\n\r\n //go through each menu entry in turn and try and get the default root path depending on what's enabled\r\n if (this.props.systemControl.configuration) {\r\n if (this.props.systemControl.configuration.epNoticesEnabled === true) {\r\n rootDefaultPath = Notices;\r\n } else if (this.props.systemControl.configuration.epDocumentsEnabled === true) {\r\n rootDefaultPath = Documents;\r\n } else if (this.props.systemControl.configuration.epMyPayEnabled === true) {\r\n rootDefaultPath = MyPay;\r\n } else if (this.props.systemControl.configuration.epMyDetailsEnabled === true) {\r\n rootDefaultPath = MyDetails;\r\n } else if (this.props.systemControl.configuration.epMyPlanEnabled === true) {\r\n rootDefaultPath = MyPlan;\r\n } else if (this.props.systemControl.configuration.epMyRequestsEnabled === true) {\r\n rootDefaultPath = MyRequests;\r\n } else if (this.props.systemControl.configuration.epMyTrainingEnabled === true) { //M05\r\n rootDefaultPath = MyTraining;\r\n } else if (this.props.systemControl.configuration.epContactsEnabled === true) {\r\n rootDefaultPath = Contacts;\r\n } else if (this.props.systemControl.configuration.epChangePasswordEnabled === true) {\r\n rootDefaultPath = ChangePassword;\r\n } \r\n };\r\n\r\n return (\r\n this.props.clientConfiguration.isLoading\r\n ? \r\n : \r\n {/*M07 added exact due to below*/}\r\n {/*M07 for passed in sso authentication ticket*/}\r\n \r\n {/*M04 default path now soft coded*/}\r\n \r\n\r\n {this.props.systemControl.configuration && this.props.systemControl.configuration.epDocumentsEnabled ?\r\n \r\n : [] /* M04 only add route if enabled */}\r\n\r\n {this.props.systemControl.configuration && this.props.systemControl.configuration.epDocumentsEnabled ?\r\n \r\n : [] /* M04 only add route if enabled */}\r\n\r\n {this.props.systemControl.configuration && this.props.systemControl.configuration.epMyPayEnabled ?\r\n \r\n : [] /* M04 only add route if enabled */}\r\n\r\n {this.props.systemControl.configuration && this.props.systemControl.configuration.epMyDetailsEnabled ?\r\n \r\n : [] /* M04 only add route if enabled */}\r\n\r\n {this.props.systemControl.configuration && this.props.systemControl.configuration.epMyPlanEnabled ?\r\n \r\n : [] /* M04 only add route if enabled */}\r\n\r\n {this.props.systemControl.configuration && this.props.systemControl.configuration.epMyPlanEnabled ?\r\n \r\n : [] /* M04 only add route if enabled */}\r\n\r\n {this.props.systemControl.configuration && this.props.systemControl.configuration.epMyRequestsEnabled ?\r\n \r\n : [] /* M04 only add route if enabled */}\r\n\r\n {this.props.systemControl.configuration && this.props.systemControl.configuration.epMyRequestsEnabled ?\r\n \r\n : [] /* M04 only add route if enabled */}\r\n\r\n {this.props.systemControl.configuration && this.props.systemControl.configuration.epDocumentsEnabled ?\r\n /* M02 new private route */\r\n : [] /* M04 only add route if enabled */}\r\n \r\n {this.props.systemControl.configuration &&\r\n (!this.props.systemControl.configuration.epChangePasswordEnabled ||\r\n this.props.systemControl.configuration.epChangePasswordEnabled === true) ?\r\n \r\n : [] /* M04 only add route if enabled - M06 or not logged in as may need access before log in */}\r\n\r\n \r\n \r\n\r\n {this.props.systemControl.configuration && this.props.systemControl.configuration.epContactsEnabled ?\r\n /* M03 */\r\n : [] /* M04 only add route if enabled */}\r\n \r\n {this.props.systemControl.configuration && this.props.systemControl.configuration.epNoticesEnabled ?\r\n /* M04 */\r\n : [] /* M04 only add route if enabled */}\r\n\r\n {this.props.systemControl.configuration && this.props.systemControl.configuration.epMyTrainingEnabled ?\r\n /* M05 */\r\n : [] /* only add route if enabled */}\r\n\r\n {(this.props.systemControl.configuration && this.props.systemControl.configuration.epManagerPortalEnabled &&\r\n this.props.authentication && this.props.authentication.user && this.props.authentication.user.isEnabledForMP) ||\r\n (this.props.systemControl.configuration && this.props.systemControl.configuration.epTeamPortalEnabled &&\r\n this.props.authentication && this.props.authentication.user && this.props.authentication.user.isEnabledForTP)?\r\n /* M07 M08 */\r\n : [] /* only add route if enabled, both on system control & users */}\r\n\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withRouter(connect(\r\n state => state,\r\n dispatch => bindActionCreators({ ...configActions, ...alertActions, ...printViewActions }, dispatch)\r\n)(App));","// In production, we register a service worker to serve assets from local cache.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport default function register() {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log('New content is available; please refresh.');\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n if (\r\n response.status === 404 ||\r\n response.headers.get('content-type').indexOf('javascript') === -1\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2020 Templa Computer Systems Ltd\r\n//\r\n// App: ManagerPortal.UI\r\n// Object: fontawesome.js\r\n// Details: fontawesome library\r\n// This library allows font awesome icons to be imported once, rather than in each individual class they are required\r\n//\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 105066 06/01/20 JC New\r\n// 110638 02/02/21 JC M01 Added faBars\r\n// WI3713 31/01/24 JC M02JC Added faSpinner, faExclamation\r\n//-------------------------------------------------------\r\n*/\r\n\r\n\r\n// import the library\r\nimport { library } from '@fortawesome/fontawesome-svg-core';\r\n\r\n// import your icons\r\nimport {\r\n\r\n faExclamationCircle,\r\n faInfoCircle,\r\n faCheck,\r\n faClock,\r\n faTimes,\r\n\r\n faPrint,\r\n faTimesCircle,\r\n //faSearch,\r\n faFile,\r\n faGraduationCap,\r\n faGlobeAmericas,\r\n faEnvelope,\r\n\r\n faChevronRight,\r\n faChevronLeft,\r\n faChevronDown,\r\n faStepForward,\r\n faStepBackward,\r\n\r\n faLock,\r\n faSave,\r\n\r\n faTrashAlt,\r\n\r\n faBars, //M01\r\n faSpinner, //M02JC\r\n faExclamation //M02JC\r\n\r\n\r\n} from \"@fortawesome/free-solid-svg-icons\";\r\n\r\n\r\n//add to library\r\nlibrary.add(\r\n faExclamationCircle,\r\n faInfoCircle,\r\n faCheck,\r\n faClock,\r\n faTimes,\r\n\r\n faPrint,\r\n faTimesCircle,\r\n //faSearch,\r\n faFile,\r\n faGraduationCap,\r\n faGlobeAmericas,\r\n faEnvelope,\r\n\r\n faChevronRight,\r\n faChevronLeft,\r\n faChevronDown,\r\n faStepForward,\r\n faStepBackward,\r\n\r\n faLock,\r\n faSave,\r\n\r\n faTrashAlt,\r\n\r\n faBars, // M01\r\n faSpinner, //M02JC\r\n faExclamation //M02JC\r\n\r\n // more icons go here\r\n);\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: index.js\r\n// Details: index.js\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 105066 06/01/20 JC M01 Added font awesome\r\n// 103839 06/04/20 JC M02 React upgrade\r\n// 108958 24/08/20 JC M03 Default app style to 'none', will be overridden in utils.applyFrameKiller called from within App.js\r\n// 110638 28/01/21 JC M04 Removed ref to bootstrap-theme.css as no longer in bootstrap\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport 'react-app-polyfill/ie11'; //M02\r\nimport 'react-app-polyfill/stable'; //M02\r\nimport 'bootstrap/dist/css/bootstrap.css';\r\n//M04 import 'bootstrap/dist/css/bootstrap-theme.css';\r\nimport './index.css';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { Provider } from 'react-redux';\r\n//M02 import { ConnectedRouter } from 'react-router-redux';\r\nimport { ConnectedRouter } from 'connected-react-router'; //M02\r\nimport { history } from './history';\r\nimport configureStore from './store/configureStore';\r\nimport App from './App';\r\nimport registerServiceWorker from './registerServiceWorker';\r\nimport fontawesome from './fontawesome'; //M01\r\n\r\n//// Create browser history to use in the Redux store\r\n//const baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\r\n//const history = createBrowserHistory({ basename: baseUrl });\r\n\r\n// Get the application-wide store instance, prepopulating with state from the server where available.\r\nconst initialState = window.initialReduxState;\r\nconst store = configureStore(history, initialState);\r\n\r\nconst rootElement = document.getElementById('root');\r\n\r\nReactDOM.render(\r\n \r\n \r\n {/* M03 apply default display of 'none' */}\r\n \r\n ,\r\n rootElement);\r\n\r\nregisterServiceWorker();\r\n","/*\r\n//-------------------------------------------------------\r\n// Copyright (c) 2019 Templa Computer Systems Ltd\r\n//\r\n// App: EmployeePortal.UI\r\n// Object: configureStore\r\n// Details: Store configuration\r\n//\r\n// Log Date By Scan Description\r\n// ----- -------- --- ---- ------------------------------\r\n// 102715 16/08/19 JC M01 Added allContacts\r\n// 103782 10/12/19 JC M02 Expanded for training\r\n// 103839 06/04/20 JC M03 React upgrade\r\n// 106380 30/04/20 JC M04 Added PortalRedirect, Flag logout on authentication\r\n// WI3713 24/01/24 JC M05JC\tAdded DataForm, RedirectController\r\n//-------------------------------------------------------\r\n*/\r\n\r\nimport { applyMiddleware, combineReducers, compose, createStore } from 'redux';\r\nimport thunk from 'redux-thunk';\r\n//M03 import { routerReducer, routerMiddleware } from 'react-router-redux';\r\nimport { connectRouter, routerMiddleware } from 'connected-react-router'; //M03\r\nimport * as ClientConfiguration from './ClientConfiguration';\r\nimport * as Authentication from './Authentication';\r\nimport * as PasswordManager from './PasswordManager';\r\nimport * as MyDetails from './MyDetails';\r\nimport * as MyPlan from './MyPlan';\r\nimport * as Weeks from './Weeks';\r\nimport * as Request from './Request';\r\nimport * as SystemControl from './SystemControl';\r\nimport * as Items from './Items';\r\nimport * as ItemTypes from './ItemTypes';\r\nimport * as Alerts from './Alerts';\r\nimport * as PrintView from './PrintView';\r\nimport * as PortalRedirect from './PortalRedirect'; //M04\r\nimport * as DataForm from './DataForm'; //M05JC\r\nimport * as RedirectController from './RedirectController'; //M05JC\r\nimport { itemCategories } from '../constants/ItemCategories';\r\nimport { lifetimeActions } from './Lifetime';\r\n\r\nexport default function configureStore(history, initialState) {\r\n\tconst reducers = {\r\n\t\tclientConfiguration: ClientConfiguration.reducer,\r\n\t\tauthentication: Authentication.reducer,\r\n\t\tpasswordManager: PasswordManager.reducer,\r\n\t\tmyDetails: MyDetails.reducer,\r\n\t\tmyPlan: MyPlan.reducer,\r\n\t\tweeks: Weeks.reducer,\r\n\t\trequest: Request.reducer,\r\n\t\tsystemControl: SystemControl.reducer,\r\n\t\talerts: Alerts.reducer,\r\n printView: PrintView.reducer,\r\n\t\tportalRedirect: PortalRedirect.reducer, //M04\r\n\t\tdataForm: DataForm.reducer, //M05JC\r\n\t\tredirectController: RedirectController.reducer, //M05JC\r\n\r\n\t\tunreadNotices: Items.createNamedReducer(itemCategories.unreadNotices),\r\n\t\treadNotices: Items.createNamedReducer(itemCategories.readNotices),\r\n\t\tunreadDocuments: Items.createNamedReducer(itemCategories.unreadDocuments),\r\n\t\treadDocuments: Items.createNamedReducer(itemCategories.readDocuments),\r\n\t\tunreadPay: Items.createNamedReducer(itemCategories.unreadPay),\r\n\t\treadPay: Items.createNamedReducer(itemCategories.readPay),\r\n\t\tunreadRequests: Items.createNamedReducer(itemCategories.unreadRequests),\r\n readRequests: Items.createNamedReducer(itemCategories.readRequests),\r\n allContacs: Items.createNamedReducer(itemCategories.allContacts), //M01\r\n uncompletedTraining: Items.createNamedReducer(itemCategories.uncompletedTraining), //M02\r\n completedTraining: Items.createNamedReducer(itemCategories.completedTraining), //M02\r\n\r\n\t\tunreadNoticeTypes: ItemTypes.createNamedReducer(itemCategories.unreadNotices),\r\n\t\treadNoticeTypes: ItemTypes.createNamedReducer(itemCategories.readNotices),\r\n\t\tunreadDocumentTypes: ItemTypes.createNamedReducer(itemCategories.unreadDocuments),\r\n\t\treadDocumentTypes: ItemTypes.createNamedReducer(itemCategories.readDocuments),\r\n\t\tunreadPayTypes: ItemTypes.createNamedReducer(itemCategories.unreadPay),\r\n\t\treadPayTypes: ItemTypes.createNamedReducer(itemCategories.readPay),\r\n\t\tunreadRequestTypes: ItemTypes.createNamedReducer(itemCategories.unreadRequests),\r\n readRequestTypes: ItemTypes.createNamedReducer(itemCategories.readRequests),\r\n allContactTypes: ItemTypes.createNamedReducer(itemCategories.allContacts), //M01\r\n uncompletedTrainingTypes: ItemTypes.createNamedReducer(itemCategories.uncompletedTraining),\r\n completedTrainingTypes: ItemTypes.createNamedReducer(itemCategories.completedTraining),\r\n\t};\r\n\r\n\tconst middleware = [\r\n\t\tthunk,\r\n\t\trouterMiddleware(history)\r\n\t];\r\n\r\n\t// In development, use the browser's Redux dev tools extension if installed\r\n\tconst enhancers = [];\r\n const isDevelopment = process.env.NODE_ENV === 'development';\r\n //M03 re-written below\r\n\t//if (isDevelopment && typeof window !== 'undefined' && window.devToolsExtension) {\r\n\t//\tenhancers.push(window.devToolsExtension());\r\n // }\r\n if (isDevelopment && typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) {\r\n enhancers.push(window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__(\r\n ));\r\n }\r\n\r\n const appReducer = combineReducers({\r\n ...reducers,\r\n //M03 routing: routerReducer\r\n router: connectRouter(history) //M03\r\n });\r\n\r\n\tconst rootReducer = (state, action) => {\r\n\t\t// Root reducer watches for the LOGOUT_SUCESS action to reset whole application state.\r\n\t\t// Therefore the LOGOUT_SUCESS action is not required to be handled by the authentication reducer.\r\n\t\t// Yes, reducers shouldn't have a side effect, but I'll make an exception as we're tearing down the app...\r\n\t\tif (action.type === Authentication.logoutSuccessType) {\r\n\t\t\tconst { clientConfiguration } = state;\r\n state = { ...initialState, clientConfiguration: clientConfiguration, authentication: { message: action.message, loggedOut: true } }; //M04 flag as logged out\r\n\t\t\tlifetimeActions.onLogOut();\r\n\t\t}\r\n\t\t// Debugging - show actions and resulting states as they are fired\r\n\t\t// NOTE THAT THE STATE WILL BE AS BEFORE THE ACTION IS DISPATCHED!!\r\n\t\t// console.log({ type: action.type, action, state });\r\n\t\treturn appReducer(state, action);\r\n\t};\r\n\r\n\treturn createStore(\r\n\t\trootReducer,\r\n\t\tinitialState,\r\n\t\tcompose(applyMiddleware(...middleware), ...enhancers)\r\n\t);\r\n}"],"sourceRoot":""}