{"version":3,"sources":["signin/RoleContext.tsx","Layout.tsx","contactInfo/ContactInfo.tsx","stores/Auth.tsx","services/Base.tsx","services/Auth.tsx","loading/Loading.jsx","signin/SignInForm.tsx","lpLoader/LPContext.tsx","asnDialog/Context.tsx","signin/SignIn.tsx","services/ASN.tsx","modal/Modal.tsx","asnDialog/AsnDialogView.tsx","asnDialog/AsnDialog.tsx","services/PO.tsx","asnListDropdowns/secondaryASNFilterDropdown.tsx","asnListDropdowns/primaryASNFilterDropdown.tsx","asnListDropdowns/sortingDropdown.tsx","dates.tsx","toolTipView/ToolTipView.tsx","asnDialog/AsnDialogOpener.tsx","asnList/ASNListItemView.tsx","asnList/InfiniteScrollWrapper.tsx","asnList/ASNList.tsx","skuLoader/skuLoaderView.tsx","select.tsx","skuLoader/skuLoader.tsx","lotCodeManager/lotCodeModalView.tsx","lotCodeManager/context.tsx","lotCodeManager/lotCodeModalOpener.tsx","lotCodeManager/lotCodeListItem.tsx","lotCodeManager/lotCodeListView.tsx","lotCodeManager/lotCodeModal.tsx","lotCodeManager/lotCodeManager.tsx","services/CoAUpload.tsx","asnCoAUpload/context.tsx","asnCoAUpload/CoAModalView.tsx","asnCoAUpload/CoAModal.tsx","loading/Saving.jsx","asnCoAUpload/CoAUploadButton.tsx","asnForm/ASNDetail.jsx","asnForm/ASNDetailGroup.jsx","poLoader/poLoaderView.tsx","poLoader/poLoader.tsx","alert/Alert.tsx","phoneInput/PhoneInput.jsx","asnForm/ASNForm.jsx","asnForm/ASNFormCreate.jsx","asnForm/ASNFormAmend.jsx","asnForm/ASNFormView.jsx","settings/AccountSettings.jsx","signout/SignOut.tsx","header/NavHeaderLayout.tsx","actionRequired/ActionRequestNotification.tsx","header/NavHeader.tsx","services/LP.tsx","lpLoader/lpLoaderView.tsx","lpLoader/lpLoader.tsx","timeout/timeout.tsx","App.tsx","registerServiceWorker.js","index.tsx"],"names":["USER_ROLE","DefaultLayout","props","className","children","ContactInfo","href","KEYS","Auth","response","window","localStorage","setItem","token","clear","getItem","RestUtilities","url","request","data","method","isBadRequest","forbidden","notFound","unauthorized","serverError","body","headers","Headers","set","AuthStore","getToken","JSON","stringify","fetcher","execute","then","status","includes","location","replace","Routes","SignOut","responseContentType","get","indexOf","json","blob","text","responseContent","is_error","error_content","content","getTokenField","id","name","field_name","jwt_decode","e","mode","contact","post","sessionStorage","email","password","mfa","rememberMe","isRegister","undefined","setResponse","this","signInOrRegister","currentPassword","isSignedInIn","retVal","expiry","Date","lastChanged","previousSignOn","lastSignOn","Promise","resolve","Loading","classNames","loading","show","icon","spin","SignInForm","showMfa","style","fontSize","margin","error","role","onSubmit","handleSubmit","htmlFor","type","value","username","onChange","handleUsername","target","placeholder","required","handlePassword","handleMfa","checked","handleRememberMe","width","disabled","submitting","getRoleLabel","ADMIN","AGLC","CanEdit","DEFAULT","setRole","RoleContext","React","createContext","displayName","DEFAULT_LP","LPContext","LP","setLP","MODAL_TYPE","Login","useState","setUsername","setPassword","setMfa","setRememberMe","setShowMfa","setError","setLoading","roleContext","useContext","lpContext","history","useHistory","doLogin","event","a","preventDefault","AuthService","signIn","error_description","resetMfa","roleFromToken","getRole","getLP","passwordChangeRequired","push","Home","ASN","lp","offset","sortBy","filterBy","filterByType","reverse","apiCall","POid","documentNumber","put","poId","lineId","costCenter","docNumber","toLowerCase","trim","Status","submitted","cancelled","booked","received","removed","confirmed","partial","draft","modal","isOpen","open","close","asn","setASN","CANCEL","setMode","AsnDialogContext","customStyles","overlay","backgroundColor","top","left","right","bottom","marginRight","transform","border","padding","Modal","setAppElement","GenericModal","shouldCloseOnOverlayClick","AsnDialogView","action","actionBody","REMOVE","UPLOAD","display","justifyContent","onClick","onClose","success","errorMsg","goButton","AsnDialog","setErrorMsg","setSuccess","doThing","cancel","licensedProducer","originalOrderNumber","remove","PO","sku","SecondaryASNFilterDropdown","selectFunction","buildElements","label","options","showLoading","buildDropDown","state","selectOptions","Array","initialOption","Component","PrimaryASNFilterDropdown","secondaryFilterRef","onFilterDropdownChange","setState","primaryFilterValue","showSecondaryFilter","buildOptions","setPrimaryFilterValue","getASNNumbers","getList","lpId","asnNumbers","map","asnNumber","filter","length","getPONumbers","Error","primaryFilter","elements","item","key","firstOption","buildSecondaryFilterDropdown","setFilterValue","createRef","SortingDropdown","parseDateString","inputString","format","parse","ToolTipView","placement","trigger","title","AsnDialogOpener","Consumer","ASNListItemView","createdTime","po","amendAsn","isDraft","orderStatus","startAmend","header","createdDate","etaDate","quantity","to","userRole","edit","btn","canAmend","canCancel","canRemove","InfiniteScrollWrapper","hasNextPage","isNextPageLoading","items","loadNextPage","itemCount","isItemLoaded","index","Item","loadMoreItems","startIndex","stopIndex","threshold","onItemsRendered","ref","height","itemSize","ASNList","isFirstLoad","setIsFirstLoad","asn_list","setAsn_list","setOffset","hasMore","setHasMore","showRemoved","setShowRemoved","sortValue","setSortValue","filterValue","isFiltering","setIsFiltering","currentLpId","setCurrentLpId","isReversed","setIsReversed","getASNs","currOffset","resetList","lpChanged","activeFetch","useEffect","lpLoaderResetList","lazyFetch","changedLP","newValues","catch","modalType","setModalType","modalOpen","setModalOpen","selectedAsn","setSelectedAsn","Provider","marginLeft","paddingTop","reload","SkuLoaderView","skuOptions","i","skus","description","selectedSKU","done","handleSelected","SKULoader","setDone","selected","setSelected","setSkus","load","getSkus","Set","add","from","handleSelectedSKU","MODAL_MODE","UNITS","UNIT_LABELS","NONE","PERCENT","ML","CAPSULE","GRAM","MG","GRAMSHORT","regexTwoDecimalPlaces","LotCodeModalView","getUnits","units","unitString","getUnitString","toUpperCase","getDisplayUnits","lc","lotCodeId","harvestDate","thc","thcUnits","cbd","cbdUnits","lotCode","toString","cbUnits","setLotCodeId","setHarvestDate","setThc","setCbd","cbMax","cbMin","cbOutOfRange","setCBOutOfRange","thcMax","thcMin","thcOutOfRange","setThcOutOfRange","isFieldValid","unit","isNumeric","numeric","parsed","parseFloat","isNaN","test","showError","requesting","completed","showSuccess","areFieldsValid","invisible","aria-hidden","maxLength","date","dateFormat","autoComplete","color","paddingLeft","alignSelf","paddingBottom","badge","submit","errorText","setLotCode","LotCodeModalContext","LotCodeModalOpener","LotCodeListItem","cbdOutOfRange","statusFlag","LotCodeListView","lotCodeLineItems","lotCodes","forEach","LotCodeModal","setRequesting","setCompleted","submitForm","originalLotCodeId","originalHarvestDate","createLotCode","editLotCode","LotCodeManager","setLotCodes","setSelectedSKU","isModalOpen","setIsModalOpen","selectedLotCode","setSelectedLotCode","LPid","useParams","loadLotCodes","getLotCodes","lineItems","CoAUploader","coAFileName","currentDate","coAFTPFileName","QvUpf","QvUpt","QvCoa","QvCat","Header","uploadCoAData","lineID","file","originalFileName","reject","toISOString","slice","trimmedLP","trimmedLot","substring","trimmedSku","blobName","fileByteArray","reader","FileReader","onload","evt","readyState","DONE","arrayBuffer","result","array","Uint8Array","coaFile","blobFolder","storageFileName","uploadResponse","amendAsnDetails","amendResponse","ok","statusText","readAsArrayBuffer","CoAModalContext","CoAModalView","getCoa","downloadLink","saveAs","textAlign","uploading","uploader","files","accept","renderUploadButton","CoAModal","setUploading","onCoAUpdate","selectedFiles","currFile","sendCoA","err","console","log","finally","asnStatus","Saving","CoAUploadButton","onFileChange","saveAsn","selectedFile","resultAsn","details","find","detail","assigned","uploadSuccess","uploadName","callBackUpdate","errorExists","lpString","ordNumString","docNumString","closeModal","fileData","buttonStyle","defaultStyle","qvUpf","isbuttonDisabled","create_UUID","dt","getTime","c","r","Math","random","floor","coaUploadButton","inputId","btnClick","isTrusted","preOpen","openModal","coAModalOpenerWithFileName","lineStatus","packagingDate","qvCoa","bind","qvCat","coAUploadCallBack","setting","ASNDetail","handleChange","numberCasesChanged","lotCodeChanged","addLotCode","removeLotCode","isNullOrWhitespace","isPartiallyFilled","isInValidQuantity","increment","decrement","notDivisible","onCoAChange","eachesPerCase","valueAsNumber","parseInt","input","values","countFilledFields","openQuantity","hasCoAValue","intialCoALoad","Object","assign","button","barcoded","referenceField","hide","readOnly","oldLotCode","asnLotCode","generateLotCodeId","exceedsQuantity","min","quantityOnOrder","coAUploadButton","numericRegex","ASNDetailGroup","isSkuQuantityValid","asnDetailItems","asnDetail","poLineItem","asnDetailItemsList","checkForMultiple","skuQuantity","additionalQuantity","maximumQuantity","confirmedQuantity","q","POLoaderView","selectedPo","setSeletedPo","poSelectorOptions","poIDs","days","default","poSelectLabel","selectedPO","x","POLoader","setPOIDs","closingstring","closingDate","handleSelectedPO","Alert","setShow","alert","data-dismiss","aria-label","CanadaPhoneInput","country","onlyCountries","emailRegex","ASNForm","successfulUpdate","getASN","loadASNData","addToGlobalCoAList","newCoAs","concatinatedList","globalCoAList","concat","submitAllCoAs","coAList","all","coa","dismissAlert","isValid","ETA","showAlert","handleCOASave","isValidMinusCOA","coaSave","POLineItems","contactPerson","phoneNumber","reference","freightForwarded","fetchingPOLineItems","fetchingPOLineItemError","alertText","alertType","getEmail","handlePOSelected","handleInputField","handleASNDetailChange","handleDateChange","handlePhoneNumberChange","handleDraft","getAndSetASNData","String","fetchPOLineItems","populateExistingASN","emails","emailAddress","prevState","NONE_SELECTED","getLineItems","fetchPOLineItemError","fetchPOLineItemSuccess","populatePOLineItems","initASNLineItems","lineItem","splice","handleHeaderField","eta","etaTime","isASNDetailItemEmpty","split","createSaveData","setTimeout","saveData","isHeaderValid","validateASNDetailItems","isEmailValid","asnDetailItem","coaCount","keys","currAsn","j","hasOwnProperty","validateCoas","filledRows","checkItemsForCoAs","isASNDetailItemFilled","totalCases","userIsAdmin","buttonDisabled","inputDisabled","noValidate","minDate","maxDate","addYears","fontWeight","toLocaleString","month","getDate","empty","colSpan","row","withRouter","ASNFormCreate","createSubmit","createDraft","match","params","ASNFormAmend","amendSubmit","amendDraft","DocumentNumber","ASNFormView","AccountSettings","confirmPassword","mfaCompare","mfaConfirm","confirmingMFA","userInfo","CNNumber","FullName","PreviousSignOn","FailedAttemptCount","LastChanged","Expiry","mfaMode","multiFactorContact","errors","mfaErrors","handleMFASubmit","handleChanged","handleMFAChanged","isPasswordValid","isMFAValid","isConfirmPasswordValid","isButtonDisabled","cancelMFAVerify","submitMFAUpdate","getAccountData","getLoggedInUserInfo","changePassword","signOut","verifyMFA","code","UpdateMFAInfo","getMFAConfirm","confirmCode","newState","getErrors","getMFAErrors","newErrors","newPassword","cnNumber","failedAttemptCount","round","confirmedMFA","SignIn","NavHeaderLayout","data-toggle","data-target","aria-controls","aria-expanded","message","Contact","initials","ActionRequestNotification","daysToExpiry","setDaysToExpiry","setType","setText","actionLinkText","setActionLinkText","actionLinkUrl","setActionLinkUrl","cookieSet","setCookieSet","currDay","diffTime","Number","diffDays","ceil","cookies","document","cookie","cookieExpiry","setDate","toUTCString","NavHeader","loggedOut","setLoggedOut","getWelcomeMessage","firstName","getFirstName","getInitials","lastName","getLastName","charAt","onSignout","currLP","currVal","LPLoaderView","lpOptions","sortedLps","lps","sort","lp1","lp2","selectedLP","setConfirmed","LPLoader","LPs","setLPs","confirm","unconfirm","LPService","SetInSession","GetFromSession","selectedLpId","selectedIndex","Timeout","displayWarning","setDisplayWarning","resetTimeOut","incrementTimeOut","currentCount","addEventListener","setInterval","useTimeout","ReactGA","initialize","library","faSpinner","faTrashAlt","faTimes","faEdit","faFileAlt","faCopy","faUpload","LotCode","AsnCreate","AsnView","AsnAmend","App","useLocation","pageview","pathname","search","usePageViews","NOT_SET","requiresLPLoader","path","component","container","lpContainer","startsWith","exact","isLocalhost","Boolean","hostname","registerValidSW","swUrl","navigator","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","baseUrl","getElementsByTagName","getAttribute","rootElement","getElementById","ReactDOM","render","basename","URL","process","origin","fetch","ready","unregister","checkValidServiceWorker","registerServiceWorker"],"mappings":"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","file":"static/js/main.5c8e7e86.chunk.js","sourcesContent":["import React from \"react\";\r\n\r\nexport enum USER_ROLE {\r\n  ADMIN = \"CannabisConnect\",\r\n  AGLC = \"CannabisAGLC\",\r\n  DEFAULT = \"Cannabis\",\r\n  NOT_SET = \"-1\"\r\n}\r\n\r\nexport const getRoleLabel = (role: USER_ROLE): string => {\r\n  switch(role) {\r\n    case USER_ROLE.ADMIN:\r\n      return 'ADMIN'\r\n    case USER_ROLE.AGLC:\r\n      return 'AGLC'\r\n    default:\r\n      return ''\r\n  }\r\n}\r\n\r\nexport const CanEdit = (role: USER_ROLE) => {\r\n  return role !== USER_ROLE.AGLC;\r\n};\r\n\r\ninterface RoleContextInterface {\r\n  role: USER_ROLE;\r\n  setRole: (name: USER_ROLE) => void;\r\n}\r\n\r\nconst role = {\r\n  role: USER_ROLE.DEFAULT,\r\n  setRole: (name: USER_ROLE) => {},\r\n};\r\n\r\nconst RoleContext = React.createContext<RoleContextInterface>(role);\r\nRoleContext.displayName = \"RoleContext\";\r\n\r\nexport default RoleContext;\r\n","import React from 'react'\r\n\r\nexport const DefaultLayout: React.FunctionComponent = (props) => {\r\n  return <div className=\"container\">{props.children}</div>\r\n}\r\n","import React from 'react'\r\nimport './ContactInfo.scss'\r\n\r\nconst ContactInfo = () => {\r\n\r\n  return (\r\n    <div className=\"ContactInfo\">\r\n      <div className=\"contact-table\">\r\n        <div className=\"contact-group\">\r\n          <div>\r\n            <h3>Receiving Inquiries</h3>\r\n            <div>Portal Troubleshooting</div>\r\n            <div>Appointment Booking Issues</div>\r\n          </div>\r\n          <div>\r\n            <div>Phone: 1-825-402-6858</div>\r\n            <div>Email: <a href=\"mailto:CannabisReceiving@Connect-Logistics.com\">CannabisReceiving@Connect-Logistics.com</a></div>\r\n          </div>\r\n        </div>      \r\n        <div className=\"contact-group\">\r\n        <div>\r\n            <h3>Customer Service</h3>\r\n            <div>Portal Account Creations</div>            \r\n          </div>\r\n          <div>\r\n            <div>Phone: 1-825-202-2000</div>\r\n            <div>Email: <a href=\"mailto:CannabisCS@Connect-Logistics.com\">CannabisCS@Connect-Logistics.com</a></div>\r\n          </div>\r\n        </div>\r\n        <div className=\"contact-group\">\r\n        <div>\r\n            <h3>Barcode Approvals</h3>\r\n            <div>Barcode Verifications</div>            \r\n          </div>\r\n          <div>            \r\n            <div>Email: <a href=\"mailto:CannabisBarcodes@Connect-Logistics.com\">CannabisBarcodes@Connect-Logistics.com</a></div>\r\n          </div>\r\n        </div>\r\n        <div className=\"contact-group\">\r\n        <div>\r\n            <h3>Value Added Services</h3>\r\n            <div>General Inventory Inquiries</div>\r\n            <div>Value Added Services Inquiries</div>\r\n          </div>\r\n          <div>            \r\n            <div>Email: <a href=\"mailto:Cnbsvas@Connect-Logistics.com\">Cnbsvas@Connect-Logistics.com</a></div>\r\n          </div>\r\n        </div>\r\n        <div className=\"contact-group\">\r\n          <div className=\"center-text\">\r\n            <h3>Hours of Operation</h3>\r\n            <div>Monday - Friday 8:00 am - 4:30 pm Mountain Time</div>\r\n            <div>Closed Saturday, Sunday, and Statutory Holidays</div>\r\n          </div>          \r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n\r\nexport default ContactInfo\r\n","const KEYS = {\r\n  token: 'token',\r\n}\r\n\r\ninterface AuthResponse {\r\n  token: string\r\n}\r\n\r\nexport default class Auth {\r\n  static setResponse(response: AuthResponse) {\r\n    window.localStorage.setItem(KEYS.token, response.token)\r\n  }\r\n\r\n  static clear() {\r\n    window.localStorage.clear()\r\n  }\r\n\r\n  static getToken() {\r\n    return window.localStorage.getItem(KEYS.token)\r\n  }\r\n}\r\n","import AuthStore from '../stores/Auth'\r\nimport { Routes } from '../App'\r\n\r\nexport interface ResponseObj {\r\n  is_error: boolean\r\n  error_content: any\r\n  content: any\r\n}\r\n\r\nexport default class RestUtilities {\r\n  static get(url: string) {\r\n    return RestUtilities.request('GET', url)\r\n  }\r\n\r\n  static delete(url: string) {\r\n    return RestUtilities.request('DELETE', url)\r\n  }\r\n\r\n  static put(url: string, data: any) {\r\n    return RestUtilities.request('PUT', url, data)\r\n  }\r\n\r\n  static post(url: string, data: any) {\r\n    return RestUtilities.request('POST', url, data)\r\n  }\r\n\r\n\r\n  private static async request(method: string, url: string, data = null) {\r\n    let isBadRequest = false\r\n    let forbidden = false\r\n    let notFound = false\r\n    let unauthorized = false\r\n    let serverError = false\r\n\r\n    let body: any = data //TODO: type here?\r\n    let headers = new Headers()\r\n\r\n    headers.set('Authorization', `Bearer ${AuthStore.getToken()}`)\r\n    headers.set('Accept', 'application/json')\r\n    headers.set('Pragma', 'no-cache')\r\n    headers.set('Cache-Control', 'no-cache')\r\n\r\n    if (method !== 'GET' && data) {\r\n      if (typeof data === 'object') {\r\n        headers.set('Content-Type', 'application/json')\r\n        body = JSON.stringify(data)\r\n      } else {\r\n        headers.set('Content-Type', 'application/x-www-form-urlencoded')\r\n      }\r\n    }\r\n\r\n    /*\r\n      Dynamically import our \"fetch\".\r\n      Allows for development version to hot-swap in a mock fetch client\r\n      that returns test data, and allows for test data to be excluded from\r\n      production build.\r\n    */\r\n    const fetcher = await import(`./${process.env.REACT_APP_FETCH}`)\r\n\r\n    return fetcher.execute(url, {\r\n      method: method,\r\n      headers: headers,\r\n      body: body,\r\n    })\r\n      .then((response: Response) => {\r\n        if (response.status === 401) {\r\n          unauthorized = true\r\n          AuthStore.clear()\r\n\r\n           // redirect to sign-in\r\n          if (!response.url.includes('/api/auth/login')) {\r\n            window.location.replace(Routes.SignOut)\r\n          }\r\n        }\r\n\r\n        isBadRequest = response.status === 400\r\n        forbidden = response.status === 403\r\n        notFound = response.status === 404\r\n        serverError = response.status >= 500\r\n\r\n        let responseContentType = response.headers.get('content-type')\r\n        if (\r\n          responseContentType &&\r\n          responseContentType.indexOf('application/json') !== -1\r\n        ) {\r\n          return response.json()\r\n        } else if (responseContentType && responseContentType.indexOf(\"application/pdf\") !== -1) {\r\n          return response.blob();\r\n        }\r\n         else {\r\n          return response.text()\r\n        }\r\n      })\r\n      .then((responseContent: Promise<any>) => {\r\n        let is_error =\r\n          isBadRequest || forbidden || notFound || unauthorized || serverError\r\n        let response: ResponseObj = {\r\n          is_error: is_error,\r\n          error_content: is_error ? responseContent : null,\r\n          content: is_error ? null : responseContent,\r\n        }\r\n        return response\r\n      })\r\n  }\r\n}\r\n","import RestUtilities from './Base'\r\nimport AuthStore from '../stores/Auth'\r\nimport { ResponseObj } from './Base'\r\n\r\nimport jwt_decode from 'jwt-decode'\r\nimport { Routes } from '../App'\r\nimport UserInfo from '../viewModels/UserInfo'\r\n\r\nexport default class Auth {\r\n  static isSignedInIn() {\r\n    return !!AuthStore.getToken()\r\n  }\r\n  static getToken() {\r\n    return AuthStore.getToken()\r\n  }\r\n\r\n  static getRole(token: string) {\r\n    return Auth.getTokenField('http://schemas.microsoft.com/ws/2008/06/identity/claims/role')\r\n  }\r\n\r\n  static getLP(token: string) {\r\n    return { id: Auth.getTokenField('lp_id'), name: Auth.getTokenField('lp_name') }\r\n  }\r\n\r\n  static getTokenField(field_name: string) {\r\n    let token = Auth.getToken()\r\n    if (token) {\r\n      try {\r\n        let decoded: any = jwt_decode(token)\r\n        return decoded[field_name]\r\n      }\r\n      catch (e) {\r\n        return ''\r\n      }\r\n\r\n    }\r\n    return ''\r\n  }\r\n\r\n  static getFirstName() {\r\n    return Auth.getTokenField('FirstName')\r\n  }\r\n\r\n  static getLastName() {\r\n    return Auth.getTokenField('LastName')\r\n  }\r\n\r\n  static getEmail() {\r\n    return Auth.getTokenField(\r\n      'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress'\r\n    )\r\n  }\r\n\r\n  static getExpiry() {\r\n    return Auth.getTokenField(\r\n      'http://schemas.microsoft.com/ws/2008/06/identity/claims/expiration'\r\n    )\r\n  }\r\n\r\n  static async getMFAConfirm(mode: string, contact: string) : Promise<string> {\r\n    return RestUtilities.get(`/api/auth/getMFAConfirm?mode=${mode}&contact=${contact}`).then((response) => {\r\n      return !response.is_error ? response.content : \"failed\";\r\n    });\r\n  }\r\n\r\n  static async UpdateMFAInfo(mode: string, contact: string): Promise<boolean> {\r\n    var response = await RestUtilities.post(`/api/auth/updateMFAInfo`,\r\n      `mode=${mode}&contact=${contact}`);\r\n\r\n    return !response.is_error ? response.content : \"failed\";\r\n  }\r\n\r\n  static signOut() {\r\n    AuthStore.clear()\r\n    sessionStorage.clear();\r\n  }\r\n\r\n  static signInOrRegister(\r\n    email: string,\r\n    password: string,\r\n    mfa: string | undefined,\r\n    rememberMe: boolean,\r\n    isRegister: boolean = false\r\n  ) {\r\n    return RestUtilities.post(\r\n      `/api/auth/${isRegister ? 'register' : 'login'}`,\r\n      `username=${email}&password=${password}${mfa == undefined ? '' : '&mfa=' + mfa}${rememberMe ? '&rememberMe=true': ''}${!isRegister ? '&grant_type=password' : ''\r\n      }`\r\n    ).then((response) => {\r\n      if (!response.is_error) {\r\n        AuthStore.setResponse(response.content)\r\n      }\r\n      return response\r\n    })\r\n  }\r\n\r\n  static signIn(email: string, password: string, mfa: string|undefined, rememberMe: boolean) {\r\n    // return this.mockSignInOrRegister(email, password, false)\r\n    return this.signInOrRegister(email, password, mfa, rememberMe, false);\r\n  }\r\n  /*\r\n  register(email: string, password: string) {\r\n    return this.signInOrRegister(email, password, true)\r\n  }\r\n  */\r\n\r\n  static refreshToken() {\r\n    return RestUtilities.get('/api/auth/refresh').then((response) => {\r\n      if (!response.is_error) {\r\n        AuthStore.setResponse(response.content)\r\n      }\r\n      return response\r\n    })\r\n  }\r\n\r\n  static changePassword(currentPassword: string, password: string) {\r\n    return RestUtilities.post('/api/auth/changePassword', {\r\n      password: password,\r\n      currentPassword: currentPassword\r\n    }).then((response) => {\r\n      return response\r\n    })\r\n  }\r\n\r\n  static getLoggedInUserInfo(): Promise<UserInfo|void> {\r\n    if (!Auth.isSignedInIn())\r\n      return Promise.resolve();\r\n\r\n    return RestUtilities.get('/api/auth/getUserInfo').then((response: any) => {\r\n      var retVal = response.content;\r\n\r\n      if (retVal) {\r\n        retVal.expiry = retVal.expiry ? new Date(retVal.expiry + \"Z\") : null;\r\n        retVal.lastChanged = retVal.lastChanged ? new Date(retVal.lastChanged + \"Z\") : null;\r\n        retVal.previousSignOn = retVal.previousSignOn ? new Date(retVal.previousSignOn + \"Z\") : null;\r\n        retVal.lastSignOn = retVal.lastSignOn ? new Date(retVal.lastSignOn + \"Z\") : null;\r\n      }\r\n\r\n      return retVal as UserInfo;\r\n    });\r\n  }\r\n}\r\n","import React from 'react'\r\nimport classNames from 'classnames'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\n\r\nconst Loading = props => {\r\n  return (\r\n    <div\r\n      className={classNames({\r\n        loading: true,\r\n        'd-none': !props.show,\r\n      })}>\r\n      <FontAwesomeIcon icon=\"spinner\" spin />\r\n    </div>\r\n  )\r\n}\r\n\r\nexport default Loading\r\n","import React from 'react'\r\n\r\nimport Loading from '../loading/Loading'\r\nimport './signin.scss'\r\n\r\ninterface Props {\r\n  submitting: boolean\r\n  error: string\r\n  username: string\r\n  password: string\r\n  mfa: string | undefined\r\n  rememberMe: boolean\r\n  showMfa: boolean\r\n  handleUsername: (value: string) => void\r\n  handlePassword: (value: string) => void\r\n  handleMfa: (value: string) => void\r\n  handleRememberMe: (value: boolean) => void\r\n  handleSubmit: (event: React.FormEvent<HTMLFormElement>) => void\r\n}\r\n\r\nconst SignInForm = (props: Props) => {\r\n  return (\r\n    <div id=\"login\" className=\"flex-container\">\r\n      <div className=\"flex-container-item flex-container-item--top\"></div>\r\n      <div className=\"flex-container-item\">\r\n        <div className=\"logo\" />\r\n        {props.showMfa && < div className=\"support\" style={{ fontSize: \".75em\", margin:\"0\" }}>\r\n          Your account security is a priority for us and MFA is an essential tool to help keep your information safe. A login request was made on your account which requires an additional MFA sign-in code. The code is time sensitive, so please enter it promptly.\r\n          <br /><br />\r\n          Please re-enter your username, password and provide the code that was sent to you.\r\n        </div>}\r\n        {props.error && (\r\n          <div className=\"alert alert-danger\" role=\"alert\">\r\n            {props.error}\r\n          </div>\r\n        )}\r\n        <form onSubmit={e => props.handleSubmit(e)}>\r\n          <div className=\"form-group\">\r\n            <label htmlFor=\"username\" className=\"form-control-label \">\r\n              Username\r\n            </label>\r\n            <input\r\n              type=\"text\"\r\n              id=\"username\"\r\n              value={props.username}\r\n              onChange={(e) => props.handleUsername(e.target.value)}\r\n              className=\"form-control form-control-danger\"\r\n              placeholder=\"Username\"\r\n              required\r\n            />\r\n          </div>\r\n          <div className=\"form-group\">\r\n            <label htmlFor=\"inputPassword\" className=\"form-control-label \">\r\n              Password\r\n            </label>\r\n            <input\r\n              type=\"password\"\r\n              id=\"inputPassword\"\r\n              value={props.password}\r\n              onChange={(e) => props.handlePassword(e.target.value)}\r\n              className=\"form-control\"\r\n              placeholder=\"Password\"\r\n              required\r\n            />\r\n          </div>\r\n          {props.showMfa &&\r\n            <>\r\n            <div className=\"form-group\">\r\n              <label htmlFor=\"inputMfa\" className=\"form-control-label \">\r\n                Emailed Code\r\n              </label>\r\n              <input\r\n                type=\"text\"\r\n                id=\"mfa\"\r\n                value={props.mfa}\r\n                onChange={(e) => props.handleMfa(e.target.value)}\r\n                className=\"form-control form-control-danger\"\r\n                placeholder=\"Email Code\"\r\n                required={props.showMfa}\r\n              />\r\n            </div>\r\n            <div className=\"form-group\">\r\n              <label htmlFor=\"rememberMe\" className=\"form-control-label \">\r\n                Remember Me\r\n              </label>\r\n              <input\r\n                type=\"checkbox\"\r\n                id=\"rememberMe\"\r\n                checked={props.rememberMe}\r\n                onChange={(e) => props.handleRememberMe(!props.rememberMe)}\r\n                className=\"form-control form-control-danger\"\r\n                style={{width:\"inherit\"}}\r\n              />\r\n            </div>\r\n            </>\r\n          }\r\n          <div className=\"form-group\">\r\n            <button\r\n              type=\"submit\"\r\n              className=\"btn btn-orange btn-block\"\r\n              disabled={props.submitting}>\r\n              Sign In\r\n            </button>\r\n          </div>\r\n          <div className=\"form-group\">\r\n            <div className=\"support\">\r\n              <div className=\"support-title\">For Support:</div>\r\n              <div><a href=\"mailto:CannabisReceiving@Connect-Logistics.com\">CannabisReceiving@Connect-Logistics.com</a></div>\r\n              <div>825-402-6858</div>\r\n            </div>\r\n          </div>\r\n          <div className=\"spinner\">\r\n            <Loading show={props.submitting} />\r\n          </div>\r\n        </form>\r\n      </div>\r\n      <div className=\"flex-container-item flex-container-item--bottom\" />\r\n    </div>\r\n  )\r\n}\r\n\r\nexport default SignInForm\r\n","import React, { Context } from 'react'\r\n\r\nexport interface LP {\r\n  id: number\r\n  name: string\r\n}\r\n\r\nexport const DEFAULT_LP = { id: -1, name: ''}\r\n\r\nexport interface LPContextInterface {\r\n  LP: LP\r\n  setLP: (LP: LP) => void\r\n  displayName? : string;\r\n}\r\n\r\nconst LPContext: Context<LPContextInterface> = React.createContext<LPContextInterface>({\r\n  LP: DEFAULT_LP,\r\n  setLP: (LP:LP) => {}\r\n})\r\n\r\nLPContext.displayName = 'LPContext'\r\n\r\nexport default LPContext\r\n","import React from 'react'\r\n\r\nexport enum MODAL_TYPE {\r\n  CANCEL,\r\n  REMOVE,\r\n  UPLOAD\r\n}\r\n\r\nconst modal = {\r\n  isOpen: false,\r\n  open: () => {},\r\n  close: () => {},\r\n  asn: {},\r\n  setASN: (asn: any) => {},\r\n  mode: MODAL_TYPE.CANCEL,\r\n  setMode: (type: number) => {}\r\n}\r\n\r\nconst AsnDialogContext = React.createContext(modal)\r\nAsnDialogContext.displayName = 'AsnDialogContext'\r\n\r\nexport default AsnDialogContext\r\n","import React, { useState, useContext } from 'react'\r\nimport { useHistory } from 'react-router'\r\n\r\nimport { default as AuthService } from '../services/Auth'\r\nimport { default as MockAuthService } from '../services/MockAuth'\r\nimport SignInForm from './SignInForm'\r\nimport RoleContext, { USER_ROLE } from './RoleContext'\r\nimport { Routes } from '../App'\r\nimport LPContext, { DEFAULT_LP } from '../lpLoader/LPContext'\r\nimport Auth from '../services/Auth'\r\n\r\nconst Login = () => {\r\n  const [username, setUsername] = useState('')\r\n  const [password, setPassword] = useState('')\r\n  const [mfa, setMfa] = useState<string | undefined>(undefined)\r\n  const [rememberMe, setRememberMe] = useState(false)\r\n  const [showMfa, setShowMfa] = useState(false)\r\n  const [error, setError] = useState('')\r\n  const [loading, setLoading] = useState(false)\r\n\r\n  const roleContext = useContext(RoleContext)\r\n  const lpContext = useContext(LPContext)\r\n  const history = useHistory()\r\n\r\n  const doLogin = async (event: React.FormEvent<HTMLFormElement>) => {\r\n    event.preventDefault()\r\n    setError(\"\");\r\n    setLoading(true)\r\n    const response = await AuthService.signIn(username, password, mfa, rememberMe)\r\n    setLoading(false)\r\n\r\n    if (response.is_error) {\r\n      setError(\r\n        response.error_content.error_description || response.error_content\r\n      )\r\n      if (response.resetMfa) {\r\n        setMfa(undefined);\r\n      }\r\n    } else if (response.content.token == null && response.content.showMfa) {\r\n      setShowMfa(true);\r\n    } else {\r\n      \r\n      let token = response.content.token\r\n      if (token) {\r\n        let roleFromToken = Auth.getRole(token)\r\n        if (\r\n          roleFromToken === USER_ROLE.ADMIN ||\r\n          roleFromToken === USER_ROLE.AGLC ||\r\n          roleFromToken === USER_ROLE.DEFAULT\r\n        ) {\r\n          roleContext.setRole(roleFromToken)\r\n        }\r\n\r\n        if (roleFromToken === USER_ROLE.DEFAULT) {\r\n          lpContext.setLP(Auth.getLP(token))\r\n        } else {\r\n          lpContext.setLP(DEFAULT_LP)\r\n        }\r\n\r\n          localStorage.setItem(\"PasswordChangeRequired\", response.content.passwordChangeRequired);\r\n      }\r\n\r\n      history.push(Routes.Home)\r\n    }\r\n  }\r\n\r\n  return (\r\n    <SignInForm\r\n      username={username}\r\n      password={password}\r\n      mfa={mfa}\r\n      rememberMe={rememberMe}\r\n      handleUsername={setUsername}\r\n      handlePassword={setPassword}\r\n      handleMfa={setMfa}\r\n      handleRememberMe={setRememberMe}\r\n      showMfa={showMfa}\r\n      handleSubmit={doLogin}\r\n      error={error}\r\n      submitting={loading}\r\n    />\r\n  )\r\n}\r\n\r\nexport default Login\r\n","import RestUtilities from './Base';\r\n\r\nexport default class ASN {\r\n  static getList(lp: number, offset: number, sortBy: string, filterBy: string, filterByType: string, reverse: boolean) {\r\n    const apiCall = `/api/${lp}/asn/list?sortBy=${sortBy}&&filterBy=${filterBy}&&filterByType=${filterByType}&&size=50&offset=${offset}&&reverse=${reverse}`    \r\n    return RestUtilities.get(apiCall).then((response) => {\r\n      return response\r\n    })\r\n  }\r\n\r\n  static getSortedList(lp: number, offset:number, sortBy:string, reverse:number) {\r\n    return RestUtilities.get(`/api/${lp}/asn/list/${sortBy}?size=50&offset=${offset}&reverse=${reverse}`).then((response) => {\r\n      return response\r\n    })\r\n  }\r\n\r\n\r\n\r\n  static getAll(offset: number) {\r\n    return RestUtilities.get(`/api/asn/list/all?size=50&offset=${offset}`).then((response) => {\r\n      return response\r\n    })\r\n  }\r\n\r\n\r\n  static get(lp: string, POid: string, documentNumber: string) {\r\n    return RestUtilities.get(`/api/${lp}/asn/${POid}/${documentNumber}`).then(\r\n      (response) => {\r\n        return response\r\n      }\r\n    )\r\n  }\r\n\r\n  static createSubmit(lp: string, data: any) {\r\n    return RestUtilities.post(`/api/${lp}/asn/`, data).then((response) => {\r\n      return response\r\n    })\r\n  }\r\n\r\n  static createDraft(lp: string, data: any) {\r\n    return RestUtilities.post(`/api/${lp}/asn/draft`, data).then((response) => {\r\n      return response\r\n    })\r\n  }\r\n\r\n  static amendSubmit(lp: string, data: any) {\r\n    return RestUtilities.put(`/api/${lp}/asn/`, data).then((response) => {\r\n      return response\r\n    })\r\n  }\r\n\r\n  static amendDraft(lp: string, data: any) {\r\n    return RestUtilities.put(`/api/${lp}/asn/draft`, data).then((response) => {\r\n      return response\r\n    })\r\n  }\r\n\r\n  static startAmend(lp: string, poId: string, documentNumber: number) {\r\n    return RestUtilities.post(`api/${lp}/asn/${poId}/${documentNumber}/startamend`, {}).then((response) => {\r\n      return response\r\n    })\r\n  }\r\n\r\n  //api/{lp}/asn/{lineid}/{costcenter}/{docnumber}/coa\r\n  static uploadCoAData(lp: string, lineId:string, costCenter: string, docNumber:string, data: any) {\r\n    return RestUtilities.put(\r\n      `api/${lp}/asn/${lineId}/${costCenter}/${docNumber}/coa`, data).then((response) => {\r\n        return response\r\n      })\r\n  }\r\n\r\n  static cancel(lp: string, POid: string, documentNumber: string) {\r\n    return RestUtilities.put(\r\n      `/api/${lp}/asn/${POid}/${documentNumber}/cancel`,\r\n      {} // TODO: verify this param doesnt break things\r\n    ).then((response) => {\r\n      return response\r\n    })\r\n  }\r\n\r\n  static remove(lp: string, POid: string, documentNumber: string) {\r\n    return RestUtilities.put(\r\n      `/api/${lp}/asn/${POid}/${documentNumber}/remove`,\r\n      {} // TODO: verify this param doesnt break things\r\n    ).then((response) => {\r\n      return response\r\n    })\r\n  }\r\n\r\n  // static uploadCoA(lp: string, docNumber: string, file: File) {  \r\n  //   //might be some issue mapping to paramaters\r\n  //   // const coaUploader = new CoAUploader();\r\n\r\n  //   return CoAUploader.sendCoA(file, lp, docNumber);\r\n  //   // return RestUtilities.put(\r\n  //   //   `/api/${lp}/asn/${docNumber}/uploadCoA`, {file}\r\n  //   // ).then((response) => response)\r\n\r\n  // }\r\n\r\n  static Status = {\r\n    draft: 'draft',\r\n    submitted: 'submitted',\r\n    cancelled: 'cancelled',\r\n    confirmed: 'confirmed',\r\n    partial: 'partial',\r\n    received: 'received',\r\n    booked: 'booked',\r\n    removed: 'removed',\r\n  }\r\n\r\n  static canAmend(status: string) {\r\n    if (\r\n      status.toLowerCase().trim() === ASN.Status.submitted ||\r\n      status.toLowerCase().trim() === ASN.Status.cancelled ||\r\n      status.toLowerCase().trim() === ASN.Status.booked ||\r\n      status.toLowerCase().trim() === ASN.Status.received ||\r\n      status.toLowerCase().trim() === ASN.Status.removed\r\n    ) {\r\n      return false\r\n    }\r\n    return true\r\n  }\r\n\r\n  static canCancel(status: string) {\r\n    if (\r\n      status.toLowerCase().trim() === ASN.Status.confirmed ||\r\n      status.toLowerCase().trim() === ASN.Status.partial\r\n    ) {\r\n      return true\r\n    }\r\n    return false\r\n  }\r\n\r\n  static canRemove(status: string) {\r\n    if (\r\n      status.toLowerCase().trim() === ASN.Status.draft ||\r\n      status.toLowerCase().trim() === ASN.Status.received\r\n    ) {\r\n      return true\r\n    }\r\n    return false\r\n  }\r\n\r\n  static isDraft(status: string) {\r\n    if (!status || status.toLowerCase().trim() === ASN.Status.draft) {\r\n      return true\r\n    }\r\n    return false\r\n  }\r\n}\r\n","import React, { FunctionComponent } from 'react'\r\nimport Modal from 'react-modal'\r\n\r\nimport './Modal.scss'\r\n\r\nconst customStyles = {\r\n  overlay: {\r\n    backgroundColor: 'rgba(100, 100, 100, 0.75)',\r\n  },\r\n  content: {\r\n    top: '50%',\r\n    left: '50%',\r\n    right: 'auto',\r\n    bottom: 'auto',\r\n    marginRight: '-50%',\r\n    transform: 'translate(-50%, -50%)',\r\n    border: '0px solid transparent',\r\n    padding: 0,\r\n  },\r\n}\r\n\r\ninterface Props {\r\n  isOpen: boolean\r\n}\r\n\r\n// Make sure to bind modal to your appElement (http://reactcommunity.org/react-modal/accessibility/)\r\nif (process.env.NODE_ENV !== 'test')\r\n  Modal.setAppElement('#root')\r\n\r\nconst GenericModal: FunctionComponent<Props> = (props) => {\r\n  return (\r\n    <Modal\r\n      isOpen={props.isOpen}\r\n      style={customStyles}\r\n      shouldCloseOnOverlayClick={false}>\r\n      { props.children }\r\n    </Modal>\r\n  )\r\n}\r\n\r\nexport default GenericModal\r\n","import React from 'react'\r\nimport classNames from 'classnames'\r\nimport Loading from '../loading/Loading'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\nimport { MODAL_TYPE } from './Context'\r\n// import CoAUploadButton from '../asnCoAUpload/CoAUploadButton'\r\nimport { execute } from '../services/Fetch'\r\n\r\ninterface Props {\r\n  loading: boolean\r\n  error: boolean\r\n  errorMsg: string\r\n  success: boolean\r\n  onClose: () => void\r\n  execute: (asn: any) => void\r\n  asn: any\r\n  mode: number\r\n}\r\n\r\nconst AsnDialogView = (props: Props) => {\r\n  let action = ''\r\n  let actionBody = null;\r\n  switch(props.mode) {\r\n    case MODAL_TYPE.CANCEL:\r\n      action = 'Cancel'\r\n      actionBody = `${action} ASN ${props.asn.documentNumber}?`\r\n\r\n      break\r\n    case MODAL_TYPE.REMOVE:\r\n      action = 'Remove'\r\n      actionBody = `${action} ASN ${props.asn.documentNumber}?`\r\n      break\r\n    case MODAL_TYPE.UPLOAD:\r\n      action = 'Upload Certificate of Analysis'\r\n      actionBody = (\r\n        <div></div>\r\n          // <AsnCoAUploadForm asn={props.asn} uploadFunction={execute}/>\r\n      )\r\n      break\r\n  }\r\n\r\n  const goButton = () => {\r\n    if (props.mode === MODAL_TYPE.CANCEL || props.mode === MODAL_TYPE.REMOVE){\r\n      return (\r\n        <button className='btn btn-orange' onClick={props.execute}>{props.error ? 'Retry' : 'Go'}</button>\r\n      );\r\n    }\r\n  }\r\n\r\n\r\n  return (\r\n    <div className=\"modal-dialog\" role=\"document\">\r\n      <div className=\"modal-content\">\r\n        <div className=\"modal-header\" style={{display: 'flex', justifyContent: 'space-between'}}>\r\n          <div>{action}</div>\r\n          <button className='btn' onClick={props.onClose}>\r\n            <FontAwesomeIcon icon='times' />\r\n          </button>\r\n        </div>\r\n        <div className=\"modal-body\">\r\n\r\n          <div\r\n            className={\r\n              classNames({\r\n                'd-none': !(!props.loading && !props.success)\r\n              })\r\n            }>\r\n            {actionBody}\r\n          </div>\r\n\r\n          <div\r\n            className={\r\n              classNames({\r\n                'd-none': !(props.loading && !props.success)\r\n              })\r\n            }>\r\n            <Loading show={true} />\r\n          </div>\r\n\r\n          <div\r\n            className={\r\n              classNames({\r\n                'd-none': !(!props.loading && props.error),\r\n                'text-danger': true\r\n              })\r\n            }>\r\n            {`An Error Occurred: ${props.errorMsg}`}\r\n          </div>\r\n\r\n          <div\r\n            className={\r\n              classNames({\r\n                'd-none': !(props.success),\r\n              })\r\n            }>\r\n            {'Done!'}\r\n          </div>\r\n\r\n        </div>\r\n\r\n        <div className=\"modal-footer\">\r\n          <div\r\n            className={\r\n              classNames({\r\n                'd-none': props.loading || props.success,\r\n              })\r\n            }>\r\n            {goButton()}\r\n\r\n\r\n\r\n\r\n          </div>\r\n\r\n        </div>\r\n      </div>\r\n    </div>\r\n  )\r\n}\r\n\r\nexport default AsnDialogView\r\n","import React, { useState } from 'react'\r\nimport AsnDialogView from './AsnDialogView'\r\nimport ASN from '../services/ASN'\r\nimport { MODAL_TYPE } from './Context'\r\n\r\ninterface Props {\r\n  asn: any\r\n  mode: number\r\n  close: () => void\r\n}\r\n\r\nconst AsnDialog = (props: Props) => {\r\n  const [loading, setLoading] = useState(false)\r\n  const [error, setError] = useState(false)\r\n  const [errorMsg, setErrorMsg] = useState('')\r\n\r\n  const [success, setSuccess] = useState(false)\r\n\r\n  const doThing = async () => {\r\n    setLoading(true)\r\n    setError(false)\r\n    setErrorMsg('')\r\n\r\n    let response = null\r\n    switch (props.mode) {\r\n      case MODAL_TYPE.CANCEL:\r\n        response = await ASN.cancel(\r\n          props.asn.licensedProducer,\r\n          props.asn.originalOrderNumber,\r\n          props.asn.documentNumber\r\n        )\r\n        break\r\n      case MODAL_TYPE.REMOVE:\r\n        response = await ASN.remove(\r\n          props.asn.licensedProducer,\r\n          props.asn.originalOrderNumber,\r\n          props.asn.documentNumber\r\n        )\r\n      // case MODAL_TYPE.UPLOAD:\r\n      //   response = async (file: File) => {\r\n      //     return await ASN.uploadCoA(\r\n      //       props.asn.licensedProducer,\r\n      //       props.asn.documentNumber,\r\n      //       file\r\n      //     )\r\n      //   }\r\n\r\n\r\n\r\n        break\r\n    }\r\n\r\n    setLoading(false)\r\n    if (response) {\r\n      if (response.is_error) {\r\n        setError(true)\r\n        setErrorMsg(response.error_content)\r\n      } else {\r\n        setSuccess(true)\r\n        setError(false)\r\n      }\r\n    } else {\r\n      setError(true)\r\n    }\r\n  }\r\n\r\n  return (\r\n    <AsnDialogView\r\n      asn={props.asn}\r\n      mode={props.mode}\r\n      success={success}\r\n      loading={loading}\r\n      error={error}\r\n      errorMsg={errorMsg}\r\n      execute={() => doThing()}\r\n      onClose={props.close}\r\n    />\r\n  )\r\n}\r\n\r\nexport default AsnDialog\r\n","import RestUtilities from './Base'\r\n\r\nexport default class PO {\r\n  static getList(lp: number) {\r\n    return RestUtilities.get(`/api/${lp}/po/list/ids`).then(response => {\r\n      return response\r\n    })\r\n  }\r\n\r\n  static getLineItems(lp: number, POid: string) {\r\n    return RestUtilities.get(`/api/${lp}/po/` + POid).then(response => {\r\n      return response\r\n    })\r\n  }\r\n\r\n  static createLotCode(lp: number, data: any) {\r\n    return RestUtilities.post(`/api/${lp}/lotCodes`, data).then(response => {\r\n      return response\r\n    })\r\n  }\r\n\r\n  static editLotCode(lp: number, data: any) {\r\n    return RestUtilities.put(`/api/${lp}/lotCodes`, data).then(response => {\r\n      return response\r\n    })\r\n  }\r\n\r\n  static getLotCodes(lp: number, sku: string) {\r\n    return RestUtilities.get(`/api/${lp}/lotCodes/` + sku).then(response => {\r\n      return response\r\n    })\r\n  }\r\n\r\n  static getSkus(lp: number) {\r\n    return RestUtilities.get(`/api/${lp}/skus`).then(response => {\r\n      return response\r\n    })\r\n  }\r\n\r\n}\r\n","import React, { Component } from 'react';\r\nimport Loading from '../loading/Loading'\r\n\r\ninterface Props {\r\n  selectFunction: (option: string) => void\r\n  setPrimaryFilterValue: (option: string) => void\r\n\r\n  label: string\r\n  lp?: number\r\n  initialOption: string\r\n  options: JSX.Element[]\r\n}\r\n\r\ninterface State {\r\n  loading: boolean\r\n  selectOptions: JSX.Element[]\r\n}\r\n\r\nexport class SecondaryASNFilterDropdown extends Component<Props, State>{\r\n  constructor(props: Readonly<Props>) {\r\n    super(props)\r\n    this.state= {\r\n      loading: true,\r\n      selectOptions:new Array()\r\n    }\r\n  }\r\n\r\n  componentDidMount() {\r\n    this.props.selectFunction(this.props.initialOption);\r\n  }\r\n\r\n  onChange = (e: React.FormEvent) => {\r\n    const target = e.target as HTMLSelectElement;\r\n    const value: string = target.value;\r\n    this.props.selectFunction(value);\r\n  }\r\n\r\n  buildElements = () => {\r\n    return(\r\n      <form>\r\n      <div className=\"form-group\">\r\n        <label htmlFor=\"exampleFormControlSelect1\">{`${this.props.label}`}</label>\r\n        <select onChange={(e) => this.onChange(e)} className=\"form-control\" id=\"exampleFormControlSelect1\">\r\n            {this.props.options}\r\n        </select>\r\n      </div>\r\n    </form>\r\n    )\r\n  }\r\n\r\n  showLoading = () => {\r\n    return (\r\n      <Loading show={true}/>\r\n    );\r\n  }\r\n\r\n  buildDropDown = () => {\r\n    return this.state.loading === true\r\n      ? this.showLoading()\r\n      : this.buildElements()\r\n  }\r\n\r\n  render() {\r\n    return(\r\n      <div>\r\n        {this.buildElements()}\r\n      </div>\r\n    );\r\n  }\r\n}\r\n\r\nexport default SecondaryASNFilterDropdown;\r\n","import React, { Component } from \"react\"\r\nimport ASN from '../services/ASN'\r\nimport PO from '../services/PO'\r\nimport SecondaryASNFilterDropdown from './secondaryASNFilterDropdown'\r\nimport Loading from \"../loading/Loading\"\r\n\r\n\r\ninterface Props {\r\n  lpId: number\r\n  setFilterValue: (option: string) => void\r\n  setPrimaryFilterValue: (option: string) => void\r\n}\r\n\r\ninterface State {\r\n  showSecondaryFilter: boolean\r\n  primaryFilterValue: string\r\n  loading: boolean\r\n  options: JSX.Element[]\r\n  firstOption: string\r\n}\r\n\r\nexport class PrimaryASNFilterDropdown extends Component<Props, State> {\r\n  secondaryFilterRef: React.RefObject<unknown>\r\n\r\n\r\n  constructor(props: Readonly<Props>) {\r\n    super(props)\r\n    this.secondaryFilterRef = React.createRef()\r\n    this.state = {\r\n      showSecondaryFilter:false,\r\n      primaryFilterValue:\"none\",\r\n      loading: false,\r\n      options: [],\r\n      firstOption: 'none'\r\n      // secondFilterValue:  \"none\"\r\n    }\r\n  }\r\n  onFilterDropdownChange = async (e: React.FormEvent) => {\r\n    const target = e.target as HTMLSelectElement\r\n    const value: string = target.value\r\n    if (target.value !== 'no filter') {      \r\n      this.setState({\r\n        primaryFilterValue: value,\r\n        showSecondaryFilter: true,\r\n        loading: true\r\n      })\r\n\r\n      await this.buildOptions(value)\r\n\r\n    } else {\r\n      this.setState({\r\n        primaryFilterValue: value,\r\n        showSecondaryFilter: false\r\n      })\r\n    }\r\n\r\n    this.props.setPrimaryFilterValue(value);\r\n  }\r\n\r\n  getASNNumbers = () => {\r\n    return ASN.getList(this.props.lpId, 0, 'none', 'default', 'none', false).then((response) => {\r\n      const asnValues =  response.content.value;\r\n      const asnNumbers = asnValues.map((asn: any) => {\r\n        return asn.asnNumber.trim()\r\n      }).filter((asnNumber: string) => asnNumber.length > 0)\r\n      return asnNumbers.length > 0 ? asnNumbers : ['No ASN Numbers'];\r\n    })\r\n  }\r\n\r\n\r\n\r\n  getPONumbers = () => {\r\n    if (this.props.lpId !== undefined && this.props.lpId !== null ) {\r\n      return PO.getList(this.props.lpId).then((response) => {\r\n        return response.content.value.map((poId: any) => {\r\n          return poId.value.trim()\r\n        });\r\n      })\r\n    } else {\r\n      throw Error('Missing Lp value')\r\n    }\r\n\r\n  }\r\n\r\n\r\n  buildOptions = async (primaryFilter: string) => {    \r\n    let options: string[] = [];\r\n    // if (this.state.primaryFilterValue !== \"none\") {\r\n      switch(primaryFilter.toLowerCase()) {\r\n        case \"none\":\r\n          this.setState({\r\n            showSecondaryFilter: false\r\n          })\r\n          break\r\n        case \"ponumber\":\r\n          options = await this.getPONumbers()\r\n          break\r\n        case \"asnnumber\":\r\n          options = await this.getASNNumbers()\r\n          break\r\n        default:\r\n          options =\r\n           ['BOOKED', 'SUBMITTED', 'DRAFT', 'REMOVED']\r\n           break\r\n      }      \r\n\r\n      const elements: JSX.Element[] = options.map((item: string) => {\r\n        return(\r\n        <option key={`${item}`} value={`${item}`}>\r\n          {`${item}`}\r\n        </option>);\r\n      })      \r\n\r\n      this.setState({\r\n        loading: false,\r\n        options: elements,\r\n        firstOption: options[0]\r\n      });\r\n    // return(\r\n    //   {options}\r\n    // )\r\n  // }\r\n\r\n    // this.setState({\r\n    //   loading: false,\r\n    //   selectOptions: elements\r\n    // });\r\n    // return(\r\n    //   {options}\r\n    // )\r\n  }\r\n\r\n  buildSecondaryFilterDropdown = () => {\r\n\r\n    if (this.state.showSecondaryFilter && !this.state.loading) {\r\n      return (\r\n\r\n          <SecondaryASNFilterDropdown\r\n            options={this.state.options}\r\n            initialOption={this.state.firstOption}\r\n            lp={this.props.lpId}\r\n            label={`${this.state.primaryFilterValue}`}\r\n            selectFunction={this.props.setFilterValue}\r\n            setPrimaryFilterValue={this.props.setPrimaryFilterValue}\r\n          />\r\n      )\r\n    } else if  (this.state.loading) {\r\n      return (\r\n        <Loading show={true}/>\r\n      );\r\n    }\r\n  }\r\n\r\n  render() {\r\n    return (\r\n      <div className=\"col-md\">\r\n        <div className=\"form-group\">\r\n          <label htmlFor=\"exampleFormControlSelect1\">Filter By</label>\r\n          <select\r\n            onChange={(e) => this.onFilterDropdownChange(e)}\r\n            className=\"form-control\"\r\n            id=\"exampleFormControlSelect1\"\r\n          >\r\n            <option value=\"none\">No Filter</option>\r\n            <option value=\"asnnumber\">ASN Number</option>\r\n            <option value=\"orderstatus\">Order Status</option>\r\n            <option value=\"ponumber\">PO Number</option>\r\n          </select>\r\n        </div>\r\n        {this.buildSecondaryFilterDropdown()}\r\n    </div>\r\n    )\r\n  }\r\n}\r\n\r\nexport default PrimaryASNFilterDropdown\r\n","import React, { Component } from 'react'\r\n\r\ninterface Props {\r\n  selectFunction: (option: string) => void\r\n}\r\n\r\nexport class SortingDropdown extends Component<Props> {\r\n  onChange(e: React.FormEvent)  {\r\n    const target = e.target as HTMLSelectElement;\r\n    const value: string = target.value;\r\n    this.props.selectFunction(value);\r\n  }\r\n  render() {\r\n    return (\r\n      <span>\r\n        <label  htmlFor=\"sortbyDropdown\">\r\n          Sort By:\r\n        </label>\r\n        <select  className=\"form-control\" onChange={(e) => this.onChange(e)} id=\"sortByDropdown\">\r\n          <option value=\"default\">ASN ID</option>\r\n          {/* <option value=\"id\">ASN ID</option> */}\r\n          <option value=\"created\">ASN Created Date</option>\r\n          <option value=\"eta\">ASN ETA</option>\r\n        </select>\r\n      </span>\r\n    );\r\n  }\r\n}\r\n\r\nexport default SortingDropdown\r\n","import {format, parse} from 'date-fns'\r\n\r\nexport const dateFormat = 'yyyyMMdd'\r\nexport const dateFormatExport = 'yyyy/MM/dd'\r\n\r\nexport const timeFormat = 'HHmmss'\r\nexport const timeFormatExport = 'hh:mm:ss a'\r\n\r\nexport const parseDateString = (inputString: string): string => {\r\n  return format(\r\n    parse(inputString, dateFormat, new Date()),\r\n    dateFormatExport,\r\n  )\r\n}\r\n\r\nexport const parseTimeString = (inputString: string): string => {\r\n  return format(\r\n    parse(inputString, timeFormat, new Date()),\r\n    timeFormatExport,\r\n  )\r\n}\r\n","import React, { ReactElement } from 'react'\r\nimport Tooltip from 'rc-tooltip'\r\n\r\nimport 'rc-tooltip/assets/bootstrap.css'\r\n\r\ninterface Props {\r\n  placement: string\r\n  title: any\r\n  children: ReactElement\r\n}\r\n\r\nconst ToolTipView = (props: Props) => {\r\n  return (\r\n    <Tooltip\r\n      placement={props.placement}\r\n      trigger={['hover']}\r\n      overlay={<span>{props.title}</span>}>\r\n      {props.children}\r\n    </Tooltip>\r\n  )\r\n}\r\n\r\nexport default ToolTipView\r\n","import React from 'react'\r\nimport AsnDialogContext from './Context'\r\n\r\ninterface Props {\r\n  asn: any\r\n  mode: number\r\n  className: string\r\n}\r\n\r\nconst AsnDialogOpener: React.FunctionComponent<Props> = props => {\r\n  return (\r\n    <AsnDialogContext.Consumer>\r\n      {({open, setASN, setMode}) => {\r\n        const onClick = () => {\r\n          setASN(props.asn)\r\n          setMode(props.mode)\r\n          open()\r\n        }\r\n\r\n        return (\r\n          <button className={props.className} onClick={onClick}>\r\n            {props.children}\r\n          </button>\r\n        )\r\n      }}\r\n    </AsnDialogContext.Consumer>\r\n  )\r\n}\r\n\r\nexport default AsnDialogOpener\r\n","import React, { useState } from 'react'\r\nimport { Link, useHistory } from 'react-router-dom'\r\nimport classNames from 'classnames'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\nimport { parseDateString, parseTimeString } from '../dates'\r\nimport ASN from '../services/ASN'\r\nimport './AsnList.scss'\r\n\r\nimport ToolTipView from '../toolTipView/ToolTipView'\r\nimport AsnDialogOpener from '../asnDialog/AsnDialogOpener'\r\nimport { MODAL_TYPE } from '../asnDialog/Context'\r\nimport { USER_ROLE, CanEdit } from '../signin/RoleContext'\r\n\r\ninterface Props {\r\n  asn: any //TODO: properly define asn\r\n  userRole: USER_ROLE\r\n}\r\n\r\nconst ASNListItemView = (props: Props) => {\r\n  const history = useHistory();\r\n  const [loading, setLoading] = useState(false);\r\n\r\n  let createdTime = props.asn.createdTime\r\n  let po = props.asn.originalOrderNumber.trim()\r\n\r\n  let amendAsn = async () => {\r\n    setLoading(true);\r\n    if (ASN.isDraft(props.asn.orderStatus)) {\r\n      history.push(`/asn/amend/${props.asn.licensedProducer}/${po}/${props.asn.documentNumber}`);\r\n    } else {\r\n      let amendAsn = await ASN.startAmend(props.asn.licensedProducer, po, props.asn.documentNumber);      \r\n      history.push(`/asn/amend/${props.asn.licensedProducer}/${po}/${amendAsn.content.header.documentNumber}`)\r\n    }\r\n  }\r\n\r\n  if (createdTime < 100000) {\r\n    createdTime = '0' + createdTime\r\n  }\r\n  return (\r\n    <>\r\n      <div>{props.asn.documentNumber}</div>\r\n      <div>{props.asn.orderStatus}</div>\r\n      <div>{po}</div>\r\n      <div>{props.asn.asnNumber}</div>\r\n      <div>\r\n        {parseDateString(props.asn.createdDate)}\r\n        <br />\r\n        {parseTimeString(createdTime)}\r\n      </div>\r\n      <div>{parseDateString(props.asn.etaDate)}</div>\r\n      <div>{props.asn.quantity}</div>\r\n      <div className=\"actions\" id={'actions_' + props.asn.documentNumber}>\r\n        <div>\r\n          <ToolTipView placement=\"top\" title=\"View the ASN\">\r\n            <Link\r\n              className=\"btn btn-orange view\"\r\n              to={`/asn/view/${props.asn.licensedProducer}/${po}/${props.asn.documentNumber}`}\r\n            >\r\n              <FontAwesomeIcon icon=\"file-alt\" />\r\n            </Link>\r\n          </ToolTipView>\r\n          {CanEdit(props.userRole) && (\r\n            <ToolTipView\r\n              placement=\"top\"\r\n              title={\r\n                ASN.isDraft(props.asn.orderStatus)\r\n                  ? 'Edit Draft ASN'\r\n                  : 'Amend the ASN'\r\n              }\r\n            >\r\n              {loading ? <button className={classNames({\r\n                  edit: true,\r\n                  btn: true,\r\n                  'btn-orange': true\r\n                })}><FontAwesomeIcon icon=\"spinner\" spin /></button> : <button\r\n                className={classNames({\r\n                  edit: true,\r\n                  btn: true,\r\n                  'btn-orange': true,\r\n                  'd-none': !ASN.canAmend(props.asn.orderStatus),\r\n                })}\r\n                onClick={amendAsn}                \r\n              >\r\n                <FontAwesomeIcon icon=\"edit\" />\r\n              </button>}\r\n            </ToolTipView>\r\n          )}\r\n\r\n          {CanEdit(props.userRole) && (\r\n            <ToolTipView placement=\"top\" title=\"Cancel the ASN\">\r\n              <span>\r\n                {/* wrap in div so that tooltip still works */}\r\n                <AsnDialogOpener\r\n                  asn={props.asn}\r\n                  mode={MODAL_TYPE.CANCEL}\r\n                  className={classNames({\r\n                    cancel: true,\r\n                    btn: true,\r\n                    'btn-orange': true,\r\n                    'd-none': !ASN.canCancel(props.asn.orderStatus),\r\n                  })}\r\n                >\r\n                  <FontAwesomeIcon icon=\"times\" />\r\n                </AsnDialogOpener>\r\n              </span>\r\n            </ToolTipView>\r\n          )}\r\n          {CanEdit(props.userRole) && (\r\n            <ToolTipView placement=\"top\" title=\"Remove the ASN\">\r\n              <span>\r\n                {/* wrap in div so that tooltip still works */}\r\n                <AsnDialogOpener\r\n                  asn={props.asn}\r\n                  mode={MODAL_TYPE.REMOVE}\r\n                  className={classNames({\r\n                    remove: true,\r\n                    btn: true,\r\n                    'btn-orange': true,\r\n                    'd-none': !ASN.canRemove(props.asn.orderStatus),\r\n                  })}\r\n                >\r\n                  <FontAwesomeIcon icon=\"trash-alt\" />\r\n                </AsnDialogOpener>\r\n              </span>\r\n            </ToolTipView>\r\n          )}\r\n        </div>\r\n      </div>\r\n    </>\r\n  )\r\n}\r\n\r\nexport default ASNListItemView","import React from 'react'\r\nimport { FixedSizeList, FixedSizeListProps } from 'react-window'\r\nimport InfiniteLoader from 'react-window-infinite-loader'\r\n\r\nimport Loading from '../loading/Loading'\r\nimport ASNListItemView from './ASNListItemView'\r\nimport { USER_ROLE } from '../signin/RoleContext'\r\n\r\nfunction InfiniteScrollWrapper({\r\n  // Are there more items to load?\r\n  // (This information comes from the most recent API request.)\r\n  hasNextPage,\r\n\r\n  // Are we currently loading a page of items?\r\n  // (This may be an in-flight flag in your Redux store for example.)\r\n  isNextPageLoading,\r\n\r\n  // Array of items loaded so far.\r\n  items,\r\n\r\n  // Callback function responsible for loading the next page of items.\r\n  loadNextPage,\r\n\r\n  userRole\r\n}: {\r\n  hasNextPage: boolean\r\n  isNextPageLoading: boolean\r\n  items: any[]\r\n  loadNextPage: (startIndex: number, stopIndex: number) => Promise<any>\r\n  userRole: USER_ROLE\r\n}) {\r\n  // If there are more items to be loaded then add an extra row to hold a loading indicator.\r\n  const itemCount = hasNextPage ? items.length + 1 : items.length\r\n\r\n  // Only load 1 page of items at a time.\r\n  // Pass an empty callback to InfiniteLoader in case it asks us to load more than once.\r\n  const loadMoreItems = (startIndex: number, stopIndex: number) => {\r\n    if (isNextPageLoading) {\r\n      return null\r\n    }\r\n    return loadNextPage(startIndex, stopIndex)\r\n  }\r\n\r\n  // Every row is loaded except for our loading indicator row.\r\n  const isItemLoaded = (index: number) => !hasNextPage || index < items.length\r\n\r\n  // Render an item or a loading indicator.\r\n  const Item = ({\r\n    index,\r\n    style,\r\n  }: {\r\n    index: number\r\n    style: React.CSSProperties\r\n  }) => {\r\n    let content\r\n    if (!isItemLoaded(index)) {\r\n      return (\r\n        <div style={style}>\r\n          Loading...\r\n          <Loading loading={true} show={true} />\r\n        </div>\r\n      )\r\n    } else {\r\n      content = items[index]\r\n    }\r\n\r\n    return (\r\n      <div className=\"ASNRow\" style={style}>\r\n        <ASNListItemView asn={content} userRole={userRole} />\r\n      </div>\r\n    )\r\n  }\r\n\r\n  return (\r\n    <InfiniteLoader\r\n      isItemLoaded={isItemLoaded}\r\n      itemCount={itemCount}\r\n      loadMoreItems={loadMoreItems}\r\n      threshold={1}\r\n    >\r\n      {({ onItemsRendered, ref, ...props }) => (\r\n        <FixedSizeList\r\n          height={600}\r\n          itemSize={60}\r\n          itemCount={itemCount}\r\n          onItemsRendered={onItemsRendered}\r\n          ref={ref}\r\n          {...props as any}\r\n        >\r\n          {Item}\r\n        </FixedSizeList>\r\n      )}\r\n    </InfiniteLoader>\r\n  )\r\n}\r\n\r\nexport default InfiniteScrollWrapper\r\n","import React, { useState, useEffect, useContext } from 'react'\r\n\r\nimport ASN from '../services/ASN'\r\nimport AsnDialogContext, { MODAL_TYPE } from '../asnDialog/Context'\r\nimport GenericModal from '../modal/Modal'\r\nimport AsnDialog from '../asnDialog/AsnDialog'\r\nimport RoleContext, { CanEdit } from '../signin/RoleContext'\r\nimport LPContext, { DEFAULT_LP } from '../lpLoader/LPContext'\r\nimport SecondaryASNFilterDropdown from '../asnListDropdowns/secondaryASNFilterDropdown'\r\nimport PrimaryASNFilterDropdown from '../asnListDropdowns/primaryASNFilterDropdown'\r\nimport SortingDropdown from '../asnListDropdowns/sortingDropdown'\r\nimport InfiniteScrollWrapper from './InfiniteScrollWrapper'\r\nimport { Link } from 'react-router-dom'\r\nimport { TestScheduler } from 'jest'\r\n\r\nconst ASNList = () => {\r\n  const [isFirstLoad, setIsFirstLoad] = useState(true);\r\n  const [error, setError] = useState(false)\r\n  const [asn_list, setAsn_list] = useState<any[]>([])\r\n  const [offset, setOffset] = useState(0)\r\n  const [loading, setLoading] = useState(false)\r\n  const [hasMore, setHasMore] = useState(true)\r\n  const [showSecondaryFilter, setShowSecondary] = useState(false)\r\n  const [primaryFilterValue, setPrimaryFilterValue] = useState('none')\r\n  const [secondFilterValue, setShowSecondaryValue] = useState('none')\r\n  const [showRemoved, setShowRemoved] = useState(false)\r\n  const [sortValue, setSortValue] = useState('default')\r\n  const [filterValue, setFilterValue] = useState('none')\r\n  const [isFiltering, setIsFiltering] = useState(false)\r\n  const roleContext = useContext(RoleContext)\r\n  const lpContext = useContext(LPContext)\r\n  const [currentLpId, setCurrentLpId] = useState(lpContext.LP.id)\r\n  const [isReversed, setIsReversed] = useState(false)\r\n  // const filterOption\r\n\r\n  // const onFilterDropdownChange = (e: React.FormEvent) => {\r\n  //   const target = e.target as HTMLSelectElement\r\n  //   const value: string = target.value\r\n  //   if (target.value !== 'no filter') {  \r\n  //     setPrimaryFilterValue(value)\r\n  //     setShowSecondary(true)\r\n  //     setShowSecondaryValue(value)  \r\n  //   } else {\r\n  //     setShowSecondary(false)\r\n  //   }\r\n  // }\r\n\r\n  const getASNs = (currOffset: number = offset) => {\r\n    if (lpContext.LP.id !== DEFAULT_LP.id) {      \r\n      return ASN.getList(lpContext.LP.id, currOffset, sortValue, filterValue, primaryFilterValue, isReversed)\r\n    } else {\r\n      return Promise.resolve({ content: { value: [] } });\r\n    }\r\n  }\r\n\r\n  // useEffect(() => {\r\n  //   if (hasMore) {\r\n  //     lazyFetch(0, 0)\r\n  //   }\r\n  // }, [hasMore])\r\n\r\n\r\n  const resetList = (lpChanged: boolean = false) => {\r\n    setOffset(0)\r\n    // setHasMore(true)\r\n    activeFetch(0, 0, lpChanged)\r\n    setLoading(false)\r\n  }\r\n\r\n  const lpLoaderResetList = (lpChanged: boolean = false) => {\r\n    setOffset(0)\r\n    setHasMore(true)\r\n    activeFetch(0, 0, lpChanged)\r\n    setLoading(false)\r\n  }\r\n\r\n  useEffect(() => {        \r\n    if (hasMore && !showRemoved && !isFirstLoad) {      \r\n      lazyFetch(0, 0)\r\n    }\r\n    else if (showRemoved || currentLpId !== lpContext.LP.id || isReversed === true) {      \r\n\r\n      if (currentLpId!== lpContext.LP.id) {        \r\n        setOffset(0)\r\n        setCurrentLpId(lpContext.LP.id)        \r\n      }\r\n      if (showRemoved === true) {        \r\n        resetList(currentLpId !== lpContext.LP.id)\r\n      } else {        \r\n        lpLoaderResetList(currentLpId !== lpContext.LP.id)\r\n      }\r\n\r\n    }\r\n\r\n  }, [lpContext.LP, showRemoved, hasMore, isFiltering])\r\n\r\n\r\n\r\n  const activeFetch = (startIndex: number, stopIndex: number, changedLP: boolean = false) => {    \r\n    setLoading(true)\r\n    setOffset(0)\r\n    return getASNs(0)\r\n      .then((response: any) => {        \r\n        setLoading(false)\r\n        if (response.is_error) {\r\n          setError(true)\r\n        } else {\r\n          setError(false)\r\n\r\n          if (response.content.value.length > 0) {\r\n            let newValues = response.content.value.filter((asn: any) => {\r\n              if (showRemoved || filterValue === \"REMOVED\") {\r\n                return true\r\n              } else {\r\n                if (\r\n                  asn.orderStatus.toLowerCase().trim() !== ASN.Status.removed\r\n                ) {\r\n                  return true\r\n                }\r\n              }\r\n\r\n              return false\r\n            })\r\n\r\n            setOffset(offset + response.content.value.length)\r\n            setAsn_list(newValues)\r\n\r\n          } else if (((filterValue !== \"none\" && primaryFilterValue !== \"none\")\r\n                          || changedLP)\r\n                      && response.content.value.length === 0) {\r\n            setAsn_list([]);\r\n            setHasMore(false);\r\n          } else {\r\n            setHasMore(false)\r\n          }\r\n        }\r\n      })\r\n      .catch((e) => {\r\n        setError(true)\r\n        setLoading(false)\r\n      })\r\n  }\r\n\r\n  const lazyFetch = (startIndex: number, stopIndex: number) => {\r\n\r\n    if (!hasMore) {\r\n      return Promise.resolve();\r\n    }\r\n\r\n    setLoading(true)\r\n    return getASNs()\r\n      .then((response) => {\r\n        setLoading(false)\r\n\r\n        if (response.is_error) {\r\n          setError(true)\r\n        } else {\r\n          setError(false)\r\n\r\n          if (response.content.value.length > 0) {\r\n            let newValues = response.content.value.filter((asn: any) => {\r\n\r\n              if (showRemoved) {\r\n                return true\r\n              } else {\r\n                if (\r\n                  asn.orderStatus.toLowerCase().trim() !== ASN.Status.removed\r\n                ) {\r\n                  return true\r\n                }\r\n              }\r\n\r\n              return false\r\n            })\r\n\r\n            setOffset(offset + response.content.value.length)\r\n            setAsn_list((asn_list) => [...asn_list, ...newValues])\r\n\r\n          } else {\r\n            setHasMore(false)\r\n          }\r\n        }\r\n      })\r\n      .catch((e) => {\r\n        setError(true)\r\n        setLoading(false)\r\n      })\r\n  }\r\n\r\n  const applyFiltersAndSorting = () => {    \r\n    setIsFiltering(true);\r\n    resetList()\r\n  }\r\n\r\n  const clearFiltersAndSorting = () => {\r\n    setIsFiltering(false);\r\n    window.location.reload(true)\r\n    resetList();\r\n\r\n  }\r\n\r\n  const [modalType, setModalType] = useState(MODAL_TYPE.CANCEL)\r\n  const [modalOpen, setModalOpen] = useState(false)\r\n  const [selectedAsn, setSelectedAsn] = useState({})\r\n\r\n  return (\r\n    <AsnDialogContext.Provider\r\n      value={{\r\n        isOpen: modalOpen,\r\n        open: () => {\r\n          setModalOpen(true)\r\n        },\r\n        close: () => {\r\n          setModalOpen(false)\r\n          resetList()\r\n        },\r\n        asn: selectedAsn,\r\n        setASN: setSelectedAsn,\r\n        mode: modalType,\r\n        setMode: setModalType,\r\n      }}\r\n    >\r\n      <div className=\"ASNList\">\r\n        <div className=\"row\">\r\n          <div className=\"col-md\">\r\n            <h1>\r\n              ASN List{' '}\r\n              {lpContext.LP.id !== DEFAULT_LP.id\r\n                ? ` - ${lpContext.LP.id}`\r\n                : ' - All LPs'}\r\n            </h1>\r\n          </div>\r\n        </div>\r\n        <div className=\"row\" style={{ margin: '10px 0' }}>\r\n          <div className=\"col-md\">\r\n            {CanEdit(roleContext.role) && lpContext.LP.id !== DEFAULT_LP.id && (\r\n              <Link to={`/asn/create/${lpContext.LP.id}/`}>\r\n                <button className=\"btn btn-orange\">+ Create ASN</button>\r\n              </Link>\r\n            )}\r\n            {lpContext.LP.id !== DEFAULT_LP.id && (\r\n              <Link to={`/asn/${lpContext.LP.id}/lotCodes`}>\r\n                <button\r\n                  className=\"btn btn-orange\"\r\n                  style={{ marginLeft: '10px' }}\r\n                >\r\n                  + Manage Lot Codes\r\n                </button>\r\n              </Link>\r\n            )}\r\n          </div>\r\n          <div className=\"col-md\">\r\n            <div className=\"float-right\">\r\n              <button className=\"btn btn-orange\" onClick={() => resetList() }>\r\n                Refresh ASN List\r\n              </button>\r\n            </div>\r\n            <div className=\"custom-control custom-checkbox float-right\" style={{ margin: '17px 5px' }}>\r\n              <input\r\n                type=\"checkbox\"\r\n                className=\"custom-control-input\"\r\n                id=\"checkRemoved\"\r\n                checked={showRemoved}\r\n                onChange={() => {\r\n                  if (showRemoved == true) {\r\n                    setAsn_list([])\r\n                    setIsFirstLoad(true)\r\n                    setShowRemoved(false)\r\n                  } else {\r\n                    setShowRemoved(true)\r\n                  }\r\n                  resetList()\r\n                }}\r\n              />\r\n              <label className=\"custom-control-label\" htmlFor=\"checkRemoved\">\r\n                Show Removed\r\n              </label>\r\n            </div>\r\n          </div>\r\n        </div>\r\n       { lpContext.LP.id !== DEFAULT_LP.id && (\r\n\r\n        <div className=\"row\" style={{ margin: '10px 0' }}>\r\n\r\n          <PrimaryASNFilterDropdown\r\n            lpId={lpContext.LP.id}\r\n            setFilterValue={setFilterValue}\r\n            setPrimaryFilterValue={setPrimaryFilterValue}\r\n          />\r\n          <div className=\"col-md\">\r\n            <SortingDropdown selectFunction={setSortValue} />\r\n          </div>\r\n          <div className=\"col-md\">\r\n            <div className=\"custom-control custom-checkbox float-center\" style={{ paddingTop:\"40px\" }}>\r\n              <input\r\n                type=\"checkbox\"\r\n                className=\"custom-control-input\"\r\n                id=\"checkReversed\"\r\n                checked={isReversed}\r\n                onChange={() => {                  \r\n                  setIsReversed(!isReversed)\r\n\r\n                }}\r\n              />\r\n              <label className=\"custom-control-label\" htmlFor=\"checkReversed\">\r\n                Reverse Order\r\n              </label>\r\n              </div>\r\n\r\n          </div>\r\n          <div className=\"col-md\">\r\n            <div style={{\"paddingTop\": \"23px\"}}>\r\n                <button className=\"btn btn-orange\" style={{ \"width\": \"100%\" }} onClick={applyFiltersAndSorting}>Apply</button>\r\n                {!isFiltering ? \"\" : < button className=\"btn btn-orange\" style={{ \"width\": \"100%\" }} onClick={clearFiltersAndSorting}>Reset</button>}\r\n\r\n            </div>\r\n          </div>\r\n\r\n        </div>\r\n       )}\r\n\r\n        <div className=\"ASNHeader\">\r\n          <div>ID</div>\r\n          <div>Status</div>\r\n          <div>PO #</div>\r\n          <div>ASN #</div>\r\n          <div>Created</div>\r\n          <div>ETA</div>\r\n          <div>Total Units</div>\r\n          <div>Actions</div>\r\n        </div>\r\n\r\n        {/*\r\n         * There's a bug with the infinite scroll list where if the initial load is empty, then\r\n           future attempts to load the list do not occur.  This causes the entire component to re-render\r\n           to force the initial request.\r\n         */}\r\n        {(asn_list.length > 0 || hasMore) && (\r\n          <InfiniteScrollWrapper\r\n            userRole={roleContext.role}\r\n            isNextPageLoading={loading}\r\n            items={asn_list}\r\n            hasNextPage={hasMore}\r\n            loadNextPage={lazyFetch}\r\n          />\r\n        )}\r\n      </div>\r\n\r\n      <AsnDialogContext.Consumer>\r\n        {({ mode, asn, isOpen, close }) => {\r\n          return (\r\n            <GenericModal isOpen={isOpen}>\r\n              <AsnDialog mode={mode} asn={asn} close={close} />\r\n            </GenericModal>\r\n          )\r\n        }}\r\n      </AsnDialogContext.Consumer>\r\n    </AsnDialogContext.Provider>\r\n  )\r\n}\r\n\r\nexport default ASNList\r\n","import React from 'react'\r\nimport classNames from 'classnames'\r\n\r\nimport Loading from '../loading/Loading'\r\nimport { NONE_SELECTED } from '../select'\r\n\r\nexport interface SKU {\r\n  sku: string\r\n  description: string\r\n\tthcMin: number,\r\n  thcMax: number,\r\n  thcUnits: string,\r\n  cbMin: number,\r\n  cbMax: number,\r\n  cbUnits: string,\r\n  closingDate: number\r\n}\r\n\r\ninterface Props {\r\n  skus: SKU[]\r\n  disabled: boolean\r\n  loading: boolean\r\n  done: boolean\r\n  errorMsg: string\r\n  selectedSKU: string\r\n  handleSelected: (e: React.ChangeEvent<HTMLSelectElement>) => void\r\n}\r\n\r\nconst SkuLoaderView: React.FunctionComponent<Props> = props => {\r\n  let skuOptions = [\r\n    <option key={NONE_SELECTED} value={NONE_SELECTED}>\r\n      {'Select a SKU ...'}\r\n    </option>,\r\n  ]\r\n\r\n  for (let i = 0; i < props.skus.length; i++) {\r\n    skuOptions.push(\r\n      <option key={i + 1} value={i}>\r\n        {`${props.skus[i].sku} - ${props.skus[i].description}`}\r\n      </option>,\r\n    )\r\n  }\r\n\r\n  let label = props.disabled ? 'SKU ' : 'SKU'\r\n\r\n  return (\r\n    <div className=\"row\">\r\n      <div className=\"col-5\">\r\n        <div className=\"form-group\">\r\n          <label htmlFor=\"SKU\">{label}</label>\r\n\r\n          <select\r\n            required\r\n            name=\"SKU\"\r\n            className={classNames({\r\n              'form-control': true,\r\n              error: props.selectedSKU === '0',\r\n              'd-none': props.loading,\r\n            })}\r\n            disabled={props.disabled || !props.done || props.loading}\r\n            value={props.selectedSKU}\r\n            onChange={props.handleSelected}>\r\n            {skuOptions}\r\n          </select>\r\n          <Loading show={props.loading} />\r\n          {props.errorMsg && (\r\n            <span className=\"text-danger\">{props.errorMsg}</span>\r\n          )}\r\n        </div>\r\n      </div>\r\n      <div className=\"col-7\">{props.children}</div>\r\n    </div>\r\n  )\r\n}\r\n\r\nexport default SkuLoaderView\r\n","export const NONE_SELECTED = '-1'\r\n","import React, { useState, useEffect, useContext } from 'react'\r\n\r\nimport PO from '../services/PO'\r\nimport SkuLoaderView, { SKU } from './skuLoaderView'\r\nimport { NONE_SELECTED } from '../select'\r\nimport LPContext from '../lpLoader/LPContext'\r\n\r\ninterface Props {\r\n  default?: string\r\n  disabled: boolean\r\n  handleSelectedSKU: (sku: SKU) => void\r\n}\r\n\r\nconst SKULoader: React.FunctionComponent<Props> = props => {\r\n  const [loading, setLoading] = useState(false)\r\n  const [done, setDone] = useState(false)\r\n  const [selected, setSelected] = useState(NONE_SELECTED)\r\n  const [errorMsg, setErrorMsg] = useState('')\r\n  const [skus, setSkus] = useState<SKU[]>([])\r\n\r\n  const lpContext = useContext(LPContext)\r\n\r\n  const load = async () => {\r\n    setErrorMsg('')\r\n    setLoading(true)\r\n    setDone(false)\r\n\r\n    const response = await  PO.getSkus(lpContext.LP.id)\r\n\r\n    setLoading(false)\r\n\r\n    if (response.is_error) {\r\n      setErrorMsg(response.error_content)\r\n    }\r\n    else {\r\n      var skus = new Set<SKU>()\r\n      for (var i = 0; i < response.content.value.length; i++) {\r\n          skus.add(response.content.value[i])\r\n      }\r\n\r\n      setSkus(Array.from(skus))\r\n      setDone(true)\r\n    }\r\n  }\r\n\r\n  // fetch on component mount\r\n  const doLoad = () => {\r\n    load()\r\n  }\r\n  useEffect(doLoad, [])\r\n\r\n  const handleSelected = (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n      let index: any = e.target.value\r\n\r\n      if(index !== NONE_SELECTED) {\r\n          setSelected(index)\r\n          props.handleSelectedSKU(skus[index])\r\n      }\r\n  }\r\n\r\n  return (\r\n    <SkuLoaderView\r\n      skus={skus}\r\n      selectedSKU={selected}\r\n      disabled={props.disabled}\r\n      handleSelected={handleSelected}\r\n      loading={loading}\r\n      done={done}\r\n      errorMsg={errorMsg}\r\n      children={props.children}\r\n    />\r\n  )\r\n}\r\n\r\nexport default SKULoader\r\n","import React, {useState} from 'react'\r\nimport classNames from 'classnames'\r\nimport DatePicker from 'react-datepicker'\r\nimport {addDays, format, parse} from 'date-fns'\r\n\r\nimport {dateFormat} from '../dates'\r\nimport Loading from '../loading/Loading'\r\nimport { SKU } from '../skuLoader/skuLoaderView'\r\n\r\ninterface Props {\r\n  mode: number\r\n  lotCode?: any\r\n  requesting: boolean\r\n  completed: boolean\r\n  error: boolean\r\n  errorText: string\r\n  description: string\r\n  sku: SKU\r\n  submit: (\r\n    lotCodeId: string,\r\n    harvestDate: string,\r\n    thc: string,\r\n    thcUnits: string,\r\n    cbd: string,\r\n    cbdUnits: string,\r\n    originalLotCodeId: string | null,\r\n    originalHarvestDate: string | null,\r\n  ) => void\r\n  close: () => void\r\n}\r\n\r\nexport const MODAL_MODE = {\r\n  ADD: 0,\r\n  EDIT: 1,\r\n}\r\n\r\nexport const UNITS = {\r\n  NONE: '0',\r\n  PERCENT: '1',\r\n  ML: '2',\r\n  CAPSULE: '3',\r\n  GRAM: '4',\r\n  MG: '5',\r\n  GRAMSHORT: '6'\r\n}\r\n\r\nexport const UNIT_LABELS = {\r\n  NONE: 'Select Units',\r\n  PERCENT: '%',\r\n  ML: 'mg/ml',\r\n  CAPSULE: 'mg/capsule',\r\n  GRAM: 'mg/gram',\r\n  MG: 'mg',\r\n  GRAMSHORT: 'mg/g',\r\n}\r\n\r\nconst regexTwoDecimalPlaces = /^([0-9]{0,5})(\\.)?([0-9]{0,2})$/\r\n\r\nconst LotCodeModalView = (props: Props) => {\r\n  const getUnits = (units: string) => {\r\n    if (units === null || units === undefined) return UNITS.NONE\r\n\r\n    let unitString = units.trim().toLowerCase()\r\n    if (unitString.trim() === UNIT_LABELS.PERCENT) {\r\n      return UNITS.PERCENT\r\n    } else if (unitString.trim() === UNIT_LABELS.ML) {\r\n      return UNITS.ML\r\n    } else if (unitString.trim() === UNIT_LABELS.CAPSULE) {\r\n      return UNITS.CAPSULE\r\n    } else if (unitString.trim() === UNIT_LABELS.GRAM) {\r\n      return UNITS.GRAM\r\n    } else if (unitString.trim() === UNIT_LABELS.MG) {\r\n      return UNITS.MG\r\n    } else if (unitString.trim() === UNIT_LABELS.GRAMSHORT) {\r\n      return UNITS.GRAMSHORT\r\n    }\r\n\r\n    return UNITS.NONE\r\n  }\r\n\r\n  const getUnitString = (units: string) => {\r\n    if (units === UNITS.NONE) {\r\n      return ''\r\n    } else if (units === UNITS.PERCENT) {\r\n      return UNIT_LABELS.PERCENT\r\n    } else if (units === UNITS.ML) {\r\n      return UNIT_LABELS.ML.toUpperCase()\r\n    } else if (units === UNITS.CAPSULE) {\r\n      return UNIT_LABELS.CAPSULE.toUpperCase()\r\n    } else if (units === UNITS.GRAM) {\r\n      return UNIT_LABELS.GRAM.toUpperCase()\r\n    } else if (units === UNITS.MG) {\r\n      return UNIT_LABELS.MG.toUpperCase()\r\n    } else if (units === UNITS.GRAMSHORT) {\r\n      return UNIT_LABELS.GRAMSHORT.toUpperCase()\r\n    }\r\n\r\n    return ''\r\n  }\r\n\r\n  const getDisplayUnits = (units: string) => {\r\n    if (units === null || units === undefined) return UNITS.NONE\r\n\r\n    let unitString = units.trim().toLowerCase()\r\n    if (unitString.trim() === UNIT_LABELS.PERCENT) {\r\n      return UNIT_LABELS.PERCENT\r\n    } else if (unitString.trim() === UNIT_LABELS.ML) {\r\n      return UNIT_LABELS.ML\r\n    } else if (unitString.trim() === UNIT_LABELS.CAPSULE) {\r\n      return UNIT_LABELS.CAPSULE\r\n    } else if (unitString.trim() === UNIT_LABELS.GRAM) {\r\n      return UNIT_LABELS.GRAM\r\n    } else if (unitString.trim() === UNIT_LABELS.MG) {\r\n      return UNIT_LABELS.MG\r\n    } else if (unitString.trim() === UNIT_LABELS.GRAMSHORT) {\r\n      return UNIT_LABELS.GRAMSHORT\r\n    }\r\n\r\n    return '';\r\n  }\r\n\r\n  let lc: any = {\r\n    lotCodeId: '',\r\n    harvestDate: null,\r\n    thc: '0',\r\n    thcUnits: UNITS.NONE,\r\n    cbd: '0',\r\n    cbdUnits: UNITS.NONE,\r\n  }\r\n\r\n  if (props.lotCode) {\r\n    if (props.lotCode.lotCodeId) {\r\n      lc.lotCodeId = props.lotCode.lotCodeId.trim()\r\n    }\r\n\r\n    if (props.lotCode.harvestDate) {\r\n      lc.harvestDate = parse(props.lotCode.harvestDate, dateFormat, new Date())\r\n    }\r\n\r\n    if (props.lotCode.thc) {\r\n      lc.thc = props.lotCode.thc.toString()\r\n    }\r\n\r\n    if (props.lotCode.cbd) {\r\n      lc.cbd = props.lotCode.cbd.toString()\r\n    }\r\n\r\n    lc.thcUnits = getUnits(props.lotCode.thcUnits)\r\n    lc.cbdUnits = getUnits(props.lotCode.cbdUnits)\r\n  } else {\r\n    lc.thcUnits = getUnits(props.sku.thcUnits)\r\n    lc.cbdUnits = getUnits(props.sku.cbUnits)\r\n  }\r\n\r\n  const [lotCodeId, setLotCodeId] = useState(lc.lotCodeId)\r\n  const [harvestDate, setHarvestDate] = useState(lc.harvestDate)\r\n  const [thc, setThc] = useState(lc.thc)\r\n  const [thcUnits, setThcUnits] = useState(lc.thcUnits)\r\n  const [cbd, setCbd] = useState(lc.cbd)\r\n  const [cbdUnits, setCbdUnits] = useState(lc.cbdUnits)\r\n  const [cbOutOfRange, setCBOutOfRange] = useState(lc.cbd > props.sku.cbMax || lc.cbd < props.sku.cbMin);\r\n  const [thcOutOfRange, setThcOutOfRange] = useState(lc.thc > props.sku.thcMax || lc.thc < props.sku.thcMin);\r\n\r\n   const isFieldValid = (value: string, unit: string): boolean => {\r\n    return (\r\n      unit === UNITS.NONE || value.trim() !== ''\r\n    )\r\n  }\r\n\r\n  const isValid = (): boolean => {\r\n    let lotCodeFilled = lotCodeId.trim().length > 0\r\n\r\n    return (\r\n      lotCodeFilled &&\r\n      harvestDate &&\r\n      isFieldValid(thc, thcUnits) &&\r\n      isFieldValid(cbd, cbdUnits)\r\n    )\r\n  }\r\n\r\n  const isNumeric = (numeric: string): string | null => {\r\n    const parsed = parseFloat(numeric)\r\n    if (isNaN(parsed)) {\r\n      return null\r\n    }\r\n\r\n    if (\r\n      !regexTwoDecimalPlaces.test(numeric) ||\r\n      parsed > 99999.99 ||\r\n      parsed < 0\r\n    ) {\r\n      return null\r\n    }\r\n    return numeric\r\n  }\r\n\r\n  const updateThc = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n    if (isNumeric(e.target.value) === null) {\r\n      if (e.target.value.trim() === '') {\r\n        setThc(e.target.value)\r\n        setThcOutOfRange(+e.target.value > props.sku.thcMax || +e.target.value < props.sku.thcMin);\r\n      }\r\n      return\r\n    }\r\n\r\n    setThc(e.target.value)\r\n    setThcOutOfRange(+e.target.value > props.sku.thcMax || +e.target.value < props.sku.thcMin);\r\n  }\r\n\r\n  const updateCbd = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n    if (isNumeric(e.target.value) === null) {\r\n      if (e.target.value.trim() === '') {\r\n        setCbd(e.target.value)\r\n        setCBOutOfRange(+e.target.value > props.sku.cbMax || +e.target.value < props.sku.cbMin);\r\n      }\r\n      return\r\n    }\r\n    setCbd(e.target.value);\r\n    setCBOutOfRange(+e.target.value > props.sku.cbMax || +e.target.value < props.sku.cbMin);\r\n  }\r\n\r\n  const submit = () => {\r\n    props.submit(\r\n      lotCodeId,\r\n      format(harvestDate, dateFormat),\r\n      thc,\r\n      getUnitString(thcUnits),\r\n      cbd,\r\n      getUnitString(cbdUnits),\r\n      lc.lotCodeId,\r\n      lc.harvestDate ? format(lc.harvestDate, dateFormat) : null,\r\n    )\r\n  }\r\n\r\n  const showError = !props.requesting && props.completed && props.error\r\n  const showSuccess = !props.requesting && props.completed && !props.error\r\n  const disabled = props.requesting || showSuccess\r\n  const areFieldsValid = isValid()\r\n\r\n  return (\r\n    <div className=\"modal-dialog\" role=\"document\">\r\n      <div className=\"modal-content\">\r\n        <div className=\"modal-header\">\r\n          <div>\r\n            <h4 className=\"modal-title\">{'Lot Code for SKU ' + props.sku.sku}</h4>\r\n            <div>\r\n              <strong>{props.description}</strong>\r\n            </div>\r\n          </div>\r\n          <button\r\n            onClick={props.close}\r\n            type=\"button\"\r\n            className={classNames({\r\n              close: true,\r\n              invisible: disabled,\r\n            })}>\r\n            <span aria-hidden=\"true\">&times;</span>\r\n          </button>\r\n        </div>\r\n        <div className=\"modal-body\">\r\n          <Loading loading={props.requesting} />\r\n          <div\r\n            className={classNames({\r\n              invisible: props.requesting,\r\n            })}>\r\n            <div className=\"form-group\">\r\n              <label htmlFor=\"lotCodeId\">Lot Code</label>\r\n              <input\r\n                type=\"text\"\r\n                className=\"form-control\"\r\n                id=\"lotCodeId\"\r\n                name=\"lotCodeId\"\r\n                value={lotCodeId}\r\n                onChange={e => {\r\n                  setLotCodeId(e.target.value)\r\n                }}\r\n                disabled={disabled}\r\n                maxLength={25}\r\n              />\r\n            </div>\r\n            <div className=\"form-group\">\r\n              <label htmlFor=\"harvestDateObj\" style={{ marginRight: 10 }}>Packaged Date</label>\r\n              <DatePicker\r\n                className={classNames({'form-control': true})}\r\n                disabled={disabled}\r\n                name=\"harvestDateObj\"\r\n                id=\"harvestDateObj\"\r\n                selected={harvestDate}\r\n                onChange={date => setHarvestDate(date)}\r\n                dateFormat=\"yyyy/MM/dd\"                \r\n                autoComplete={'off'}\r\n              />\r\n            </div>\r\n            <div className=\"form-row\">\r\n              <div className=\"col-12\">\r\n                <label htmlFor=\"thc\">Total THC</label> <span style={{ fontSize: 14, color: \"gray\", paddingLeft: 15 }}>Range {props.sku.thcMin} {getDisplayUnits(props.sku.thcUnits)} to {props.sku.thcMax} {getDisplayUnits(props.sku.thcUnits)}</span>\r\n              </div>\r\n            </div>\r\n            <div className=\"form-row\">\r\n              <div className=\"col-4\">\r\n                <input\r\n                  className=\"form-control\"\r\n                  id=\"thc\"\r\n                  name=\"thc\"\r\n                  type=\"text\"\r\n                  value={thc}\r\n                  onChange={updateThc}\r\n                  disabled={disabled}\r\n                />\r\n              </div>\r\n              <div className=\"col-1\" style={{ alignSelf: \"flex-start\", paddingBottom: 10, paddingTop: 6} }>\r\n                {getDisplayUnits(props.sku.thcUnits)}\r\n              </div>\r\n              <div className=\"col-7\" style={{ alignSelf: \"flex-end\"}}>\r\n                <span style={{ paddingLeft: 15, color: \"red\", display: thcOutOfRange ? \"block\" : \"none\" }}>This value falls outside the acceptable range causing potential rejection during receiving.<br />\r\n                  Please contact Category Management team at <a href=\"mailto:CategoryManagement@aglc.ca\">CategoryManagement@aglc.ca</a>.</span>\r\n              </div>\r\n            </div>\r\n            <div className=\"form-row\">\r\n              <div className=\"col-12\">\r\n                <label htmlFor=\"cbd\">Total CBD</label> <span style={{ fontSize: 14, color: \"gray\", paddingLeft: 15 }}>Range {props.sku.cbMin} {getDisplayUnits(props.sku.cbUnits)} to {props.sku.cbMax} {getDisplayUnits(props.sku.cbUnits)}</span>\r\n              </div>\r\n            </div>\r\n            <div className=\"form-row\">\r\n              <div className=\"col-4\">\r\n                <input\r\n                  className=\"form-control\"\r\n                  id=\"cbd\"\r\n                  name=\"cbd\"\r\n                  type=\"text\"\r\n                  value={cbd}\r\n                  onChange={updateCbd}\r\n                  disabled={disabled}\r\n                />\r\n              </div>\r\n              <div className=\"col-1\" style={{ alignSelf: \"flex-start\", paddingBottom: 10, paddingTop: 6 }}>\r\n                {getDisplayUnits(props.sku.cbUnits)}\r\n              </div>\r\n              <div className=\"col-7\" style={{ alignSelf: \"flex-end\"}}>\r\n                <span style={{ paddingLeft: 15, color: \"red\", display: cbOutOfRange ? \"block\" : \"none\" }}>This value falls outside the acceptable range causing potential rejection during receiving.<br />\r\n                  Please contact Category Management team at <a href=\"mailto:CategoryManagement@aglc.ca\">CategoryManagement@aglc.ca</a>.</span>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <div className=\"modal-footer\">\r\n          <div\r\n            className={classNames({\r\n              badge: true,\r\n              'badge-success': true,\r\n              invisible: !showSuccess,\r\n            })}>\r\n            Success!\r\n          </div>\r\n          <div\r\n            className={classNames({\r\n              badge: true,\r\n              'badge-danger': true,\r\n              invisible: !showError,\r\n            })}>\r\n            An Error Occurred\r\n          </div>\r\n          <button\r\n            type=\"button\"\r\n            disabled={!areFieldsValid || disabled}\r\n            className=\"btn btn-orange\"\r\n            onClick={submit}>\r\n            {props.mode === MODAL_MODE.ADD && 'Add'}\r\n            {props.mode === MODAL_MODE.EDIT && 'Edit'}\r\n            &nbsp;Lot Code\r\n          </button>\r\n\r\n          <button\r\n            onClick={props.close}\r\n            type=\"button\"\r\n            className=\"btn btn-secondary\"\r\n            disabled={props.requesting}>\r\n            Close\r\n          </button>\r\n\r\n          {!props.requesting && props.error && (\r\n            <div className=\"modal-error\">{props.errorText}</div>\r\n          )}\r\n        </div>\r\n      </div>\r\n    </div>\r\n  )\r\n}\r\n\r\nexport default LotCodeModalView\r\n","import React from 'react'\r\nimport { MODAL_MODE } from './lotCodeModalView'\r\n\r\nconst modal = {\r\n  isOpen: false,\r\n  open: () => {},\r\n  close: () => {},\r\n  lotCode: {},\r\n  setLotCode: (lotCode: any) => {},\r\n  mode: MODAL_MODE.ADD,\r\n  setMode: (mode: number) => {}\r\n}\r\n\r\nconst LotCodeModalContext = React.createContext(modal)\r\nLotCodeModalContext.displayName = 'LotCodeModalContext'\r\n\r\nexport default LotCodeModalContext\r\n","import React from 'react'\r\nimport LotCodeModalContext from './context'\r\n\r\ninterface Props {\r\n  lotCode?: any\r\n  disabled: boolean\r\n  type: number\r\n}\r\n\r\nconst LotCodeModalOpener: React.FunctionComponent<Props> = (props) => {\r\n  return (\r\n    <LotCodeModalContext.Consumer>\r\n      {({open, setLotCode, setMode}) => {\r\n        const onClick = () => {\r\n          setLotCode(props.lotCode)\r\n          setMode(props.type)\r\n          open()\r\n        }\r\n\r\n        return (\r\n          <button disabled={props.disabled} className='btn btn-orange' onClick={onClick}>\r\n            { props.children }\r\n          </button>\r\n        )\r\n      }}\r\n    </LotCodeModalContext.Consumer>\r\n  )\r\n}\r\n\r\nexport default LotCodeModalOpener\r\n","import React from \"react\";\r\n\r\nimport { parseDateString } from \"../dates\";\r\n\r\nimport \"./lotCodeManager.scss\";\r\nimport LotCodeModalOpener from \"./lotCodeModalOpener\";\r\nimport { MODAL_MODE } from \"./lotCodeModalView\";\r\nimport { USER_ROLE, CanEdit } from \"../signin/RoleContext\";\r\n\r\ninterface Props {\r\n  lotCode: any;\r\n  userRole: USER_ROLE;\r\n}\r\n\r\nconst LotCodeListItem = (props: Props) => {\r\n  return (\r\n    <div className=\"table-row\">\r\n      <div>{props.lotCode.sku}</div>\r\n      <div>{props.lotCode.lotCodeId}</div>\r\n      <div>{parseDateString(props.lotCode.harvestDate)}</div>\r\n      <div className=\"value\">\r\n        <span style={{color:props.lotCode.thcOutOfRange ? \"inherit\" : \"red\"} }>{props.lotCode.thc}</span> {props.lotCode.thcUnits}\r\n      </div>\r\n      <div className=\"value\">\r\n        <span style={{ color: props.lotCode.cbdOutOfRange ? \"inherit\" : \"red\" }}>{props.lotCode.cbd}</span> {props.lotCode.cbdUnits}\r\n      </div>\r\n      <div>\r\n        {CanEdit(props.userRole) && (\r\n          <LotCodeModalOpener\r\n            type={MODAL_MODE.EDIT}\r\n            lotCode={props.lotCode}\r\n            disabled={props.lotCode.statusFlag.trim() === \"Y\"}\r\n          >\r\n            Edit\r\n          </LotCodeModalOpener>\r\n        )}\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default LotCodeListItem;\r\n","import React from 'react'\r\nimport Loading from '../loading/Loading'\r\nimport LotCodeListItem from './lotCodeListItem'\r\nimport { USER_ROLE } from '../signin/RoleContext'\r\nimport { SKU } from '../skuLoader/skuLoaderView'\r\n\r\ninterface Props {\r\n  loading: boolean\r\n  done: boolean\r\n  errorMsg: string\r\n  lotCodes: any[]\r\n  userRole: USER_ROLE\r\n  sku: SKU | undefined\r\n}\r\n\r\nconst LotCodeListView = (props: Props) => {\r\n  let lotCodeLineItems: JSX.Element[] = []\r\n  props.lotCodes.forEach((item, index) => {\r\n    lotCodeLineItems.push(\r\n      <LotCodeListItem\r\n        lotCode={item}\r\n        key={index}\r\n        userRole={props.userRole}\r\n      />,\r\n    )\r\n  })\r\n\r\n  return (\r\n    <div>\r\n      <Loading show={props.loading} />\r\n      {props.errorMsg && !props.loading && (\r\n        <div className=\"text-danger\">{`An Error Occurred: ${props.errorMsg}`}</div>\r\n      )}\r\n\r\n      {!props.loading && !props.errorMsg &&\r\n        <>\r\n      <div className=\"table\">\r\n        <div className=\"table-header\" key=\"-1\">\r\n          <div>SKU</div>\r\n          <div>Lot Code</div>\r\n          <div>Packaged Date</div>\r\n          <div>Total THC</div>\r\n          <div>Total CBD</div>\r\n          <div>Actions</div>\r\n        </div>\r\n        {lotCodeLineItems}\r\n        </div>\r\n      </>\r\n      }\r\n    </div>\r\n  )\r\n}\r\n\r\nexport default LotCodeListView\r\n","import React, { useState, useContext }  from 'react'\r\n\r\nimport PO from '../services/PO'\r\nimport { ResponseObj } from '../services/Base'\r\nimport LotCodeModalView, {\r\n  MODAL_MODE,\r\n} from './lotCodeModalView'\r\nimport LPContext from '../lpLoader/LPContext'\r\nimport { SKU } from '../skuLoader/skuLoaderView'\r\n\r\ninterface Props {\r\n  lotCode?: any\r\n  sku: SKU\r\n  mode: number\r\n  description: string\r\n  close: () => void\r\n}\r\n\r\nconst LotCodeModal = (props: Props) => {\r\n  const [requesting, setRequesting] = useState(false)\r\n  const [completed, setCompleted] = useState(false)\r\n  const [error, setError] = useState(false)\r\n  const [errorMsg, setErrorMsg] = useState('')\r\n\r\n  const lpContext = useContext(LPContext)\r\n\r\n  const submitForm = async (\r\n    lotCodeId: string,\r\n    harvestDate: string,\r\n    thc: string,\r\n    thcUnits: string,\r\n    cbd: string,\r\n    cbdUnits: string,\r\n    originalLotCodeId: string | null,\r\n    originalHarvestDate: string | null,\r\n  ) => {\r\n    if (requesting) return\r\n\r\n    setRequesting(true)\r\n    setError(false)\r\n    setErrorMsg('')\r\n\r\n    let lotCode: any = {\r\n      sku: props.sku.sku,\r\n      lotCodeId: lotCodeId,\r\n      harvestDate: harvestDate,\r\n      thc: thc,\r\n      thcUnits: thcUnits,\r\n      cbd: cbd,\r\n      cbdUnits: cbdUnits,\r\n    }\r\n\r\n    let response: ResponseObj | null = null\r\n    if (props.mode === MODAL_MODE.ADD) {\r\n      response = await PO.createLotCode(lpContext.LP.id, lotCode)\r\n    }\r\n    else if (props.mode === MODAL_MODE.EDIT) {\r\n      lotCode.originalHarvestDate = originalHarvestDate\r\n      lotCode.originalLotCodeId = originalLotCodeId\r\n\r\n      response = await PO.editLotCode(lpContext.LP.id, lotCode)\r\n    }\r\n\r\n    setRequesting(false)\r\n    if(response){\r\n      if(response.is_error) {\r\n        setError(true)\r\n        setErrorMsg(response.error_content);\r\n      }\r\n      else {\r\n        setCompleted(true)\r\n      }\r\n    }\r\n  }\r\n\r\n  return (\r\n    <LotCodeModalView\r\n      mode={props.mode}\r\n      lotCode={props.lotCode}\r\n      requesting={requesting}\r\n      completed={completed}\r\n      error={error}\r\n      errorText={errorMsg}\r\n      submit={submitForm}\r\n      description={props.description}\r\n      sku={props.sku}\r\n      close={props.close}\r\n    />\r\n  )\r\n}\r\n\r\nexport default LotCodeModal\r\n","import React, { useState, useEffect, useContext } from 'react'\r\nimport { useParams } from 'react-router-dom'\r\n\r\nimport SKULoader from '../skuLoader/skuLoader'\r\nimport LotCodeListView from './lotCodeListView'\r\nimport { SKU } from '../skuLoader/skuLoaderView'\r\nimport PO from '../services/PO'\r\nimport LotCodeModalContext from './context'\r\nimport GenericModal from '../modal/Modal'\r\nimport LotCodeModal from './lotCodeModal'\r\nimport { MODAL_MODE } from './lotCodeModalView'\r\nimport LotCodeModalOpener from './lotCodeModalOpener'\r\nimport RoleContext, { CanEdit } from '../signin/RoleContext'\r\nimport LPContext, { DEFAULT_LP } from '../lpLoader/LPContext'\r\n\r\nconst LotCodeManager = () => {\r\n  const [loading, setLoading] = useState(false)\r\n  const [done, setDone] = useState(false)\r\n  const [errorMsg, setErrorMsg] = useState('')\r\n  const [lotCodes, setLotCodes] = useState<any[]>([])\r\n  const [selectedSKU, setSelectedSKU] = useState<SKU>()\r\n  const [isModalOpen, setIsModalOpen] = useState(false)\r\n  const [selectedLotCode, setSelectedLotCode] = useState({})\r\n  const [modalType, setModalType] = useState(MODAL_MODE.ADD)\r\n\r\n  const roleContext = useContext(RoleContext)\r\n  const lpContext = useContext(LPContext)\r\n\r\n  let { LPid } = useParams() as any;\r\n\r\n  const doLoadLotCodes = () => {\r\n    loadLotCodes()\r\n  }\r\n\r\n  const loadLotCodes = async () => {\r\n    if(isModalOpen) {\r\n      return\r\n    }\r\n\r\n    if (!LPid) {\r\n      setErrorMsg('Select LP')\r\n      return\r\n    }\r\n\r\n    if (selectedSKU) {\r\n      setLoading(true)\r\n      setDone(false)\r\n      setErrorMsg('')\r\n\r\n      const response = await PO.getLotCodes(LPid, selectedSKU.sku)\r\n\r\n      setLoading(false)\r\n      if (response.is_error) {\r\n        setErrorMsg(response.error_content)\r\n      } else {\r\n        let lineItems = []\r\n        for (let i = 0; i < response.content.value.length; i++) {\r\n          lineItems.push(response.content.value[i])\r\n        }\r\n\r\n        setLotCodes(lineItems)\r\n        setDone(true)\r\n      }\r\n    }\r\n  }\r\n\r\n  const handleSelectedSKU = (sku: SKU) => {\r\n    setSelectedSKU(sku)\r\n  }\r\n\r\n  useEffect(doLoadLotCodes, [selectedSKU, isModalOpen])\r\n\r\n  const openModal = () => {\r\n    setIsModalOpen(true)\r\n  }\r\n\r\n  const closeModal = () => {\r\n    setIsModalOpen(false)\r\n  }\r\n\r\n  return (\r\n    <div>\r\n      <div className=\"row\">\r\n        <div className=\"col-md\">\r\n          <h1>Lot Codes {(lpContext.LP.id !== DEFAULT_LP.id) ? ` - ${lpContext.LP.id}`: ' - All LPs'}</h1>\r\n        </div>\r\n      </div>\r\n\r\n      <LotCodeModalContext.Provider\r\n        value={{\r\n          isOpen: isModalOpen,\r\n          open: openModal,\r\n          close: closeModal,\r\n          lotCode: selectedLotCode,\r\n          setLotCode: setSelectedLotCode,\r\n          mode: modalType,\r\n          setMode: setModalType,\r\n        }}\r\n      >\r\n        <SKULoader disabled={false} handleSelectedSKU={handleSelectedSKU}>\r\n          {CanEdit(roleContext.role) && (\r\n            <div className=\"add\">\r\n              {selectedSKU && (\r\n                <LotCodeModalOpener type={MODAL_MODE.ADD} disabled={false}>\r\n                  + Add Lot Code\r\n                </LotCodeModalOpener>\r\n              )}\r\n            </div>\r\n          )}\r\n        </SKULoader>\r\n\r\n        <LotCodeListView\r\n          loading={loading}\r\n          done={done}\r\n          errorMsg={errorMsg}\r\n          lotCodes={lotCodes}\r\n          userRole={roleContext.role}\r\n          sku={selectedSKU}\r\n        />\r\n\r\n        <LotCodeModalContext.Consumer>\r\n          {({ isOpen, close, lotCode, mode }) => {\r\n            return (\r\n              <GenericModal isOpen={isOpen}>\r\n                {selectedSKU && (\r\n                  <LotCodeModal\r\n                    mode={mode}\r\n                    sku={selectedSKU}\r\n                    description={selectedSKU.description}\r\n                    lotCode={lotCode}\r\n                    close={close}\r\n                  />\r\n                )}\r\n              </GenericModal>\r\n            )\r\n          }}\r\n        </LotCodeModalContext.Consumer>\r\n      </LotCodeModalContext.Provider>\r\n    </div>\r\n  )\r\n}\r\n\r\nexport default LotCodeManager\r\n","// import { DefaultAzureCredential } from \"@azure/identity\";\r\nimport { BlobServiceClient } from \"@azure/storage-blob\";\r\nimport ASN from '../services/ASN'\r\nimport RestUtilities from \"./Base\";\r\n// import AzureStorageBlob from \"@azure/storage-blob\";\r\n\r\nexport default class CoAUploader {\r\n    static async amendAsnDetails(coAFileName: string, currentDate:string, coAFTPFileName:string, lp: string, header: any, asn: any) {\r\n\r\n      const data  = {\r\n        QvUpf: \"Y\",\r\n        QvUpt:currentDate,\r\n        QvCoa: coAFileName,\r\n        QvCat: coAFTPFileName,\r\n        Header: header\r\n      }      \r\n      return ASN.uploadCoAData(lp, asn.lineID, header.costCenter, header.documentNumber, data);\r\n    }\r\n\r\n    static async sendCoA(file: File, harvestDate:string, lotCode: string, sku: any, lp:string, header: any, asn: any, originalFileName?: string) {\r\n      return new Promise(async (resolve, reject) => {\r\n        const currentDate = new Date().toISOString().slice(-24).replace(/\\D/g,'').slice(0, 14);\r\n        const trimmedLP = lp.trim();\r\n        var trimmedLot = lotCode.trim();\r\n        if (trimmedLot.length > 20 ){\r\n          trimmedLot = trimmedLot.substring(0, 19)\r\n        }\r\n        const trimmedSku = sku.trim();\r\n        const asnNumber = `${asn.documentNumber}`.trim();\r\n        const blobName = originalFileName == null ? `${trimmedSku}+${trimmedLot}+${harvestDate}+${currentDate}.pdf` : originalFileName;\r\n  \r\n        var fileByteArray: any  = [];\r\n        var reader = new FileReader();\r\n        reader.onload = \r\n          async (evt: any) => {\r\n            if (evt.target.readyState == FileReader.DONE) {\r\n               var arrayBuffer = evt.target.result,\r\n                   array = new Uint8Array(arrayBuffer);\r\n               for (var i = 0; i < array.length; i++) {\r\n                   fileByteArray.push(array[i]);\r\n                }\r\n\r\n                const uploadResponse = await RestUtilities.post(\"/api/asn/uploadCoA\", {\r\n                  coaFile: fileByteArray,\r\n                  blobFolder: `${trimmedLP}-${asnNumber}`,\r\n                  storageFileName: blobName\r\n                });\r\n          \r\n                if (!uploadResponse.is_error) {\r\n                  const amendResponse = await this.amendAsnDetails(blobName, currentDate, file.name.trim(), lp, header, asn);\r\n                  if (amendResponse.ok) {\r\n                    resolve(amendResponse);\r\n                  } else {\r\n                    resolve(blobName);\r\n                  }        \r\n                } else {\r\n                  resolve(uploadResponse.statusText);\r\n                }\r\n            }\r\n          };\r\n        reader.readAsArrayBuffer(file);        \r\n      });\r\n    }\r\n}\r\n","import React from 'react'\r\n// import { MODAL_MODE } from './CoAModalView'\r\n\r\nconst modal = {\r\n  isOpen: false,\r\n  open: () => {},\r\n  close: () => {},\r\n  lotCode: {},\r\n  // setLotCode: (lotCode: any) => {},\r\n  // mode: MODAL_MODE.ADD,\r\n\r\n}\r\n\r\nconst CoAModalContext = React.createContext(modal)\r\nCoAModalContext.displayName = 'CoAModalContext'\r\n\r\nexport default CoAModalContext\r\n","import React from 'react'\r\nimport classNames from 'classnames';\r\nimport { saveAs } from 'file-saver'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport RestUtilities from '../services/Base';\r\n\r\ninterface Props {\r\n  asn: any;\r\n  coAFileName: string\r\n  close: () => void  \r\n  uploader:  (selectedFiles: FileList|null) => void\r\n  asnStatus: string\r\n  uploading: boolean\r\n  header: any\r\n}\r\n\r\nconst CoAModalView = (props: Props) => {\r\n  const renderUploadButton = () => {\r\n    if(props.header.orderStatus.trim().length === 0 || props.header.orderStatus.trim() === 'DRAFT') {\r\n      return (\r\n        <div style={{textAlign:\"center\"}}>\r\n          <input onChange={(e) =>{ props.uploader(e.target.files)}} type=\"file\" name=\"file2\" id=\"file2\"  accept=\"application/pdf\"/>\r\n          {props.uploading ? <FontAwesomeIcon icon=\"spinner\" spin /> : <label className=\"hiddenInput\" htmlFor=\"file2\">\r\n            <div style={{ padding:\"5px\"}} className=\"btn btn-orange\">\r\n              Upload New CoA\r\n            </div>\r\n          </label>}\r\n        </div>\r\n      )\r\n    }\r\n  }\r\n\r\n  const getCoa = async () => {\r\n    var downloadLink = `/api/asn/${props.asn.licensedProducer}/${props.asn.documentNumber}/${props.asn.lineID}/coa`;\r\n    var response = await RestUtilities.get(downloadLink);    \r\n    saveAs(response.content, props.coAFileName.trim());\r\n  }\r\n\r\n\r\n  return (\r\n    <div className=\"modal-dialog\">\r\n      <div className=\"modal-content\">\r\n        <div className=\"modal-header\">\r\n          <h4 className=\"modal-title\">Uploaded Certificate of Analysis</h4>\r\n\r\n          <button\r\n            onClick={props.close}\r\n            type=\"button\"\r\n            className={classNames({\r\n              close: true\r\n            })}>\r\n            <span aria-hidden=\"true\">&times;</span>\r\n          </button>\r\n\r\n        </div>\r\n        <h5 style={{\"padding\": \"10px 20px\"}}>{`Current File: ${props.coAFileName}`}</h5>\r\n        <div className=\"modal-body\">\r\n          <div style={{textAlign:\"center\", paddingBottom:\"30px\"}}>\r\n              {!props.uploading && <button className=\"btn btn-orange\" onClick={getCoa}>\r\n                Download CoA\r\n             </button>}\r\n            </div>\r\n            {renderUploadButton()}\r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n\r\n}\r\n\r\nexport default CoAModalView;\r\n","import React, { useState, useContext }  from 'react';\r\nimport CoaModalView from './CoAModalView'\r\nimport CoAUploader from '../services/CoAUpload'\r\n\r\ninterface Props {\r\n  coAFileName: string\r\n  close: () => void\r\n  asnStatus: string\r\n  header: any\r\n  asn: any\r\n  lp: string\r\n  harvestDate: string\r\n  lotCode: string\r\n  sku: any\r\n  packagingDate:string,\r\n\r\n}\r\n\r\nconst CoAModal = (props: Props) => {\r\n  const [requesting, setRequesting] = useState(false)\r\n  const [completed, setCompleted] = useState(false)\r\n  const [error, setError] = useState(false)\r\n  const [errorMsg, setErrorMsg] = useState('')\r\n  const [uploading, setUploading] = useState(false);\r\n\r\n  const onCoAUpdate = async (selectedFiles: FileList|null) => {\r\n    if (selectedFiles) {\r\n      setUploading(true);\r\n      const currFile = selectedFiles[0];\r\n      if (currFile !== undefined && currFile.type === 'application/pdf') {\r\n        return CoAUploader.sendCoA(\r\n          currFile,\r\n          props.harvestDate,\r\n          props.lotCode,\r\n          props.sku,\r\n          props.lp,\r\n          props.header,\r\n          props.asn,\r\n          props.coAFileName\r\n        ).then((response) => {\r\n          if (response instanceof Error) {\r\n            throw Error('Issue Uploading CoA')\r\n          }\r\n          props.close();\r\n        }).catch((err) => {\r\n          console.log(err);\r\n        })\r\n        .finally(() => {\r\n          setUploading(true);\r\n        });\r\n      }\r\n    }\r\n  }\r\n\r\n  return (\r\n      <CoaModalView\r\n        asn={props.asn}\r\n        coAFileName={props.coAFileName}\r\n        close={props.close}\r\n        uploader={onCoAUpdate}\r\n        asnStatus={props.asnStatus}\r\n        uploading={uploading}\r\n        header={props.header}\r\n      />\r\n    );\r\n}\r\n\r\nexport default CoAModal;\r\n","import React from 'react'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\n\r\nconst Saving = props => {\r\n  return (\r\n    <div style={{textAlign:\"center\"}}>\r\n\r\n        <div>\r\n            <FontAwesomeIcon icon=\"spinner\" spin />\r\n        </div>\r\n        <div>\r\n            Saving\r\n        </div>\r\n      \r\n    </div>\r\n  )\r\n}\r\n\r\nexport default Saving\r\n","import React, { Component } from 'react'\r\nimport './AsnUploadForm.scss'\r\nimport CoAUploader from '../services/CoAUpload'\r\nimport ToolTipView from '../toolTipView/ToolTipView'\r\nimport CoAModalContext from './context'\r\nimport GenericModal from '../modal/Modal'\r\nimport CoAModal from './CoAModal'\r\nimport Saving from '../loading/Saving'\r\nimport { toHtml } from '@fortawesome/fontawesome-svg-core'\r\ninterface Props {\r\n    // asn: any //TODO: properly define asn\r\n    // uploadFunction: any\r\n    lp: string\r\n    harvestDate: string\r\n    lotCode: string\r\n    sku: any\r\n    packagingDate:string,\r\n    header:any,\r\n    asn:any\r\n    disabled:boolean\r\n    saveAsn(): Promise<any>\r\n    history: any\r\n    coAUploadCallBack: (isCoAUplaoded: boolean, intialLoad: boolean)  => void //if the coA is empyt we have a callback to update the parent component\r\n    preOpen: () => boolean\r\n}\r\ninterface S {\r\n    selectedFile: File | null\r\n    errorExists: boolean\r\n    uploadSuccess:boolean\r\n    uploadName: string\r\n    disabled: boolean;\r\n    isModalOpen: boolean;\r\n    setIsModalOpen: boolean;\r\n    uploading: boolean\r\n\r\n\r\n\r\n}\r\n\r\nexport class CoAUploadButton extends Component<Props, S>{\r\n    constructor(props: any) {\r\n      super(props)\r\n      this.state = {\r\n        selectedFile: null,\r\n        errorExists: false,\r\n        uploadSuccess: false,\r\n        disabled: this.props.disabled !== undefined ? this.props.disabled : true,\r\n        uploadName: this.props.asn.qvCoa !== undefined ? this.props.asn.qvCoa.trim() : '',\r\n        isModalOpen: false,\r\n        setIsModalOpen: false,\r\n        uploading: false\r\n      }\r\n\r\n      this.onFileChange = this.onFileChange.bind(this);\r\n\r\n\r\n      if (this.props.asn.qvUpf === \"Y\" && (this.props.asn.qvCat?.trim() !== \"\" || this.props.asn.qvCoa?.trim() !== \"\")) {\r\n        this.props.coAUploadCallBack(true, true)\r\n      }\r\n  }\r\n\r\n  onFileChange = async (selectedFiles: FileList|null) => {\r\n    if (selectedFiles) {\r\n      return this.props.saveAsn()?.then(response => {\r\n        if (response.error) {\r\n          throw Error('Issue saving ASN before COA Upload');\r\n        }\r\n\r\n        \r\n        this.setState({ \r\n          selectedFile: selectedFiles[0],\r\n          uploading: true\r\n        });\r\n        const currFile = selectedFiles[0];\r\n        if (currFile !== undefined && currFile.type === 'application/pdf') {\r\n\r\n          let header = { ...this.props.header };\r\n          header.documentNumber = response.documentNumber;\r\n          header.costCenter = response.costCenter;\r\n\r\n          let asn = { ...this.props.asn };\r\n          asn.documentNumber = response.documentNumber;\r\n          asn.costCenter = response.costCenter;\r\n\r\n          let resultAsn  = response?.details?.find((detail: any) => detail.assigned == this.props.asn.assigned);\r\n          if (resultAsn == null) {\r\n            throw 'Error finding details line';\r\n          }\r\n\r\n          asn.lineID = resultAsn.lineID;\r\n\r\n          return CoAUploader.sendCoA(\r\n            currFile,\r\n            this.props.harvestDate,\r\n            this.props.lotCode,\r\n            this.props.sku,\r\n            this.props.lp,\r\n            header,\r\n            asn\r\n\r\n          ).then((response) => {\r\n            if (response instanceof Error) {\r\n              throw Error('Issue Uploading CoA')\r\n            } else {\r\n              this.setState({\r\n                uploadSuccess: true,\r\n                uploadName: (response as string).trim(),\r\n                uploading: false\r\n              });\r\n              return this.callBackUpdate(true)\r\n            }\r\n          }).catch((err) => {            \r\n            console.log(err);\r\n\r\n\r\n            this.setState({\r\n              uploading: false,\r\n              errorExists: true\r\n            });\r\n            return this.callBackUpdate(false)\r\n          }).finally(() => {\r\n              let lpString = this.props.lp.toString().trim();\r\n              let ordNumString = this.props.header.originalOrderNumber.toString().trim();\r\n              let docNumString = response.documentNumber.toString().trim();\r\n\r\n              this.props.history.push(`/asn/amend/${lpString}/${ordNumString}/${docNumString}`)\r\n\r\n              if (this.state.isModalOpen) {\r\n                  this.closeModal();\r\n              }\r\n          });\r\n        } else {\r\n          this.setState({\r\n            uploading: false,\r\n            errorExists: true\r\n          })\r\n          return this.callBackUpdate(false)\r\n        }\r\n      });\r\n    }\r\n  }\r\n\r\n  callBackUpdate(setting: boolean) {\r\n    if (!(this.props.asn.qvUpf === \"Y\" && (this.props.asn.qvCat?.trim() !== \"\" || this.props.asn.qvCoa?.trim() !== \"\"))) {\r\n      this.props.coAUploadCallBack(setting, false)\r\n    }\r\n  }\r\n\r\n\r\n\r\n  fileData = () => {\r\n    if (this?.state?.selectedFile) {\r\n      return (\r\n        <div>\r\n          <p>File Name: {this.state.selectedFile.name}</p>\r\n        </div>\r\n      );\r\n    }\r\n  };\r\n\r\n  buttonStyle = () => {\r\n    const defaultStyle = \"file btn btn-secondary\";\r\n    return this.state.errorExists === true\r\n      ? defaultStyle + ' ' + 'redBorder'\r\n      : this.props.asn.qvUpf === \"Y\" || this.state.uploadSuccess === true\r\n        ? defaultStyle + ' ' + 'greenBorder'\r\n        : defaultStyle;\r\n  };\r\n\r\n  isbuttonDisabled = () => {\r\n    if (this.state.uploadSuccess !== undefined){\r\n      return this.state.uploadSuccess;\r\n    } else {\r\n      return false;\r\n    }\r\n  }\r\n  \r\n  create_UUID = () => {\r\n    var dt = new Date().getTime();\r\n    var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\r\n        var r = (dt + Math.random()*16)%16 | 0;\r\n        dt = Math.floor(dt/16);\r\n        return (c=='x' ? r :(r&0x3|0x8)).toString(16);\r\n    });\r\n    return uuid;\r\n  }\r\n\r\n  coaUploadButton = () => {\r\n    const inputId = \"coaUpload\" + this.props.sku + this.create_UUID();\r\n    return (\r\n\r\n      <div style={{textAlign:\"center\"}}>\r\n        <input onClick={(e) => this.btnClick(e)} onChange={(e) => this.onFileChange(e.target.files)} type=\"file\" name=\"file\" id={inputId}  accept=\"application/pdf\"/>\r\n      <label className=\"hiddenInput\" htmlFor={inputId}>\r\n        <div style={{ padding:\"5px\"}} className={this.buttonStyle()}>\r\n          CoA\r\n        </div>\r\n      </label>\r\n    </div>\r\n    );\r\n  }\r\n  btnClick = (e:React.MouseEvent<HTMLInputElement, MouseEvent>) => {\r\n    if (e.isTrusted) {\r\n      if (!this.props.preOpen()) {\r\n        e.preventDefault()\r\n      }\r\n    }\r\n  }\r\n  openModal = () => {\r\n      // setIsModalOpen(true)\r\n      if (!this.props.preOpen()) {\r\n        return;\r\n      }\r\n      this.setState({\r\n        isModalOpen: true\r\n      });\r\n    }\r\n\r\n  closeModal = () => {\r\n      // setIsModalOpen(false)\r\n      this.setState({\r\n        isModalOpen: false\r\n      });\r\n    }\r\n\r\n  coAModalOpenerWithFileName = () => {\r\n    return (\r\n      <CoAModalContext.Provider\r\n        value={{\r\n          isOpen: this.state.isModalOpen,\r\n          open: this.openModal,\r\n          close: this.closeModal,\r\n          lotCode: {},\r\n\r\n        }}\r\n      >\r\n      <CoAModalContext.Consumer>\r\n        {({open}) => {\r\n          const openAction = () => {              \r\n            open();\r\n          }\r\n\r\n          const inputId = \"modalDeploy\" + this.props.sku + this.props.asn.lineID + this.create_UUID();;\r\n\r\n          return (\r\n            <ToolTipView placement=\"top\" title={`Uploaded: ${this.state.uploadName}`}>\r\n              <div style={{textAlign:\"center\"}}>\r\n              <input onClick={openAction}  style={{\"display\":\"none\"}} id={inputId}  accept=\"application/pdf\"/>\r\n                <label className=\"hiddenInput\" htmlFor={inputId}>\r\n                <div style={{ padding:\"5px\"}} className={this.buttonStyle()}>\r\n                    CoA\r\n                </div>\r\n              </label>\r\n              </div>\r\n\r\n            </ToolTipView>\r\n          )\r\n        }}\r\n      </CoAModalContext.Consumer>\r\n      <CoAModalContext.Consumer>\r\n        {({ isOpen }) => {\r\n          return (\r\n            <GenericModal isOpen={isOpen}>\r\n              {(\r\n                <CoAModal\r\n                  close= {this.closeModal}\r\n                  coAFileName={`${this.state.uploadName}`}\r\n                  asnStatus={this.props.asn.lineStatus}\r\n                  header={this.props.header}\r\n                  asn={this.props.asn}\r\n                  lp={this.props.lp}\r\n                  harvestDate={this.props.harvestDate}\r\n                  lotCode={this.props.lotCode}\r\n                  sku={this.props.sku}\r\n                  packagingDate={this.props.packagingDate}\r\n                  key={`${this.state.uploadName}`}\r\n                />\r\n              )}\r\n            </GenericModal>\r\n          )\r\n        }}\r\n      </CoAModalContext.Consumer>\r\n    </CoAModalContext.Provider>\r\n\r\n    );\r\n  }\r\n\r\n  render() {\r\n    return(\r\n      <div style={{\"border\":\"none!important\", \"outline\":\"none!important\", \"boxShadow\": \"none!important\"}}>\r\n\r\n        {this.state.uploading === true\r\n        ? <Saving/>\r\n        : (this.props.asn.qvUpf === \"Y\" && (this.props.asn.qvCat?.trim() !== \"\" || this.props.asn.qvCoa?.trim() !== \"\")\r\n        || (this.state.uploadName.trim() !== null && this.state.uploadName.trim() !== ''))\r\n          ? this.coAModalOpenerWithFileName()\r\n          : this.coaUploadButton()\r\n        }\r\n      </div>\r\n    )\r\n  }\r\n}\r\n\r\nexport default CoAUploadButton;\r\n","import React, { Component } from \"react\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport CoAUploadButton from \"../asnCoAUpload/CoAUploadButton\";\r\nimport ToolTip from \"rc-tooltip\";\r\n\r\nexport const LOT_CODE_UNSELECTED = \"\";\r\n/**\r\n * Represents a single line item from an ASN.\r\n */\r\nexport class ASNDetail extends Component {\r\n    \r\n    constructor(props) {\r\n        super(props);\r\n\r\n        this.handleChange = this.handleChange.bind(this);\r\n        this.numberCasesChanged = this.numberCasesChanged.bind(this);\r\n        this.lotCodeChanged = this.lotCodeChanged.bind(this);\r\n\r\n        this.addLotCode = this.addLotCode.bind(this);\r\n        this.removeLotCode = this.removeLotCode.bind(this);\r\n\r\n        this.isNullOrWhitespace = this.isNullOrWhitespace.bind(this);\r\n        this.isPartiallyFilled = this.isPartiallyFilled.bind(this);\r\n        this.isInValidQuantity = this.isInValidQuantity.bind(this);\r\n        this.increment = this.increment.bind(this);\r\n        this.decrement = this.decrement.bind(this);\r\n        this.notDivisible = this.notDivisible.bind(this);\r\n        // this.requiresCoA =  this.requiresCoA.bind(this);\r\n        this.onCoAChange = this.onCoAChange.bind(this);\r\n\r\n\r\n        this.state ={\r\n\r\n        }\r\n    }\r\n    notDivisible(value) {\r\n        return !(value % this.props.po.eachesPerCase === 0);\r\n    }\r\n\r\n    handleChange(name, value) {\r\n        this.props.onChange(this.props.po, this.props.index, name, value, ); // propogate change up to parent\r\n    }\r\n\r\n    lotCodeChanged(event) {\r\n        this.props.po.lotCodes.forEach((lotCode) => {\r\n            if (lotCode.id === event.target.value) {\r\n                this.handleChange(\"harvestDate\", lotCode.harvestDate);\r\n                this.handleChange(\"lotCode\", lotCode.lotCodeId.trim());\r\n            }\r\n        });\r\n    }\r\n\r\n    increment(value) {\r\n        let valueAsNumber = parseInt(value, 10);\r\n        if (isNaN(valueAsNumber)) {\r\n            valueAsNumber = 0;\r\n        }\r\n\r\n        valueAsNumber += this.props.po.eachesPerCase;\r\n        if (valueAsNumber % this.props.po.eachesPerCase != 0) {\r\n            valueAsNumber -= valueAsNumber % this.props.po.eachesPerCase;\r\n        }\r\n        this.handleChange(\"openQuantity\", valueAsNumber);\r\n    }\r\n    decrement(value) {\r\n        let valueAsNumber = parseInt(value, 10);\r\n        if (isNaN(valueAsNumber)) {\r\n            valueAsNumber = 0;\r\n        }\r\n\r\n        valueAsNumber -= this.props.po.eachesPerCase;\r\n        if (valueAsNumber % this.props.po.eachesPerCase != 0) {\r\n            valueAsNumber -= valueAsNumber % this.props.po.eachesPerCase;\r\n        }\r\n\r\n        if (valueAsNumber < 0) {\r\n            valueAsNumber = 0;\r\n        }\r\n        this.handleChange(\"openQuantity\", valueAsNumber);\r\n    }\r\n    numberCasesChanged(event) {\r\n        this.handleChange(event.target.name, event.target.value);\r\n    }\r\n    addLotCode() {\r\n        this.props.addLotCode(this.props.po.sku);\r\n    }\r\n    removeLotCode() {\r\n        this.props.removeLotCode(this.props.po.sku, this.props.index);\r\n    }\r\n    isNullOrWhitespace(input) {\r\n        if (typeof input == \"string\") return !input || !input.trim();\r\n        else if (typeof input == \"object\") return input == null;\r\n        return false;\r\n    }\r\n    isInValidQuantity(input) {\r\n        if (typeof input == \"number\") return false;\r\n        if (typeof input == \"string\") {\r\n            let parsed = parseInt(input, 10);\r\n            if (isNaN(parsed)) {\r\n                return true;\r\n            }\r\n            return false;\r\n        }\r\n    }\r\n    isPartiallyFilled(values) {\r\n        let countFilledFields = 0;\r\n        if (this.isNullOrWhitespace(values.lotCode)) countFilledFields++;\r\n\r\n        if (this.isInValidQuantity(values.openQuantity)) countFilledFields++;\r\n\r\n        return countFilledFields > 0 && countFilledFields < 2;\r\n    }\r\n    onCoAChange(hasCoAValue, intialCoALoad) {       \r\n        if (!intialCoALoad) {\r\n            this.handleChange(\"hasCoA\", hasCoAValue)\r\n            this.props.onCoAUpdate(hasCoAValue)\r\n        }        \r\n    }\r\n\r\n    generateLotCodeId(lotCode, harvestDate) {\r\n        return `${lotCode.trim()}_${harvestDate}`;\r\n    }\r\n    render() {\r\n        // merge po and asn data\r\n        let values = {\r\n            harvestDate: \"\",\r\n            lotCode: \"\",\r\n            openQuantity: \"\",\r\n            sku: this.props.po.sku,\r\n            description: this.props.po.description,\r\n        };\r\n        values = Object.assign(values, this.props.asn);\r\n\r\n        let button =\r\n            this.props.index === 0 ? (\r\n                <ToolTip placement=\"top\" overlay={<span>Add LOT# to SKU</span>}>\r\n                <button\r\n                    className=\"btn btn-secondary\"\r\n                    type=\"button\"\r\n                    onClick={this.addLotCode}\r\n                >\r\n                    +Lot#\r\n                    </button>\r\n                </ToolTip>\r\n            ) : (\r\n                <button\r\n                    className=\"btn btn-secondary\"\r\n                    type=\"button\"\r\n                    onClick={this.removeLotCode}\r\n                >\r\n                    <FontAwesomeIcon icon=\"trash-alt\" />\r\n                </button>\r\n            );\r\n\r\n        const coAUploadButton = () => {\r\n            if  (values.harvestDate !== '')  {\r\n                return (\r\n                    <td>\r\n                        <CoAUploadButton \r\n                            harvestDate={values.harvestDate}\r\n                            lotCode={values.lotCode}\r\n                            sku={values.sku}\r\n                            lp={this.props.lp}\r\n                            header={this.props.header}\r\n                            asn={this.props.asn}\r\n                            saveAsn={this.props.saveAsn}\r\n                            history={this.props.history}\r\n                            coAUploadCallBack={this.onCoAChange}\r\n                            preOpen={this.props.preOpen}\r\n                        />\r\n                    </td>\r\n                )\r\n            }\r\n        }\r\n\r\n\r\n\r\n        // hide 'barcoded' fields\r\n        let barcoded = this.props.po.referenceField.trim() === \"BF\";\r\n        if (this.props.asn.lotCode) barcoded = false; // show rows that may have been added before the SKU was barcoded to allow for removal\r\n\r\n        // hide detail line item if there's no line ID, when in read-only mode, and non-draft mode\r\n        let hide = (!values.lineID && this.props.readOnly) || barcoded;\r\n\r\n        // disable all fields while submitting\r\n        let readOnly = this.props.readOnly || this.props.submitting;\r\n\r\n        let lotCodes = [\r\n            <option key={LOT_CODE_UNSELECTED} value={LOT_CODE_UNSELECTED}>\r\n                Select a Lot Number\r\n            </option>,\r\n        ];\r\n        if (this.props.po.lotCodes.length === 0) {\r\n            lotCodes = [\r\n                <option\r\n                    key={LOT_CODE_UNSELECTED}\r\n                    value={LOT_CODE_UNSELECTED}\r\n                    disabled\r\n                >\r\n                    No Lot Numbers Available\r\n                </option>,\r\n            ];\r\n        } else {\r\n            let oldLotCode = true;\r\n            let asnLotCode = this.props.asn.lotCode\r\n                ? this.generateLotCodeId(\r\n                      this.props.asn.lotCode,\r\n                      this.props.asn.harvestDate\r\n                  )\r\n                : \"\";\r\n            this.props.po.lotCodes.forEach((lotCode) => {\r\n                lotCodes.push(\r\n                    <option key={lotCode.id} value={lotCode.id}>\r\n                        {lotCode.description}\r\n                    </option>\r\n                );\r\n\r\n                if (asnLotCode == lotCode.id) {\r\n                    oldLotCode = false;\r\n                }\r\n            });\r\n\r\n            // for lot codes that were entered prior to the 'Add Lot Code' feature\r\n            if (asnLotCode && oldLotCode) {\r\n                lotCodes.push(\r\n                    <option key={asnLotCode} value={asnLotCode}>\r\n                        {asnLotCode + \" (Not found in F62ASNL)\"}\r\n                    </option>\r\n                );\r\n            }\r\n        }\r\n\r\n        return (\r\n            <tr\r\n                className={this.props.index === 0 ? \"\" : \"child\"}\r\n                style={{\r\n                    display: hide ? \"none\" : \"table-row\",\r\n                }}\r\n            >\r\n                <td>{this.props.index === 0 ? this.props.po.sku : \"\"}</td>\r\n                <td>\r\n                    <select\r\n                        value={\r\n                            values.lotCode.trim()\r\n                                ? this.generateLotCodeId(\r\n                                      values.lotCode,\r\n                                      values.harvestDate\r\n                                  )\r\n                                : LOT_CODE_UNSELECTED\r\n                        }\r\n                        name=\"lotCode\"\r\n                        className={\r\n                            this.isNullOrWhitespace(values.lotCode) &&\r\n                            this.isPartiallyFilled(values)\r\n                                ? \"form-control error\"\r\n                                : \"form-control\"\r\n                        }\r\n                        onChange={this.lotCodeChanged}\r\n                        disabled={readOnly}\r\n                        required\r\n                    >\r\n                        {lotCodes}\r\n                    </select>\r\n                </td>\r\n                <td>{this.props.po.eachesPerCase}</td>\r\n                <td>\r\n                    <input\r\n                        type=\"search\"\r\n                        value={values.openQuantity}\r\n                        name=\"openQuantity\"\r\n                        className={\r\n                            (this.isInValidQuantity(values.openQuantity) &&\r\n                                this.isPartiallyFilled(values)) ||\r\n                            this.props.exceedsQuantity()\r\n                                ? \"form-control error\"\r\n                                : \"form-control\"\r\n                        }\r\n                        onChange={this.numberCasesChanged}\r\n                        disabled={readOnly}\r\n                        min=\"0\"\r\n                        required\r\n                    />\r\n                    {/*<div>\r\n                        <button className={'btn btn-orange' + (readOnly? ' d-none' : '')} disabled={readOnly} type=\"button\" onClick={(event) => this.increment(values.openQuantity)}><i className=\"fas fa-plus\"></i></button>\r\n                        <span style={{ margin: '5px' }}>{values.openQuantity}</span>\r\n                        <button className={'btn btn-orange' + (readOnly? ' d-none' : '')} disabled={readOnly} type=\"button\" onClick={(event) => this.decrement(values.openQuantity)}><i className=\"fas fa-minus\"></i></button>\r\n                    </div>*/}\r\n                    <div\r\n                        style={{\r\n                            color: \"red\",\r\n                            display: this.props.exceedsQuantity()\r\n                                ? \"block\"\r\n                                : \"none\",\r\n                        }}\r\n                    >\r\n                        This Quantity exceeds the amount available on order.\r\n                    </div>\r\n                    <div\r\n                        style={{\r\n                            color: \"red\",\r\n                            display: this.notDivisible(values.openQuantity)\r\n                                ? \"block\"\r\n                                : \"none\",\r\n                        }}\r\n                    >\r\n                        This Quantity should be a multiple of{\" \"}\r\n                        {this.props.po.eachesPerCase}.\r\n                    </div>\r\n                </td>\r\n                <td>{this.props.po.quantityOnOrder}</td>\r\n                {coAUploadButton()}\r\n                <td className={readOnly ? \"d-none\" : \"\"}>{button}</td>\r\n            </tr>\r\n        );\r\n    }\r\n}\r\n","import React, { Component } from 'react';\r\n\r\nimport { ASNDetail } from './ASNDetail';\r\n\r\nconst numericRegex =  /^[0-9]*$/;\r\n\r\n/**\r\n * Represents a group of line items which share the same SKU, but differing lot codes.\r\n */\r\nexport class ASNDetailGroup extends Component {\r\n    constructor(props) {\r\n        super(props)\r\n        const coASet = {};\r\n\r\n        this.exceedsQuantity = this.exceedsQuantity.bind(this)\r\n        // this.hasCoASet =  this.hasCoASet.bind(this);\r\n    }\r\n    /**\r\n     * Validate that the quantities of all asn line items for the same sku do not exceed the total\r\n     * defined in the PO.\r\n     *\r\n     * Optionally pass in a new quantity value at the index of the asnDetailLineItemList to test\r\n     * if the new value exceeds quantity limit.\r\n     *\r\n     * @param {*} poLineItem The SKU Line Item defined in the PO\r\n     * @param {*} asnDetailItemsList The ASNDetail line items to verify, all under the same SKU\r\n     * @param {*} index (optional) The index in the asnDetailItemList to replace the quantity\r\n     * @param {*} value (optional) The value\r\n     */\r\n    static isSkuQuantityValid(poLineItem, asnDetailItemsList, index=-1, value=0, checkForMultiple=false) {\r\n        let skuQuantity = 0;\r\n        let additionalQuantity = 0;\r\n        let maximumQuantity = poLineItem.quantityOnOrder;\r\n        for(let i = 0; i < asnDetailItemsList.length; i++) {\r\n            if(asnDetailItemsList[i].maximumQuantity != undefined) {\r\n                maximumQuantity = asnDetailItemsList[i].maximumQuantity;\r\n            }\r\n\r\n            if(asnDetailItemsList[i].confirmedQuantity != undefined) {\r\n                additionalQuantity += asnDetailItemsList[i].confirmedQuantity;\r\n            }\r\n\r\n            if(i != index) {\r\n                let q = parseInt(asnDetailItemsList[i].openQuantity);\r\n                if(q)\r\n                    skuQuantity += q;\r\n            }\r\n        }\r\n\r\n        if(!numericRegex.test(value)) {\r\n            return false;\r\n        }\r\n\r\n        skuQuantity += parseInt(value, 10);\r\n        if(skuQuantity > (maximumQuantity + additionalQuantity)) {\r\n            return false\r\n        }\r\n\r\n        // check for proper multiple\r\n        if(checkForMultiple && skuQuantity % poLineItem.eachesPerCase != 0) {          \r\n            return false\r\n        }\r\n\r\n        return true\r\n    }\r\n    exceedsQuantity() {\r\n        if(this.props.readOnly) {\r\n            return false;\r\n        }\r\n        return !ASNDetailGroup.isSkuQuantityValid(this.props.po, this.props.asn);\r\n    }\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n    render () {\r\n        const coATracker = {};\r\n        let asnDetailItems = [];\r\n        this.props.asn.forEach((asnDetail, index) => {\r\n            asnDetailItems.push(\r\n                <ASNDetail\r\n                    key={index}\r\n                    po={this.props.po}\r\n                    asn={asnDetail}\r\n                    header={this.props.header}\r\n                    onChange={this.props.onChange}\r\n                    readOnly={this.props.readOnly}\r\n                    submitting={this.props.submitting}\r\n                    addLotCode={this.props.addLotCode}\r\n                    removeLotCode={this.props.removeLotCode}\r\n                    index={index}\r\n                    lp={this.props.lp}\r\n                    exceedsQuantity={this.exceedsQuantity}\r\n                    saveAsn={this.props.saveAsn}\r\n                    history={this.props.history}\r\n                    onCoAUpdate={this.props.onCoAUpdate}\r\n                    preOpen={this.props.preOpen}\r\n                />\r\n            );\r\n        });\r\n        return (\r\n            <tbody>\r\n                { asnDetailItems }\r\n            </tbody>\r\n        );\r\n    }\r\n}\r\n","import React, { ChangeEvent } from 'react'\r\nimport classNames from 'classnames'\r\n\r\nimport Loading from '../loading/Loading'\r\nimport { NONE_SELECTED } from '../select'\r\nimport { POId } from './poLoader'\r\n\r\ninterface Props {\r\n  poIDs: POId[]\r\n  selectedPO: string\r\n  default?: string\r\n  disabled: boolean\r\n  loading: boolean\r\n  done: boolean\r\n  errorMsg: string\r\n  handleSelected: (e: React.ChangeEvent<HTMLSelectElement>) => void\r\n}\r\n\r\nconst POLoaderView = (props: Props) => {\r\n  const [selectedPo, setSeletedPo] = React.useState<POId | undefined>(undefined);\r\n\r\n  let poSelectorOptions = [\r\n    <option key={NONE_SELECTED} value={NONE_SELECTED} style={{color:\"black\"}}>\r\n      {'Select PO# ...'}\r\n    </option>,\r\n  ]\r\n\r\n  for (let i = 0; i < props.poIDs.length; i++) {\r\n    poSelectorOptions.push(\r\n      <option key={i + 1} value={props.poIDs[i].value} style={{ color: props.poIDs[i].days <= 7 ? \"red\" : props.poIDs[i].days <= 21 ? \"#eed202\" : \"black\" }}>\r\n        {props.poIDs[i].text}\r\n      </option>,\r\n    )\r\n  }\r\n\r\n  if (props.default) {\r\n    poSelectorOptions.push(\r\n      <option value={props.default} key={props.default}>\r\n        {props.default}\r\n      </option>,\r\n    )\r\n  }\r\n\r\n  let poSelectLabel = props.disabled ? 'PO# ' : 'PO#'\r\n  let disabled =\r\n    props.disabled || !props.done || props.loading || !!props.default\r\n\r\n  const selectPo = (e:ChangeEvent<HTMLSelectElement>) => {\r\n    const poId = props.poIDs.find(x => x.value == e.target.value);\r\n    setSeletedPo(poId);\r\n    props.handleSelected(e);\r\n  }\r\n\r\n  return (\r\n    <div className=\"row\">\r\n      <div className=\"col-5\">\r\n        <div className=\"form-group\">\r\n          <label htmlFor=\"PO\">{poSelectLabel}</label>\r\n          <select\r\n            required\r\n            name=\"PO\"\r\n            className={classNames({\r\n              'form-control': true,\r\n              error: props.selectedPO === '0' && !props.default,\r\n              'd-none': props.loading,\r\n            })}\r\n            disabled={disabled}\r\n            value={props.selectedPO}\r\n            onChange={selectPo}\r\n            style={{ color: !selectedPo ? \"black\": selectedPo.days <= 7 ? 'red' : selectedPo.days <= 21 ? '#eed202' : 'black', paddingLeft: 15 }}>\r\n            {poSelectorOptions}\r\n          </select>\r\n          <Loading show={props.loading} />\r\n          {props.errorMsg && (\r\n            <span className=\"text-danger\">{props.errorMsg}</span>\r\n          )}\r\n        </div>\r\n      </div>\r\n    </div>\r\n  )\r\n}\r\n\r\nexport default POLoaderView\r\n","import React, { useState, useEffect, useContext } from 'react'\r\n\r\nimport PO from '../services/PO'\r\nimport POLoaderView from './poLoaderView'\r\nimport { NONE_SELECTED } from '../select'\r\nimport LPContext from '../lpLoader/LPContext'\r\n\r\nexport interface POId {\r\n  text: string\r\n  value: string\r\n  days: number\r\n  closingDate: number\r\n}\r\n\r\ninterface Props {\r\n  default?: string\r\n  disabled: boolean\r\n  handleSelectedPO: (po: string, closingDate:Date) => void\r\n}\r\n\r\nconst POLoader = (props: Props) => {\r\n  const [loading, setLoading] = useState(false)\r\n  const [done, setDone] = useState(false)\r\n  const [selected, setSelected] = useState(NONE_SELECTED)\r\n  const [errorMsg, setErrorMsg] = useState('')\r\n  const [poIDs, setPOIDs] = useState<POId[]>([])\r\n\r\n  const lpContext = useContext(LPContext)\r\n\r\n  const handleSelected = (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n    let POid = e.target.value\r\n    if (POid !== NONE_SELECTED) {\r\n      const closingstring = poIDs.find(x => x.value === POid)?.closingDate + \"\";\r\n      const closingDate = new Date(+closingstring.substring(0, 4), +closingstring.substring(4, 6) - 1, +closingstring.substring(6, 8))\r\n      props.handleSelectedPO(POid, closingDate)\r\n      setSelected(POid)\r\n    }\r\n  }\r\n\r\n  const load = async () => {\r\n    if(props.default) {\r\n      setSelected(props.default)\r\n    }\r\n    else {\r\n      setErrorMsg('')\r\n      setLoading(true)\r\n      setDone(false)\r\n\r\n      const response = await PO.getList(lpContext.LP.id)\r\n\r\n      setLoading(false)\r\n\r\n      if(response.is_error) {\r\n        setErrorMsg(response.error_content)\r\n      }\r\n      else {\r\n        setPOIDs(response.content.value)\r\n        setDone(true)\r\n      }\r\n    }\r\n  }\r\n\r\n  const doLoad = () => {\r\n    load()\r\n  }\r\n\r\n  useEffect(doLoad, [])\r\n\r\n  return (\r\n    <POLoaderView\r\n      poIDs={poIDs}\r\n      loading={loading}\r\n      done={done}\r\n      disabled={props.disabled}\r\n      default={props.default}\r\n      selectedPO={selected}\r\n      handleSelected={handleSelected}\r\n      errorMsg={errorMsg} />\r\n  )\r\n}\r\n\r\nexport default POLoader\r\n","import React, { useEffect, useState } from 'react'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\nimport classNames from 'classnames'\r\n\r\ninterface Props {\r\n  type: string\r\n  text: string\r\n  show?: boolean\r\n}\r\n\r\nconst Alert = (props: Props) => {\r\n  const [show, setShow] = useState(props.show)\r\n\r\n  useEffect(() => {\r\n    setShow(props.show);\r\n  }, [props.show])\r\n\r\n  return (\r\n    <div\r\n      className={\r\n        classNames({\r\n          alert: true,\r\n          ['alert-' + props.type]: true,\r\n          'alert-dismissable': true,\r\n          'fade': true,\r\n          show: show\r\n        })\r\n      }\r\n      role=\"alert\">\r\n      {props.text}\r\n      <button\r\n        type=\"button\"\r\n        className=\"close\"\r\n        data-dismiss=\"alert\"\r\n        aria-label=\"Close\"\r\n        onClick={() => {setShow(false)}}>\r\n        <FontAwesomeIcon icon=\"times\" />\r\n      </button>\r\n    </div>\r\n  )\r\n}\r\n\r\nexport default Alert\r\n","import React from 'react';\r\n\r\nimport PhoneInput from 'react-phone-input-2'\r\nimport 'react-phone-input-2/lib/style.css'\r\n\r\nconst CanadaPhoneInput = (props) => {\r\n    return (\r\n      <PhoneInput\r\n        value={props.value}\r\n        disabled={props.disabled}\r\n        country='ca'\r\n        onlyCountries={['ca']}\r\n        maxLength='14'\r\n        className='form-control'\r\n        placeholder='(xxx) xxx-xxxx'\r\n        onChange={props.onChange} />\r\n    )\r\n}\r\n\r\nexport default CanadaPhoneInput\r\n","import React, { Component } from 'react'\r\nimport DatePicker from 'react-datepicker'\r\nimport { withRouter } from 'react-router-dom'\r\nimport classNames from 'classnames'\r\nimport { addYears, format, parse, isValid } from 'date-fns'\r\n\r\nimport { ASNDetailGroup } from './ASNDetailGroup'\r\nimport POLoader from '../poLoader/poLoader'\r\nimport PO from '../services/PO'\r\nimport Auth from '../services/Auth'\r\nimport ASN from '../services/ASN'\r\nimport Loading from '../loading/Loading'\r\nimport Alert from '../alert/Alert'\r\nimport CanadaPhoneInput from '../phoneInput/PhoneInput'\r\nimport { USER_ROLE } from '../signin/RoleContext';\r\n\r\nimport 'react-datepicker/dist/react-datepicker.css'\r\nimport './ASNForm.scss'\r\nimport { Routes } from '../App'\r\nimport CoAUploader from '../services/CoAUpload'\r\nimport AsnDialog from '../asnDialog/AsnDialog'\r\n\r\nconst emailRegex = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/\r\nconst dateFormat = 'yyyyMMdd'\r\nconst timeFormat = 'HHmmss'\r\n\r\nexport class ASNForm extends Component {\r\n  constructor(props) {\r\n    super(props)\r\n\r\n    this.state = {\r\n        selectedPO: '0',\r\n        POLineItems: [],\r\n        header: {\r\n            ETA: null,\r\n            email: '',\r\n            contactPerson: '',\r\n            phoneNumber: '',\r\n            reference: '',\r\n            freightForwarded: '',\r\n            asnNumber: ''\r\n        },\r\n        asnDetailItems: {},\r\n        submitting: false,\r\n        submitted: false,\r\n        fetchingPOLineItems: false,\r\n        fetchingPOLineItemError: false,\r\n        globalCoAList: [],\r\n        alertText: \"\",\r\n        alertType: \"\",\r\n        showAlert: false,\r\n        closingDate: null\r\n    }\r\n\r\n    this.state.header.email = Auth.getEmail()\r\n\r\n    this.handlePOSelected = this.handlePOSelected.bind(this)\r\n    this.handleSubmit = this.handleSubmit.bind(this)\r\n    this.handleInputField = this.handleInputField.bind(this)\r\n    this.handleASNDetailChange = this.handleASNDetailChange.bind(this)\r\n    this.handleDateChange = this.handleDateChange.bind(this)\r\n    this.handlePhoneNumberChange = this.handlePhoneNumberChange.bind(this)\r\n\r\n    this.isValid = this.isValid.bind(this)\r\n    this.addLotCode = this.addLotCode.bind(this)\r\n    this.removeLotCode = this.removeLotCode.bind(this)\r\n    this.showAlert = this.showAlert.bind(this)\r\n    this.dismissAlert = this.dismissAlert.bind(this)\r\n    this.handleDraft = this.handleDraft.bind(this)\r\n    this.handleCOASave = this.handleCOASave.bind(this);\r\n    \r\n  }\r\n  componentDidMount() {\r\n    this.getAndSetASNData()\r\n  }\r\n\r\n  getAndSetASNData() {\r\n    this.props.getASN(this.props.lp).then((response) => {\r\n      return this.loadASNData(response);\r\n    });\r\n  }\r\n  onCoAUpdate = (successfulUpdate) => {\r\n    this.props.getASN(this.props.lp).then((response) => {      \r\n      return this.loadASNData(response)\r\n    });\r\n  }\r\n\r\n  addToGlobalCoAList = (newCoAs) => {\r\n    const originalCoAList= this.state.globalCoAList\r\n    const concatinatedList = originalCoAList.concat(newCoAs)\r\n    this.setState({\r\n      globalCoAList: concatinatedList\r\n    })\r\n\r\n  }\r\n\r\n  submitAllCoAs = () => {\r\n    const coAList = this.state.globalCoAList;\r\n    return Promise.all(coAList.map((coa) => {\r\n      return CoAUploader.sendCoA(coa);\r\n    })).catch((err) => {\r\n      console.log(err)\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Parse the response, format the data, and populate the read-only form.\r\n   * @param {*} response\r\n   */\r\n  loadASNData(response) {\r\n    let value = response.content.value\r\n    if (value) {\r\n      let selectedPO = String(value.header.originalOrderNumber)\r\n      return this.fetchPOLineItems(selectedPO).then(() => {\r\n        this.populateExistingASN(value)\r\n      })\r\n    }\r\n  }\r\n  /**\r\n   * Populate the state with the given ASN data.\r\n   * @param {*} value\r\n   */\r\n  populateExistingASN(value) {\r\n    let header = value.header\r\n\r\n    let emails = ''\r\n    for (var i = 0; i < value.emails.length; i++) {\r\n      emails += value.emails[i].emailAddress.trim()\r\n      if (i < value.emails.length - 1) {\r\n        emails += ', '\r\n      }\r\n    }\r\n\r\n    header.email = emails\r\n\r\n    header.ETA = parse(String(value.header.etaDate), dateFormat, new Date())\r\n\r\n    let asnDetailItems = {}\r\n    for (var i = 0; i < value.details.length; i++) {\r\n      let item = value.details[i]\r\n      if (!asnDetailItems[item.sku]) {\r\n        asnDetailItems[item.sku] = []\r\n      }      \r\n      asnDetailItems[item.sku].push(item)\r\n    }\r\n\r\n    this.setState((prevState) => {\r\n      return {\r\n        header: header,\r\n        selectedPO: value.header.originalOrderNumber,\r\n        asnDetailItems: Object.assign(prevState.asnDetailItems, asnDetailItems),\r\n      }\r\n    })\r\n  }\r\n  /**\r\n   * Handler for when the POLoader value is selected.\r\n   *\r\n   * @param {} POid\r\n   */\r\n  handlePOSelected(POid, closingDate) {\r\n    if (POid === POLoader.NONE_SELECTED) {\r\n      this.setState({\r\n        selectedPO: POid,\r\n        POLineItems: [],\r\n          asnDetailItems: {},\r\n        closingDate: null,\r\n      })\r\n    } else {\r\n      this.setState(\r\n        {\r\n          selectedPO: POid,\r\n          POLineItems: [],\r\n          asnDetailItems: {},\r\n              fetchingPOLineItems: true,\r\n              closingDate: closingDate,\r\n        },\r\n        () => {\r\n          this.fetchPOLineItems(POid)\r\n        }\r\n      )\r\n    }\r\n  }\r\n  create_UUID = () => {\r\n    var dt = new Date().getTime();\r\n    var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\r\n        var r = (dt + Math.random()*16)%16 | 0;\r\n        dt = Math.floor(dt/16);\r\n        return (c=='x' ? r :(r&0x3|0x8)).toString(16);\r\n    });\r\n    return uuid;\r\n  }\r\n  /**Fetch\r\n   * Fetch the PO's line items\r\n   * @param {} POid\r\n   */\r\n  fetchPOLineItems(POid) {\r\n    return PO.getLineItems(this.props.lp, POid).then((response) => {\r\n      if (response.is_error) {\r\n        return this.fetchPOLineItemError(response)\r\n      }\r\n\r\n      return this.fetchPOLineItemSuccess(response)\r\n    })\r\n  }\r\n  /**\r\n   *\r\n   * @param {*} response\r\n   */\r\n  fetchPOLineItemSuccess(response) {\r\n    let POLineItems = response.content.value\r\n    this.populatePOLineItems(POLineItems)\r\n    this.initASNLineItems(POLineItems)\r\n\r\n    this.setState({\r\n      fetchingPOLineItems: false,\r\n      fetchingPOLineItemError: false,\r\n    })\r\n  }\r\n\r\n  fetchPOLineItemError(response) {\r\n    this.setState({\r\n      fetchingPOLineItems: false,\r\n      fetchingPOLineItemError: true,\r\n    })\r\n  }\r\n  /**\r\n   * Populate the PO Line Items in the state\r\n   * @param {*} POLineItems\r\n   */\r\n  populatePOLineItems(POLineItems) {\r\n    let lineItems = []\r\n    if (POLineItems) {\r\n      for (var i = 0; i < POLineItems.length; i++) {\r\n        let lineItem = POLineItems[i]\r\n        lineItems.push(lineItem)\r\n      }\r\n  \r\n      this.setState({\r\n        POLineItems: lineItems,\r\n      })\r\n\r\n\r\n    }\r\n\r\n\r\n  }\r\n  /**\r\n   * Initialize the ASN Line Items given the provided PO Line items\r\n   * @param {*} POLineItems\r\n   */\r\n  initASNLineItems(POLineItems) {\r\n    let asnDetailItems = {}\r\n    if (POLineItems) {\r\n      for (var i = 0; i < POLineItems.length; i++) {\r\n        let lineItem = POLineItems[i]\r\n        asnDetailItems[lineItem.sku] = [\r\n          {\r\n            sku: lineItem.sku,\r\n            assigned: this.create_UUID()\r\n          },\r\n        ]\r\n      }\r\n  \r\n      this.setState({\r\n        asnDetailItems: asnDetailItems,\r\n      })\r\n\r\n    }\r\n\r\n  }\r\n  create_UUID = () => {\r\n    var dt = new Date().getTime();\r\n    var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\r\n        var r = (dt + Math.random()*16)%16 | 0;\r\n        dt = Math.floor(dt/16);\r\n        return (c=='x' ? r :(r&0x3|0x8)).toString(16);\r\n    });\r\n    return uuid;\r\n  }\r\n  /**\r\n   * Add a new ASNDetail item with same sku as\r\n   * @param {*} sku\r\n   */\r\n  addLotCode(sku) {\r\n    this.setState((prevState) => {\r\n      let asnDetailItems = prevState.asnDetailItems\r\n      asnDetailItems[sku].push({assigned: this.create_UUID()})\r\n      return Object.assign(prevState, {\r\n        asnDetailItems: asnDetailItems,\r\n      })\r\n    })\r\n  }\r\n  /**\r\n   * Remove an ASNDetail item with same sku as\r\n   * @param {*} sku\r\n   */\r\n  removeLotCode(sku, index) {\r\n    this.setState((prevState) => {\r\n      let asnDetailItems = prevState.asnDetailItems\r\n      asnDetailItems[sku].splice(index, 1)\r\n      return Object.assign(prevState, {\r\n        asnDetailItems: asnDetailItems,\r\n      })\r\n    })\r\n  }\r\n  handleInputField(event) {\r\n    this.handleHeaderField(event.target.name, event.target.value)\r\n  }\r\n  handleDateChange(date) {\r\n    this.handleHeaderField('ETA', date)\r\n  }\r\n  handlePhoneNumberChange(phoneNumber) {\r\n    this.handleHeaderField('phoneNumber', phoneNumber)\r\n  }\r\n  handleHeaderField(name, value) {\r\n    this.setState((prevState) => {\r\n      let header = {}\r\n      header[name] = value\r\n      return {\r\n        header: Object.assign(prevState.header, header),\r\n      }\r\n    })\r\n  }\r\n  /**\r\n   * Manage the state of the ASNDetail child components.\r\n   *\r\n   * @param {*} sku\r\n   * @param {*} name\r\n   * @param {*} value\r\n   */\r\n  handleASNDetailChange(po, index, name, value) {\r\n    this.setState((prevState) => {\r\n      let asnDetailItemsList = prevState.asnDetailItems\r\n\r\n      // Ensure quantity of all items under same sku do not exceed the quantity on order\r\n      if (name === 'openQuantity') {\r\n        if (\r\n          !ASNDetailGroup.isSkuQuantityValid(\r\n            po,\r\n            asnDetailItemsList[po.sku],\r\n            index,\r\n            value,\r\n            false\r\n          )\r\n        ) {\r\n          return\r\n        }\r\n      }\r\n\r\n      asnDetailItemsList[po.sku][index][name] = value\r\n      return {\r\n        asnDetailItems: asnDetailItemsList,\r\n      }\r\n    })\r\n    }\r\n    preOpen = () => {\r\n        this.dismissAlert();\r\n        if (!isValid(this.state.header.ETA)) {\r\n            this.showAlert(\"Must enter a valid Estimated Date of Arrival.\", 'danger');\r\n            return false;\r\n        }\r\n        return true;\r\n    }\r\n  handleCOASave = () =>  {\r\n      this.dismissAlert();\r\n      if (Auth.getRole() !== USER_ROLE.ADMIN && (this.props.disabled || !this.isValidMinusCOA())) {\r\n        return\r\n      }\r\n\r\n      return new Promise((resolve, reject) => {\r\n        this.coaSave(this.props.lp).then(response => {\r\n            resolve(response);\r\n        });\r\n      });      \r\n  }\r\n  /**\r\n   * Handles the Save Draft button pressed event.\r\n   * @param {*} event\r\n   */\r\n  handleDraft(event) {\r\n    event.preventDefault()\r\n\r\n    this.dismissAlert()\r\n      if (Auth.getRole() !== USER_ROLE.ADMIN && (this.props.disabled || !this.isValidMinusCOA())) {\r\n      return\r\n    }\r\n\r\n    this.setState({ submitting: true }, () => {\r\n      this.submit(this.props.lp, ASN.Status.draft)\r\n    })\r\n  }\r\n  /**\r\n   * Handles the submit button pressed event.\r\n   * @param {*} event\r\n   */\r\n  handleSubmit(event) {\r\n    event.preventDefault()\r\n\r\n    this.dismissAlert()\r\n      if (Auth.getRole() !== USER_ROLE.ADMIN && (this.props.disabled || !this.isValidMinusCOA())) {\r\n      return\r\n    }\r\n    this.setState({ submitting: true }, () => {\r\n      this.submit(this.props.lp, ASN.Status.submitted)\r\n    })\r\n  }\r\n  createSaveData() {\r\n    let eta = format(this.state.header.ETA, dateFormat)\r\n    let data = {\r\n        header: Object.assign(this.state.header, {\r\n            originalOrderNumber: this.state.selectedPO,\r\n            etaDate: eta,\r\n            etaTime: '000000',\r\n        }),\r\n        details: [],\r\n        emails: [],\r\n    }\r\n\r\n    for (let sku in this.state.asnDetailItems) {\r\n        for (let i = 0; i < this.state.asnDetailItems[sku].length; i++) {\r\n            let item = this.state.asnDetailItems[sku][i]\r\n            if (!this.isASNDetailItemEmpty(item)) {\r\n                item.sku = sku\r\n                data.details.push(item)\r\n            }\r\n        }\r\n    }\r\n\r\n    let emails = this.state.header.email.split(',')\r\n    emails.forEach((email) => {\r\n        data.emails.push({\r\n            emailAddress: email,\r\n        })\r\n    });\r\n\r\n    return data;\r\n  }\r\n  /**\r\n   * Submits the form data.\r\n   * @param {*} type\r\n   */\r\n  submit(lp, type) {\r\n    let data = this.createSaveData();\r\n\r\n    let requestType =\r\n      type === ASN.Status.draft\r\n        ? this.props.handleDraft\r\n        : this.props.handleSubmit\r\n\r\n    requestType(lp, data).then((response) => {\r\n      if (response.is_error) {\r\n        this.setState({ submitting: false, submitted: false })\r\n        this.showAlert(response.error_content, 'danger')\r\n        return\r\n      }\r\n\r\n      this.setState({ submitting: false, submitted: true })\r\n      this.showAlert('Success!', 'success')\r\n\r\n      setTimeout(() => {\r\n        this.props.history.push(Routes.Home)\r\n      }, 3000)\r\n    })\r\n  }\r\n\r\n  coaSave (lp) {\r\n    let saveData = this.createSaveData();\r\n    return this.props.handleDraft(lp, saveData).then((response) => {\r\n      if(response.is_error) {\r\n        return { error: true };\r\n      }\r\n      return { error: false, documentNumber: response.content.header.documentNumber, costCenter: response.content.header.costCenter, details: response.content.details };\r\n    });\r\n  }\r\n\r\n  \r\n  showAlert(text, type) {\r\n    this.setState({ showAlert: true, alertText: text, alertType: type })\r\n  }\r\n  dismissAlert() {\r\n    this.setState({ showAlert: false })\r\n  }\r\n  isValid() {\r\n    return this.isHeaderValid() && this.validateASNDetailItems()\r\n  }\r\n  isValidMinusCOA() {\r\n    return this.isHeaderValid() && this.validateASNDetailItems(false)\r\n  }\r\n  isHeaderValid() {\r\n    if (!this.state.header.ETA || !this.isEmailValid()) {\r\n      return false\r\n    }\r\n    return true\r\n  }\r\n  isEmailValid() {\r\n    var emails = this.state.header.email\r\n    if (!emails) return false\r\n    emails = emails.split(',')\r\n    for (var i = 0; i < emails.length; i++) {\r\n      let email = emails[i].replace(' ', '')\r\n      if (email == '' || !emailRegex.test(email)) {\r\n        return false\r\n      }\r\n    }\r\n    return true\r\n  }\r\n  isASNDetailItemEmpty(asnDetailItem) {\r\n    return !asnDetailItem.lotCode && !asnDetailItem.openQuantity\r\n  }\r\n  isASNDetailItemFilled(asnDetailItem) {\r\n    return asnDetailItem.lotCode && asnDetailItem.openQuantity\r\n  }\r\n\r\n  checkItemsForCoAs() {\r\n    if (this.state.asnDetailItems !== undefined) {\r\n      var coaCount =  0;\r\n      const keys = Object.keys(this.state.asnDetailItems);\r\n      for (let i = 0 ; i < keys.length; i++) {\r\n        var currAsn =  this.state.asnDetailItems[keys[i]]\r\n        for (let j = 0 ; j < currAsn.length; j++) {\r\n          if (currAsn[j] !== undefined && currAsn[j].hasOwnProperty(\"qvUpf\") && currAsn[j][\"qvUpf\"].trim() !== \"Y\") {\r\n            return false\r\n          } else if (currAsn[j] !== undefined && currAsn[j].hasOwnProperty(\"openQuantity\") && currAsn[j].openQuantity > 0 && !currAsn[j].hasOwnProperty(\"qvUpf\")) {\r\n            return false;\r\n          } else if (currAsn[j] !== undefined && currAsn[j].hasOwnProperty(\"qvUpf\")) {\r\n            coaCount++;\r\n          }\r\n        }\r\n      }\r\n      if (coaCount === 0) {        \r\n        return false;\r\n      }      \r\n    }\r\n    return true;\r\n  }\r\n\r\n  validateASNDetailItems(validateCoas = true) {\r\n    if (this.state.selectedPO === '0') {\r\n      return false\r\n    }\r\n\r\n    // ensure all rows are completely filled or blank.'\r\n    let filledRows = 0    \r\n    if (validateCoas && !this.checkItemsForCoAs()) {\r\n      return false;\r\n    }\r\n\r\n    // for every sku\r\n    for (let po of this.state.POLineItems) {      \r\n      let sku = po.sku\r\n      let asnDetailItemsList = this.state.asnDetailItems[sku]\r\n\r\n      if (!asnDetailItemsList) continue\r\n\r\n      if (\r\n        !ASNDetailGroup.isSkuQuantityValid(po, asnDetailItemsList, -1, 0, true, true)\r\n      ) {\r\n        return false\r\n      }\r\n\r\n      // for every lot code\r\n      for (let i = 0; i < asnDetailItemsList.length; i++) {\r\n        // all filled\r\n        if (this.isASNDetailItemFilled(asnDetailItemsList[i])) {\r\n          filledRows++\r\n          \r\n          // if (this.asnDetailItemsList[i]?.onCoAChange === true) {\r\n          //   return false\r\n          // }\r\n        }\r\n\r\n        // not all blank\r\n        else if (!this.isASNDetailItemEmpty(asnDetailItemsList[i])) {\r\n          return false\r\n        }\r\n      }\r\n    }\r\n\r\n    // ensure at least one row is filled\r\n    if (filledRows === 0) {\r\n      return false\r\n    }\r\n\r\n    return true;  \r\n  }\r\n\r\n  render() {\r\n    let POLineItems = []\r\n    this.state.POLineItems.forEach((item) => {\r\n      if (this.state.asnDetailItems[item.sku])\r\n        POLineItems.push(\r\n          <ASNDetailGroup\r\n                key={item.sku}\r\n                po={item}\r\n                header={this.state.header}\r\n                asn={this.state.asnDetailItems[item.sku]} //\r\n                onChange={this.handleASNDetailChange}\r\n                readOnly={this.props.disabled}\r\n                submitting={this.state.submitting || this.state.submitted}\r\n                addLotCode={this.addLotCode}\r\n                removeLotCode={this.removeLotCode}\r\n                lp={this.props.lp}\r\n                saveAsn={this.handleCOASave}\r\n                history={this.props.history}\r\n                onCoAUpdate={this.onCoAUpdate}\r\n                preOpen={this.preOpen}\r\n          />\r\n        )\r\n    })\r\n\r\n    let title = this.state.header.documentNumber\r\n      ? 'ASN ' +\r\n        this.state.header.documentNumber +\r\n        ' - ' +\r\n        this.state.header.orderStatus\r\n      : 'Create ASN'\r\n\r\n    let totalCases = 0\r\n    for (let sku in this.state.asnDetailItems) {\r\n      this.state.asnDetailItems[sku].forEach((asnDetailItem) => {\r\n        if (asnDetailItem.openQuantity) {\r\n          totalCases += parseInt(asnDetailItem.openQuantity)\r\n        }\r\n      })\r\n    }\r\n\r\n    let userIsAdmin = Auth.getRole() === USER_ROLE.ADMIN;\r\n\r\n    let buttonDisabled =\r\n        (!this.isValidMinusCOA() ||\r\n        this.state.submitting ||\r\n        this.state.submitted ||\r\n        this.props.disabled);\r\n    let inputDisabled =\r\n      this.props.disabled || this.state.submitting || this.state.submitted\r\n\r\n    return (\r\n      <div id=\"create_asn\">\r\n        <form onSubmit={this.handleSubmit} noValidate>\r\n          <div className=\"row\">\r\n            <div className=\"col-12\">\r\n              <h1>{title}</h1>\r\n            </div>\r\n          </div>\r\n          <div className=\"row\">\r\n                    <div className=\"col-12\">\r\n                        {(this.state.header.asnNumber && this.state.header.asnNumber.trim().length > 0) ? ('ASN #' + this.state.header.asnNumber) : ''}\r\n              </div>\r\n          </div>\r\n          <div className=\"row\">\r\n            <div className=\"col-12\">\r\n              <h4>Shipment Information</h4>\r\n            </div>\r\n          </div>\r\n          <div className=\"row justify-content-between\">\r\n            <div className=\"col-5\">\r\n              <div className=\"form-group\">\r\n                <label htmlFor=\"ETA\">Estimated Date of Arrival</label>\r\n                <DatePicker\r\n                  className={classNames({\r\n                    'form-control': true,\r\n                    error: !this.state.header.ETA,\r\n                  })}\r\n                  required={true}\r\n                  name=\"ETA\"\r\n                  selected={this.state.header.ETA}\r\n                  onChange={this.handleDateChange}\r\n                  dateFormat=\"eeee, dd MMMM yyyy\"\r\n                  disabled={inputDisabled}\r\n                  minDate={new Date()}\r\n                  maxDate={addYears(new Date(), 1)}\r\n                  autoComplete={'off'}\r\n                />\r\n                <span className=\"text-danger\"></span>\r\n              </div>\r\n            </div>\r\n            <div className=\"col-5\">\r\n              <div className=\"form-group\">\r\n                <label htmlFor=\"Email\">Notification Email Address(es)</label>\r\n                <input\r\n                  required\r\n                  type=\"text\"\r\n                  value={this.state.header.email}\r\n                  name=\"email\"\r\n                  className={classNames({\r\n                    'form-control': true,\r\n                    error: !this.isEmailValid(),\r\n                  })}\r\n                  disabled={inputDisabled}\r\n                  onChange={this.handleInputField}\r\n                />\r\n                <span className=\"text-danger\"></span>\r\n              </div>\r\n            </div>\r\n          </div>\r\n          <div className=\"row\">\r\n            <div className=\"col-12\">\r\n              <div className=\"form-group\">\r\n                <label htmlFor=\"Notes\">Comments or Notes</label>\r\n                <textarea\r\n                  name=\"reference\"\r\n                  value={this.state.header.reference}\r\n                  className=\"form-control\"\r\n                  disabled={inputDisabled}\r\n                  onChange={this.handleInputField}\r\n                  maxLength=\"80\"\r\n                />\r\n                <span className=\"text-danger\"></span>\r\n              </div>\r\n            </div>\r\n          </div>\r\n          <div className=\"row\">\r\n            <div className=\"col-12\">\r\n              <h4>Trucking Company Information</h4>\r\n            </div>\r\n          </div>\r\n          <div className=\"row justify-content-between\">\r\n            <div className=\"col-5\">\r\n              <div className=\"form-group\">\r\n                <label htmlFor=\"CompanyName\">Company Name</label>\r\n                <input\r\n                  type=\"text\"\r\n                  maxLength=\"40\"\r\n                  name=\"freightForwarded\"\r\n                  value={this.state.header.freightForwarded}\r\n                  disabled={inputDisabled}\r\n                  className=\"form-control\"\r\n                  onChange={this.handleInputField}\r\n                />\r\n                <span className=\"text-danger\"></span>\r\n              </div>\r\n            </div>\r\n            <div className=\"col-5\">\r\n              <div className=\"form-group\">\r\n                <label htmlFor=\"Contact\">Contact Person</label>\r\n                <input\r\n                  type=\"text\"\r\n                  maxLength=\"50\"\r\n                  value={this.state.header.contactPerson}\r\n                  disabled={inputDisabled}\r\n                  name=\"contactPerson\"\r\n                  className=\"form-control\"\r\n                  onChange={this.handleInputField}\r\n                />\r\n                <span className=\"text-danger\"></span>\r\n              </div>\r\n            </div>\r\n          </div>\r\n          <div className=\"row justify-content-end\">\r\n            <div className=\"col-5\">\r\n              <div className=\"form-group\">\r\n                <label htmlFor=\"phoneNumber\">Contact Phone</label>\r\n                <CanadaPhoneInput\r\n                  type=\"text\"\r\n                  value={this.state.header.phoneNumber}\r\n                  disabled={inputDisabled}\r\n                  name=\"phoneNumber\"\r\n                  onChange={this.handlePhoneNumberChange}\r\n                />\r\n                <span className=\"text-danger\"></span>\r\n              </div>\r\n            </div>\r\n          </div>\r\n          <div className=\"row\">\r\n            <div className=\"col-12\">\r\n              <hr />\r\n            </div>\r\n          </div>\r\n\r\n          <POLoader\r\n            disabled={this.state.submitting || this.state.submitted}\r\n            handleSelectedPO={this.handlePOSelected}\r\n            default={this.props.poId}\r\n          />\r\n                <div style={{ display: this.state.closingDate ? \"block\" : \"none\" }}>\r\n                    If this PO will not be delivered in full before <span style={{ fontWeight: 'bold' }}>{this.state.closingDate ? this.state.closingDate.toLocaleString('default', { month: 'short' }) + \" \" + this.state.closingDate.getDate() : ''}</span>, you must notify your AGLC Merchandising Planner.\r\n        </div>\r\n          <div\r\n            id=\"PO\"\r\n            className={classNames({\r\n              empty: this.state.selectedPO === '0',\r\n            })}\r\n          >\r\n            <div className=\"empty_msg\">\r\n              <h3>Select a PO# to continue</h3>\r\n            </div>\r\n            <div className=\"row\">\r\n              <div className=\"col-12\">\r\n                <table className=\"table\">\r\n                  <thead>\r\n                    <tr>\r\n                      <th>SKU</th>\r\n                      <th className=\"releaseDate\">\r\n                        Lot Number - Packaged Date\r\n                      </th>\r\n                      {/*<th></th>*/}\r\n                      <th>Unit(s) Per Case</th>\r\n                      <th style={{ width: '150px' }}># of Units</th>\r\n                      <th>Outstanding</th>\r\n                      <th\r\n                        className={classNames({\r\n                          'd-none': this.props.disabled,\r\n                        })}\r\n                      ></th>\r\n                    </tr>\r\n                  </thead>\r\n                  <tfoot>\r\n                    <tr>\r\n                      <th className=\"labelTotal\" colSpan=\"4\">\r\n                        Total\r\n                      </th>\r\n                      <th className=\"total\">\r\n                        <input\r\n                          className=\"form-control\"\r\n                          value={totalCases}\r\n                          disabled={true}\r\n                        />\r\n                      </th>\r\n                      <th colSpan={this.props.disabled ? 1 : 2}></th>\r\n                    </tr>\r\n                  </tfoot>\r\n                  {POLineItems}\r\n                  {this.state.fetchingPOLineItemError &&\r\n                    !this.state.fetchingPOLineItems && (\r\n                      <div\r\n                        style={{\r\n                          color: 'red',\r\n                          padding: '25px',\r\n                        }}\r\n                      >\r\n                        There was an error fetching Line Items for this PO\r\n                      </div>\r\n                    )}\r\n                </table>\r\n              </div>\r\n            </div>\r\n          </div>\r\n          <div\r\n            className={classNames({\r\n              row: true,\r\n              'd-none': !userIsAdmin && buttonDisabled,\r\n            })}\r\n          >\r\n            <div id=\"asn_submit\" className=\"col-12\">\r\n              <Loading show={this.state.submitting} />\r\n              <button\r\n                type=\"button\"\r\n                className={classNames({ btn: true, 'btn-orange': true, 'd-none': this.props.disabled })}\r\n                onClick={this.handleDraft}\r\n                disabled={buttonDisabled}\r\n              >\r\n                + Save Draft ASN\r\n              </button>\r\n              <span>\r\n                <span style={{ padding: '5px' }}>&nbsp;</span>\r\n                <button\r\n                  id=\"submit\"\r\n                  type=\"submit\"\r\n                  // onClick={this.submitFinal}\r\n                  className=\"btn btn-orange\"\r\n                  disabled={buttonDisabled}\r\n                >\r\n                  + Submit ASN\r\n                </button>\r\n              </span>\r\n            </div>\r\n          </div>\r\n        </form>\r\n\r\n        <Alert\r\n          text={this.state.alertText}\r\n          type={this.state.alertType}\r\n          close={this.dismissAlert}\r\n          show={this.state.showAlert}\r\n        />\r\n      </div>\r\n    )\r\n  }\r\n}\r\n\r\nexport default withRouter(ASNForm)\r\n","import React, { Component } from 'react'\r\nimport ASNForm from './ASNForm'\r\nimport ASN from '../services/ASN'\r\n\r\nexport class ASNFormCreate extends Component {\r\n  constructor(props) {\r\n    super(props)\r\n\r\n    this.handleSubmit = this.handleSubmit.bind(this)\r\n    this.handleDraft = this.handleDraft.bind(this)\r\n\r\n    this.getASN = this.getASN.bind(this)\r\n  }\r\n  handleSubmit(lp, data) {\r\n    return ASN.createSubmit(lp, data)\r\n  }\r\n  handleDraft(lp, data) {\r\n    return ASN.createDraft(lp, data)\r\n  }\r\n  getASN(lp) {\r\n    // dummy function, we are creating a new ASN\r\n    return new Promise((resolve, reject) => {\r\n      resolve({\r\n        content: {\r\n          value: null,\r\n        },\r\n      })\r\n    })\r\n  }\r\n  render() {\r\n    return (\r\n      <ASNForm\r\n        disabled={false}\r\n        handleSubmit={this.handleSubmit}\r\n        handleDraft={this.handleDraft}\r\n        getASN={this.getASN}\r\n        lp={this.props.match.params.LPid}\r\n      />\r\n    )\r\n  }\r\n}\r\n","import React, { Component } from 'react'\r\nimport ASNForm from './ASNForm'\r\nimport ASN from '../services/ASN'\r\n\r\nexport class ASNFormAmend extends Component {\r\n  constructor(props) {\r\n    super(props)\r\n\r\n    this.handleSubmit = this.handleSubmit.bind(this)\r\n    this.handleDraft = this.handleDraft.bind(this)\r\n\r\n    this.getASN = this.getASN.bind(this)\r\n  }\r\n  handleSubmit(lp, data) {\r\n    return ASN.amendSubmit(lp, data)\r\n  }\r\n  handleDraft(lp, data) {\r\n    return ASN.amendDraft(lp, data)\r\n  }\r\n  create_UUID = () => {\r\n    var dt = new Date().getTime();\r\n    var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\r\n        var r = (dt + Math.random()*16)%16 | 0;\r\n        dt = Math.floor(dt/16);\r\n        return (c=='x' ? r :(r&0x3|0x8)).toString(16);\r\n    });\r\n    return uuid;\r\n  }\r\n  getASN(lp) {\r\n    return ASN.get(\r\n      lp,\r\n      this.props.match.params.POid,\r\n      this.props.match.params.DocumentNumber\r\n    ).then((response) => {\r\n      if (response && response.content && response.content.value && response.content.value.details) {\r\n        for(let i = 0; i < response.content.value.details.length; i++) {\r\n          response.content.value.details[i].assigned = this.create_UUID();\r\n        }\r\n      }\r\n\r\n      return response\r\n    })\r\n  }\r\n  render() {\r\n    return (\r\n      <ASNForm\r\n        disabled={false}\r\n        handleSubmit={this.handleSubmit}\r\n        handleDraft={this.handleDraft}\r\n        getASN={this.getASN}\r\n        poId={this.props.match.params.POid}\r\n        lp={this.props.match.params.LPid}\r\n      />\r\n    )\r\n  }\r\n}\r\n","import React, { Component } from 'react'\r\nimport ASNForm from './ASNForm'\r\nimport ASN from '../services/ASN'\r\n\r\nexport class ASNFormView extends Component {\r\n  constructor(props) {\r\n    super(props)\r\n\r\n    this.handleSubmit = this.handleSubmit.bind(this)\r\n    this.getASN = this.getASN.bind(this)\r\n  }\r\n  handleSubmit(lp, data) {\r\n      return ASN.amendSubmit(lp, data);\r\n  }\r\n  getASN(lp) {\r\n    return ASN.get(\r\n      lp,\r\n      this.props.match.params.POid,\r\n      this.props.match.params.DocumentNumber\r\n    ).then((response) => {\r\n      return response\r\n    })\r\n  }\r\n  render() {\r\n    return (\r\n      <ASNForm\r\n        disabled={true}\r\n        handleSubmit={this.handleSubmit}\r\n        handleDraft={this.handleSubmit}\r\n        getASN={this.getASN}\r\n        poId={this.props.match.params.POid}\r\n        lp={this.props.match.params.LPid}\r\n      />\r\n    )\r\n  }\r\n}\r\n","import React, { Component } from \"react\";\r\nimport { withRouter } from 'react-router-dom';\r\nimport classNames from 'classnames'\r\nimport './AccountSettings.scss'\r\nimport Auth from '../services/Auth';\r\n\r\nclass AccountSettings extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n\r\n        this.state = {\r\n            password: \"\",\r\n            confirmPassword: \"\",\r\n            currentPassword: \"\",\r\n            mfaCompare: \"\",\r\n            mfaConfirm: \"\",\r\n            confirmingMFA: false,\r\n            userInfo: {\r\n                        CNNumber: \"\",\r\n                        FullName: \"\",\r\n                        PreviousSignOn: null,\r\n                        FailedAttemptCount: 0,\r\n                        LastChanged: null,\r\n                        Expiry: null,\r\n                        mfaMode: \"None\",\r\n                        multiFactorContact: \"\",\r\n            },\r\n            errors: [],\r\n            mfaErrors: []\r\n        };\r\n\r\n        this.handleSubmit = this.handleSubmit.bind(this);\r\n        this.handleMFASubmit = this.handleMFASubmit.bind(this);\r\n        this.handleChanged = this.handleChanged.bind(this);\r\n        this.handleMFAChanged = this.handleMFAChanged.bind(this);\r\n        this.isPasswordValid = this.isPasswordValid.bind(this);\r\n        this.isMFAValid = this.isMFAValid.bind(this);\r\n        this.isConfirmPasswordValid = this.isConfirmPasswordValid.bind(this);\r\n        this.isButtonDisabled = this.isButtonDisabled.bind(this);\r\n        this.cancelMFAVerify = this.cancelMFAVerify.bind(this);\r\n        this.submitMFAUpdate = this.submitMFAUpdate.bind(this);\r\n    }\r\n\r\n    componentDidMount() {\r\n        this.getAccountData();\r\n    }\r\n\r\n    getAccountData() {\r\n        return Auth.getLoggedInUserInfo().then((response) => {\r\n            if (response) {\r\n                this.setState({ userInfo: response });\r\n            }\r\n        });\r\n    }\r\n\r\n    handleSubmit(event) {\r\n        event.preventDefault();\r\n        Auth.changePassword(this.state.currentPassword, this.state.password)\r\n            .then((response) => {\r\n                if (response.is_error) {\r\n                    alert(response.error_content);\r\n                } else {\r\n                    Auth.signOut();\r\n                    localStorage.setItem(\"PasswordChangeRequired\", false);\r\n                    this.props.history.push('/signin');\r\n                }\r\n            });\r\n    }\r\n\r\n    handleMFASubmit(event) {\r\n        event.preventDefault();\r\n        if (this.state.userInfo.mfaMode == \"None\") {\r\n            this.submitMFAUpdate();\r\n        } else {\r\n            this.verifyMFA().then((code) => {\r\n                if (code == \"failed\") {\r\n                    alert('could not update - please verify entered mfa type and contact info and try again');\r\n                } else if (code == \"unchanged\") {\r\n                    //nothing to do\r\n                    alert('MFA information matches that already in system.');\r\n                    return;\r\n                } else {\r\n                    var oldInfo =\r\n\r\n                        this.setState((prevState) => (Object.assign(prevState, {\r\n                            mfaConfirm: \"\",\r\n                            mfaCompare: code,\r\n                            confirmingMFA: true\r\n                        })));\r\n                }\r\n            });\r\n        }\r\n    }\r\n\r\n    submitMFAUpdate() {\r\n        Auth.UpdateMFAInfo(this.state.userInfo.mfaMode, this.state.userInfo.multiFactorContact).then(() => {\r\n            alert('successfully updated')\r\n        }).catch(() => { alert('error occured updating - please verify information and try again'); }).finally(() => {\r\n            this.setState((prevState) => (Object.assign(prevState, {\r\n                mfaConfirm: \"\",\r\n                mfaCompare: \"\",\r\n                confirmingMFA: false\r\n            })));\r\n        });\r\n    }\r\n\r\n    async verifyMFA() {\r\n        var confirmCode = await Auth.getMFAConfirm(this.state.userInfo.mfaMode, this.state.userInfo.multiFactorContact);\r\n        return confirmCode;\r\n    }\r\n\r\n    handleChanged(event) {\r\n        let name = event.target.name;\r\n        let value = event.target.value;\r\n        let newState = {};\r\n        newState[name] = value;\r\n\r\n        if (name === \"password\") {\r\n            newState[\"errors\"] = this.getErrors(value);\r\n        } \r\n\r\n        this.setState((prevState) => (\r\n            Object.assign(prevState, newState)\r\n        ));\r\n\r\n    }\r\n\r\n    cancelMFAVerify(){\r\n        this.setState((prevState) => (Object.assign(prevState, { confirmingMFA: false })));\r\n    }\r\n\r\n    handleMFAChanged(event) {\r\n        let name = event.target.name;\r\n        let value = event.target.value;\r\n        let newState = { ...this.state.userInfo };\r\n        newState[name] = value;\r\n        let errors = [];\r\n\r\n        if (name === \"multiFactorContact\" && this.state.userInfo.mfaMode == \"SMS\") {\r\n            if (value) {\r\n                //phone masking\r\n                value = value.replace(/[^0-9]/g, '');\r\n\r\n                if (value.length <= 3) {\r\n                    //do nothing\r\n                }\r\n                else if (value.length > 3 && value.length < 7) {\r\n                    value = `${value.substring(0, 3)}-${value.substring(3)}`\r\n                } else {\r\n                    value = `${value.substring(0, 3)}-${value.substring(3,6)}-${value.substring(6,Math.min(10,value.length))}`\r\n                }\r\n            }\r\n\r\n            newState[name] = value;\r\n            errors = this.getMFAErrors(this.state.userInfo.mfaMode, value);\r\n        } else if (name === \"mfaMode\") {\r\n            errors = this.getMFAErrors(value, this.state.userInfo.multiFactorContact);\r\n        }\r\n\r\n\r\n\r\n        this.setState((prevState) => ({ ...prevState, userInfo: newState, mfaErrors: errors }));\r\n    }\r\n\r\n    getMFAErrors(mode, value) {\r\n        var newErrors = [];\r\n\r\n        if (mode == \"None\") {\r\n            return newErrors;\r\n        }\r\n\r\n        if (!value || value.trim().length == 0) {\r\n            newErrors.push(\"MFA Contact must be provided\");\r\n        }\r\n\r\n\r\n        if (value && mode == \"Email\") {\r\n            if ((value.indexOf('@') <= 0) || (value.split('@').length < 2)) {\r\n                newErrors.push(\"Email entered is invalid\");\r\n            } \r\n        } else if (value && mode == \"SMS\") {\r\n            if (!/(\\d){3}-(\\d){3}-(\\d){4}/.test(value)) {\r\n                newErrors.push(\"Phone number entered is invalid. Please ensure of form 123-456-7890\");\r\n            }\r\n        }\r\n\r\n        return newErrors;\r\n    }\r\n\r\n    getErrors(newPassword) {\r\n        let newErrors = [];\r\n\r\n        if (!/[a-z]+/.test(newPassword)) {\r\n            newErrors.push(\"Password must contain at least one lowercase letter\");\r\n        }\r\n\r\n        if (!/[A-Z]+/.test(newPassword)) {\r\n            newErrors.push(\"Password must contain at least one uppercase letter\");\r\n        }\r\n\r\n        if (!/[0-9]+/.test(newPassword)) {\r\n            newErrors.push(\"Password must contain at least one number\");\r\n        }\r\n\r\n        if (!/[\\\"@\\\\|!#$%&/()=?{}.\\-;'<>_,*]+/.test(newPassword)) {\r\n            newErrors.push(\"Password must contain at least one special letter (from \\\"@\\\\|!#$%&/()=?{}.-;'<>_,*)\");\r\n        }\r\n\r\n        if (newPassword.length > 0 && newPassword.length < 8) {\r\n\r\n            newErrors.push(\"Your password must be a least 8 characters long.\");\r\n        }\r\n\r\n        if (/\\ /.test(newPassword)){\r\n            newErrors.push(\"Password cannot contain spaces\");\r\n        }\r\n\r\n        return newErrors;\r\n    }\r\n\r\n    isPasswordValid() {\r\n        let retVal = true;\r\n\r\n        if (!/[a-z]+/.test(this.state.password)) {\r\n            retVal = false;\r\n        }\r\n\r\n        if (!/[A-Z]+/.test(this.state.password)) {\r\n            retVal = false;\r\n        }\r\n\r\n        if (!/[0-9]+/.test(this.state.password)) {\r\n            retVal = false;\r\n        }\r\n\r\n        if (!/[\\\"@\\\\|!#$%&/()=?{}.\\-;'<>_,*]+/.test(this.state.password)) {\r\n            retVal = false;\r\n        }\r\n\r\n        if(this.state.password.length > 0 && this.state.password.length < 8) {\r\n            retVal = false;\r\n        }\r\n\r\n        if (/\\ /.test(this.state.password)){\r\n            retVal = false;\r\n        }\r\n\r\n        return retVal;\r\n    }\r\n\r\n    isConfirmPasswordValid() {\r\n        if(this.isPasswordValid()){\r\n            if(this.state.password === this.state.confirmPassword) {\r\n                return true;\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n\r\n    isMFAValid() {\r\n        if (this.state.userInfo.mfaMode == \"None\") {\r\n            return true;\r\n        }\r\n\r\n        var isValid = true;\r\n\r\n        if (!this.state.userInfo.multiFactorContact || this.state.userInfo.multiFactorContact.trim().length == 0) {\r\n            isValid = false;\r\n        }\r\n\r\n        if (this.state.userInfo.multiFactorContact && this.state.userInfo.mfaMode == \"Email\") {\r\n            if ((this.state.userInfo.multiFactorContact.indexOf('@') <= 0) || (this.state.userInfo.multiFactorContact.split('@').length < 2)) {\r\n                isValid = false;\r\n            }\r\n        } else if (this.state.userInfo.multiFactorContact && this.state.userInfo.mfaMode == \"SMS\") {\r\n            if (!/(\\d){3}-(\\d){3}-(\\d){4}/.test(this.state.userInfo.multiFactorContact)) {\r\n                isValid = false;\r\n            }\r\n        }\r\n\r\n        return this.state.userInfo.multiFactorContact && (this.state.userInfo.multiFactorContact.trim().length > 0) && isValid;\r\n    }\r\n\r\n    confirmedMFA() {\r\n        return this.state.confirmingMFA && (this.state.mfaConfirm === this.state.mfaCompare);\r\n    }\r\n\r\n    isButtonDisabled() {\r\n        return (!this.isConfirmPasswordValid() || this.state.password.length < 1)\r\n    }\r\n\r\n    render() {\r\n        let passwordChangeRequired = localStorage.getItem(\"PasswordChangeRequired\") == \"true\";\r\n\r\n        return (\r\n            <div className=\"container\">\r\n                <div className=\"row\">\r\n                    <div className=\"col-12\">\r\n                        <h1>Account Settings</h1>\r\n                    </div>\r\n                </div>\r\n                {passwordChangeRequired && <div className=\"row\">\r\n                    <div className=\"col-12\">\r\n                        <span className=\"text-danger\">Your password was recently reset. You will need to change your password before accessing other functionality.</span>\r\n                    </div>\r\n                </div>}\r\n                <div className=\"row accountInfo\">\r\n                    <div className=\"col-5\">\r\n                        <h4>Organization Information</h4>\r\n                    </div>\r\n                    <div className=\"col-7\">\r\n                        <div><label>Cannabis Number:</label><span>{this.state.userInfo.cnNumber}</span></div>\r\n                        <div><label>Name:</label><span>{this.state.userInfo.username}</span></div>\r\n                    </div>\r\n                </div>\r\n                <div className=\"row accountInfo\">\r\n                    <div className=\"col-5\">\r\n                        <h4>Login Information</h4>\r\n                    </div>\r\n                    <div className=\"col-7\">\r\n                        <div><label>Account Number:</label><span>{this.state.userInfo.id}</span></div>\r\n                        <div><label>This Session Signed On:</label><span>{this.state.userInfo.lastSignOn ? this.state.userInfo.lastSignOn.toLocaleString() : \"\"}</span></div>\r\n                        <div><label>Your Previous Sign-On:</label><span>{this.state.userInfo.previousSignOn ? this.state.userInfo.previousSignOn.toLocaleString() : \"\" }</span></div>\r\n                        <div><label>Recent Failed Attempts:</label><span>{this.state.userInfo.failedAttemptCount}</span></div>\r\n                        <div><label>Password Last Changed:</label><span>{this.state.userInfo.lastChanged ? this.state.userInfo.lastChanged.toLocaleString() : \"\"}</span></div>\r\n                        <div><label>Password Expires (Days):</label><span>{this.state.userInfo.expiry ? (Math.round((this.state.userInfo.expiry - (new Date())) / (1000 * 60 * 60 * 24)) + \" Days\") : \"\"}</span></div>\r\n                    </div>\r\n                </div>\r\n                {this.state.confirmingMFA ?\r\n                    <div className=\"row accountInfo confirmMFADialog\">\r\n                        <div>\r\n                            <h4>Verify Multi Factor Auth</h4>\r\n                            <br />\r\n                            <p>A code has been sent to you - please enter it below to verify you received it. If you did not receive a code, please press cancel and verify your information</p>\r\n                            <label>Enter your code:</label>\r\n                            <input type=\"text\" className=\"form-control\" name=\"mfaConfirm\" onChange={this.handleChanged} value={this.state.mfaConfirm} placeholder=\"Enter MFA Code Sent\" />\r\n                            <br />\r\n                            <input type=\"submit\" className=\"btn btn-orange\" disabled={!this.confirmedMFA()} onClick={this.submitMFAUpdate} />\r\n                            <input type=\"button\" className=\"btn btn-orange\" value=\"Cancel\" onClick={this.cancelMFAVerify}></input>\r\n                        </div>\r\n                    </div> :\r\n                    <form onSubmit={this.handleMFASubmit} className=\"mfaInfo\">\r\n                        <div className=\"row accountInfo\">\r\n                            <div className=\"col-12\">\r\n                                <h4 >Multi Factor Authentication</h4>\r\n                            </div>\r\n                            <div className=\"col-5\">\r\n                                <label className=\"form-control-label authTitle\">Authentication Method</label>\r\n                                <ul>\r\n                                    {[\"None\", \"Email\", \"SMS\"].map(a => { return <li key={a} ><label><input type=\"radio\" value={a} name=\"mfaMode\" onChange={this.handleMFAChanged} checked={a == this.state.userInfo.mfaMode} />{a}</label></li> })}\r\n                                </ul>\r\n                            </div>\r\n                            <div className=\"col-7\">\r\n                                <label className=\"form-control-label\">Email or SMS:&nbsp;</label>\r\n                                <input\r\n                                    value={this.state.userInfo.multiFactorContact}\r\n                                    name=\"multiFactorContact\"\r\n                                    className={classNames({\r\n                                        'form-control': true,\r\n                                        'is-valid': this.isMFAValid(),\r\n                                        'is-invalid': !this.isMFAValid()\r\n                                    })}\r\n                                    placeholder=\"Contact for MFA\"\r\n                                    onChange={this.handleMFAChanged}\r\n                                    required={this.state.userInfo.mfaMode !== \"None\"}\r\n                                />\r\n                                <div className=\"invalid-feedback\">\r\n                                    {this.state.mfaErrors.map(item => <div key={item}>{item}</div>)}\r\n                                </div>\r\n                                <button type=\"submit\" className=\"btn btn-orange btn-block\" disabled={!this.isMFAValid()}>Update 2FA</button>\r\n                            </div>\r\n                            <div className=\"col-12\">\r\n                            </div>\r\n                        </div>\r\n                    </form>}\r\n                <div className=\"row\">\r\n                    <div className=\"col-5\">\r\n                        <h4>Change your Password</h4>\r\n                        <ul>\r\n                            <li>Passwords must be at least 8 characters long</li>\r\n                            <li>It must contain at least:\r\n                                <ul>\r\n                                    <li>1 uppercase letter</li>\r\n                                    <li>1 lowercase letter</li>\r\n                                    <li>1 number</li>\r\n                                    <li>1 special character.</li>\r\n                                    <li>no spaces</li>\r\n                                    <li>Not been previously used</li>\r\n                                </ul>\r\n                            </li>\r\n                        </ul>                            \r\n                    </div>\r\n                    <div className=\"col-7\">\r\n                        <form onSubmit={this.handleSubmit}>\r\n                            <div className=\"form-group\">\r\n                                <label htmlFor=\"currentPassword\" className=\"form-control-label\">\r\n                                    Current Password\r\n                                </label>\r\n                                <input\r\n                                    value={this.state.currentPassword}\r\n                                    name=\"currentPassword\"\r\n                                    type=\"password\"\r\n                                    id=\"currentPassword\"\r\n                                    className={classNames({\r\n                                        'form-control': true,\r\n                                    })}\r\n                                    placeholder=\"Current Password\"\r\n                                    onChange={this.handleChanged}\r\n                                    required\r\n                                />\r\n                                <div className=\"invalid-feedback\">\r\n                                    Your passwords must match.\r\n                                </div>\r\n                            </div>\r\n                            <div className=\"form-group\">\r\n                                <label htmlFor=\"inputPassword\" className=\"form-control-label\">\r\n                                    New Password\r\n                                </label>\r\n                                <input\r\n                                    value={this.state.password}\r\n                                    name=\"password\"\r\n                                    type=\"password\"\r\n                                    id=\"inputPassword\"\r\n                                    className={classNames({\r\n                                        'form-control': true,\r\n                                        'is-valid': this.isPasswordValid(),\r\n                                        'is-invalid': !this.isPasswordValid()\r\n                                    })}\r\n                                    placeholder=\"Password\"\r\n                                    onChange={this.handleChanged}\r\n                                    required\r\n                                />\r\n                                <div className=\"invalid-feedback\">\r\n                                    {this.state.errors.map(item => <div key={ item }>{item}</div>) }\r\n                                </div>\r\n                            </div>\r\n                            <div className=\"form-group\">\r\n                                <label htmlFor=\"confirmPassword\" className=\"form-control-label\">\r\n                                    Confirm New Password\r\n                                </label>\r\n                                <input\r\n                                    value={this.state.confirmPassword}\r\n                                    name=\"confirmPassword\"\r\n                                    type=\"password\"\r\n                                    id=\"confirmPassword\"\r\n                                    className={classNames({\r\n                                        'form-control': true,\r\n                                        'is-valid': this.isConfirmPasswordValid(),\r\n                                        'is-invalid': !this.isConfirmPasswordValid()\r\n                                    })}\r\n                                    placeholder=\"Confirm Password\"\r\n                                    onChange={this.handleChanged}\r\n                                    required\r\n                                />\r\n                                <div className=\"invalid-feedback\">\r\n                                    Your passwords must match.\r\n                                </div>\r\n                            </div>\r\n                            <div className=\"form-group\">\r\n                                <button type=\"submit\" className=\"btn btn-orange btn-block\" disabled={this.isButtonDisabled()}>Change Password</button>\r\n                            </div>\r\n                        </form>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\n\r\nexport default withRouter(AccountSettings);\r\n","import React from 'react'\r\nimport { Redirect } from 'react-router-dom'\r\n\r\nimport { Routes } from '../App'\r\nimport Auth from '../services/Auth'\r\n\r\nconst SignOut = () => {\r\n  if (Auth.isSignedInIn()) {\r\n    Auth.signOut();\r\n  }\r\n  return <Redirect to={Routes.SignIn} push />;\r\n}\r\n\r\nexport default SignOut\r\n","import React from 'react'\r\nimport {Link} from 'react-router-dom'\r\nimport { Routes } from '../App'\r\n\r\ninterface Props {\r\n  message: string\r\n  initials: string\r\n  userRole: string\r\n  onSignout: () => void\r\n}\r\n\r\nconst NavHeaderLayout = (props: Props) => {\r\n  return (\r\n    <nav className=\"navbar navbar-expand-lg navbar-light bg-light\">\r\n      <Link className=\"navbar-brand\" to={Routes.Home}></Link>\r\n      <button\r\n        className=\"navbar-toggler\"\r\n        type=\"button\"\r\n        data-toggle=\"collapse\"\r\n        data-target=\"#navbarText\"\r\n        aria-controls=\"navbarText\"\r\n        aria-expanded=\"false\"\r\n        aria-label=\"Toggle navigation\">\r\n        <span className=\"navbar-toggler-icon\"></span>\r\n      </button>\r\n      <div className=\"collapse navbar-collapse\" id=\"navbarText\">\r\n        <ul className=\"navbar-nav mr-auto\">\r\n          <li className=\"nav-item active\"></li>\r\n        </ul>\r\n        <span className=\"navbar-text\">\r\n          <div className=\"info\">\r\n            <div className=\"welcome\">{props.message}</div>\r\n            <div>\r\n              {props.userRole && (\r\n                <span className=\"btn btn-link\" style={{color: 'black'}}>\r\n                  {`Signed in as: ${props.userRole.toUpperCase()}`}\r\n                </span>\r\n              )}\r\n              {props.userRole && <span className=\"divider\">|</span>}\r\n              <Link className=\"btn btn-link\" to={Routes.AccountSettings}>\r\n                Account Settings\r\n              </Link>\r\n              <span className=\"divider\">|</span>\r\n              <Link className=\"btn btn-link\" to={Routes.Contact}>\r\n                Contact Us\r\n              </Link>\r\n              <span className=\"divider\">|</span>\r\n              <Link className=\"btn btn-link\" to={Routes.SignOut}>\r\n                Logout\r\n              </Link>\r\n            </div>\r\n          </div>\r\n          <div className=\"circle\">\r\n            <div>{props.initials}</div>\r\n          </div>\r\n        </span>\r\n      </div>\r\n    </nav>\r\n  )\r\n}\r\n\r\nexport default NavHeaderLayout\r\n","import React, { useState } from 'react'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\nimport classNames from 'classnames'\r\nimport { Link } from 'react-router-dom'\r\nimport Auth from '../services/Auth'\r\nimport { Routes } from '../App'\r\n\r\ninterface Props {\r\n  mode: string\r\n}\r\n\r\nconst ActionRequestNotification = (props: Props) => {\r\n  const [daysToExpiry, setDaysToExpiry] = React.useState(999)\r\n  const [type, setType] = React.useState(\"\")\r\n  const [text, setText] = React.useState(\"\")\r\n  const [actionLinkText, setActionLinkText] = React.useState(\"\")\r\n  const [actionLinkUrl, setActionLinkUrl] = React.useState(\"\")\r\n  const [cookieSet, setCookieSet] = React.useState(false)\r\n  const threshold = 15;\r\n\r\n  React.useEffect(() => {\r\n    switch (props.mode) {\r\n      case \"PasswordExpiry\":\r\n        Auth.getLoggedInUserInfo().then((result) => {\r\n          if (result && result.expiry) {\r\n            var currDay = new Date();\r\n            const diffTime = Number(result.expiry) - Number(currDay);\r\n            const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\r\n\r\n            setDaysToExpiry(diffDays);\r\n            setType(\"warning\");\r\n            setText(`Your password will expire in ${diffDays} days`);\r\n            setActionLinkText(\"Please reset your password here\");\r\n            setActionLinkUrl(Routes.AccountSettings);\r\n\r\n\r\n            var cookies = document.cookie;\r\n            setCookieSet(cookies.indexOf(\"CC_Hide_PwdNotification=true\") >= 0);\r\n\r\n          }\r\n        });\r\n\r\n        break;\r\n    }\r\n  }, [props.mode]);\r\n\r\n  var setCookie = () => {\r\n    var cookieExpiry = new Date();\r\n    cookieExpiry.setDate(cookieExpiry.getDate() + 1);\r\n    document.cookie = \"CC_Hide_PwdNotification=true; expires=\" + cookieExpiry.toUTCString() + \";path=/\";\r\n    setCookieSet(true);\r\n  }\r\n\r\n  return (\r\n    <div style={{ width: \"100%\" }}\r\n      className={\r\n        classNames({\r\n          alert: true,\r\n          ['alert-' + type]: true,\r\n          'alert-dismissable': true,\r\n          'fade': true,\r\n          show: !cookieSet && (daysToExpiry < threshold)\r\n        })\r\n      }\r\n      role=\"alert\">\r\n      {text}&nbsp;\r\n      {actionLinkText && actionLinkUrl && <Link to={actionLinkUrl}>{actionLinkText}</Link>}\r\n      <button\r\n        type=\"button\"\r\n        className=\"close\"\r\n        data-dismiss=\"alert\"\r\n        aria-label=\"Close\"\r\n        onClick={setCookie}>\r\n        <FontAwesomeIcon icon=\"times\" />\r\n      </button>\r\n    </div>\r\n  )\r\n}\r\n\r\nexport default ActionRequestNotification\r\n","import React, {useState} from 'react'\r\nimport {Redirect} from 'react-router-dom'\r\n\r\nimport NavHeaderLayout from './NavHeaderLayout'\r\nimport Auth from '../services/Auth'\r\nimport './NavHeader.scss'\r\nimport RoleContext, { getRoleLabel } from '../signin/RoleContext'\r\nimport { Routes } from '../App'\r\nimport ActionRequestNotification from '../actionRequired/ActionRequestNotification'\r\n\r\n//import SessionExpiryModal from '../SessionExpiryModal';\r\n\r\n\r\n\r\nconst NavHeader = () => {\r\n  const [loggedOut, setLoggedOut] = useState(false)\r\n\r\n  const getWelcomeMessage = () => {\r\n    let msg = ''\r\n    const firstName = Auth.getFirstName()\r\n    if (firstName) {\r\n      msg = 'Welcome back, ' + firstName\r\n    } else {\r\n      msg = 'Hello!'\r\n    }\r\n    return msg\r\n  }\r\n\r\n  const getInitials = () => {\r\n    let initials = ''\r\n    const firstName = Auth.getFirstName()\r\n    const lastName = Auth.getLastName()\r\n\r\n    if (firstName) {\r\n      initials += firstName.charAt(0)\r\n    }\r\n    if (lastName) {\r\n      initials += lastName.charAt(0)\r\n    }\r\n\r\n    return initials\r\n  }\r\n\r\n  const signOut = () => {\r\n    setLoggedOut(true)\r\n  }\r\n\r\n  if (loggedOut) {\r\n    return <Redirect to={Routes.SignOut} />\r\n  }\r\n\r\n  return (\r\n    <div>\r\n      <ActionRequestNotification mode=\"PasswordExpiry\" />\r\n      {/*<SessionExpiryModal /> */}\r\n      <RoleContext.Consumer>\r\n        {({role}) => {\r\n          return (\r\n            <NavHeaderLayout\r\n              message={getWelcomeMessage()}\r\n              initials={getInitials()}\r\n              onSignout={signOut}\r\n              userRole={getRoleLabel(role)}\r\n            />\r\n          )\r\n        }}\r\n      </RoleContext.Consumer>\r\n    </div>\r\n  )\r\n}\r\n\r\nexport default NavHeader\r\n","import RestUtilities from \"./Base\";\r\nimport { LP as LPType } from \"../lpLoader/LPContext\";\r\n\r\nexport default class LP {\r\n  static getList() {\r\n    return RestUtilities.get(\"/api/account/lp/list/\").then((response) => {\r\n      return response;\r\n    });\r\n  }\r\n\r\n  static GetFromSession(): LPType | null {\r\n    var currLP = sessionStorage.getItem('currentLP');\r\n    var parsed: LPType | null = null;\r\n\r\n    if (currLP) {\r\n      parsed = JSON.parse(currLP);\r\n    }\r\n\r\n\r\n    return parsed;\r\n  }\r\n\r\n  static SetInSession(currVal: LPType): void {\r\n    sessionStorage.setItem('currentLP', JSON.stringify(currVal));\r\n  }\r\n}\r\n","import React from 'react'\r\nimport classNames from 'classnames'\r\n\r\nimport Loading from '../loading/Loading'\r\nimport { NONE_SELECTED } from '../select'\r\nimport { LP } from './LPContext'\r\n\r\nimport './lpLoader.scss'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\n\r\ninterface Props {\r\n  lps: LP[]\r\n  disabled: boolean\r\n  loading: boolean\r\n  done: boolean\r\n  errorMsg: string\r\n  selectedLP: string\r\n  handleSelected: (e: React.ChangeEvent<HTMLSelectElement>) => void\r\n  setConfirmed: (confirmed: boolean) => void\r\n  confirmed: boolean\r\n}\r\n\r\nconst LPLoaderView = (props: Props) => {\r\n  let lpOptions = [\r\n    <option key={NONE_SELECTED} value={NONE_SELECTED}>\r\n      {'Select an LP ...'}\r\n    </option>,\r\n  ]\r\n  \r\n  const sortedLps  = props.lps.sort((lp1, lp2) => {\r\n    return lp1.id - lp2.id;\r\n  });\r\n\r\n  const confirm = () => props.setConfirmed(true);\r\n  const unconfirm = () => props.setConfirmed(false);\r\n\r\n  for (let i = 0; i < props.lps.length; i++) {\r\n    lpOptions.push(\r\n      <option key={i + 1} value={i}>\r\n        {`${sortedLps[i].id} - ${sortedLps[i].name}`}\r\n      </option>\r\n    )\r\n  }\r\n\r\n  return (\r\n    <div className=\"row\">\r\n      <div className=\"col-5\">\r\n        <div className=\"form-group\">\r\n          <label htmlFor=\"LP\">Select LP</label>\r\n          <select\r\n            required\r\n            name=\"LP\"\r\n            className={classNames({\r\n              'form-control': true,\r\n              'd-none': props.loading,\r\n            })}\r\n            disabled={\r\n              props.disabled || !props.done || props.loading || props.confirmed\r\n            }\r\n            value={props.selectedLP}\r\n            onChange={props.handleSelected}\r\n          >\r\n            {lpOptions}\r\n          </select>\r\n\r\n          <Loading show={props.loading} />\r\n          {props.errorMsg && (\r\n            <span className=\"text-danger\">{props.errorMsg}</span>\r\n          )}\r\n        </div>\r\n      </div>\r\n      <div className=\"col-7\">\r\n        <div className=\"confirm\">\r\n          <button\r\n            className={classNames({\r\n              'btn btn-orange': true,\r\n              'd-none': props.confirmed,\r\n            })}\r\n            disabled={\r\n              props.disabled ||\r\n              !props.done ||\r\n              props.loading ||\r\n              props.confirmed ||\r\n              props.selectedLP === NONE_SELECTED\r\n            }\r\n            onClick={confirm}\r\n          >\r\n            Select LP\r\n          </button>\r\n          <button\r\n            className={classNames({\r\n              'btn btn-link': true,\r\n              'd-none': !props.confirmed,\r\n            })}\r\n            disabled={!props.confirmed}\r\n            onClick={unconfirm}\r\n          >\r\n            <FontAwesomeIcon icon=\"edit\" />\r\n            &nbsp;Change LP\r\n          </button>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  )\r\n}\r\n\r\nexport default LPLoaderView\r\n","import React, { useState, useEffect, useContext, Context } from 'react'\r\nimport { useHistory } from 'react-router-dom'\r\n\r\nimport { default as LPService } from '../services/LP'\r\nimport LPContext, { LP, DEFAULT_LP, LPContextInterface } from './LPContext'\r\nimport { NONE_SELECTED } from '../select'\r\nimport LPLoaderView from './lpLoaderView'\r\nimport { Routes } from '../App'\r\n\r\ninterface Props {\r\n  default?: string\r\n  disabled: boolean\r\n  handleSelected: (lp: LP) => void\r\n}\r\n\r\nconst LPLoader = (props: Props) => {\r\n  const [loading, setLoading] = useState(false)\r\n  const [done, setDone] = useState(false)\r\n  const [confirmed, setConfirmed] = useState(false)\r\n  const [selected, setSelected] = useState(NONE_SELECTED)\r\n  const [errorMsg, setErrorMsg] = useState('')\r\n  const [LPs, setLPs] = useState<LP[]>([])\r\n\r\n  const history = useHistory()\r\n  const lpContext : LPContextInterface = useContext(LPContext)\r\n\r\n  const handleSelected = (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n    let index: any = e.target.value // TODO: probably shouldn't be any type\r\n    if (index !== NONE_SELECTED) {\r\n      setSelected(index)\r\n    }\r\n  }\r\n\r\n  useEffect(() => {\r\n    if (confirmed) {\r\n      confirm();\r\n    } else {\r\n      unconfirm();\r\n    }\r\n  }, [confirmed])\r\n\r\n  const confirm = () => {\r\n    props.handleSelected(LPs[selected as any]);\r\n    LPService.SetInSession(LPs[selected as any]);\r\n  }\r\n\r\n  const unconfirm = () => {\r\n    setSelected(NONE_SELECTED)\r\n    lpContext.setLP(DEFAULT_LP)\r\n    props.handleSelected(DEFAULT_LP)\r\n\r\n    history.push(Routes.Home)\r\n  }\r\n\r\n  const load = async () => {\r\n    //get from cookie\r\n    let selectedLP = LPService.GetFromSession();\r\n\r\n    if (props.default && !selectedLP) {\r\n      setSelected(props.default)\r\n    } else {   \r\n      setErrorMsg('')\r\n      setLoading(true)\r\n      setDone(false)\r\n\r\n      const response = await LPService.getList()\r\n\r\n      setLoading(false)\r\n\r\n      if (response.is_error) {\r\n        setErrorMsg(response.error_content)\r\n      } else {\r\n        let lps = new Set<LP>()\r\n        let selectedLpId = null;\r\n\r\n        if (lpContext.LP.id !== DEFAULT_LP.id) {\r\n          selectedLpId = lpContext.LP.id;\r\n        } else if (selectedLP != null) {\r\n          selectedLpId = selectedLP.id;\r\n        }\r\n\r\n        for (let i = 0; i < response.content.value.length; i++) {\r\n          lps.add(response.content.value[i]);         \r\n        }\r\n\r\n        const sortedLps = Array.from(lps).sort((lp1, lp2) => {\r\n            return lp1.id - lp2.id;\r\n        });\r\n\r\n        let selectedIndex = -1;\r\n        if (selectedLpId != null) {\r\n          for (let j = 0; j < sortedLps.length; j++) {\r\n            if (sortedLps[j].id === selectedLpId) {\r\n              selectedIndex = j;\r\n              setSelected((j).toString());\r\n              break;\r\n            }\r\n          }\r\n        }        \r\n\r\n        setLPs(sortedLps)\r\n        setDone(true)\r\n\r\n        if (selectedIndex > -1) {\r\n          setConfirmed(true);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  const doLoad = () => {\r\n    //lpContext.setLP(DEFAULT_LP);\r\n    load()\r\n  }\r\n\r\n  useEffect(doLoad, [])\r\n\r\n  return (\r\n    <LPLoaderView\r\n      lps={LPs}\r\n      selectedLP={selected}\r\n      disabled={props.disabled}\r\n      handleSelected={handleSelected}\r\n      loading={loading}\r\n      done={done}\r\n      errorMsg={errorMsg}\r\n      confirmed={confirmed}\r\n      setConfirmed={setConfirmed}\r\n    />\r\n  )\r\n}\r\n\r\nexport default LPLoader\r\n","import React, { useState, useEffect } from 'react'\r\nimport Alert from '../alert/Alert';\r\nimport { useHistory } from 'react-router-dom';\r\n\r\ninterface Props {    \r\n    \r\n}\r\n\r\nconst useTimeout = () => {\r\n    let history = useHistory();\r\n\r\n    const idleCountKey = 'IdleCount';\r\n    localStorage.setItem(idleCountKey, (0 as any));\r\n\r\n    let [displayWarning, setDisplayWarning] = useState(false);\t\r\n\r\n    function resetTimeOut() {\r\n        localStorage.setItem(idleCountKey, (0 as any));\r\n        setDisplayWarning(false);\r\n    }\r\n\r\n    function incrementTimeOut() {\r\n        let currentCount = parseInt(localStorage.getItem(idleCountKey) as string);\r\n        currentCount += 1;\r\n        if (currentCount > 29) {\r\n            history.push('/signout');\r\n        } else if (currentCount > 24) {\r\n            setDisplayWarning(true);\r\n        }\r\n        localStorage.setItem(idleCountKey, (currentCount as any));\r\n    }\r\n\r\n    useEffect(() => {\r\n        document.addEventListener('mousemove', resetTimeOut);  \r\n\t    setInterval(incrementTimeOut, 60000);\r\n    }, []);\r\n\r\n    return displayWarning;\r\n}\r\n\r\nconst Timeout = (props: Props) => {\r\n    let displayWarning = useTimeout();\r\n\r\n    return (\r\n        <>\r\n            {displayWarning &&\r\n                <Alert\r\n\t\t\t\t\ttext={\"You have been inactive for 25 minutes. If no activity is detected within the next 5 minutes your session will be ended.\"}\r\n\t\t\t\t\ttype={'danger'}\r\n            />}\r\n\t\t</>\r\n    )\r\n}\r\n\r\nexport default Timeout\r\n","import React, { Component, useState } from 'react'\r\nimport { Switch, Route, useLocation, Redirect } from 'react-router-dom'\r\nimport ReactGA from 'react-ga'\r\nimport classNames from 'classnames'\r\nimport { library } from '@fortawesome/fontawesome-svg-core'\r\nimport {\r\n  faSpinner,\r\n  faTrashAlt,\r\n  faTimes,\r\n  faEdit,\r\n  faFileAlt,\r\n  faCopy,\r\n  faUpload,\r\n} from '@fortawesome/free-solid-svg-icons'\r\n\r\nimport { DefaultLayout } from './Layout'\r\nimport ContactInfo from './contactInfo/ContactInfo';\r\nimport SignIn from './signin/SignIn'\r\nimport ASNList from './asnList/ASNList'\r\nimport LotCodeManager from './lotCodeManager/lotCodeManager'\r\n\r\nimport { ASNFormCreate } from './asnForm/ASNFormCreate'\r\nimport { ASNFormAmend } from './asnForm/ASNFormAmend'\r\nimport { ASNFormView } from './asnForm/ASNFormView'\r\nimport AccountSettings from './settings/AccountSettings'\r\nimport RoleContext, { USER_ROLE } from './signin/RoleContext'\r\n\r\nimport LPContext, { DEFAULT_LP } from './lpLoader/LPContext'\r\nimport SignOut from './signout/SignOut'\r\nimport NavHeader from './header/NavHeader'\r\nimport Auth from './services/Auth'\r\nimport LPLoader from './lpLoader/lpLoader'\r\nimport Timeout from './timeout/timeout'\r\n//import Test from './_test/Test'\r\n//import NoRoute from './noRoute/noRoute'\r\n\r\nReactGA.initialize('UA-153581572-1')\r\nlibrary.add(faSpinner, faTrashAlt, faTimes, faEdit, faFileAlt, faCopy, faUpload)\r\n\r\nconst usePageViews = () => {\r\n  let location = useLocation()\r\n  React.useEffect(() => {\r\n    ReactGA.pageview(location.pathname + location.search)\r\n  }, [location])\r\n}\r\n\r\nexport const Routes = {\r\n  SignIn: '/signin',\r\n  SignOut: '/signout',\r\n  Contact: '/contact',\r\n  AccountSettings: '/settings',\r\n\r\n  Home: '/asn',\r\n  LotCode: '/asn/:LPid/lotCodes',\r\n  AsnCreate: '/asn/create/:LPid/',\r\n  AsnView: '/asn/view/:LPid/:POid/:DocumentNumber',\r\n  AsnAmend: '/asn/amend/:LPid/:POid/:DocumentNumber',\r\n}\r\n\r\nconst App = () => {\r\n  usePageViews()\r\n\r\n  const [role, setRole] = useState<USER_ROLE>(USER_ROLE.NOT_SET)\r\n  const [LP, setLP] = useState(DEFAULT_LP)\r\n\r\n  // if no token exists(ie. logged out), reset role and LP\r\n  let token = Auth.getToken()\r\n  if(!token && role !== USER_ROLE.NOT_SET) {\r\n    setRole(USER_ROLE.NOT_SET)\r\n    setLP(DEFAULT_LP)\r\n  }\r\n\r\n  // get user role and LP if not already in context\r\n  if (role === USER_ROLE.NOT_SET) {\r\n    if (token) {\r\n      let roleFromToken = Auth.getRole(token)\r\n      if (\r\n        roleFromToken === USER_ROLE.ADMIN ||\r\n        roleFromToken === USER_ROLE.AGLC ||\r\n        roleFromToken === USER_ROLE.DEFAULT\r\n      ) {\r\n        setRole(roleFromToken)\r\n      }\r\n\r\n      if (roleFromToken === USER_ROLE.DEFAULT) {\r\n        setLP(Auth.getLP(token))\r\n      } \r\n    }\r\n  }\r\n\r\n  let requiresLPLoader = (role === USER_ROLE.ADMIN || role === USER_ROLE.AGLC);\r\n\r\n  let passwordChangeRequired = localStorage.getItem(\"PasswordChangeRequired\") == 'true';\r\n\r\n  return (\r\n      <RoleContext.Provider\r\n        value={{\r\n          role: role,\r\n          setRole: setRole,\r\n        }}\r\n      >\r\n        <LPContext.Provider\r\n          value={{\r\n            LP: LP,\r\n            setLP: setLP,\r\n          }}\r\n        >\r\n          {/* If not authenticated, all routes go to sign in page */}\r\n          {!Auth.isSignedInIn() && (\r\n            <Switch>\r\n              <Route path={Routes.SignOut} component={SignOut} />\r\n              <Route>\r\n              <DefaultLayout>\r\n                  <Route path={'*'} component={SignIn} />\r\n                </DefaultLayout>\r\n              </Route>\r\n            </Switch>\r\n          )}        \r\n\r\n          {Auth.isSignedInIn() && (\r\n            <>\r\n              <Timeout />\r\n              <NavHeader />\r\n\r\n              {passwordChangeRequired && (\r\n                  <Switch>\r\n                      <Route path={Routes.SignOut} component={SignOut} />\r\n                      <Route>\r\n                          <DefaultLayout>\r\n                              <Route path={'*'} component={AccountSettings} />\r\n                          </DefaultLayout>\r\n                      </Route>\r\n                  </Switch>\r\n              )}\r\n\r\n                {/* Routes that require an LP are prefixed with /asn/*/}\r\n              {!passwordChangeRequired && (\r\n                  <>\r\n                    <Switch>\r\n                      <Route path={'*'} children={({ match }) => (\r\n                        requiresLPLoader && (\r\n                          <div className={classNames({ container: true, lpContainer: true, 'd-none': !match?.url.startsWith('/asn')})}>\r\n                            <LPLoader disabled={false} handleSelected={setLP} />\r\n                          </div>\r\n                        )\r\n                      )} />\r\n                    </Switch>\r\n\r\n                    <Switch>\r\n\r\n                      <Route path=\"/asn/\">\r\n                        <DefaultLayout>\r\n                          <Switch>\r\n                            <Route path={Routes.LotCode} component={LotCodeManager} />\r\n                            <Route path={Routes.AsnCreate} component={ASNFormCreate} />\r\n                            <Route path={Routes.AsnAmend} component={ASNFormAmend} />\r\n                            <Route path={Routes.AsnView} component={ASNFormView} />\r\n                            <Route exact path={Routes.Home} component={ASNList} />\r\n                          </Switch>\r\n                        </DefaultLayout>\r\n                      </Route>\r\n                      <DefaultLayout>\r\n                        <Route\r\n                          path={Routes.AccountSettings}\r\n                          component={AccountSettings}\r\n                        />\r\n                        <Route path={Routes.SignOut} component={SignOut} />\r\n                        <Route path={Routes.Contact} component={ContactInfo} />\r\n                        <Route\r\n                          exact\r\n                          path={'/'}\r\n                          component={() => <Redirect to={Routes.Home} />}\r\n                        />                        \r\n                        {/*\r\n                        <Route path=\"/test\" component={Test} />\r\n                        <Route component={NoRoute} />\r\n                        */}\r\n                      </DefaultLayout>\r\n                    </Switch>\r\n                  </>\r\n               )}\r\n            </>\r\n          )}\r\n        </LPContext.Provider>\r\n      </RoleContext.Provider>\r\n    \r\n  )\r\n}\r\n\r\nexport default App\r\n","// 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","import 'react-app-polyfill/ie11'\r\nimport 'react-app-polyfill/stable'\r\n\r\nimport 'bootstrap/dist/css/bootstrap.css'\r\nimport React from 'react'\r\nimport ReactDOM from 'react-dom'\r\nimport { BrowserRouter } from 'react-router-dom'\r\nimport App from './App'\r\nimport registerServiceWorker from './registerServiceWorker'\r\n\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href')\r\nconst rootElement = document.getElementById('root')\r\n\r\nReactDOM.render(\r\n  <BrowserRouter basename={baseUrl ? baseUrl : undefined}>\r\n    <App />\r\n  </BrowserRouter>,\r\n  rootElement\r\n)\r\n\r\nregisterServiceWorker()\r\n"],"sourceRoot":""}