{"version":3,"sources":["stores/lis-journal-store.js","stores/lis-print-store.js","lis-shared/tinymce/lineNumberPlugin.js","lis-shared/tinymce/copyHeadStylePlugin.js","lis-shared/tinymce/rejectedButtonPlugin.js","lis-shared/tinymce/agreedButtonPlugin.js","lis-shared/tinymce/createAmendmentPlugin.js","lis-admin/lis-version-management/components/lis-review.js","services/request.service.js","services/json-to-html.js","lis-admin/lis-version-management/components/lis-amendments.js","lis-admin/lis-version-management/components/lis-version-management.js","lis-admin/lis-version-management/components/lis-bill-grid.js","lis-admin/lis-version-management/components/lis-selectors.js","lis-admin/lis-version-management/components/lis-bill-preview.js","lis-admin/lis-version-management/components/lis-text-list.js","stores/lis-nav-store.js","stores/lis-session-store.js","lis-shared/lis-layout/components/lis-forms-component.js","lis-shared/tinymce/rightMarginPlugin.js","stores/lis-legislation-store.js","authConfig.js","stores/lis-auth-store.js","lis-shared/lis-login/components/lis-house-login-button.js","lis-shared/lis-login/components/lis-login-form.js","lis-shared/lis-layout/components/lis-house-logout-button.js","lis-shared/lis-layout/components/lis-profile-component.js","lis-shared/lis-layout/components/lis-submenu-component.js","lis-shared/lis-layout/components/lis-global-search-input-component.js","lis-shared/lis-layout/components/lis-nav-component.js","lis-shared/lis-layout/components/lis-session-selector.js","lis-shared/lis-layout/components/lis-popup-component.js","lis-shared/lis-layout/components/lis-toast-component.js","lis-shared/lis-layout/components/lis-icon-links-component.js","lis-shared/lis-layout/components/lis-layout-component.js","stores/lis-user-store.js","lis-shared/lis-login/components/lis-create-account-form.js","lis-shared/lis-login/components/lis-register-account-form.js","lis-shared/lis-login/components/lis-forgot-password-form.js","lis-shared/lis-login/components/lis-change-password-form.js","lis-admin/lis-member-management/components/lis-member-grid.js","lis-admin/lis-member-management/components/lis-contact-form.js","lis-admin/lis-member-management/components/lis-user-creation.js","lis-admin/lis-member-management/components/lis-member-form.js","lis-admin/lis-member-management/components/lis-member-management.js","lis-admin/lis-session-management/components/lis-session-grid.js","lis-admin/lis-session-management/components/lis-session-form.js","lis-admin/lis-session-management/components/lis-session-management.js","lis-admin/lis-committee-management/components/lis-committee-grid.js","lis-admin/lis-committee-management/components/lis-committee-personnel-dnd.js","lis-admin/lis-committee-management/components/lis-committee-members-dnd.js","lis-admin/lis-committee-management/components/lis-subcommittee-grid.js","stores/lis-personnel-store.js","lis-admin/lis-committee-management/components/lis-partner-committee-details.js","lis-admin/lis-committee-management/components/lis-committee-form.js","lis-admin/lis-committee-management/components/lis-committee-management.js","services/emptyCache.js","stores/lis-calendar-store.js","stores/lis-schedule-store.js","lis-admin/lis-docket-management/components/lis-docket-grid.js","lis-admin/lis-docket-management/components/lis-committee-bills-grid.js","lis-shared/lis-dockets/lis-docket-details.js","lis-admin/lis-docket-management/components/lis-docket-patron-list.js","lis-admin/lis-docket-management/components/lis-docket-form.js","lis-admin/lis-docket-management/components/lis-docket-management.js","lis-admin/lis-calendar-management/components/lis-calendar-grid.js","lis-shared/lis-calendar/lis-agenda-items.js","lis-admin/lis-calendar-management/components/lis-house-bills-grid.js","services/csv.service.js","stores/lis-votes-store.js","stores/lis-patron-store.js","lis-shared/lis-bills/lis-bill-version-list.js","stores/lis-report-store.js","lis-public/components/lis-bill-search/lis-report-maker.js","lis-shared/lis-calendar/lis-calendar-details.js","lis-shared/lis-calendar/lis-calendar-details-printout.js","lis-admin/lis-calendar-management/components/lis-house-calendar-form.js","lis-admin/lis-calendar-management/components/lis-senate-bills-grid.js","lis-admin/lis-calendar-management/components/lis-senate-calendar-form.js","lis-admin/lis-calendar-management/components/lis-calendar-form-container.js","lis-admin/lis-calendar-management/components/lis-calendar-management.js","stores/lis-minutes-store.js","lis-admin/lis-minutes-management/components/lis-minutes-grid.js","lis-shared/lis-layout/components/lis-loader-component.js","lis-admin/lis-minutes-management/components/forms/misc.js","services/event-references-helpers.js","lis-admin/lis-minutes-management/components/input-types.js","lis-admin/lis-minutes-management/components/forms/comment-box.js","lis-admin/lis-minutes-management/components/forms/non-legislative-form.js","lis-admin/lis-minutes-management/components/forms/legislative-form.js","lis-shared/lis-minutes/lis-minutes-details.js","stores/lis-communications-store.js","lis-admin/lis-minutes-management/components/lis-minutes-form.js","lis-admin/lis-minutes-management/components/lis-minutes-management.js","lis-admin/lis-bill-management/components/event-controls.js","lis-shared/lis-search/lis-search-categories.js","lis-shared/lis-search/lis-advanced-search-box.js","lis-shared/lis-search/lis-search-selections.js","lis-public/components/lis-bill-details/lis-history-form.js","lis-shared/lis-search/lis-legislation-watchlists.js","lis-shared/lis-search/lis-collection-controls.js","stores/lis-collection-store.js","lis-shared/lis-search/lis-bill-info.js","lis-admin/lis-bill-management/components/lis-bill-management.js","lis-admin/lis-communications-management/components/lis-communications-grid.js","images/houseclerk_paulnardo.png","lis-shared/lis-communications/lis-communications-details.js","images/senateclerk_susanclarkeschaar.png","lis-admin/lis-communications-management/components/lis-bills-grid.js","lis-admin/lis-communications-management/components/lis-communications-form.js","lis-admin/lis-communications-management/components/lis-communications-management.js","lis-admin/lis-vote-management/components/lis-vote-grid.js","lis-shared/lis-votes/lis-vote-details.js","lis-admin/lis-vote-management/components/lis-vote-form.js","lis-admin/lis-vote-management/components/lis-vote-management.js","lis-admin/lis-print-management/components/lis-print-room-grid.js","lis-admin/lis-print-management/components/lis-print-management.js","lis-admin/lis-report-management/components/lis-report-management.js","lis-admin/lis-amendment-management/components/lis-bill-grid.js","lis-admin/lis-amendment-management/components/lis-selectors.js","lis-admin/lis-amendment-management/components/lis-amendment-management.js","lis-admin/lis-admin-dashboard/components/lis-admin-dashboard.js","lis-admin/lis-notifications-management/components/lis-notification-management.js","stores/lis-developers-store.js","lis-admin/lis-partner-management/components/lis-partner-grid.js","lis-admin/lis-partner-management/components/lis-partner-form.js","lis-admin/lis-partner-management/components/lis-partner-management.js","lis-admin/lis-user-management/components/lis-user-management.js","lis-public/components/lis-home/lis-public-home-search.js","lis-public/components/lis-home/lis-public-home-resources.js","lis-public/components/lis-home/lis-public-home-session-info.js","lis-public/components/lis-home/lis-public-home-schedule.js","lis-public/components/lis-home/lis-public-message-of-the-day.js","lis-public/components/lis-home/lis-public-home.js","lis-public/components/lis-public-session-list.js","lis-public/components/lis-committee/lis-public-committee-list.js","lis-public/components/lis-committee/lis-public-committee-details.js","lis-public/components/lis-committee/lis-public-meeting-details.js","lis-public/components/lis-committee/lis-public-docket-details.js","lis-public/components/lis-committee/lis-public-committee-information.js","lis-public/components/lis-public-members-list.js","lis-public/components/lis-public-member-details.js","lis-shared/lis-search/lis-watchlist-notifications.js","lis-public/components/lis-bill-search/lis-search-help.js","lis-public/components/lis-bill-search/quick-add-bills.js","lis-public/components/lis-bill-search/lis-public-bill-search.js","lis-public/components/lis-bill-search/share-report.js","lis-public/components/lis-bill-search/lis-report-bill-search.js","lis-public/components/lis-bill-search/search-translator.js","lis-public/components/lis-bill-search/shorthand-url-translator.js","stores/lis-org-store.js","lis-public/components/lis-bill-details/lis-impact-statements.js","lis-public/components/lis-bill-details/collection-notes.js","lis-public/components/lis-bill-details/lis-public-bill-details.js","lis-public/components/lis-public-vote-details.js","lis-public/components/lis-public-data-files.js","lis-public/components/lis-public-communications.js","lis-public/components/lis-public-calendar-list.js","lis-public/components/lis-public-calendar-details.js","lis-public/components/lis-public-minutes.js","lis-public/components/lis-public-minutes-details.js","lis-admin/lis-update-patronage-modal.js","services/json-to-jsx.js","lis-public/components/lis-public-full-text.js","lis-shared/lis-custom-components/lis-custom-components.js","lis-shared/lis-meetings/lis-meetings-form-component.js","lis-shared/lis-meetings/lis-meetings-calendar-preview.js","lis-public/components/lis-public-schedule.js","lis-public/components/lis-public-vote-search.js","lis-public/components/lis-public-member-legislation.js","lis-public/components/lis-public-communication-details.js","stores/lis-statistics-store.js","lis-public/components/lis-committee-statistics.js","lis-public/components/lis-session-statistics.js","lis-public/components/lis-unauthorized.js","lis-public/components/lis-watchlists.js","lis-shared/lis-profile/components/lis-profile-form.js","lis-public/components/lis-privacy.js","lis-developers/public/components/lis-developers-portal.js","lis-developers/public/components/lis-document.js","lis-developers/public/components/lis-api-key-registration.js","lis-developers/public/components/lis-api-key-confirmation.js","lis-developers/public/components/lis-terms-of-service.js","lis-developers/admin/components/lis-admin-developers-portal.js","lis-developers/admin/components/lis-admin-document.js","lis-developers/admin/components/lis-admin-docs.js","lis-public/components/lis-footer.js","lis-admin/lis-configurations/lis-configurations-table.js","lis-admin/lis-configurations/lis-calendar-configurations.js","lis-admin/lis-configurations/lis-communications-configurations.js","lis-admin/lis-configurations/lis-configurations-grid.js","lis-admin/lis-configurations/lis-configurations-management.js","lis-admin/lis-journal-management/components/lis-journal-grid.js","lis-admin/lis-journal-management/components/lis-journal-details.js","lis-admin/lis-journal-management/forms/journal-vote.js","lis-admin/lis-journal-management/components/lis-journal-form.js","lis-admin/lis-journal-management/components/lis-journal-management.js","App.js","registerServiceWorker.js","configureStore.js","index.js","reducers.js","stores/lis-committee-store.js","stores/lis-members-store.js","lis-shared/lis-layout/components/lis-popout-component.js"],"names":["API_URL","window","env","API_SERVER","journalCategoryListRequest","journalCategoryListSuccess","journalCategoryListFailure","journalListRequest","journalListSuccess","journalListFailure","journalByIdRequest","journalByIdSuccess","journalByIdFailure","journalBuildSuccess","journalBuildFailure","journalGenerationSuccess","journalGenerationFailure","journalSaveSuccess","journalSaveFailure","journalDeleteSuccess","journalDeleteFailure","receiveCategoryData","receiveCategoryDataFailure","initialState","journalCategoryList","journalCategoryMessage","journalList","journalMessage","journalById","journalByIdMessage","journalBuild","journalBuildError","journalGeneration","journalGenerationError","journalSave","journalSaveError","categoryData","categoryDataError","journalDeleteError","journalActionCreators","requestJournalCategoryList","type","isFetching","receiveJournalCategoryList","list","message","journalCategoryListError","getJournalCategories","dispatch","partnerRequest","process","REACT_APP_JOURNAL_API_URL","then","result","Promise","reject","JournalCategoryTypes","map","x","label","Name","value","JournalCategoryTypeID","name","catch","err","requestJournalList","receiveJournalList","journalListError","getJournals","params","Journals","requestJournalById","receiveJournalById","journalByIdError","getJournalById","receiveJournalBuild","buildJournal","receiveJournalGeneration","bytes","generateJournal","config","method","headers","localStorage","getItem","url","fetch","a","status","body","getReader","read","error","JSON","parse","Buffer","from","buffer","toString","text","responseText","receiveJournalSave","saveJournal","responseObj","getCategoryData","decoder","TextDecoder","decode","receiveJournalDelete","deleteJournal","reducer","state","action","Object","assign","journalDelete","printDocumentsSuccess","printDocumentsFailure","printCreateSuccess","printCreateFailure","printSaveSuccess","printSaveFailure","printParchmentEmailSuccess","batchItemCompleteSuccess","batchItemCompleteFailure","printAllEnrolledSuccess","printAllEnrolledFailure","printDocuments","printDocumentsError","printCreate","printCreateError","printSave","printSaveError","printParchmentEmail","printParchmentEmailError","batchItemComplete","batchItemCompleteError","printAllEnrolledError","printActionCreators","receivePrintDocuments","resObj","getPrintDocuments","REACT_APP_PRINT_DOCUMENTS_SERVICE","PrintBatches","receivePrintCreate","createPrintDocument","receivePrintSave","savePrintDocument","receivePrintParchmentEmail","printParchmentemailError","printParchmentError","sendParchmentEmail","receiveBatchItemComplete","completeBatchItem","receivePrintAllEnrolled","printAllEnrolled","tinymce","PluginManager","add","editor","width","linePositions","bodyHeight","container","document","createElement","lineNumberContainer","on","_e","root","contentDocument","activeElement","scrollHeight","update","contentWindow","onscroll","scrollNumbers","style","margin","marginLeft","overflow","position","appendChild","contentAreaContainer","scrollTop","scrollY","childNodes","forEach","rootChild","clonedRootChild","cloneNode","insertBefore","oldDisplay","display","tagNewLines","removeChild","height","scrollingElement","bodyFontSize","getComputedStyle","getPropertyValue","innerText","beginDrawing","i","length","lineNumber","fontWeight","fontSize","top","node","oldLocation","atBillNumber","atGovernorsActions","child","includes","nodeName","testNode","nodeVal","nodeValue","innerHTML","replace","testChild","rect","getBoundingClientRect","location","bottom","push","parentNode","classList","head","querySelectorAll","element","newEl","attributes","rel","addedStyles","intialValue","hasFocus","e","points","elementsFromPoint","y","selection","select","collapse","getButton","buttonText","intialText","onAction","fire","toolbarKey","items","ui","registry","addMenuButton","callback","addNestedMenuItem","getSubmenuItems","addContextForm","scope","initValue","launch","commands","formApi","getValue","insertContent","hide","addButton","addMenuItem","selections","members","getParam","committees","addAmendmentCallback","userChamber","billNumber","allowGovernorAmendmentSponsor","amendmentOrigin","sponsor","member","committee","formItems","placeholder","unshift","concat","dialog","windowManager","open","initialPageConfig","setData","billnumber","toUpperCase","amendmentorigin","title","html","buttons","disabled","onChange","dialogApi","data","getData","enable","disable","details","redial","amendmentTypeDialog","versiontype","committeeAndMemberConfig","undefined","amendmenttype","previousValue","initialData","amendmentstobeinserted","class","isNaN","onSubmit","textToBeInserted","amendmentBuilder","endNode","getEnd","close","formData","amendmentsToBeInserted","parseInt","billNumberSection","titleSection","committeeSection","patronSection","lineSections","ReviewSection","props","selectedBillNumberIsLoaded","selectedSponsorIsLoaded","selectedMemberIsLoaded","selectedCommitteeIsLoaded","showLineNumbers","showTooltip","currentFormats","toggleShowLineNumbers","bind","toggleTooltip","setFormat","sessionId","this","setState","memberIsLoaded","actions","getMemberList","memberList","filter","m","ListDisplayName","ChamberCode","PatronDisplayName","membersCallback","finally","committeIsLoaded","getCommitteeList","committeeList","ParentCommitteeID","c","committeesCallback","committeeIsLoaded","content","handleEditorChange","wasEmpty","replaced","setWasEmpty","setReplaced","activeEditor","execCommand","setItem","getSelection","focusNode","parentElement","editorContent","versionAuthoring","loadCommittees","loadMembers","prevProps","selectedSponsor","selectedMember","selectedCommittee","className","Fragment","marginBottom","marginTop","onClick","stopPropagation","float","init","setup","addToggleButton","tooltip","bookmark","getBookmark","moveToBookmark","browser_spellcheck","plugins","allowAmendmentActions","toolbar","overrideRemoveAgreeRejectButtons","overrideRemoveCreateAmendmentButton","contextmenu","skin","paste_as_text","pasteAsText","valid_children","content_css","content_style","find","paste_word_valid_elements","paste_convert_word_fake_lists","paste_enable_default_filters","paste_data_images","paste_preprocess","plugin","args","table_default_attributes","border","formats","section","block","ldtitle","enactstatement","enactclause","catchline","rejected","i10","i0","i15","i20","customcenter","strikethrough","inline","end","textind","textbl","textbi","textasis","table","testc","tablec","tblhdn","tbllft","tblctr","tblrt","txtctr","drafter","billblank","pro","sumtext","lddata","ld","patctr","patalt","textrt","testhdrchar","texthdr","new","classes","style_formats","format","onEditorChange","reviewKey","React","Component","connect","bindActionCreators","committeeActionCreators","memberActionCreators","idToken","refreshToken","refreshTokenExpiration","claims","abortController","AbortController","signal","cancelRequest","abort","publicRequest","WebAPIKey","stringify","aborted","response","console","log","json","nonAbortable","checkToken","Authorization","FormData","token","jwtDecode","stringToken","exp","Date","getTime","getNewToken","resolve","rtoken","removeItem","user","roles","Claims","Roles","AccessToken","RefreshToken","mapJson","object","headerContent","id","nc","hierarchicalContent","nnc","nestedNestedContent","createTextNode","cssText","Style","Class","nestedContent","outerHTML","getHtml","jsonObject","AmendmentSection","shown","showAll","showInactiveAmendments","getAmendmentDescription","showAmendment","showAllAmendments","toggleInactiveAmendments","amendment","descriptionAndDisposition","Description","DocumentCode","TextDispositionID","TextDisposition","IsReprint","LDNumber","index","opposite","Array","amendments","fill","IsActive","backgroundColor","padding","checked","DraftText","renderHTML","VersionManagement","billFieldsetIsActive","amendmentFieldsetIsActive","reviewFieldsetIsActive","sessionOptions","legOptions","billVersionRef","selectedSession","selectedLegType","originalBillText","selectedBillText","selectedBillTextIndex","isLoaded","billList","selectedBill","billText","isPreviewVisible","processingFile","showPortal","billDataIsLoading","showCompletedItems","versionDate","moment","legDateOptions","selectedLegDate","selectedLegNum","showHeaders","previewContent","previewContentError","editorChanged","savedReviewContent","gettingIncompletePdf","showIncompletePdf","checkedBills","enrolledPrintQueue","useCurrentPublishDates","reviewContent","onReconvene","isDirty","showTextConfirmation","showBillConfirmation","changeCount","storedTextIndex","storedBill","storedBillIndex","sessionBillsList","checkAll","lastCheckedBills","amendmentRef","createRef","reviewRef","togglePreview","togglePortal","toggleFieldsetCollapse","handleSelectorChange","checkHandleSelectorChange","selectBill","selectBillIndex","checkBill","batchPublish","batchComplete","togglePublishDatePreference","handlePublishDateChange","toggleCompleteItems","handleSave","handleSaveCompletedItem","handleVersionDateChange","toggleHeaders","resetWarning","getJsonHeadersRequestString","getPreviewRequest","previewPdf","toggleReprint","filterReprints","setLegDateOptions","closeConfirmation","updateBillListByLegislationID","toggleCheckAll","pdfRef","isActive","reprintsFiltered","billTexts","val","newDraftText","previewRequest","doc","insertAdjacentHTML","docDivs","getElementsByTagName","j","docParagraphs","searchForLDTitleContainer","draftLDTitle","querySelector","DraftTitle","EditTitle","SessionCode","Chamber","LegislationChamberCode","VersionChamber","LegislationKey","LegislationNumber","substr","OnReconvene","LegislationClass","LegislationClassID","LegislationVersionID","getElementsByClassName","ReferredCommittee","split","trim","gettingCompletedItemPreview","previewPdfFile","src","bills","sasUrl","current","setAttribute","onload","getHtmlPreview","htmlPreview","locked","patronageInfo","textContent","htmlPreviewError","publish","isComplete","isSaving","customPublishDate","LegislationTextID","LegislationID","batchGenBillFile","SessionID","makeToast","IsPublic","newBillText","LegislationTextActionID","ModificationDate","IsComplete","HTMLFile","JSONFile","PDFFile","CandidateDate","LegislationVersion","subNumber","replaceAll","Sponsor","SponsorTypeID","CommitteeID","Patrons","CommitteeName","CommitteeNumber","VersionDate","removeAttribute","childNode","header","headerContainer","headerParagraphs","saveBillText","TextsList","billTextParams","getBillText","newbillTextList","priorBillText","findIndex","t","legFileGenParams","genBillFile","prevState","jsonPromise","bill","jsonHeadersRequestString","getJsonHeaders","jsonHeaders","LegislationTypeCode","applyPassageDates","HousePassageDate","SenatePassageDate","session","sessionList","SessionEvents","DisplayName","ActualDate","isSameOrBefore","headerDoc","SessionYear","isArray","all","replacement","paragraphs","legDates","isValid","sort","b","key","confirmed","storedKey","storedValue","showCategoryConfirmation","version","AuthoringLabel","getBillManagementList","getSessionBills","billManagementList","PendingChange","toLowerCase","legislationID","billListGetResponse","billListInState","associatedBillInStateIndex","associatedBillInGetResponse","updateDraftTextVersionDate","DOMParser","parseFromString","draftText","elements","billIndex","sbl","bt","billTextForReviewPane","target","href","confirm","click","billVersionDate","headerError","test","checkedBillsIndex","indexOf","splice","enrolledPrintQueueIndex","windowY","scrollTo","behavior","changingBillIndex","it","date","sessionBills","login","userClaims","legislationNumbers","LegislationNumbers","legislationTypeCode","housePassageDate","senatePassageDate","preDoc","preDocParagraphs","housePassage","senatePassage","legislationTextId","documentCode","overrideParam","getSessionShallowList","sessionShallowList","IsDefault","getBillVersionRef","billVersionsToUse","v","billVersionOptions","Resource","Scope","localeCompare","signedText","windowTitle","ref","paddingTop","trigger","componentRef","pageStyle","el","htmlFor","whiteSpace","scopes","marginRight","when","paddingBottom","billManagementListError","completedItems","legislationVersionID","verticalAlign","selected","legislationVersion","nav","billActionCreators","sessionActionCreators","navActionCreators","BillGridSection","selectedSessionBill","ldNumberSearch","searchingLDNumber","selectSessionBill","handleLdNumberSearchChange","searchByLDNumber","legislation","preventDefault","columns","Header","sortable","sortMethod","rowA","rowB","desc","legChamberA","legChamberB","legTypeA","legTypeB","filterable","accessor","Cell","original","to","row","patron","cursor","docCodeColumn","publishDateColumn","defaultChecked","billListIDs","left","classNamePrefix","options","sb","styles","provided","gridTemplateColumns","flex","right","readOnly","isClearable","resizable","loading","r","reactTable","minRows","defaultPageSize","pageSizeOptions","SelectorSection","handleSessionChange","handleLegTypeChange","handleLegDateChange","handleLegNumChange","isDisabled","selectedOption","triggeredAction","isSearchable","PreviewSection","Suffix","TextList","nonAmendments","originalIndex","showPageSizeOptions","showPagination","showPageJump","pageSize","getTrProps","_state","rowInfo","background","noDataText","previousLocationRequest","changeSessionRequest","makeToastRequest","toggleOverlayRequest","fileSuccess","fileFailure","reloadSessionSelectorChange","currentLocation","createBrowserHistory","previousLocation","toasts","hideSessionSelectorPaths","showOverlay","getPreviousLocation","changeSession","toggleOverlay","overlay","receiveFile","file","fileError","getFile","reloadSessionSelector","reload","getDefaultSessionAsyncRequest","getDefaultSessionAsyncSuccess","getDefaultSessionAsyncFailure","getSessionListRequest","getSessionListSuccess","getSessionListFailure","getSessionShallowListSuccess","getSessionShallowListFailure","getDefaultSessionSuccess","getSessionByIdRequest","getSessionByIdSuccess","getSessionByIdFailure","getSessionEventTypesRequest","getSessionEventTypesSuccess","getSessionEventTypesFailure","editSessionSuccess","editSessionFailure","createSessionSuccess","createSessionFailure","getSessionByCodeRequest","defaultSession","defaultSessionAsync","sessionListError","sessionEventTypes","sessionEvents","SessionType","SessionStart","BillCrossover","PrefileStart","BillCutoff","Adjournment","Reconvene","getSessionError","saveSession","saveSessionError","createSession","createSessionError","requestSessionEventTypes","receiveSessionEventTypes","sessionEventTypesError","getSessionEventTypes","SessionEventTypes","requestDefaultSessionAsync","receiveDefaultSessionAsync","defaultSessionAsyncError","getDefaultSessionAsync","receiveDefaultSession","sessiondata","setDefaultSession","defaultSessionObject","requestSessionList","receiveSessionList","getSessionList","year","Sessions","receiveSessionShallowList","sessionShallowListError","sessionShallowListMessage","requestSessionById","receiveSessionById","sessionByIdError","getSessionById","partner","sessionData","getSessionByCode","setSelectedSession","sessionObject","receiveEditSession","res","editSessionError","editSession","receiveCreateSession","defaultSessionAsyncMessage","sessionEventTypesMessage","errorMessage","InputFeedback","Label","children","originatingChamberOptions","sessionTypeOptions","stateOptions","customStyles","option","base","control","minHeight","menu","zIndex","singleValue","MenuList","maxHeight","initialOffset","itemCount","itemSize","initialScrollOffset","LargeListSelect","filterOption","createFilter","ignoreCase","ignoreAccents","matchFrom","components","Dropdown","multi","onBlur","TextInput","defaultValue","TextArea","legislationIdsListRequest","legislationIdsListSuccess","legislationIdsListFailure","billListByIdsRequest","billListByIdsSuccess","billListByIdsFailure","legislationTextsHitCountsRequest","legislationTextsHitCountsSuccess","legislationTextsHitCountsFailure","billListRequest","billListSuccess","billListFailure","mostFrequentBillListSuccess","mostFrequentBillListFailure","billSummaryRequest","billSummarySuccess","billSummaryFailure","saveBillSummaryRequest","saveBillSummarySuccess","saveBillSummaryFailure","billHistorySuccess","billHistoryFailure","billVersionRequest","billVersionSuccess","billVersionFailure","billNumbersSuccess","billNumbersFailure","legislationClassesSuccess","legislationClassesFailure","billStatusRefSuccess","billStatusRefFailure","billStatusCategoryRefSuccess","billStatusCategoryRefFailure","billEventRefSuccess","billEventRefFailure","legislationEventsByIdSuccess","legislationEventsByIdFailure","billTextSuccess","billTextFailure","ihodAmendmentSaveSuccess","ihodAmendmentSaveFailure","billVersionRefSuccess","billVersionRefFailure","sponsorRefListSuccess","sponsorRefListFailure","billSummaryRefSuccess","billSummaryRefFailure","batchPublishSuccess","batchPublishFailure","batchCompleteSuccess","batchCompleteFailure","billTextSaveSuccess","billTextSaveFailure","jsonHeadersSuccess","jsonHeadersFailure","pdfPreviewSuccess","pdfPreviewFailure","previewPdfFileSuccess","previewPdfFileFailure","htmlPreviewSuccess","htmlPreviewFailure","htmlFilePreviewSuccess","htmlFilePreviewFailure","billSaveSuccess","billSaveFailure","billFileGenSuccess","billFileGenFailure","batchBillFileGenSuccess","batchBillFileGenFailure","billManagementListSuccess","billManagementListFailure","sessionBillsSuccess","sessionBillsFailure","billEventsSuccess","billEventsFailure","billEventSaveSuccess","billEventSaveFailure","textListSuccess","textListFailure","subjectListSuccess","subjectListFailure","introDateListSuccess","introDateListFailure","legislationAmendmentListSuccess","legislationAmendmentListFailure","legislationDispositionsSuccess","legislationDispositionsFailure","legislationStatusHistorySuccess","legislationStatusHistoryFailure","deleteBlobFileSuccess","deleteBlobFileFailure","sasURLSuccess","sasURLFailure","billSuccess","billFailure","uploadImpactStatementRequest","legislationIdsList","legislationIdsListPagination","billListByIds","billListByIdsPagination","legislationTextsHitCounts","billListPagination","mostFrequentBillList","searchCriteria","billDetails","billsByMember","billHistory","billVersion","billNumbers","billSummary","billSummarySave","billVersionRefError","sponsorRefList","sponsorRefListError","billEventRef","billEventRefError","billTextError","batchPublishSave","batchPublishError","batchCompleteSave","batchCompleteError","billTextSave","billTextSaveError","jsonHeadersError","pdfPreview","pdfPreviewError","sasUrlError","htmlFilePreview","htmlFilePreviewError","billFileGen","billFileGenError","batchBillFileGen","batchBillFileGenError","billStatusReferences","legislationClasses","billStatusCategoryReferences","sessionBillsError","billEvents","billEventsError","billEventSave","billEventSaveError","textList","textListError","subjectList","subjectListError","introDateList","introDateListError","legislationAmendmentList","legislationAmendmentListError","legislationDispositions","legislationDispositionsError","legislationStatusHistory","legislationStatusHistoryError","sasURLLink","sasURLLinkError","billError","uploadImpactStatementResponse","uploadImpactStatementError","deleteBlobFileResponse","deleteBlobFileError","receiveBill","getBill","REACT_APP_LEGISLATION_API_URL","Legislations","receiveBillHistory","billHistoryError","getBillHistoryByBillID","LegislationEvents","requestBillVersion","receiveBillVersion","billVersionError","getBillVersionByBillNumber","LegislationsVersion","getBillVersionsByBillID","requestBillSummary","receiveBillSummary","billSummaryError","getBillSummary","SummaryList","LegislationSummaries","requestSaveBillSummary","receiveSaveBillSummary","saveBillSummaryError","saveBillSummary","receiveBillStatusRefs","billStatusRefsError","getBillStatusReferences","References","receiveLegislationClasses","legislationClassesError","getLegislationClasses","LegislationClasses","receiveBillStatusCategoryRefs","billStatusCategoryRefsError","getBillStatusCategoryReferences","LegislationCategoriesList","receiveBillEventRefs","billEventRefsError","getBillEventReferences","EventTypes","receiveLegislationEventsById","legislationEventsById","legislationEventsByIdError","getLegislationEventsByLegislationId","requestLegislationIdsList","receiveLegislationIdsList","pagination","FailureMessage","legislationIdsListError","getLegislationIdsList","get","requestBillListByIds","receiveBillListByIds","billListByIdsError","getBillListByIds","requestLegislationTextsHitCounts","receiveLegislationTextsHitCounts","legislationTextsHitCountsError","getLegislationTextsHitCounts","HitCounts","requestBillList","receiveBillList","billListError","getBillList","requestMostFrequentBillList","receiveMostFrequentBillList","mostFrequentBillListError","getMostFrequentBillList","receiveBillNumbers","billNumbersError","billNumberMessage","getBillNumbers","LegislationNumbersList","receiveBillVersionRef","LegislationVersionList","receiveSponsorRefList","getSponsorRefList","SponsorTypes","receiveBillSummaryRef","billSummaryRef","billSummaryRefError","getBillSummaryRef","SummaryVersions","receiveBillText","receiveBillTextSave","receiveIhodAmendmentSave","ihodAmendmentSave","ihodAmendmentSaveError","saveIhodAmendment","receiveBatchPublish","receiveCompletePublish","receiveJsonHeaders","receivePdfPreview","getPdfPreview","receivePreviewPdfFile","previewPdfFileError","sasUrlFailure","sasTokenUrl","receiveHtmlPreview","receiveHtmlFilePreview","getHtmlFilePreview","receiveBillSave","billSave","billSaveError","saveBill","receiveBillFileGen","receiveBatchBillFileGen","receiveBillManagementList","receiveSessionBills","receiveBillEvents","getBillEvents","receiveBillEventSave","saveBillEvent","receiveTextList","getTextList","LegislationTextList","receiveSubjectList","getSubjectList","REACT_APP_LEGISLATION_SUBJECT_SERVICE","SubjectsReference","subject","Subject","SubjectIndexID","receiveIntroDateList","getIntroDateList","LegislationDatesList","receiveLegislationAmendmentList","getLegislationAmendmentList","LegislationAmendmentList","receiveLegislationDispositions","getLegislationDispositions","TextDispositionList","receiveLegislationStatusHistory","getBillStatusHistory","LegislationsStatusHistory","receiveSasURL","sasURLError","getSasURL","uploadImpactStatement","append","receiveDeleteBlobFile","deleteBlobFileStatement","FilesDeleted","batchPublishSaveError","batchCompleteSaveError","msalConfig","auth","clientId","APP_ENV","authority","redirectUri","postLogoutRedirectUri","cache","cacheLocation","storeAuthStateInCookie","system","loggerOptions","loggerCallback","level","containsPii","LogLevel","Error","Info","info","Verbose","debug","Warning","warn","loginRequest","graphToken","loginSuccess","loginFailure","logoutSuccess","refreshTokenRequest","refreshTokenSuccess","refreshTokenFailure","houseLoginRequest","houseLoginSuccess","houseLoginFailure","decodedToken","jwtToken","userData","initials","chamber","email","resources","parsedToken","given_name","charAt","family_name","expr","isTokenExpired","parsedClaims","claimsObject","RoleName","authActionCreators","requestLogin","creds","initiateRedirect","receiveLogin","isAuthenticated","userProfile","loginError","loginUser","UserID","userId","Password","userPassword","GraphToken","requestLogout","receiveLogout","logoutUser","requestRefreshToken","receiveRefreshToken","refreshTokenError","refreshAccessToken","requestHouseLogin","receiveHouseLogin","houseLogin","authToken","expirationDate","HouseLoginButton","instance","useMsal","username","loginHint","loginRedirect","LoginForm","password","isSubmitting","checkForHouseDomain","handleChange","handleSubmit","userNameSplit","IsPasswordTemporaryOrExpired","history","failureMessage","failureCode","match","isSubmenu","autoFocus","onFocus","textDecoration","HouseLogoutButton","logoutRedirect","logout","Links","unsortedLinks","canAccessMemberMgmt","route","canAccessSessionMgmt","canAccessCommitteeMgmt","canAccessMinutesMgmt","canAccessDocketMgmt","canAccessBillMgmt","canAccessVersionMgmt","canAccessAmendmentMgmt","canAccessCommMgmt","canAccessCalendarMgmt","canAccessConfigurationsMgmt","canAccessJournalMgmt","canAccessVoteMgmt","canAccessPrintMgmt","canAccessMeetingsMgmt","canAccessPartnerMgmt","canAccessUserMgmt","canAccessBds","outside","link","idx","canAccessReportMgmt","canAccessSenateLinks","canAccessPatronStatusReport","isLoggedIn","canAccessWatchlists","UserProfile","tabIndexNum","targetFocus","slideout","slideoutToggle","isOpen","isAriaHidden","isAriaExpanded","isMenuVisible","permissions","focus","tabIndex","handleLogout","Boolean","p","bdsRole","Submenu","isAuth","SearchInputComponent","search","handleInputChange","event","getSessionPromise","regexResult","legNumbers","searchTerms","searchWithRemovedBillNumbers","resultIndex","param","selectedBillNumbers","selectedKeywords","btoa","pathname","queryString","collection","parsed","q","withRouter","NavMenu","showLogin","pathName","handleClick","handleClosingLoginOnOffClick","mousedownListener","addEventListener","removeEventListener","loginBox","profileLink","loginLink","contains","button","ProfileButton","LoginButton","isBillPath","transitionName","transitionEnterTimeout","transitionLeaveTimeout","Menu","borderRadius","menuList","indicatorSeparator","SessionSelector","HISTORICAL_DATA_REDIRECT","LegacySessionID","historicalSessionRedirect","redirect","substring","s","sessionListMessage","getSessions","reverse","overrideSession","newSession","path","RegExp","maxMenuHeight","getSelectedSessionLabel","Popup","componentWillUnmount","timerHandle","clearTimeout","closePopup","logOut","togglePopup","isIdle","setTimeout","ToastContainer","visible","dismiss","dismissed","long","Toast","item","IconLinks","budgetUrl","Layout","helpBanner","showPopup","popupMessage","dismissHelpBanner","logOutUser","contactReferencesSuccess","contactReferencesFailure","contactSaveSuccess","contactSaveFailure","personListSuccess","personListFailure","personSuccess","personFailure","personContactRequest","personContactSuccess","personContactFailure","userListSuccess","userListFailure","userSuccess","userFailure","userByEmailSuccess","userByEmailFailure","userSaveSuccess","userSaveFailure","userCreateSuccess","userCreateFailure","newUserCreateSuccess","newUserCreateFailure","personCreateSuccess","personCreateFailure","personSaveSuccess","personSaveFailure","dirListSuccess","dirListFailure","userRegisterSuccess","userRegisterFailure","userCreatePublicSuccess","userCreatePublicFailure","requestPasswordResetSuccess","requestPasswordResetFailure","passwordResetSuccess","passwordResetFailure","changePasswordSuccess","changePasswordFailure","contactReferences","contactReferencesError","contactSave","contactSaveError","userList","userListError","personList","personListError","personContact","userError","userByEmail","userByEmailError","personCreate","personCreateError","dirList","dirListError","userSave","userSaveError","userCreate","userCreateError","newUserCreate","newUserCreateError","userCreatePublic","userCreatePublicError","userRegister","userRegisterError","requestPasswordReset","requestPasswordResetError","passwordReset","passwordResetError","changePassword","changePasswordError","userActionCreators","receiveContactReferences","getContactReferences","ContactTypeReferences","receiveContactSave","saveContact","requestPersonContact","receivePersonContact","contact","personContactError","personConact","getPersonContact","receivePersonList","getPersonList","Persons","receivePerson","person","personError","getPerson","receiveUserList","getUserList","UserProfiles","receiveUser","userdata","getUser","receiveUserByEmail","userByEmaildata","getUserByEmail","receiveUserSave","userErrorSave","saveUser","receiveUserCreate","userErrorCreate","createUser","receiveNewUserCreate","newUserErrorCreate","createNewUser","receivePersonCreate","createPerson","receivePersonSave","personSave","personSaveError","savePerson","receiveDirList","getDirReferences","Directories","receiveRegisterUser","userErrorRegister","registerUser","receiveCreatePublicUser","userErrorCreatePublic","Value","startsWith","endsWith","createPublicUser","receiveRequestPasswordReset","receivePasswordReset","resetPassword","receiveChangePassword","calculateNumberOfCriteriaMet","criteriaMet","CreateAccount","firstname","lastname","passwordconfirm","showPassword","handleTextChange","toggleShowPassword","checkName","checkPassword","checkPasswordConfirm","toggleShowTooltip","handleClickOutside","createAccount","infoRef","infoButtonRef","nameError","showHelp","passwordError","currentpassword","passwordConfirmError","toolTip","isError","isCreating","FirstName","LastName","HashedWord","registerhash","accountCreated","users","passwordHelp","indicate","gridGap","autoComplete","emailRegex","RegisterAccount","checkEmail","registerAccount","emailError","encodeURIComponent","ForgotPassword","paswordResetRequested","houseDomains","senateDomains","legislativeDomains","ChangePassword","isChanging","confirmPassword","passwordChangeFinished","resettingPassword","emailaddress","newpassword","loginObj","emailAddress","resetHash","resethash","EmailAddress","passwordHasBeenResetCheckEmail","passwordistemporaryorexpired","passwordIsTemporaryOrExpired","emailSplit","MemberManagementGrid","searchFilter","handleFilterChange","filterData","formattedFilter","memberContacts","memberListContactData","MemberDisplayName","MemberNumber","getMemberListContact","checkedMembers","lineHeight","dropdownIndicator","ServiceEndDate","ServiceEndReason","headerClassName","expander","Expander","isExpanded","ContactInformation","MemberID","SubComponent","MemberInfo","contactIndex","ContactType","Address1","Address2","City","StateCode","ZipCode","PhoneNumber","contactList","contactOptions","removeContact","changeContact","Fields","addContact","UserForm","firstName","lastName","selectedDomain","handleDomainChange","userObj","LoginID","DomainName","DomainID","IdentityID","personData","domainOptions","toggleUserCreation","MemberManagementForm","userFieldsetIsActive","personalFieldsetIsActive","memberFieldsetisActive","memberData","chamberOptions","districtOptions","showUserCreation","statusOptions","showPersonCreation","memberNumberError","buildListDisplayName","handleMemberChange","handlePersonChange","handleContactChange","selectPerson","togglePersonCreation","selectUser","saveForm","getMemberData","listDisplayName","MiddleName","AlternateName","memberDisplayName","personObj","memberDataObject","fieldset","buildMemberDisplayName","stateVar","newMember","DistrictID","PartyCode","newMemberObj","sessionCode","buildPatronDisplayName","memberNumbers","createMember","memberCreate","fullName","FullName","rowIndex","saveMember","contactArray","contactObj","memberId","getMember","Person","getMemberNumbers","getPersonData","getDistricts","districtList","district","Title","getParties","getPartyCodeList","partyOptions","partyCodeList","party","getContactTypes","ContactTypeID","getStatuses","getMemberStatuses","memberStatuses","MemberStatusID","dir","PersonTable","selectedPersonIndex","handleSearchChange","formattedSearch","filteredPersonList","personIndex","PersonInformation","OwnerID","ContactInformationID","Prefix","OwnerTypeID","MemberInformation","invalidGabEmail","invalidGabPhone","markOverride","color","VotingSequence","SeatNumber","paddingLeft","ServiceBeginDate","GABEmailAddress","GABPhoneNumber","RoomNumber","CreateMember","EditMember","memberid","MemberManagement","exact","component","SessionGridComponent","filtered","currentYear","getFullYear","isCurrentBiennium","filterAll","defaultFilterMethod","onFilteredChange","Year","sessionStartObj","startDate","Filter","getProps","filterMethod","rows","yearfilter","defaultSorted","SessionManagementGrid","SessionForm","selectedSessionType","selectedSessionEventType","sessionEventData","handleEventChange","handleSessionEventTypeChange","handleCopyContinuedChange","addSessionDate","sessionCodeSuffix","romanize","Number","sessionTypeData","num","NaN","digits","String","roman","pop","join","copyContinuedLegislation","prefileDate","prefileDueDate","codeError","prefileDueDateError","prefileDateError","startDateError","displayNameError","initialSessionCode","CopyContinuedLegislation","EventTypeID","sessionEventsIsLoaded","sessionsAreLoaded","SessionTypeID","sessionHasBills","sessionBillsAreLoaded","filteredSessionEvents","eventData","eventIndex","SessionManagement","SessionManagementForm","CommitteeGridComponent","showCreateSuccess","showCreateFailure","isSubcommittee","disableChamberSelector","selectedError","currentDate","filterChamber","filterName","committeeNameInput","committeeNumberInput","committeeNameChange","committeeNumberChange","sendCreateDetails","getPartnerCommittees","houseScope","senateScope","committeeChamber","newCommittee","createNewCommittee","getCommittees","committeeName","committeeNumber","toggleChamber","tableData","partnerCommittees","partnerCommitteesError","createCommitteeMessage","committeePartnerListError","column","lowercaseRow","lowercaseFilter","CommitteeManagementGrid","getListStyle","isDraggingOver","SelectMenu","dropdown","dropdownData","isDuplicate","selectedPersonnel","handleDropDownChange","Email","onInsert","PersonnelDraggableComponent","personnel","personnelArray","Sequence","onDragEnd","staffRoleTypeID","EffectiveEndDate","AffiliationID","affiliation","StaffRoleTypeID","onPersonnelChange","rowID","tempArray","StaffID","destination","startIndex","endIndex","removed","reorder","source","keys","droppableId","snapshot","innerRef","draggableId","draggableProps","dragHandleProps","isDragging","draggableStyle","userSelect","pendingDeletion","onRemove","dropdownDataMembers","dropdownDataRoles","handleRolesDropDownChange","Seniority","handleSeniorityChange","handleEditVotingSequence","AssignDate","handleDateChange","popperPlacement","filterDate","isValidTerminationDate","placeholderText","MembersDraggableComponent","DisplaySequence","role","selectedRole","CommitteeRoleID","membersDropdown","RemoveDate","onMemberChange","newItems","memberRole","valObj","isPendingAdd","toggleInput","memberSeniority","memberVotingSequence","memberAssignDate","memberRemoveDate","tempValue","stateName","roleID","memberRoleEditStyle","sortByVotingSequence","handleEditRoles","handleSaveRoles","getCommitteeRoleName","handleEditSeniority","handleSaveSeniority","handleSaveVotingSequence","handleEditAssignDate","handleSaveAssignDate","handleEditRemoveDate","maxDate","handleSaveRemoveDate","SubcommitteeManagementGrid","subcommitteeData","subcommitteeNameInput","subcommitteeNumberInput","calculatedFullCommitteeNumber","subcommitteeNameChange","subcommitteeNumberChange","calculateFullCommitteeNumber","sendSubcommitteeCreateDetails","subcommitteeName","subcommitteeNumber","number","parentCommitteeNumber","padStart","isInteger","createSubcommittee","subcommitteeMessage","min","max","parentCommitteeID","personnelListRequest","personnelListSuccess","personnelListFailure","roleTypesRequest","roleTypesSuccess","roleTypesFailure","personnelReferencesRequest","personnelReferencesSuccess","personnelReferencesFailure","personnelSaveRequest","personnelSaveSuccess","personnelSaveFailure","personnelStaffList","personnelClerkList","personnelOtherList","personnelStaffReferences","personnelClerkReferences","personnelErrorSave","receivePersonnelSave","personnelStaffSave","personnelClerkSave","roleTypes","personnelActionCreators","requestPersonnelReferences","personnelReferences","receivePersonnelReferences","clerkReferences","staffReferences","personnelReferencesError","getPersonnelReferences","Personnels","personnelObj","isOtherDuplicate","requestPersonnelList","personnelList","receivePersonnelList","clerkList","staffList","otherList","personnelListError","getPersonnelList","isPublic","requestRoleTypes","receiveRoleTypes","roleTypesError","getRoleTypes","StaffRoleTypes","requestPersonnelSave","savePersonnel","SubCommitteesList","listCommittees","Math","random","MemberListComponent","names","PersonnelListComponent","CommitteeDetailsComponent","committeeData","subcommitteesList","Abbreviation","MeetingNote","TwitterHandle","TwitterEmail","membersByCommitteeError","memberRoles","partnerCommitteeListError","PartnerCommitteeDetails","NewCommitteeFormComponent","infoFieldsetIsActive","clerkFieldsetIsActive","staffFieldsetIsActive","membershipFieldsetIsActive","subcommFieldsetIsActive","clerks","staff","committeeMemberRoles","committeeMemberNames","subcommitteeIsLoaded","showPreview","ascending","isFormDirty","getSubcommittees","handleClerkChange","handleStaffChange","handleClose","committeeid","subcommitteeid","getPartnerCommitteeList","partnerCommitteeList","serviceEndDate","memberObject","MemberList","personnelObject","saveCommittee","saveCommitteeError","commData","savedCommittee","saveMemberCommittee","memberCommitteeSaveError","memberCommitteeSave","saved","committeeNameMissing","goBack","committeeId","committeeParams","getPartnerCommitteeById","partnerCommitteeByIdData","committeeLoaded","getCommitteeMemberRoles","committeeHouseRoles","committeeSenateRoles","chamberCode","organizeMembers","getMembersByCommittee","membersByCommittee","membersLoaded","parentCommData","parentCommitteeName","filteredStaffAndClerkReferences","OrganizationName","personnelParams","clerk","staf","personnelLoaded","AgendaURL","CommitteeFiles","isBefore","isAfter","paddingRight","CommitteeManagement","CommitteeManagementForm","emptyCache","caches","delete","getReferencesSuccess","getReferencesFailure","getCalendarListSuccess","getCalendarListFailure","createCalendarSuccess","createCalendarFailure","saveCalendarSuccess","saveCalendarFailure","saveCalendarFileSuccess","saveCalendarFileFailure","getCalendarSuccess","getCalendarFailure","getDocketListSuccess","getDocketListFailure","createDocketSuccess","createDocketFailure","saveDocketSuccess","saveDocketFailure","docketByIdRequest","docketByIdSuccess","docketByIdFailure","patronListDocketByIdRequest","patronListDocketByIdSuccess","patronListDocketByIdFailure","getCalendarCategoriesReferencesSuccess","getCalendarCategoriesReferencesFailure","getCalendarAssignmentsSuccess","getCalendarAssignmentsFailure","getAdminCalendarAssignmentsSuccess","getAdminCalendarAssignmentsFailure","saveCalendarAssignmentSuccess","saveCalendarAssignmentFailure","saveCalendarCurrentItemSuccess","saveCalendarCurrentItemFailure","replacePdfRequest","references","getReferencesError","docketList","getDocketListError","calendarList","calendarListError","calendarCreate","calendarCreateError","calendarSave","calendarSaveError","calendarFileSave","calendarFileSaveError","calendarGet","calendarGetError","calendarCategoriesReferences","calendarCategoriesReferencesError","docketByIdData","docketSave","docketSaveError","replacePdfResponse","replacePdfError","patronListDocketByIdData","sendDocketHtmlError","sendCalendarHtmlError","sendDocketHtmlResponse","sendCalendarHtmlResponse","calendarAssignments","getCalendarAssignmentsError","adminCalendarAssignments","getAdminCalendarAssignmentsError","calendarAssignmentSave","saveCalendarAssignmentsError","calendarActionCreators","requestDocketById","receiveDocketById","docketByIdError","getDocketById","Dockets","requestPatronListDocketById","receivePatronListDocketById","patronListDocketByIdError","getPatronListDocketById","ListItems","receiveReferences","getReferences","CalendarActions","receiveDocketList","getDocketList","receiveDocketCreate","docketCreate","createDocketError","createDocket","receiveDocketSave","saveDocket","HouseAgendas","receiveCalendarCategoriesReferences","includeChairmansReportCategories","CalendarCategoryTypes","cc","CategoryType","getCalendarCategoriesReferencesError","getCalendarCategoriesReferences","receiveCalendarAssignments","CalendarAssignments","getCalendarAssignments","receiveAdminCalendarAssignments","getAdminCalendarAssignments","receiveCalendarAssignmentSave","saveCalendarAssignmentError","saveCalendarAssignment","Message","receiveCalendarList","getCalendarList","Calendars","receiveCalendarCreate","createCalendarError","createCalendar","createCalendarResponse","receiveCalendarSave","saveCalendar","saveCalendarResponse","receiveCalendarFileSave","saveCalendarFile","receiveCalendarById","getCalendarById","receiveCalendarCurrentItem","calendarCurrentItem","calendarCurrentItemError","saveCalendarCurrentItem","replacePdf","sendDocketHtml","sendCalendarHtml","docketCreateError","scheduleListSuccess","scheduleListFailure","scheduleTypeListSuccess","scheduleTypeListFailure","scheduleGetSuccess","scheduleGetFailure","scheduleSaveSuccess","scheduleSaveFailure","scheduleCreateSuccess","scheduleCreateFailure","meetingsCalendarPreviewSuccess","meetingsCalendarPreviewFailure","getMeetingRoomReferencesSuccess","getMeetingRoomReferencesFailure","subcommitteeMembersRequest","subcommitteeMembersSuccess","subcommitteeMembersFailure","uploadMeetingPdfSuccess","uploadMeetingPdfFailure","scheduleList","schedule","scheduleListError","scheduleTypeListError","scheduleGetError","scheduleSaveError","scheduleCreateError","meetingRoomReferences","meetingRoomReferencesError","meetingsCalendarPreview","meetingsCalendarPreviewError","subcommitteeMembers","uploadMeetingPdf","uploadMeetingPdfError","scheduleActionCreators","receiveScheduleList","getScheduleList","parter","REACT_APP_SCHEDULE_API_URL","Schedules","receiveScheduleTypeList","scheduleTypeList","getScheduleTypeList","ScheduleTypes","receiveSchedule","scheduleError","getSchedule","receiveScheduleSave","scheduleSave","saveSchedule","receiveScheduleCreate","scheduleCreate","createSchedule","receiveMeetingRoomReferences","getMeetingRoomReferencesError","getMeetingRoomReferences","MeetingRooms","receiveMeetingsCalendarPreview","getMeetingsCalendarPreviewError","getMeetingsCalendarPreview","requestSubcommitteeMembers","receiveSubcommitteeMembers","subcommitteeMembersError","getSubcommitteeMembers","SubcomitteeMembers","receiveUploadMeetingPdf","DocketGrid","committeeOptions","subcommitteeOptions","docketDate","utc","startOf","hour","minute","createFailureMessage","isAdding","showDeleteModal","docketToDeleteIndex","getDockets","deleteDocket","checkDeleteDocket","cancelDeleteDocket","handleSessionSelectChange","handleCommitteeSelectChange","handleSubcommitteeSelectChange","newState","selectedSubcommittee","handleDropdownChange","createDocketObj","DocketDate","DocketType","DocketTypeID","VoteRoomID","ScheduleDate","ScheduleTypeID","calendar","docketBeingDeleted","DocketID","docketData","DocketCategories","DocketItems","DeletionDate","showDeleteSuccess","deleteFailureMessage","docketIndex","filteredCommittees","listParams","docketParams","DocketNumber","getItemStyle","CommitteeBillsGrid","showAuxBillForm","auxBill","savingAuxBill","toggleRow","toggleBill","toggleBillBulk","toggleEdit","saveChange","toggleAuxBillAdd","addAuxBill","setAuxBill","categorySequence","categories","catIndex","category","itemIndex","lastCheckedBill","nativeEvent","shiftKey","abs","updateDocket","sequence","nextHighestActiveLegislationNumber","currentSequences","apply","Infinity","activate","isEditing","newDescription","notesCategories","IsLegislationCategory","docketBills","flatMap","d","gap","selectAllActive","toggleAllActive","selectAllInactive","gridTemplateRows","categoryIndex","dataActive","note","dataInactive","resize","cols","LegislationDescription","DocketItemID","HouseAgendaItemID","Docket","patronList","docket","hideCaption","hidePatron","hideSummary","Summary","hideTitle","hideLDNumber","DocketDetailsComponent","HouseAgendaCategories","Staff","obj","committeeHeader","ParentCommitteeName","subcommitteeHeader","sessionHeader","memberNames","CommitteeMember","clerkNames","staffNames","hideClerk","hideStaff","scheduleIndex","ScheduleTime","RoomDescription","Comments","HouseAgendaItems","DocketPatronList","patronListDocketData","CalendarDate","Legislation","togglePatronList","PUBLISH_DOCKET","TIME_REGEX","DocketFormComponent","handleMeetingRoomChange","selectedMeetingRoom","pendingSave","committeeClerk","committeeStaff","committeeLeadership","meetingRoomsList","showPatronList","handleSequenceChange","toggleDocketSection","downloadWordFile","handleCommentHeight","docketBillParams","docketid","getDocketBills","CalendarDisplay","DisplayColumn","IsDisplayed","noSavedItems","memberDelimiter","getMeetingRoomsReferences","notesCategory","calCategory","CategoryCode","cat","time24Hr","hours","minutes","modifier","active","publishFlag","unpublishing","DocketFiles","hasNotes","ContentHTML","filename","downloadLink","legislationKey","SummaryVersion","round","commentHeight","committeeDate","dockets","disablePublish","for","fontFamily","room","DocketManagementForm","DocketManagement","render","DocketForm","CalendarGrid","nextBusinessDay","day","selectedChamber","calendarDate","calendarToBeDeleted","calendarBeingDeleted","showDeleteWarning","getCalendars","handleChamberChange","deleteCalendar","toggleDeleteCalendar","calendarNumber","isSame","createCalendarObj","CalendarType","CalendarTypeID","CalendarNumber","CalendarID","calendarData","calendarParams","ReferenceNumber","newAgendaItemText","AgendaItemsComponent","agendaItemContent","saveAgendaItems","addNote","toggleCustomNote","agendaItems","agenda","AgendaItems","newAgendaItem","AgendaId","updateAgendaItems","agendaIndex","toggleAgendaItemEditor","CalendarDescription","OrigIsActive","sortedAgendaItems","newAgendaItemContent","alert","removedItemContent","removedItem","tinyMceEditor","tinyMceId","tinyMceHtmlElem","tinyMceHeaderElem","getElementById","tinymceId","editors","_snapshot","isDragDisabled","AgendaItemId","borderRight","borderTop","borderLeft","borderBottom","onInit","setTinyMceIds","menubar","statusbar","textAlign","isNotHidden","IsHidden","CalendarCategoryTypeID","NUMERIC_SORT_CATEGORIES","sortAgendas","calendarChamber","Ranking","sortAgendasNumerically","BillsGrid","categoryDescription","associatedReferenceCategory","calendarCategories","PluralDescription","Agendas","showAgendaItemEditor","showAgendaItemEditorCategoryIndex","handleAgendaSort","toggleSelectAll","showAgendaItems","toggleEditCategoryDescription","expandTitle","getCategoryBills","setDescription","setBillsInConferenceCategoryDescription","categoryDescriptionIsEdited","changeCommitteeDropdown","changeDateDropdown","addBill","toggleShowAmendments","setRanking","handleDescriptionChange","selectAllCommending","selectAllMemorial","organizedBills","selectAll","leg","updateAgenda","categoryAsDisplayed","updatedOrganizedBills","newTypeAndPluralityLanguage","existingDescription","categoryLegislations","activeCategoryLegislations","cl","numResolutions","acl","numBills","agendas","categoryTypeId","unrankedAgendas","rankedAgendas","inactiveAgendas","rankings","gaps","sortInactiveAgendasNumerically","sortInactiveAgendas","Set","size","insertPoint","pending","duplicateCategory","duplicateAgenda","duplicateCategoryIndex","legNumbersToBeIncluded","topOrBottom","checkedAgenda","CalendarCategoryID","existingCategoryAgendaIndex","LegislationTitle","associatedCategory","showAmendments","ranking","save","editing","tempDescription","calendarCategoryOptions","billButtonText","billExists","some","selectedDate","dateList","selectedCategory","changeCategoryDropdown","addCategory","toggleHideAllCategories","hideCategories","toggleHideAllNonIncludedBills","hideAllNonIncludedBills","showTitles","toggleHideCategory","DisplayType","userRoles","deleteCategory","switchCategory","toggleCalendarPreview","changeBillDropdown","inputValue","alignItems","moveTo","showNewIndicator","AgendaID","fullCommitteeList","calendarTime","CalendarCategoryTemplateID","generateCsv","col","rowText","voteLinkRequest","voteLinkSuccess","voteLinkFailure","voteDetailsRequest","voteDetailsSuccess","voteDetailsFailure","voteActionListRequest","voteActionListSuccess","voteActionListFailure","voteListSuccess","voteListFailure","voteTypesSuccess","voteTypesFailure","voteSaveSuccess","voteSaveFailure","voteFileSuccess","voteFileFailure","voteSaveMotionSuccess","voteSaveMotionFailure","voteLinkResponse","voteLinkError","voteDetailsResponse","voteDetailsError","voteList","voteListError","voteTypes","voteTypesError","voteSave","voteSaveError","voteSaveBulk","voteSaveBulkError","voteFile","voteFileError","voteSaveMotion","voteSaveMotionError","voteActionCreators","requestVoteDetails","receiveVoteDetails","getVoteDetails","Votes","requestVoteLink","receiveVoteLink","getVoteLink","VoteLinks","requestVoteActionList","receiveVoteActionList","voteActionList","voteActionListError","getVoteActionList","VoteActions","receiveVoteList","getVoteList","ShallowVotes","receiveVoteTypes","getVoteTypes","VoteTypes","receiveVoteSave","saveVote","receiveVoteSaveBulk","saveVoteBulk","receiveVoteFile","voteFileGen","REACT_APP_VOTE_FILE_GEN_URL","receiveVoteSaveMotion","saveVoteMotion","patronListRequest","patronListSuccess","patronListFailure","patronRolesSuccess","patronRolesFailure","patronTypesSuccess","patronTypesFailure","patronSaveSuccess","patronSaveFailure","senatePatronsList","housePatronsList","chiefPatronsList","patronRoles","patronRolesError","patronTypes","patronTypesError","patronSaveList","patronSaveError","patronActionCreators","requestPatronList","receivePatronList","housePatrons","senatePatrons","chiefPatrons","patronListError","getPatronList","patronsListError","patrons","receivePatronRoles","getPatronRoles","PatronRolesList","receivePatronTypes","getPatronTypes","MemberPatronTypes","requestPatronSave","receivePatronSave","savePatrons","patronSave","VersionData","useState","showText","toggleText","impactFileUrls","pdfLink","ImpactFile","FileURL","description","pushWithKeywords","substituteLdAndDocCodeString","resource","legislationClass","legislationNumber","handleToggleDescriptionEdit","saveDescription","countMatches","LinkFile","toggleStatementForm","DraftDate","VersionList","keywordExpression","keywordParts","foundAnOperator","keywordPart","sanitizedKeywords","chars","wordToInsert","phraseToInsert","statementDate","statementDescription","descriptionEditable","reportTypesSuccess","reportTypesFailure","reportSuccess","reportFailure","billReportInformationSuccess","billReportInformationFailure","shareReportRequest","reportTypes","reportTypesError","report","reportError","shareReport","billReportInformation","billReportInformationError","reportActionCreators","receiveReportTypes","getReportTypes","REACT_APP_REPORT_FILE_GEN_SERVICE","Reports","receiveReport","getReport","ReportDataList","receiveBillReportInformation","getBillReportInformation","StronglyTypedObject","saveBillReportInformation","REACT_APP_NOTIFICATIONS_API_URL","shareReportError","ReportMaker","creating","showCatchline","showCurrentStatus","showTitle","showChiefPatron","showAllPatrons","showSummary","showNotes","selectedNotes","selectedCollection","WatchListID","showHistory","showHouseAmendments","showSenateAmendments","showConferenceAmendments","showGovernorsRecommendations","personalMessage","showStatus","showCommitteeEvent","showAllBills","showClerkNames","showDlsStaffNames","showLdNumber","startRange","endRange","rangeError","DLS_STAFF","getReportUrl","toggleShowBills","checkParams","generateBillList","recent","mostRecentAmount","showVotes","newWindow","jsonData","userCreated","reportTitle","ReportNumber","startType","endType","typeFilled","Committee","Subcommittee","showPassedHouse","showPassedSenate","showPassed","showApproved","showVetoed","showContinued","showFailed","showEmergency","showFirstHouseCommittee","showFirstSenateCommittee","showLastHouseSubcommittee","showLastSenateSubcommittee","toggleReportMaker","autoReport","lisDocDomain","STORAGE_ACCOUNT_DOMAIN","HOUSE_NUMERIC_SORT_CATEGORIES","SENATE_NUMERIC_SORT_CATEGORIES","CalendarDetailsComponent","hideAll","currentItemSelection","toggleAll","toggleCategory","fetchCsv","handleCurrentItemChange","generateClerksCopy","CalendarCategories","CalendarCategory","Patron","fileName","saveAs","Blob","showReportMaker","setCategoryReportBillList","categoryReportBillList","comments","filteredCategories","calendarFileUrl","pdfFile","CalendarFiles","URL","calendarCategoryReferences","canSetCurrentItem","isCalendarForm","IsProforma","comment","Comment","currentProceduralMotion","currentAgendaItem","currentCategoryItem","commonCurrentItemOptions","formatCreateLabel","isSavingCalendarCurrentItem","setCurrentItem","creatingCollection","ClerksCopy","editHistory","createWatchlist","createdCollections","sessionOnly","show","toggleAgenda","agendaNote","AgendaNote","AgendaActivities","sortedPatrons","patronIndex","sameAsPrevious","sameAsNext","patronDisplayName","Versions","votes","CalendarDetailsPrintout","agendaNode","dangerouslySetInnerHTML","__html","HouseCalendarFormComponent","showCategoryPreview","selectedFile","calendatDate","commentEdit","tempComments","initializeForm","handleBulkAgendaSort","addComment","removeComment","commentShift","handleProFormaChange","handlePdfFile","submitPdfFile","changeConveneTime","toggleCommentEdit","confirmCommentEdit","toggleShowTitles","setPending","fileInput","referenceCategory","OnDemand","thisDate","Map","values","agendaItem","CalendarComments","tempComment","saveRequired","forceUpdate","categoryFinder","newCalendarCategory","isNewCategory","newCategoryIndex","selectedCategoryIndex","newAgenda","duplicateBillIndex","categoryType","gettingPdf","blob","createObjectURL","newComments","newTempComments","CalendarCommentID","toISOString","newSequence","shiftUp","genCalendarPreview","calendarId","navigate","files","isSubmittingFile","versions","ver","Version","conveneTime","timeChecker","clone","showTimeSelect","showTimeSelectOnly","dateFormat","timeFormat","accept","handleCommentChange","CalendarManagementForm","findLastByIsActiveThenCalendarDateThenCandidateDateThenLegChamberTypeKey","ignoreCalendarDate","ignoreCandidateDate","findLastByCalendarDateThenCandidateDateThenLegChamberTypeKey","findLastByLegChamberTypeKey","SenateBillsGrid","textHeight","sortNumeric","newAgendaSequence","categoryIsSequenced","lowerLegislationNumberAgenda","findLast","finalLowerLegislationNumberIndex","sortCategoryNumeric","SenateCalendarFormComponent","hideCategory","CalendarFormContainerComponent","isLoading","calendarBillParams","calendarid","CalendarFormContainer","CalendarManagement","minutesListRequest","minutesListSuccess","minutesListFailure","minutesCreateRequest","minutesCreateSuccess","minutesCreateFailure","categoryCreateSuccess","categoryCreateFailure","minutesBookSuccess","minutesBookFailure","minutesBookForCalendarSuccess","minutesBookForCalendarFailure","minutesBookSaveSuccess","minutesBookSaveFailure","minutesBookPublishSuccess","minutesBookPublishFailure","entriesSaveSuccess","entriesSaveFailure","entriesCreateSuccess","entriesCreateFailure","entriesCommunicationSaveSuccess","entriesCommunicationSaveFailure","actionTypesSuccess","actionTypesFailure","chairReportSuccess","chairReportFailure","committeeMinutesSummarySuccess","committeeMinutesSummaryFailure","minutesList","minutesMessage","minutesCreateMessage","minutesBook","minutesBookError","minutesBookForCalendar","minutesBookErrorForCalendarError","minutesBookSave","minutesBookSaveError","minutesBookPublish","minutesBookPublishError","clerksCopyGen","clerksCopyGenError","categoryCreate","categoryCreateError","entriesSave","entriesSaveError","entriesCreate","entriesCreateError","entriesCommunicationSave","entriesCommunicationSaveError","minutesGen","minutesGenError","actionTypes","actionTypesError","chairReport","chairReportError","committeeMinutesSummary","committeeMinutesSummaryError","minutesActionCreators","requestMinutesList","receiveMinutesList","minutesListError","getMinutesList","Minutes","requestMinutesCreate","receiveMinutesCreate","minutesCreateError","createMinutes","createMinutesError","receiveMinutesBook","getMinutesBook","MinutesBooks","receiveMinutesBookForCalendar","minutesBookForCalendarError","getMinutesBookForCalendar","receiveMinutesBookSave","saveMinutesBook","receiveMinutesBookPublish","publishMinutesBook","receiveClerksCopyGen","genClerksCopy","receiveCategoryCreate","createCategory","receiveEntriesSave","saveEntries","receiveEntriesCreate","createEntries","receiveEntriesCommunicationSave","saveEntriesCommunication","receiveActionTypes","getActionTypes","ActionReferenceTypeList","receiveChairReport","getChairReport","minutesBookID","ChairReports","receiveCommitteeMinutesSummary","getCommitteeMinutesSummary","minutesBookIDs","categoryCreateMessage","entriesSaveMessage","entriesCreateMessage","MinutesGridComponent","getMinutesData","minutesDate","sessionDropdown","selectedSessionToolbar","selectedSessionGrid","selectedRow","minutesObj","minutesId","newSelected","MinutesBookID","input","indeterminate","MinutesDate","MinutesManagementGrid","LoaderComponent","loadingCheck","prototype","call","Misc","newEntries","cancelEdit","entries","EntryText","MinutesEntries","handleSaveEntry","entry","MinutesEntryID","getReferenceList","eventCode","fullList","filteredOptions","otherVersions","otherAmendments","lt","o","otherSubs","CustomCreatableSelect","inputMinWidth","inputWidth","selectedActionType","inputSizer","newWidth","scrollWidth","inputStyle","minWidth","boxShadow","autoselected","isNewEvent","getOptionLabel","visibility","selectStyle","isValidNewOption","CustomInput","maxWidth","textListLength","InputType","handleActionTypeChange","addInput","actionTypeDropdown","referenceIndex","entryIndex","activityIndex","originalValue","reference","ActionReferenceType","ReferenceText","__isNew__","ReferenceID","LegislationEventID","EventCode","IsPassed","CommunicationDate","CommunicationNumber","CommunicationSummaries","newInput","ActionReferenceTypeID","divStyle","errorCheck","incompleteInputs","force_br_newlines","force_p_newlines","forced_root_block","memberVal","newEvent","committeeVal","eventChamber","subCommitteeVal","subCommittee","textVal","autoselect","opt","newLabel","time","timeIntervals","timeCaption","datetime","ActionReferences","ActivityReferences","EventReferences","eventList","evt","getOptionValue","communicationList","communicationVal","comm","CommunicationID","communication","legislationVal","legislationList","fetchingSessionLegislation","opacity","onKeyDown","menuIsOpen","valueContainer","CommentBox","selectedComment","selectComment","showView","toggleViews","MinutesSummary","handleCommentBoxChange","toggleBox","firstElement","getCommentPreview","Footer","innerHeight","saveComment","NonLegislativeForm","selectedMotion","insertEntry","templateInputs","motionOptions","selectedMotions","closeNewEntries","onEntryDragEnd","onActivityDragEnd","removeActivity","addBackActivity","insertMotion","handleTemplateChange","handleMotionChange","handleSelectedMotionDescriptionChange","getCatActionList","toggleMenu","addEntry","toggleCommentBox","toggleShowDeleted","getNonLegislativeActionList","handleNewMotionChange","toggleSwitchCategory","handleSwitchCategoryChange","toggleSelectEntry","toggleEditActivityDescription","menuBoxRef","MinutesActivities","newActivity","InPreview","act","eventReference","actionReferences","missingActivitiyReferences","existingActivities","textType","MinutesActivityID","editingActivityDescription","initialText","activity","VoteTally","handleActivityDescriptionChange","attr","tempVoteTally","activities","onMultipleEntryChange","currentActivitySequence","MinutesSummaries","tInput","ms","cs","commSummary","promises","ar","onEntryChange","templatedEdited","activityRefs","actIndex","MinutesCategoryID","showSwitchCategory","selectedSwitchCategory","catId","referenceParams","CalendarActionID","currentTarget","relatedTarget","showMenu","newEntry","IsOOB","commentBoxContent","showCommentBox","showDeleted","AdministrativeAction","dropdownOptions","switchingCategories","origSequence","bulkMoveEntry","showDeletedItemsCheckbox","getIndexOfFirstActivity","categoryFormDisabled","reconsiderationEvents","getCategoryDescriptionText","disableChanges","provided2","ma","contentEditable","suppressContentEditableWarning","toggleMoveEntry","tIndex","summary","summaryIndex","toggleChairsReport","MinutesNumber","EditVoteTally","forwardRef","LegislativeForm","nonLegislativeActionReferences","fullEventList","votesToBeSaved","savingVotes","togglingEdit","smallMotionForm","selectedBillNumber","savingNonLegAction","otherBillEventOptions","otherEvent","otherEventSelected","removeMotion","unSelectOtherEvent","handleOtherEventChange","getOtherBillEventOptions","filterBillEventReferences","handleBillChange","addAllEntries","toggleSmallMotionForm","handleBillNumberChange","applyLegislationToEntry","getReconsiderationEvents","unSelectOtherEventEdit","handleOtherActivityDescriptionChange","motionRef","motionDropdownRef","VoteID","activitiesToBeSaved","OtherEvent","_","newMotion","reversedActivities","OtherMotionSelected","unreversedActivities","memberListEvents","ReconsiderationGrammar","ReconsiderationDescription","billEventReferences","templateEdited","self","openMotionEditor","isNewEntry","minutesEntry","theNewActivity","needToSave","eventReferenceIndex","cb","isOOB","newInserEntries","_entryIndex","_activityIndex","recess","MinutesEntryCreate","me","firstActivityIndex","extractText","justifyContent","toggleOOB","legNumSelectStyle","onKeyUp","motion","handleOtherChange","outOfBlockEntries","inBlockEntries","auxOptions","isMulti","formatGroupLabel","formInput","ent","MinutesDetails","publicPage","nonPublicEntries","CategoryDescription","CategoryText","categoryTextPiece","p1","commListSuccess","commListFailure","commGetSuccess","commGetFailure","commSaveSuccess","commSaveFailure","commFileSaveSuccess","commFileSaveFailure","commCreateSuccess","commCreateFailure","commCategoriesSuccess","commCategoriesFailure","getCommunicationAssignmentsSuccess","getCommunicationAssignmentsFailure","getCommunicationSummaryListSuccess","getCommunicationSummaryListFailure","getAdminCommunicationAssignmentsSuccess","getAdminCommunicationAssignmentsFailure","saveCommunicationAssignmentSuccess","saveCommunicationAssignmentFailure","joinCommFileSuccess","joinCommFileFailure","commList","commListError","commCreate","commCreateError","commGet","commGetError","commSave","commSaveError","commFileSave","commFileSaveError","commCategories","commCategoriesError","commChamber","joinCommFile","joinCommFileError","communicationSummaryList","communicationSummaryListError","communicationAssignments","getCommunicationAssignmentsError","adminCommunicationAssignments","getAdminCommunicationAssignmentsError","communicationAssignmentSave","saveCommunicationAssignmentsError","communicationsActionCreators","receiveCommList","getCommList","CommunicationsList","receiveCommSummaryList","commSummaryListError","getCommunicationSummaryList","CommunicationSummariesResponse","receiveCommGet","getComm","CommunicationResponse","receiveCommCategories","getCommCategories","CommunicationCategoryTypesReference","receiveCommunicationAssignments","CommunicationAssignments","getCommunicationAssignments","receiveAdminCommunicationAssignments","getAdminCommunicationAssignments","receiveCommunicationAssignmentSave","saveCommunicationAssignmentError","saveCommunicationAssignment","receiveCommSave","saveComm","saveCommError","saveCommunicationResponse","receiveCommFileSave","saveCommFile","receiveJoinCommFile","receiveCommCreate","createComm","createCommunicationResponse","MinutesManagementForm","buildingCategoryConnection","buildingEntryConnection","isPendingChange","lastSavedTime","lastPublishedTime","entryHubConnection","categoryHubConnection","indexFieldsetIsActive","activityFieldsetIsActive","previewFieldsetIsActive","categoriesToMove","selectedCategoryToMoveTo","publishing","committeeMinutesBooks","chairReportCategoriesSetForRegeneration","regeneratingCategories","fetchedMinutesBookIDs","activityRef","entryFormRef","entryChange","multipleEntryChange","moveEntry","saveCategory","saveEntry","publishAllEntries","showActivity","duplicateChairmansCategory","receiveEntryByWebsocket","receiveCategoryByWebsocket","toggleFetchChairs","handleChairsReportDateChange","fetchChairsReports","regenerateChairsReportCategory","toggleEditCategoryText","setTempCategoryText","toggleMinutesStatus","getMinutes","editingCategoryText","MinutesCategories","tempCategoryText","newFormData","currentCategory","applicableCategories","movingCategorySource","movingEntrySource","showMoveEntryDialog","destinationCategoryIndex","sourceCategory","sourceEntry","destinationCategory","sourceCategoryIdx","destinationCategoryID","mc","sourceEntryIdx","theEntry","entryObject","MinutesEntrySave","invoke","promise","activitesForClerksCopy","categoryIdx","ReleaseToPreview","entryIdx","publishEntry","IsReleased","IsPassage","activityRect","MinutesFiles","newMinutesBook","newCategory","creatingCategory","minutesbookid","fetchingChairsReports","calendarCategoryTypeID","categoryToDuplicate","MinutesSummaryID","entryFromResult","minuteEntries","categoryFromResult","getConnectionId","conn","connectionName","connectionId","handleMessage","functionToRun","StatusCode","lastSaveErr","handleMessageOriginatedFromWebsocket","Success","entryConnection","signalR","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","startConn","categoryConnection","sequences","every","seq","communications","usedCommunicationSummary","communicationSummaries","start","withCredentials","onreconnecting","onreconnected","onclose","chairsReportStartDate","chairsReportEndDate","endOf","MinutesStatus","combinedMinutesBookIDs","uniqueCombinedMinutesBookIDs","totalIterations","newIterations","matchingIterations","existingMatchingCategory","matchingCategoryIdx","existingCategoryIndex","cmte","existingMatchingEntryIndex","existingMatchingSummaryIndex","activitySequence","committeeMinutesBookIDs","associatedCommitteeMinutesEntry","existingMs","MinutesStatusId","MinutesStatusID","MinutesCalendars","flexShrink","sty","onSequenceChange","reconnectingCategory","closedCategory","categoryID","TypeSwitcher","reconnectingEntry","closedEntry","MinutesIndex","selectedCalendarCategory","handleCalendarCategoryChange","pointerEvents","renderCategoryDescription","Preview","newPreviewArray","entryObj","overflowY","MinutesManagement","EventControls","eventDate","utcOffset","set","second","millisecond","eventSequence","addEvent","removeEvent","_a","_b","eventObj","actorType","ActorType","eventAdded","eventRemoved","billEventOptions","buttonDisabled","required","maxLength","comitteeList","singleStyles","group","groupHeading","BillCategories","selectedPatron","selectedSubject","handlePatronChange","handleCommitteeChange","handleSubjectChange","selectedBillStatusCategory","statusCategoriesList","LegislationCategoryID","introDate","introductionDate","statusCategoryName","currentStatus","honorExcludeFailed","statusCategoryId","statusCategory","excludeFailed","allLegislation","uniqueSearch","query","frequentParams","mostFrequent","frequentJson","frequentQuery","frequentLink","includeDates","makeLink","clearIndicator","AdvancedSearchBoxComponent","billStatusDateError","showFindSection","showCategorySection","toggleFindSection","toggleCategorySection","setOpenSection","toggleShowCategories","showCategories","failedToGetSessions","billStatusStartDate","billStatusEndDate","adjournmentEvent","queryObj","selectedBillRangeBeginning","selectedBillRangeEnd","selectedChapterNumber","selectedLocation","selectedSummaryVersion","selectedBillVersion","selectedPatronType","selectedBillType","selectedBillEvent","billEventStartDate","billEventEndDate","billActionStartDate","billActionEndDate","keywordUseGlobalSessionSearch","searchParam","innerWidth","handleExcludeFailedChange","toggleGroup","billFieldset","toggleHelpModal","keywordFieldset","billManagement","handleRadioChange","handleSelectChange","billVersionList","billSummaryList","statusFieldset","billStatusCategoryList","handleCurrentStatusChange","chamberChange","committeesFieldset","committeeChange","newCmte","getSelectedCommitteeLabel","subcommitteeList","subcommittee","membersFieldset","PatronTypeID","handlePatronTypeChange","subjectFieldset","clearForm","showUpdateSearchButton","SearchSelections","clear","handleSelectionClear","typeIndex","handleMultiSelectionClear","updateSearch","Selection","UpdateSearch","NEW_EVENT","historyItem","isNewlyAdded","isNewlyDeleted","dateChanged","sequenceChanged","descriptionChanged","eventCodeChanged","BillHistoryForm","checkForScrollUp","conNodeRect","scrollToEvent","checkForScrollDown","organizedEvents","newEventDate","editingEvents","currentInput","eventGroupIndex","inputNumber","changeToBill","handleEventInputChange","changeEvent","changeDate","toggleEventGroup","bulkToggleEventGroup","toggleEditDescription","changeDescription","formDescription","handleNewEventChange","handleNewEventDateChange","saveEvents","handleMovingFocus","handleMovingFocusFromBillChanger","receiveEventByWebsocket","getSessionLegislation","_inputRefs","_containerRefs","_billSwitcherRef","_addEventRef","switchedToBill","organizeEvents","historyList","addEventNode","ReactDOM","findDOMNode","numberOfEvents","hidden","isBillManagement","events","HubConnectionBuilder","entryConnectionId","handleEvent","billData","legislationEventID","eventInputValue","origEventCode","LegislationEventTypeID","hasChanged","lEvent","EventDate","origDate","newEventGroupIndex","eventGroup","newEventGroup","hideAllEvents","togglehideAllEvents","expand","currentEvent","missingActionReferences","existingEvt","descEdit","origDescription","IsMandatory","eventReferences","inputs","substitueRejectedEvents","overrideSet","wasLastEventGroup","eventsToSave","eventGroupsToSave","success","orgEvents","g","lastSavedEventGroup","savedEventsInLastSavedEventGroup","lastSavedEvent","lastSavedEventIndex","sessionID","sessionLegislation","conNode","lastItemIndexInEventGroup","changer","inputNode","lastEventGroup","lastEvent","changeToNewBillHistoryForm","nodeRect","pageYOffset","windowHeight","inputRefs","containerRefs","containers","_historyItem","toggleEditContent","AddEventForm","addEventRef","versionsList","reconsiderationActionReference","eg","latestEvent","expandAllEvents","focusOnInputContainer","onInputChange","onMenuClose","deleteEvent","previousDate","eventsInADay","valueOf","originallyDeleted","inputId","statusCode","HistoryForm","LegislationProfiles","showSection","filteredWatchlists","filteredWatchlistsValue","toggleSection","createCollection","filterWatchlist","WatchListLegislation","collections","coll","watchlists","selectedCollectionIndex","w","isAuthor","collectionIsSaving","listIndex","IsPaid","claim","selectCollection","MERGE","DELETE","CollectionControls","selectedWatchlists","selectedMergeWatchlists","editWatchlistName","newName","deleteCollection","handleWatchlistChange","handleMergeWatchlistChange","handleToggleCompositeView","toggleEditWatchlistName","saveWatchlistName","addToWatchlists","handleCollectionChange","merge","saveResultCollections","associatedWatchlist","calendarHeader","searchMade","mergeButtonDisabled","createOptionPosition","billListLength","getCollectionFailure","getCollectionSuccess","getCollectionsFailure","getCollectionsSuccess","saveCollectionsFailure","saveCollectionsSuccess","getCriteriaTypesSuccess","getCriteriaTypesFailure","notificationListSuccess","notificationListFailure","messageListSuccess","messageListFailure","adminMessageListSuccess","adminMessageListFailure","createMessageSuccess","createMessageFailure","saveMessageSuccess","saveMessageFailure","collectionsError","collectionSave","collectionSaveError","criteriaTypes","criteriaTypesError","notifications","notificationsError","messages","messagesError","adminMessages","adminMessagesError","messageCreate","messageCreateError","messageSave","messageSaveError","collectionActionCreators","receiveCollection","collectionError","getCollection","REACT_APP_LEGISLATION_COLLECTION_API_URL","WatchLists","receiveCollections","getCollections","receiveCollectionSave","saveCollections","useCreate","receiveCriteriaTypes","getCriteriaTypes","CriteriaTypes","receiveNotifications","getNotifications","Notifications","receiveMessages","getMessages","Messages","receiveAdminMessages","getAdminMessages","receiveMessageCreate","createMessage","receiveMessageSave","saveMessage","HistoryList","filterAmount","setFilterAmount","filteredBillHistory","slice","filterOptions","hIndex","opened","vIndex","VoteNumber","toggleShowLinks","BillInfoComponent","billHistoryIsLoading","showInfo","showBillHistory","showBillVersions","newBillNote","showBillNote","handleNoteChange","toggleShowInfo","getHistory","toggleVersions","toggleBillNote","toggleBillNotesFromParent","saveNote","toggleShowData","billHistoryMessage","vote","historyIndex","links","linkPromises","cmtePromise","getCommitteeById","committeeByIdData","ReferenceType","collectionBillIndex","cBill","Note","userCanUseCollections","displayCrossSession","eventsChanged","fontStyle","handleBillCheckbox","displayChapterNumber","ChapterNumber","LegislationStatus","expanded","LegislationSummary","SearchText","marginBlockEnd","BILL_COLLECTION_AUTHOR","BillManagement","billStatusCategoryListIsLoading","selectedBillAction","selectedBillSession","previousSearch","searchType","filteredPatronList","groupedCommitteeList","filteredCommitteeList","selectAllBills","legislationIDs","showSidebar","showModal","searchOnEnterPress","handleSearch","getBillsResults","sessionChange","toggleSidebar","toggleAllBills","handleEditedBills","executeSearch","toggleModal","toggleExpandAllLegislation","searchBox","base64","decodedSearch","atob","calendarCategoryDescription","getBillStatusCategoryOptions","getBillVersionOptions","getBillSummaryOptions","getBillEventOptions","msg","updated","sessions","dateParam","sessionParam","getPatrons","getSubjects","getIntroDates","groupName","clearUrl","clearBillData","isPending","displaySelectedLocation","encodedSearch","keywordVersion","KeywordLegislationVersionID","KeywordSummaryVersionID","PatronTypes","StartDate","EndDate","KeywordExpression","KeywordLocation","EventStartDate","EventEndDate","IsPending","MostFrequent","AllLegislation","CurrentStatus","ExcludeFailed","LegislationIDs","IntroductionDate","activityFieldset","closeBillInfo","pos","l","billVersionReferences","billSummaryReferences","SummaryVersionID","datesList","code","collectionIsLoading","collectionIndex","returningFromSearch","legislationIds","LegislationId","insertIdx","displaySequence","dateItem","dateItemIdx","eventItem","newEvents","deletedEvents","reDeletedEvents","dateChangedEvents","sequenceChangedEvents","descriptionChangedEvents","eventCodeChangedEvents","_bill","historyIsLoaded","billID","bool","scrollIntoView","toggleArrows","isCreatingCollection","resetUrl","saveCollection","PublicBillSearch","CommunicationsManagementGrid","commDate","loadCommsList","deleteCommunication","commParams","createObj","CommunicationType","createErrorMessage","communicationBeingDeleted","communicationData","Communication","legList","CommunicationLegislation","legNumber","billType","numbers","char","billLink","draftTitle","removeLDNum","EffectiveType","categoryStyle","CommunicationsDetailsComponent","refNum","authoring","referenceNumber","CommunicationCategories","CommunicationCategoryID","ShowSignatureNote","FooterSentence","WebkitPrintColorAdjust","houseSig","ClerkName","ClerkTitle","newDescriptions","handleTitleChange","organizedComms","getCommunicationCategoryHeight","newDraftTitle","stripTags","initialOverflow","communicationCategories","textOverflow","searchText","regexp","newSearchText","SyntaxError","numeric","CommunicationLegislationID","existsInMultipleCategories","CommunicationCategoryTypeID","IsCandidate","CommunicationsForm","failedToJoinBills","isDoubleSided","genCommDoc","hasSelectedBills","hasIncludedBills","toggleShowSignatureNote","includeAll","validateCommunicationNumber","toggleIsDoubleSided","newReferenceNumber","commId","duplicateCommNumber","commNumbers","n","newCommCategory","printAllIncluded","billsToGen","billNum","AmendmentCount","FirstChamberCount","SecondChamberCount","pdfSrc","LegislationFiles","Pdf","FileContents","urlObj","failedBills","JoinLegislation","Generated","showPdfWindow","communicationsId","communicationid","catList","roleType","clerkRoleTypeID","hasDuplicates","print","changeCategoryPositionDropdown","CommunicationsManagement","VoteGrid","voteOriginOptions","saving","getVoteTypeReferences","saveVotes","toggleDeleteVoteModal","deleteVote","voteIndex","organizedVotes","voteToDelete","votesToSave","deletingVote","VoteList","getVotes","datesToIterate","checkedVotes","invalidFinalVotePublish","voteOrigin","FinalVote","voteObj","VoteLegislation","VoteDate","CommitteeVotedOnLegislation","VoteIDs","chairmansReportFailures","createChairmansReportSummarizedOnMinutes","chairmansReportVotes","VoteTypeID","fetchingCommittees","voteDay","sortTimeDesc","endDate","IsVoice","sortVotes","voteActions","VoteDetails","voteMembers","voteData","memberYeas","nObj","ResponseCode","memberNays","memberAbstentions","memberNoVote","voteStatements","VoteStatement","voteActionDescription","LegislationActionDescription","VoteType","displayTallySheet","voteFileUrl","displayCommitteeLink","linksGridColumns","linksGridTemplateColumns","headerGridTemplateColumns","mobileLinksPosition","printedContent","removedContent","billDescription","ReferToCommitteeID","ReferToCommitteeName","statement","statementIndex","VoteComment","PassFailOptions","REFER_ACTIONS","INCORPORATED_ACTIONS","VoteForm","isPreviewing","changeVotes","selectedVoteActionDescription","selectedCalendarCategoryType","calendarCategoryTypeList","showWarning","settingIsBlock","savedIncorporated","resetForm","resetVoteMembers","getVoteActionReferences","getCalendarCategoryTypes","handleVoteActionDescriptionChange","handleCalendarCategoryTypeChange","handleVoteChange","handleVoteLegislationChange","updateStatement","toggleTallySheetPDFPreview","toggleChangeVotes","setVoteTally","toggleWarning","getVoteListForFinalVote","toggleEditVoteLegislation","getBills","handleSenateCommitteeVoteLegislationChange","originalVoteData","originalVoteMembers","VoteMember","setSelectedValue","loadingVoteActionList","voteAction","VoteActionID","VoteActionDescription","committeeSameDayVoteList","undo","editingVoteLegislation","showEditingVoteLegislationMessage","uneditedVoteLegislation","voteLegislation","deletedLegIndex","vl","legIndex","removedValue","IsBlock","ReferToCommitteeNumber","yeaVotes","vm","nayVotes","abstainVotes","isPublishing","voteId","voteid","voteParams","preventPublish","showVoteTallyWarningMessage","voteTallyInDescription","PassFail","bl","EventDeletionDate","onMouseEnter","VoteMembers","responseStyle","arrangedVoteMembers","voteColumns","memberColumn","memberVote","VoteStatements","newVoteStatement","toggleEditing","handleMemberSelection","addStatement","exitEdit","memberIndex","memberOptions","removeStatement","VoteManagement","dateIndex","committeeID","votedLegislation","votedLegislationNumbers","commCategoriesWithVotedBills","voteArray","previousVote","newDateContainer","legislationKeyA","legislationKeyB","newOrganizedVoteDate","newDate","PrintRoomGrid","showRow","printPreviewIndex","togglePrintView","batchIndex","urlBatchId","textResults","urlBatchIndex","PrintBatchID","findMember","headerStyle","headerStyleComplete","viewCompletedByBill","flatBillList","batch","BatchItems","PrintDate","printDate","flattenBatches","BatchDate","BatchSequence","BatchDescription","VendorBatch","totalPageCount","PageCount","filteredTextResults","showComplete","viewOnlyCompletedItems","introStartDate","introEndDate","formattedStartDate","formattedEndDate","isBetween","isSameOrAfter","filterTextResults","batchDate","pdfMarked","textIndex","BatchItemID","markPdf","overflowX","SasURL","versionOptions","PrintManagement","billRoomView","isSearching","selectedVersion","anyChecked","handleFilter","handleReleaseToPrint","handlePrintComplete","handlePrintAllEnrolled","toggleBillRoomView","rej","showReprints","returnItem","billInNewFilteredDataset","textId","vendorBatch","isReleased","releaseDate","batchItemsToSave","itemsToRemove","completeDate","BatchItemIDs","Editing","showBillText","BillGrid","LegislationText","ReportManagement","selectedReport","reportData","handleFormChange","handleReportTypeChange","ReportID","reportDataChamber","reportDataName","ReportName","rpt","showItem","reportDataDate","filteredReportData","reportItem","Heading","sessionisLoaded","reportTypesAreLoaded","rt","flags","uniqueHeaderItems","has","dateLabel","printRef","reportItemIndex","patronString","ByRequest","ConsentRequired","GovernorsRequest","onExpandedChange","legislationText","newExpanded","toggleExpandedBills","currentPage","autoResetExpanded","freezeWhenExpanded","expandedBills","page","pages","ceil","onPageChange","Amendments","amendmentIndex","selectAmendment","onPageSizeChange","onSessionChange","onChamberChange","chamberIsDisabled","AmendmentManagement","selectedAmendment","billFilter","firstPass","unpublished","filterBills","getEDoc","appendEdoc","filterToEDocReady","isEDocReady","amendmentsToSave","domContainer","publishedBillIndex","filteredBillList","publishedLegislationIndex","createEDoc","eDocFiltered","amendmentNumber","amendmentTexts","amendmentItems","amendmentText","AmendmentItems","LineNumber","k","thisDraftText","ClassName","LineClassName","Line","amendmentChanges","AmendmentActions","TextClassName","Lines","eDocText","appendedEDoc","keepExpanded","resultsChanged","pageIndex","amendmentsFilteredByOpposingChamber","eDoc","SponsorType","aPrefix","bPrefix","aNumber","bNumber","AdminDashboard","criteriaTypeWeights","LegEvent","showLinks","toggleLinks","toggleLoading","voteLinks","setVoteLinks","getVoteLinks","BillInfo","reasonGrouping","allBillsExpanded","toggleInfo","useEffect","deleteBillFromCollection","addBillToCollection","handleCheckbox","CriteriaType","NotificationManagement","expandLatestHistory","getWatchlists","selectWatchlist","addBillsToWatchlist","stickyHeader","notificationsRef","notificationIDs","notificationID","checkedBillIdx","NotificationID","wl","billsFound","duplicate","Committees","Reasons","Bills","WatchListLegislationID","savedWatchlistIndex","sortLegNumbers","organizedNotifications","committeesArr","previousNotification","notification","newNotificationContainer","Notification","NotificationGroupings","objName","NotificationGrouping","NotificationReason","reasonObjIdx","legListing","watchlistId","selectedWatchlist","NotificationCriterias","CriteriaValue","organizeNotifications","remove","notificationIndex","committeeGrouping","committeeGroupingIndex","reasonGroupingIndex","Reason","watchlistID","notificationGroupings","reasons","criteriaType","reason","docListSuccess","docListFailure","docSuccess","docFailure","keyRegistrationSuccess","keyRegistrationFailure","confirmKeyRegistrationSuccess","confirmKeyRegistrationFailure","savePartnerSuccess","savePartnerFailure","partnerListSuccess","partnerListFailure","getPartnerSuccess","getPartnerFailure","getPartnerKeySuccess","docList","docListError","docError","savePartnerError","keyRegistrationError","partnerListError","partnerError","partnerKeyError","developersActionCreators","receiveDocList","getDocList","ApiDocumentations","receiveDoc","getDoc","Documentation","receiveKeyRegistration","submitKeyRegistration","receiveConfirmKeyRegistration","confirmKeyRegistrationError","submitConfirmKeyRegistration","receiveSavePartner","savePartner","receivePartnerList","partnerList","getPartnerList","PartnerList","receivePartner","getPartnerError","getPartner","receivePartnerKey","partnerKey","getPartnerKeyError","getPartnerKey","PartnerGridComponent","nameSearch","orgSearch","developers","partnerName","_original","ContactName","nameFilter","partnerOrg","orgFilter","PartnerID","phoneRegex","PartnerForm","initIsActive","checkPhone","partnerId","phoneError","PartnerFormWrapper","PartnerManagement","PartnerManagementGrid","PartnerManagementForm","UserManagement","newUser","existingUser","searching","cancel","create","splitName","Search","handleMemberDropdownChange","handleSubjectDropdownChange","openToDate","ResourcesComponent","SessionInfo","adjournment","reconvene","activeSessions","activeSession","tz","guess","Schedule","Times","timeIndex","Items","OwnerName","IsCancelled","renderHtml","defaultStyle","freshMessage","BulletinMessage","MessageOfTheDay","handleBold","handleItalic","toggleLink","linking","linkUrl","linkText","setLinkUrl","setLinkText","handleLink","editMessage","anchor","adminView","previewing","toggleAdminView","toggleShowAll","newMessageRef","bulletinID","BulletinID","filteredMessages","messagesToDisplay","admin","local","gettingAdminMessages","gettingMessages","MessageList","HomeComponent","searchIsLoaded","sessionInfoIsLoaded","scheduleIsLoaded","setupPage","getMembers","getDates","getStatusCategories","dateComp","timeA","TimeDescription","timeB","organizedSchedule","scheduleArray","previousSchedule","scheduleDateTime","getScheduleDateTime","previousScheduleDateTime","organizeTimes","itemsList","organizedTimes","Time","scheduleDate","scheduleTime","sessionCodeParam","currentHour","subtract","organizeSchedule","filteredOrganizedEvents","times","thisDayMeetings","timeObj","overflowWrap","SessionInformationComponent","listSessions","PublicSessionInformation","CommitteeListComponent","activeKey","listMembers","houseCommitteesIsLoaded","senateCommitteesIsLoaded","houseCommittees","senateCommittees","conveneDate","showSenateChamber","showHouseChamber","getCommitteeLists","toggleGetMembers","listName","chairmanIndex","CommitteeRoleTitle","chairman","memberString","detailString","EffectiveBeginDate","sessioncode","listCommittee","legislationObj","selectedBillStatus","legislationLink","listHouseCommittees","listSenateCommittees","PublicCommitteeList","CURRENTLY_IN","ASSIGNED_TO","MinutesData","MinutesList","listMinutes","DocketData","formattedSessionCode","HouseAgendaDate","DocketList","count","listDockets","maxSize","SubCommittees","parentCommitteeData","getCommitteeDetails","getCommitteeMembers","getMeetings","setupDoc","committeenumber","getCommitteeByNumber","committeeByNumberData","detailsIsLoaded","membersIsLoaded","parentID","subcommitteesIsLoaded","meetingParam","minutesListIsLoaded","docketListIsLoaded","closingEvent","reconveneEvent","defaultDocket","committeeLabel","changedMembers","Change","ChangeDate","buildMembers","slideDockets","linkIndex","PublicCommitteeDetails","Entry","VoteIsPublic","senateUser","PublicMeetingDetails","subformIsLoaded","view","chairmanReport","voteSheet","setView","toggleMeetingStatus","ChairmansCategory","getVoteSheetData","getBillDetailData","getVoteDetailData","voteDetails","memberRule36","minutesBookId","meetingid","parentCommittee","entIndex","actionIndex","ChairmansLegislation","formattedBill","striptags","PublicDocketDetails","docketId","sessionIsLoaded","htmlFile","dataIsLoaded","docketFile","trimmedUrl","removeZeros","CommitteeInformationComponent","slide","MemberInfoComponent","memberID","prefileEvent","MemberStatus","memberDetails","PartyName","DistrictName","MemberInformationComponent","houseMembers","senateMembers","getMembersLists","getMemberContact","memberContactData","houseMembersIsLoaded","senateMembersIsLoaded","listHouseMembers","listSenateMembers","PublicMemberInformation","subcommittees","subcomm","CommitteeAssignments","PatronRoles","roleLinks","roleIndex","memberNumber","memberChamber","memberNumberWithoutChamber","formattedMemberNumber","b64Link","MemberDetailsComponent","memberCommittees","memberSessionContact","memberDistrictContact","memberConferenceBills","getMemberCommittees","getMemberConferenceBills","effectiveDate","getCommitteesByMember","committeesByMember","parent","memberCommitteesIsLoaded","gaAddress","mailingAddress","contactIsLoaded","memberConferenceBillsIsLoaded","patronRolesIsLoaded","membernumber","jwt","showMemberStatusPageLink","getPrototypeOf","sessionContactInfo","districtContactInfo","PublicMemberDetails","WATCHLIST_LEGISLATION","ALL_LEGISLATION","WatchlistNotifications","hideNotifications","newKeywords","toggleNotifications","handleFrequenyChange","toggleEditKeywords","handleKeywordChange","handleKeywordSave","handleCheckboxChange","Frequency","NotificationFrequencyID","criteriaTypeObj","newCriteria","criteria","indexOfCriteriaInValue","CriteriaTypeID","keywordCriteria","showKeywordEditor","isDelete","criteriaToUseIndex","kc","nk","criteriaIndices","criteriaIndex","selectedHousePatrons","selectedSenatePatrons","selectedHouseCommittees","selectedSenateCommittees","getSelectedCommitteesLabel","statusChangeCheck","docketCheck","versionCheck","impactStatementCheck","keywords","introducedCheck","keyword","keywordIndex","HelpPage","QuickAdd","handleAddBillChange","isAddingBill","toggleIsAddingBill","quickAddBills","quickAddErr","sortLegislations","aLegislationKey","bLegislationKey","validLegPrefixes","BillSearchComponent","searchedKeywords","showAllNotes","showHelpModal","compositeView","removeWatchlistBills","toggleAllNotes","unload","getReportTitle","_billResultRefs","fullLegislationList","skippedRecords","skipIdsCall","KeywordUseGlobalSessionSearch","getResultsPromise","numSearchedIds","hasResults","paginatedLegislationIds","legislationIdsResponse","LegislationIds","totalResults","hasNextPage","observer","IntersectionObserver","handleObserver","rootMargin","threshold","observe","loadingRef","LOADING","hitCountRequestBody","flat","hitCounts","hitCount","reduce","st","HitCount","entities","boundingClientRect","prevY","savedCollectionIndex","errorMsg","billsToAdd","duplicatedBills","watchlist","removedBillCount","_cb","cbIndex","legislationIndex","billsToSearchFor","ranges","exitFn","existingWatchListLegislation","rangeStartAndEnd","rangeStart","rangeStartNumber","rangeEnd","rangeEndNumber","prefix","missedBills","fb","noWhiteSpaceBill","billKey","billPrefix","range","saveWatchlist","nextPageLoadingHeight","billResultRefs","getReportTitleObject","documentElement","clientHeight","ShareReport","emailAddresses","isSharing","handleEmailAddressChange","sendReport","toggleShareForm","STAFF","weights","getBillHistoryTypeLabel","committeeClerksAndStaff","generatingBillNumbers","generatingReport","hbCount","hjCount","sbCount","sjCount","compositeSortValue","getReportData","makeHtml","makePrintout","makeSpreadsheet","toggleCompositeSort","toggleShowNotes","htmlRef","printOutRef","sessionStartDate","loadingStaffNames","loadingClerkNames","loadingLdNumber","fullTextVersions","latestFullTextVersion","LdNumber","loadingAmendments","getLdNumber","loadingHistory","allResults","results","Status","committeeEvents","firstSenateCommitteeEvent","firstHouseCommitteeEvent","lastSenateSubcommitteeEvent","lastHouseSubcommitteeEvent","loadingVotes","loadingPatrons","loadingStatusHistory","billStatuses","committeePromises","patronPromises","historyPromises","textPromises","statusHistoryPromises","showStatusBool","showCommitteeEventBool","gettingBillHistory","gettingBillStatusHistory","gettingClerkNames","gettingStaffNames","gettingPatrons","gettingVotes","gettingLdNumbers","gettingAmendments","clerkRoleType","staffRoleType","committeesAndSessionsToSearch","getCommitteeClerksOrStaff","sl","se","billHistoryChunks","Notes","Emergency","ListName","getAmendments","chunk","getBillHistory","printWindow","contentData","htmlRefNode","breaks","historyRows","historyHeaders","hyperlinkedBill","formattedName","typeA","typeB","sortBillHistoryTypes","billHistoryType","billHistoryItems","newRow","Billno","YEAS","NAYS","ABSTENTIONS","PassedHouse","PassedSenate","Passed","Failed","Continued","Approved","Vetoed","columnHeader","noteIndex","historyFileName","showShareForm","reportId","BillInformation","gettingCommittees","sortBillsNumerically","direction","shareable","pageBreakInside","billHistoryTypeIndex","billHistoryItem","billHistoryItemIndex","gridColumn","frameBorder","SearchTranslator","wordToTranslate","word","wordparam","billSearchParams","ShorthandUrlTranslator","findPatronType","agencyListSuccess","agencyListFailure","agencyList","agencyListError","orgActionCreators","receiveAgencyList","getAgencyList","REACT_APP_STATS_API_URL","Agencies","ImpactStatementForm","fiscal","selectedAgency","uploadFile","getImpactStatementDescription","handleAgencyChange","handleFileChange","submit","agencyOptions","CollectionNotes","notes","toggleExpandNotes","legId","legislationInCollection","BILL_EVENT_AUTHOR","BILL_AUTHOR","VERSION_AUTHOR","SUMMARY","DESCRIPTION","isStatic","PatronName","PatronList","patronsLength","listPatrons","BillDetailsComponent","summariesList","editingHistory","displayStatementForm","statementSubmitting","statementLegislationTextID","statementDocumentcode","showWatchlistForm","getBillDetails","getBillVersion","saveSummary","submitImpactStatement","closeStatementForm","checkForDuplicates","togglePatronModal","handleAddToWatchlists","toggleWatchlistForm","saveVersionDescription","legislationNumberDigitsWithZeroPadding","legislationNumberDigitsWithOutZeroPadding","previousSessionCode","previousLegislationNumber","summaryIsLoaded","versionsIsLoaded","patronIsLoaded","billDataIsLoaded","openBillHistory","abbrev","agencies","organizations","agency","AgencyName","AgencyNumber","originalPatronList","expandPatrons","slideVersions","partnerEditor","billId","footer","errJson","modifiedBillData","LegislationList","newBillData","deletion","LegislationSummaryID","modifiedSummaryData","toggleDeleteSummaryModal","keyState","breaklessMatch","summaryToDelete","patronUpdate","activeVersions","billHeader","billHeaderEditor","formatSummaryVersion","billSummaryEditor","summaries","PublicBillDetails","VoteDetailsComponent","voteNumber","votenumber","voteDataIsLoaded","VoteFiles","PublicVoteDetails","csv_info","csv_name","csv_file","PublicDataFiles","loadingSessions","setSession","csv","PublicCommunicationsList","senateIsLoaded","houseIsLoaded","senateCommList","houseCommList","createCommList","jsonFile","CommunicationFiles","IsGenerated","PublicCalendarList","senateCalendarList","houseCalendarList","PublicCalendarDetails","currentItemHubConnection","receiveCurrentItem","getCalendar","calendarFile","currentItemConnection","currentItem","stronglyTypedObject","calendarCategoryID","agendaID","proceduralMotion","ProceduralMotion","categoryId","agendaId","displayDescription","PublicMinutesList","senateMinutesList","houseMinutesList","MinutesunicatilonNumber","PublicMinutesDetails","minutesid","minutesFile","ltGovPromise","ltGovParams","ltGov","clerkOfSenatePromise","clerkOfSenateParams","clerkofTheSenate","categoriesToShow","RESET","isHeader","selectStyles","UpdatePatronageModal","showPatronTypeChangeWarning","newPatron","showConfirmButton","pt","handleNewPatronChange","addNewPatron","droppableProps","IsIntroducing","togglePatron","savingPatrons","updatePatrons","attributeObject","hasOwnProperty","processStyle","Url","newElements","nestedElements","properties","property","objectName","urlChecker","getJsx","NEXT","PREVIOUS","inlineStyles","PatronDisplayInfo","FullText","draftTextCopy","sponsorOptions","highlight","amendmentSelections","houseMemberOptions","senateMemberOptions","showPatronModal","initialPass","markHelpIndex","createNewAmendment","saveText","handleBillDispositionChange","toggleHighlight","highlightText","handleParamChange","handleIsActiveChange","handleIsPublicChange","isLdIncluded","triggerDownload","passageCheck","resetPatrons","navToKeywordHit","dispositionRef","sponsorRef","memberRef","committeeRef","gettingEditData","beginningOfTextParagraphClassesInPriorityOrder","beginningOfTextParagraphIndex","loopIdx","indexTracker","validateData","grandchildNode","greatGrandchildNode","DraftTextFromJson","documentCodeChanged","valid","focused","textDispositionError","sponsorError","memberError","committeeError","draftTextError","keywordsFromQueryString","markInstance","Mark","asteriskSearch","separateWordSearch","accuracy","limiters","mark","showMarkHelp","showNextMarkHelp","scrollElement","currentIdx","numElements","newIndex","Content","documentNumber","documentcode","DLSPrepared","dispo","versionSession","originalTextDisposition","OfferedDate","PrefileDate","LegislationType","DraftTextJSON","jsonFileFound","passageDates","htmlDoc","prevClass","passage","insertText","patronListBeforeEdit","currentPatronLineElement","currChamber","patronInfo","patronsSameChamber","multiplePatrons","newPatronLine","associatedPatron","calculatePatronSequence","addedPatron","removedPatron","keepPatronType","PatronDate","currentSeq","existingPatronOfSameType","existingPatronOfHigherPriority","fetchingPatronage","disableSponsor","MarkHelpBar","patronArray","senators","delegates","finishedText","getPatronText","Button","icons","icon","hyperlinkInstructions","chamberList","MeetingsForm","scheduleID","scheduleType","meetingDateTime","timeDescription","ownerName","isCancelled","onCalendar","scheduleTypeOptions","remarks","scheduleFiles","highlightFileAnchorTag","setFormIsDirty","field","lastIndexOf","createTextRange","selRange","moveStart","moveEnd","setSelectionRange","selectionStart","selectionEnd","meeting","ScheduleID","OnCalendar","createMeeting","saveMeetings","originalFile","originalFileIdx","fileURL","committeeDropDownOptions","locationList","toggleEditMeeting","f","nextProps","ScheduleFiles","MeetingsCalendarPreview","setDate","getPreview","gettingPreview","toggleMeetingsCalendarPreview","SCHEDULE_EDITOR","PublicSchedule","currentDayIndex","locationOptions","showAllDates","calendarDisabled","displayScheduleModal","displayMeetingsCalendarPreview","showConfirmation","toggleAllDates","changeDay","handleReset","openMeeting","toggleCancelMeeting","deleteMeeting","openScheduleModal","closeScheduleModal","amount","parentCmteOption","sub","preserveIndex","voteRooms","roomDescription","meetings","onFail","scheduleFile","FileID","flatMappedSchedules","isSavingDrag","showDates","meetingDate","meetingTime","lastDate","lastTime","dateDate","Meeting","Location","ScheduleType","isPartner","marginBlockStart","currentDay","keyIndex","EventFinder","todayButton","PartnerSchedule","selectedMeeting","LinkURL","ScheduleModal","showInstructions","toggleInstructions","icsLink","PublicVoteSearch","voteTypeOptions","selectedMembers","selectedVoteType","searchSelectedMember","searchSelectedSession","searchSelectedVoteType","memberListError","getMemberVotes","memberVotesError","memberVotes","VoteSearchResults","toggleShow","VoteResult","nextState","memberName","organizeVotes","ClassificationName","VoteDescription","PublicMemberLegislation","hideBills","collapseAll","showPrefileOnly","toggleShowPrefile","chambercode","getMemberLegislation","memberLegislationError","memberLegislation","filteredMembers","totalBills","prefiledBills","IsPrefile","nonPrefiledBills","memberBills","PublicCommunicationDetails","communicationFile","clerkInfo","commid","chamberStatsSuccess","chamberStatsFailure","committeeStatsSuccess","committeeStatsFailure","stat","statsError","committeeStats","committeeStatsError","statActionCreators","receiveChamberStats","chamberStats","chamberStatsError","getChamberStats","ChamberStatistics","receiveCommitteeStats","getCommitteeStats","CommitteeStatistics","CommitteeStatDetails","stats","totals","ContinuedFromTotal","HReferredTotal","SReferredTotal","HInCommitteeTotal","SInCommitteeTotal","HInSubCommitteeTotal","SInSubCommitteeTotal","HReportedTotal","SReportedTotal","HIncorporatedTotal","SIncorporatedTotal","HFailedTotal","SFailedTotal","ContinuedToTotal","HContinuedFrom","SContinuedFrom","HReferred","SReferred","HInCommittee","SInCommittee","HInSubCommittee","SInSubCommittee","HReported","SReported","HIncorporated","SIncorporated","HFailed","SFailed","HContinued","SContinued","colSpan","rowSpan","statIndex","SessionStatDetails","IntroducedTotal","InCommitteeTotal","PassedHouseTotal","PassedSenateTotal","PassedTotal","IncorporatedTotal","FailedTotal","PendingTotal","ApprovedTotal","VetoTotal","ContinuedFromLastSession","Introduced","InCommittee","Incorporated","Pending","Veto","ContinuedToNextSession","Unauthorized","WatchlistsComponent","nameSort","descSort","dateSort","billNumberSort","viewCrossReferenceList","expandedWatchlists","filteredBills","filteredBillsValue","expandAllWatchlists","expandAllBills","loadingCollections","sortByName","sortByDesc","sortByDate","sortByBillNumber","toggleBillList","toggleCrossReferenceList","toggleWatchlistList","toggleWatchlist","deleteWatchlists","updateCrossReferenceList","newLegislation","watchListIDsParam","watchListIDs","watchlistIndex","watchlistsToDelete","deletingWatchlists","legislationNumbersParam","crossRefList","isProfilePage","toggleExpandAll","ProfileForm","apiKeys","apiKeyIsLoading","getApiKeys","handleCopy","navigator","clipboard","writeText","canCreateMultipleWatchlists","APIKey","PrivacyComponent","DevsPortal","ApiName","DocumentComponent","backToList","docName","spec","nativeScrollbars","theme","colors","primary","main","http","responses","typography","headings","visited","hover","optimizeSpeed","sidebar","rightPanel","spacing","sectionHorizontal","sectionVertical","lazyRendering","KeyRegistration","urlRegex","KeyConfirmation","urlError","organization","phone","agree","checkUrl","Phone","EulaDate","TermsOfService","AdminDevsPortal","AdminDocumentComponent","AdminDocs","FooterWrapper","ConfigurationsTable","getTdProps","associatedAdminAssignment","uniqueIdentifier","adminAssignments","showDifferences","aca","associatedAdminValue","uniqueCategoryIdentifier","associatedRowCategoryCodeHasMultipleChambers","associatedRowAdminCategoryCodeHasMultipleChambers","assignments","newAssignment","getTheadProps","getTheadFilterThProps","finalState","getTheadThProps","pivotId","isNewRow","rowValue","categoryChamberIdentifier","requiredFields","newAssignmentFreshValues","p_LegislationDescription","IsUncontested","CalendarConfigurations","getAssociatedAdminAssignmentWithoutModDate","assignment","legislationClassOptions","loadedCategories","loadedAssignments","loadedAdminAssignments","loadedLegislationClassOptions","categoriesError","assignmentsError","legislationClassOptionsError","adminAssignmentsError","duplicates","showAllDifferences","filteringMismatches","assignmentMismatches","getCategories","getAssignments","getAdminAssignments","handleAssignmentChange","checkDuplicates","getUneditedAssignment","toggleDifferences","findDifferences","legClass","uid","ca","referenceEvent","editedAssignment","preSaveEventControlID","EventControlID","assignmentSave","existingAssignmentIndex","assignmentIndex","uneditedAssignment","cas","billEventOptionsError","loadedBillEventOptions","Placeholder","associatedAdminAssignmentWithoutModDate","originalWithoutModificationDate","differentInAdminDB","doesNotExistInAdminDB","originalCategoryDisplayCode","associatedAdminCategoryDisplayCode","cm","requiredFieldsNotCompleted","uneditedWithoutCategoryChamberIdentifier","originalWithoutCategoryChamberIdentifier","originalWithoutCategoryChamberIdentifierAndModificationDate","differentOrNonExistentInAdminDB","isDifferentOrNonExistentInAdminDB","CommunicationsConfigurations","refCategory","ConfigurationsGrid","categoryColumn","isAscending","arr","ConfigurationsManagement","getEventReferences","currentlyAsc","first","getAssociatedAdminAssignmentFn","originalWithoutCategoryChamberAndModificationDate","JournalGridComponent","getJournalData","handleCategoryChange","journalDate","handleSendCategory","handleDeleteJournal","journal","JournalDate","journalId","excludeDates","JournalID","JournalManagementGrid","JournalDetails","JournalEntries","JournalVote","infoBoxRef","JournalEntryID","JournalManagementForm","generateMml","JournalCategories","JournalCategoryID","journals","newJournal","generatingMml","download","revokeObjectURL","journalid","JournalIndex","ObjectName","JournalManagement","PrivateRoute","authstatus","hasPermission","checkingToken","rest","LISApp","counter","houseToken","idleTimer","onActive","onIdle","checkPermissions","setHouseToken","canAccessDocs","tokenExp","getElapsedTime","getLastActiveTime","timeout","divElement","offsetHeight","Home","SearchReportPage","SearchHelp","PublicCommitteeInformation","Login","ProfileContent","accounts","request","account","acquireTokenSilent","accessToken","expiresOn","RequestAccessToken","App","isLocalhost","hostname","registerValidSW","swUrl","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","reactRouterMiddleware","routerMiddleware","middleWares","thunk","msalInstance","PublicClientApplication","store","preloadedState","createStore","combineReducers","router","connectRouter","Users","Session","Calendar","Members","Nav","Personnel","Communications","Print","Report","Collection","Stat","Org","Dev","Journal","compose","applyMiddleware","configureStore","rootElement","iKey","ApplicationInsights","instrumentationKey","loadAppInsights","origin","ready","unregister","checkValidServiceWorker","registerServiceWorker","committeeListRequest","committeeListSuccess","committeeListFailure","createCommitteeRequest","createCommitteeSuccess","createCommitteeFailure","saveCommitteeRequest","saveCommitteeSuccess","saveCommitteeFailure","partnerCommitteeListRequest","partnerCommitteeListSuccess","partnerCommitteeListFailure","partnerCommitteesRequest","partnerCommitteesSuccess","partnerCommitteesFailure","committeeByIdRequest","committeeByIdSuccess","committeeByIdFailure","committeeByNumberRequest","committeeByNumberSuccess","committeeByNumberFailure","committeePartnerByIdRequest","committeePartnerByIdSuccess","committeePartnerByIdFailure","committeesByMemberRequest","committeesByMemberSuccess","committeesByMemberFailure","membersList","createdCommittee","receiveSaveCommittee","receiveCreateCommittee","createCommitteeError","requestPartnerCommitteeList","receivePartnerCommitteeList","requestPartnerCommittees","receivePartnerCommittees","requestCommitteesByMember","receiveCommitteesByMember","committeesByMemberError","requestCommitteeList","receiveCommitteeList","committeeListError","requestCommitteeById","receiveCommitteeById","committeeByIdError","requestCommitteeByNumber","receiveCommitteeByNumber","committeeByNumberError","requestPartnerCommitteeById","receivePartnerCommitteeById","committeePartnerByIdError","districtListSuccess","districtListFailure","memberStatusesSuccess","memberStatusesFailure","partyCodeListSuccess","partyCodeListFailure","memberNumbersRequest","memberNumbersSuccess","memberNumbersFailure","memberListRequest","memberListSuccess","memberListFailure","memberContactRequest","memberContactSuccess","memberContactFailure","memberListContactRequest","memberListContactSuccess","memberListContactFailure","memberByIdSuccess","memberByIdFailure","membersByCommitteeRequest","membersByCommitteeSuccess","membersByCommitteeFailure","committeeMemberRolesRequest","committeeMemberRolesSuccess","committeeMemberRolesFailure","memberCommitteeSaveSuccess","memberCommitteeSaveFailure","memberCreateSuccess","memberCreateFailure","memberSaveSuccess","memberSaveFailure","memberLegislationSuccess","memberLegislationFailure","memberVotesSuccess","memberVotesFailure","memberConferenceBillsSuccess","memberConferenceBillsFailure","districtListError","memberStatusesError","partyCodeListError","memberCreateError","memberSave","memberSaveError","memberConferenceBillsError","memberListContactError","receiveDistricts","Districts","receivePartyCodeList","Parties","receiveMemberStatuses","MemberStatuses","requestMembersByCommittee","receiveMembersByCommittee","requestCommitteeMemberRoles","receiveCommitteeMemberRoles","houseRoles","senateRoles","committteeMemberRolesError","committeeMemberRolesError","committeeMembersArray","CommitteeRoles","committeeMemberSenateRoles","committeeMemberHouseRoles","elemObj","requestMemberNumbers","receiveMemberNumbers","memberNumbersError","MemberNumberList","requestMemberList","receiveMemberList","ShallowMembers","receiveMember","requestMemberContact","receiveMemberContact","memberContactError","MemberContactInformationList","requestMemberListContact","receiveMemberListContact","receiveMemberCommitteeSave","receiveMemberCreate","receiveMemberSave","receiveMemberLegislation","PatronLegislation","receiveMemberVotes","REACT_APP_MEMBER_VOTE_SEARCH_SERVICE","MemberVoteList","receiveMemberConferenceBills","ConferenceLegislationList","Popout","containerEl","sourceDoc","targetDoc","windowWidth","externalWindow","styleSheets","styleSheet","cssRules","newStyleEl","cssRule","newLinkEl","createPortal"],"mappings":"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","file":"static/js/main.717058a2.chunk.js","sourcesContent":["import { partnerRequest } from '../services/request.service'\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst journalCategoryListRequest = 'JOURNAL_CATEGORY_LIST_REQUEST';\nconst journalCategoryListSuccess = 'JOURNAL_CATEGORY_LIST_SUCCESS';\nconst journalCategoryListFailure = 'JOURNAL_CATEGORY_LIST_FAILURE';\n\nconst journalListRequest = 'JOURNAL_LIST_REQUEST';\nconst journalListSuccess = 'JOURNAL_LIST_SUCCESS';\nconst journalListFailure = 'JOURNAL_LIST_FAILURE';\n\nconst journalByIdRequest = 'JOURNAL_BY_ID_REQUEST';\nconst journalByIdSuccess = 'JOURNAL_BY_ID_SUCCESS';\nconst journalByIdFailure = 'JOURNAL_BY_ID_FAILURE';\n\nconst journalBuildSuccess = 'JOURNAL_BUILD_SUCCESS';\nconst journalBuildFailure = 'JOURNAL_BUILD_FAILURE';\n\nconst journalGenerationSuccess = 'JOURNAL_GENERATION_SUCCESS';\nconst journalGenerationFailure = 'JOURNAL_GENERATION_FAILURE';\n\nconst journalSaveSuccess = 'JOURNAL_SAVE_SUCCESS';\nconst journalSaveFailure = 'JOURNAL_SAVE_FAILURE';\n\nconst journalDeleteSuccess = 'JOURNAL_DELETE_SUCCESS';\nconst journalDeleteFailure = 'JOURNAL_DELETE_FAILURE';\n\nconst receiveCategoryData = 'CATEGORY_DATA_SUCCESS';\nconst receiveCategoryDataFailure = 'CATEGORY_DATA_FAILURE';\n\nconst initialState = {\n    journalCategoryList: [],\n    journalCategoryMessage: '',\n    journalList: [],\n    journalMessage: '',\n    journalById: [],\n    journalByIdMessage: '',\n    journalBuild: [],\n    journalBuildError: '',\n    journalGeneration: [],\n    journalGenerationError: '',\n    journalSave: [],\n    journalSaveError: '',\n    categoryData: '',\n    categoryDataError: '',\n    journalDeleteError: ''\n};\n\nexport const journalActionCreators = {\n    // GET JOURNAL CATEGORY LIST FOR JOURNAL MGMT GRID\n    requestJournalCategoryList: () => ({\n        type: journalCategoryListRequest,\n        journalCategoryList: [],\n        isFetching: true\n    }),\n\n    receiveJournalCategoryList: (list, message) => ({\n        type: journalCategoryListSuccess,\n        isFetching: false,\n        journalCategoryList: list,\n        journalCategoryMessage: message\n    }),\n\n    journalCategoryListError: (message) => ({\n        type: journalCategoryListFailure,\n        isFetching: false,\n        journalCategoryList: [],\n        journalCategoryMessage: message\n    }),\n\n    getJournalCategories: () => {\n        return dispatch => {\n            dispatch(journalActionCreators.requestJournalCategoryList());\n\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_JOURNAL_API_URL) + '/JournalFileGeneration/api/GetJournalCategoryTypes', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(journalActionCreators.journalCategoryListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(journalActionCreators.receiveJournalCategoryList(result[1].JournalCategoryTypes.map(x => { return { label: x.Name, value: x.JournalCategoryTypeID } })))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(journalActionCreators.receiveJournalCategoryList([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    // GET JOURNAL LIST FOR JOURNAL MGMT GRID\n    requestJournalList: () => ({\n        type: journalListRequest,\n        journalList: [],\n        isFetching: true\n    }),\n\n    receiveJournalList: (list, message) => ({\n        type: journalListSuccess,\n        isFetching: false,\n        journalList: list,\n        journalMessage: message\n    }),\n\n    journalListError: (message) => ({\n        type: journalListFailure,\n        isFetching: false,\n        journalList: [],\n        journalMessage: message\n    }),\n\n    getJournals: (params) => {\n        return dispatch => {\n            dispatch(journalActionCreators.requestJournalList());\n\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_JOURNAL_API_URL) + '/JournalFileGeneration/api/GetJournalData?', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(journalActionCreators.journalListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(journalActionCreators.receiveJournalList(result[1].Journals))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(journalActionCreators.receiveJournalList([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    // GET JOURNAL BY ID FOR JOURNAL FORM\n    requestJournalById: () => ({\n        type: journalByIdRequest,\n        journalById: [],\n        isFetching: true\n    }),\n\n    receiveJournalById: (list, message) => ({\n        type: journalByIdSuccess,\n        isFetching: false,\n        journalById: list,\n        journalByIdMessage: message\n    }),\n\n    journalByIdError: (message) => ({\n        type: journalByIdFailure,\n        isFetching: false,\n        journalById: [],\n        journalByIdMessage: message\n    }),\n\n    getJournalById: (params) => {\n        return dispatch => {\n            dispatch(journalActionCreators.requestJournalById());\n\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_JOURNAL_API_URL) + '/JournalFileGeneration/api/GetJournalDataById?', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(journalActionCreators.journalByIdError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(journalActionCreators.receiveJournalById(result[1].Journals))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(journalActionCreators.receiveJournalById([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    //BUILD JOURNAL DAY\n    receiveJournalBuild: (list) => ({\n        type: journalBuildSuccess,\n        journalBuild: list[0],\n    }),\n\n    journalBuildError: (message) => ({\n        type: journalBuildFailure,\n        journalBuild: [],\n        journalBuildError: message\n    }),\n\n    buildJournal: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_JOURNAL_API_URL) + '/JournalFileGeneration/api/BuildSenateJournalDay', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(journalActionCreators.journalBuildError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(journalActionCreators.receiveJournalBuild(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(journalActionCreators.journalBuildError('Journal Data not available'))\n                        return Promise.reject('No Journal Data')\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    //GENERATE JOURNAL DAY\n    receiveJournalGeneration: (bytes) => ({\n        type: journalGenerationSuccess,\n        journalGeneration: bytes,\n    }),\n\n    journalGenerationError: (message) => ({\n        type: journalGenerationFailure,\n        journalGeneration: [],\n        journalGenerationError: message\n    }),\n\n    generateJournal: (params) => {\n        return dispatch => {\n            let config = {\n                method: \"GET\",\n                headers: {\n                    \"Content-Type\": \"application/json; charset=utf-8\",\n                    \"authorization\": \"Bearer \" + localStorage.getItem('LIS_ID_TOKEN'),\n                    \"WebAPIKey\": process.env.REACT_APP_API_KEY\n                }\n            }\n            let url = (API_URL || process.env.REACT_APP_JOURNAL_API_URL) + '/JournalFileGeneration/api/GenerateSenateJournalDay' + params;\n            return fetch(url, config)\n                .then(async result => {\n                    if (!result) {\n                        dispatch(journalActionCreators.journalGenerationError(\"File not generated\"));\n                    } else if (result.status === 400) {\n                        await result.body.getReader().read().then(({ value }) => {\n                            const error = JSON.parse(Buffer.from(value.buffer).toString())\n                            dispatch(journalActionCreators.journalGenerationError(error.Name || \"Unknown Error\"));\n                        })\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    } else {\n                        const responseText = await result.text();\n                        dispatch(journalActionCreators.receiveJournalGeneration(responseText));\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    //SAVE JOURNAL\n    receiveJournalSave: (list) => ({\n        type: journalSaveSuccess,\n        journalSave: list[0],\n    }),\n\n    journalSaveError: (message) => ({\n        type: journalSaveFailure,\n        journalSave: [],\n        journalSaveError: message\n    }),\n\n    saveJournal: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_JOURNAL_API_URL) + '/JournalFileGeneration/api/SaveJournalData', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(journalActionCreators.journalSaveError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(journalActionCreators.receiveJournalSave(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(journalActionCreators.journalSaveError('Journal Data not available'))\n                        return Promise.reject('No Journal Data')\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveCategoryData: responseObj => ({\n        type: receiveCategoryData,\n        categoryData: responseObj\n    }),\n\n    categoryDataError: message => ({\n        type: receiveCategoryDataFailure,\n        categoryDataError: message\n    }),\n\n    getCategoryData: (params) => {\n        return dispatch => {\n            let config = {\n                method: \"GET\",\n                headers: {\n                    \"Content-Type\": \"application/json; charset=utf-8\",\n                    \"authorization\": \"Bearer \" + localStorage.getItem('LIS_ID_TOKEN'),\n                    \"WebAPIKey\": process.env.REACT_APP_API_KEY\n                }\n            }\n\n            let url = API_URL + '/JournalFileGeneration/api/GenerateJournalCategoryType?' + params;\n\n            return fetch(url, config)\n                .then(async result => {\n                    if (!result) {\n                        dispatch(journalActionCreators.categoryDataError(\"File not generated\"));\n                    } else if (result.status === 400) {\n                        await result.body.getReader().read().then(({ value }) => {\n                            const error = JSON.parse(Buffer.from(value.buffer).toString())\n                            dispatch(journalActionCreators.categoryDataError(error.Name || \"Unknown Error\"));\n                        })\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    } else {\n                        await result.body.getReader().read().then(({ value }) => {\n                            let decoder = new TextDecoder;\n                            dispatch(journalActionCreators.receiveCategoryData(decoder.decode(value)));\n                        })\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    //SAVE JOURNAL\n    receiveJournalDelete: () => ({\n        type: journalDeleteSuccess,\n    }),\n\n    journalDeleteError: (message) => ({\n        type: journalDeleteFailure,\n        journalDeleteError: message\n    }),\n\n    deleteJournal: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_JOURNAL_API_URL) + '/JournalFileGeneration/api/DeleteJournalDay?journalId=' + params, 'DELETE', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(journalActionCreators.journalDeleteError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(journalActionCreators.receiveJournalDelete())\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(journalActionCreators.journalDeleteError('Journal Data not available'))\n                        return Promise.reject('No Journal Data')\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    }\n}\n\nexport const reducer = (state, action) => {\n\n    state = state || initialState;\n\n    switch (action.type) {\n\n        case journalCategoryListRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            })\n        case journalCategoryListSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                journalCategoryList: action.journalCategoryList,\n                journalMessage: ''\n            })\n        case journalCategoryListFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                journalCategoryList: action.journalCategoryList,\n                journalMessage: action.journalMessage\n            })\n        case journalListRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            })\n        case journalListSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                journalList: action.journalList,\n                journalMessage: ''\n            })\n        case journalListFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                journalList: action.journalList,\n                journalMessage: action.journalMessage\n            })\n        case journalByIdRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            })\n        case journalByIdSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                journalById: action.journalById,\n                journalByIdMessage: ''\n            })\n        case journalByIdFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                journalById: action.journalById,\n                journalByIdMessage: action.journalByIdMessage\n            })\n        case journalBuildSuccess:\n            return Object.assign({}, state, {\n                journalBuild: action.journalBuild,\n                journalBuildError: ''\n            })\n        case journalBuildFailure:\n            return Object.assign({}, state, {\n                journalBuildError: action.journalBuildError\n            })\n        case journalGenerationSuccess:\n            return Object.assign({}, state, {\n                journalGeneration: action.journalGeneration,\n                journalGenerationError: ''\n            })\n        case journalGenerationFailure:\n            return Object.assign({}, state, {\n                journalGenerationError: action.journalGenerationError\n            })\n        case journalSaveSuccess:\n            return Object.assign({}, state, {\n                journalSave: action.journalSave,\n                journalSaveError: ''\n            })\n        case journalSaveFailure:\n            return Object.assign({}, state, {\n                journalSaveError: action.journalSaveError\n            })\n        case journalDeleteSuccess:\n            return Object.assign({}, state, {\n                journalDelete: action.journalDelete,\n                journalDeleteError: ''\n            })\n        case journalDeleteFailure:\n            return Object.assign({}, state, {\n                journalDeleteError: action.journalDeleteError\n            })\n        case receiveCategoryData:\n            return Object.assign({}, state, {\n                categoryData: action.categoryData,\n                categoryDataError: ''\n            })\n        case receiveCategoryDataFailure:\n            return Object.assign({}, state, {\n                categoryDataError: action.categoryDataError\n            })\n        default:\n            return state\n    }\n};","import { partnerRequest, publicRequest } from '../services/request.service'\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst printDocumentsSuccess = \"PRINT_DOCUMENTS_SUCCESS\";\nconst printDocumentsFailure = \"PRINT_DOCUMENTS_FAILURE\";\n\nconst printCreateSuccess = \"PRINT_CREATE_SUCCESS\";\nconst printCreateFailure = \"PRINT_CREATE_FAILURE\";\n\nconst printSaveSuccess = \"PRINT_SAVE_SUCCESS\";\nconst printSaveFailure = \"PRINT_SAVE_FAILURE\";\n\nconst printParchmentEmailSuccess = \"PRINT_PARCHMENT_EMAIL_SUCCESS\";\nconst printParchmentEmailFailure = \"PRINT_PARCHMENT_EMAIL_FAILURE\";\n\nconst batchItemCompleteSuccess = \"BATCH_ITEM_SUCCESS\";\nconst batchItemCompleteFailure = \"BATCH_ITEM_FAILURE\";\n\nconst printAllEnrolledSuccess = \"PRINT_ALL_ENROLLED_SUCCESS\";\nconst printAllEnrolledFailure = \"PRINT_ALL_ENROLLED_FAILURE\";\n\nconst initialState = {\n    printDocuments: [],\n    printDocumentsError: '',\n    printCreate: '',\n    printCreateError: '',\n    printSave: '',\n    printSaveError: '',\n    printParchmentEmail: '',\n    printParchmentEmailError: '',\n    batchItemComplete: '',\n    batchItemCompleteError: '',\n    printAllEnrolledError: ''\n};\n\nexport const printActionCreators = {\n\n    receivePrintDocuments: resObj => ({\n        type: printDocumentsSuccess,\n        printDocuments: resObj\n    }),\n\n    printDocumentsError: (message) => ({\n        type: printDocumentsFailure,\n        printDocumentsError: message\n    }),\n\n    getPrintDocuments: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_PRINT_DOCUMENTS_SERVICE) + '/PrintDocuments/api/getprintdocumentsasync', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(printActionCreators.printDocumentsError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(printActionCreators.receivePrintDocuments(result[1].PrintBatches))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(printActionCreators.receivePrintDocuments([]))\n                        return Promise.reject('No documents found');\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receivePrintCreate: resObj => ({\n        type: printCreateSuccess,\n        printCreate: resObj\n    }),\n\n    printCreateError: (message) => ({\n        type: printCreateFailure,\n        printCreateError: message\n    }),\n\n    createPrintDocument: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_PRINT_DOCUMENTS_SERVICE) + '/printdocuments/api/createprintdocumentasync', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(printActionCreators.printCreateError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(printActionCreators.receivePrintCreate(result[1][0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(printActionCreators.printCreateError('No Content'))\n                        return Promise.reject('No Content');\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receivePrintSave: resObj => ({\n        type: printSaveSuccess,\n        printSave: resObj\n    }),\n\n    printSaveError: (message) => ({\n        type: printSaveFailure,\n        printSaveError: message\n    }),\n\n    savePrintDocument: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_PRINT_DOCUMENTS_SERVICE) + '/printdocuments/api/saveprintdocumentasync', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(printActionCreators.printSaveError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(printActionCreators.receivePrintSave(result[1][0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(printActionCreators.printSaveError('No Content'))\n                        return Promise.reject('No Content');\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receivePrintParchmentEmail: resObj => ({\n        type: printParchmentEmailSuccess,\n        printParchmentEmail: resObj\n    }),\n\n    printParchmentemailError: (message) => ({\n        type: printParchmentEmailFailure,\n        printParchmentError: message\n    }),\n\n    sendParchmentEmail: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_PRINT_DOCUMENTS_SERVICE) + '/PrintDocuments/api/SendPrintParchmentEmailAsync', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(printActionCreators.printParchmentEmailError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(printActionCreators.receivePrintParchmentEmail(result[1][0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(printActionCreators.printParchmentEmailError('No Content'))\n                        return Promise.reject('No Content');\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveBatchItemComplete: resObj => ({\n        type: batchItemCompleteSuccess,\n        batchItemComplete: resObj\n    }),\n\n    batchItemCompleteError: (message) => ({\n        type: batchItemCompleteFailure,\n        batchItemCompleteError: message\n    }),\n\n    completeBatchItem: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_PRINT_DOCUMENTS_SERVICE) + '/printdocuments/api/CompletePrintDocumentAsync', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(printActionCreators.batchItemCompleteError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(printActionCreators.receiveBatchItemComplete(result[1][0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(printActionCreators.batchItemCompleteError('No Content'))\n                        return Promise.reject(\"No Content\");\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receivePrintAllEnrolled: resObj => ({\n        type: printAllEnrolledSuccess\n    }),\n\n    printAllEnrolledError: (message) => ({\n        type: printAllEnrolledFailure,\n        printAllEnrolledError: message\n    }),\n\n    printAllEnrolled: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_PRINT_DOCUMENTS_SERVICE) + '/printdocuments/api/ProcessAllEnrolledBillsAsync', 'POST', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(printActionCreators.printAllEnrolledError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(printActionCreators.receivePrintAllEnrolled(result[1][0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(printActionCreators.printAllEnrolledError('No Content'))\n                        return Promise.reject(\"No Content\");\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    }\n};\n\n\nexport const reducer = (state, action) => {\n\n    state = state || initialState;\n\n    switch (action.type) {\n        case printDocumentsSuccess:\n            return Object.assign({}, state, {\n                printDocuments: action.printDocuments,\n                printDocumentsError: action.printDocumentsError\n            })\n        case printDocumentsFailure:\n            return Object.assign({}, state, {\n                printDocumentsError: action.printDocumentsError\n            })\n        case printCreateSuccess:\n            return Object.assign({}, state, {\n                printCreate: action.printCreate,\n                printCreateError: action.printCreateError\n            })\n        case printCreateFailure:\n            return Object.assign({}, state, {\n                printCreateError: action.printCreateError\n            })\n        case printSaveSuccess:\n            return Object.assign({}, state, {\n                printSave: action.printSave,\n                printSaveError: action.printSaveError\n            })\n        case printSaveFailure:\n            return Object.assign({}, state, {\n                printSaveError: action.printSaveError\n            })\n        case printParchmentEmailSuccess:\n            return Object.assign({}, state, {\n                printParchmentEmail: action.printParchmentEmail,\n                printParchmentEmailError: action.printParchmentEmailError\n            })\n        case printSaveFailure:\n            return Object.assign({}, state, {\n                printParchmentEmailError: action.printParchmentEmailError\n            })\n        case batchItemCompleteSuccess:\n            return Object.assign({}, state, {\n                batchItemComplete: action.batchItemComplete,\n                batchItemCompleteError: action.batchItemCompleteError\n            })\n        case batchItemCompleteFailure:\n            return Object.assign({}, state, {\n                batchItemCompleteError: action.batchItemCompleteError\n            })\n        case printAllEnrolledSuccess:\n            return Object.assign({}, state, {\n                printAllEnrolledError: action.printAllEnrolledError\n            })\n        case printAllEnrolledFailure:\n            return Object.assign({}, state, {\n                printAllEnrolledError: action.printAllEnrolledError\n            })\n        default:\n            return state\n    }\n};","import tinymce from 'tinymce/tinymce';\n\ntinymce.PluginManager.add('linenumbers', function (editor) {\n    const width = '40px'\n    let linePositions = [];\n    let bodyHeight = 0;\n    const container = document.createElement('div');\n    const lineNumberContainer = document.createElement('div');\n    // NodeChange stops firing when text start to wrap. input does not fire when font size is changed.\n    // Neither of these fire when a the tinymce react component changes state so SetContent is used as well.\n    // So this function is ran regardless of which event happens\n    editor.on('NodeChange input SetContent', _e => {\n        const root = editor.contentDocument.activeElement;\n        // The line numbers only need to be updated when the vertical size of the content changes. Any more would be unnecessary since the line numbers wouldn't change\n        if (bodyHeight !== root.scrollHeight) {\n            update();\n            bodyHeight = root.scrollHeight;\n        }\n    });\n    // Where text wraps have a chance of changing when the windows resizes \n    editor.on('ResizeWindow', _e => {\n        update();\n    });\n    editor.on('init', _e => {\n        editor.contentWindow.onscroll = () => scrollNumbers();\n        //Style the tinymce body to allow room for the line numbers on the left side\n        const root = editor.contentDocument.activeElement;\n        root.style.margin = 0;\n        root.style.marginLeft = width;\n        bodyHeight = root.scrollHeight;\n        // Style the line number container and container to allow for the content to scroll\n        container.style.width = width;\n        container.style.overflow = 'hidden';\n        lineNumberContainer.style.position = 'relative'; // Needs to be relative or else the line numbers will not scroll\n        container.appendChild(lineNumberContainer);\n        editor.contentAreaContainer.appendChild(container);\n        //Account for content already in the editor on initiation\n        update();\n    });\n    editor.on('ScrollContent', _e => {\n        update();\n    });\n\n    // Scroll the collection of line numbers with the tinymce window\n    // This is so the line numbers will stay next to their line\n    const scrollNumbers = () => {\n        const contentWindow = editor.contentWindow;\n        container.scrollTop = contentWindow.scrollY;\n    }\n\n    // Updates the line numbers to the correct amount and position\n    // Only runs at tinymce initiation and when the tinymce body changes height\n    const update = () => {\n        const root = editor.contentDocument.activeElement;\n        linePositions = [];\n\n        //If line numbering is disabled by the user then escape and clear line numbers\n        if (localStorage.getItem(\"showLineNumbers\") === \"false\") {\n            lineNumberContainer.innerText = '';\n            return;\n        }\n\n        root.childNodes.forEach(rootChild => {\n            // Since the content of the html is going to be changed to find where the lines end it is safer to make a copy of the editor body\n            let clonedRootChild = rootChild.cloneNode(true);\n            root.insertBefore(clonedRootChild, rootChild);\n            // Hide the original editor body so that its height does not offset the line positions\n            const oldDisplay = rootChild.style.display;\n            rootChild.style.display = 'none';\n            if(clonedRootChild.style.display != \"none\") {\n                tagNewLines(clonedRootChild, root.scrollHeight * -1);\n            }\n            // Remove the node used to find line positions and show the original editor body again\n            root.removeChild(clonedRootChild);\n            rootChild.style.display = oldDisplay;\n        });\n        lineNumberContainer.style.height = editor.contentDocument.scrollingElement.scrollHeight + 'px';\n        // Get the font size. Most browsers default it to 16px\n        const bodyFontSize = window.getComputedStyle(root).getPropertyValue('font-size') || \"16px\";\n        lineNumberContainer.innerText = ''\n\n        let beginDrawing = false;\n\n        for (let i = 0; i < linePositions.length; i++) {\n            //Attempt to limit the amount of line numbers being drawn at any given time based on the scroll position of the window\n            if ((editor.contentWindow.scrollY === 0 && i < 100)\n                || (i < 225 && editor.contentWindow.scrollY < 7500)\n                || (editor.contentWindow.scrollY / i > 28.5 && editor.contentWindow.scrollY / i < 33.5)) {\n                let lineNumber = document.createElement('div');\n                lineNumber.style.position = 'absolute'\n                lineNumber.style.fontWeight = '700';\n                lineNumber.style.fontSize = bodyFontSize;\n                //Set the position of the line number. Need to account for how the position changes with the scroll height\n                lineNumber.style.top = linePositions[i].top + editor.contentWindow.scrollY + 'px';\n                lineNumber.innerText = i + 1;\n                lineNumberContainer.appendChild(lineNumber)\n                beginDrawing = true;\n            } else if (beginDrawing) {\n                //Exit the loop now that we're outside of the drawing range\n                return;\n            }\n        }\n    }\n\n    // This is a recursive function.\n    // It takes text nodes and converts them to an element that can be used to find the node's position\n    // The function calls itself when reaching a non-text node so that it can traverse that node's children until it reaches a text node\n    const tagNewLines = (node, oldLocation) => {\n        let atBillNumber = false;\n        let atGovernorsActions = false;\n        node.childNodes.forEach(child => {\n            if ([\"#text\", \"U\", \"S\", \"LI\", \"STRONG\", \"EM\", \"SPAN\"].includes(child.nodeName)) {\n                let testNode = document.createElement('span');\n                //Surround each word with an <n> tag\n                //There is not a way to find the location of each seperate word\n                //So an element is created with the word as the content. That way the location of the element can be found\n                let nodeVal = child.nodeValue || child.innerText;\n                testNode.innerHTML = nodeVal.replace(/[^\\s-]+/g, '<n>$&</n>');\n                //Get rid of the text node and replace it with the new element \n                node.insertBefore(testNode, child);\n                node.removeChild(child);\n                testNode.childNodes.forEach(testChild => {\n                    if (testChild.nodeName === \"#text\") {\n                        // Leftover text nodes will always be either the whitespace between the words or dashes between the words\n                        // Their location does not need to be checked because text is wrapped on words\n                        return;\n                    }\n                    const rect = testChild.getBoundingClientRect()\n                    const location = rect.bottom;\n                    const height = rect.height;\n                    if (testChild.nodeName === 'N') {\n                        // Account for the height of an element because an element that is taller then the last element doesn't mean it is on a new line\n                        if (location >= oldLocation + height) {\n                            // This word is on a different line then the previous. Save the position so that it can be referenced later when placing the line numbers\n                            linePositions.push(testChild.getBoundingClientRect());\n                        }\n                    }\n                    oldLocation = location;\n                });\n            } else if (child.nodeName === \"TR\") {\n                //Add a line for each table row\n                linePositions.push(child.getBoundingClientRect());\n            } else if (child.nodeName === 'BR') {\n                // BR tags also count as new lines only when they are by themselves on a line\n                if (child.parentNode.childNodes.length === 1) {\n                    linePositions.push(child.getBoundingClientRect());\n                }\n            } else {\n                //Continuously check for the bill number or the VA acts of assembly line until we find it\n                //Don't start tagging lines until we reach one of these lines\n                if (child.classList && child.classList.value == \"billnumber\" || child.innerText === \"VIRGINIA ACTS OF ASSEMBLY -- CHAPTER\") {\n                    atBillNumber = true;\n                    oldLocation = tagNewLines(child, oldLocation);\n                    //Skip tagging the patron line\n                } else if (atBillNumber === true && child.classList.value != \"patronLine\") {\n                    //Traverse through this element's children until a text node is reached\n                    oldLocation = tagNewLines(child, oldLocation)\n                }\n                //Continuously check for governor actions lines until we find it\n                //Don't start tagging lines until after these lines\n                if (child.classList && child.classList.value == \"governorsactions\") {\n                    atGovernorsActions = true;\n                } else if (atGovernorsActions === true && child.classList.value != \"governorsactions\") {\n                    //Traverse through this element's children until a text node is reached\n                    oldLocation = tagNewLines(child, oldLocation)\n                }\n                //Go into the table so we can tag the child <tr>s  \n                if (child.nodeName === 'TBODY') {\n                    oldLocation = tagNewLines(child, oldLocation)\n                }\n            }\n        });\n        // Return the last element's location to be compared against the next element's location\n        return oldLocation;\n    }\n});","import tinymce from 'tinymce/tinymce';\n\ntinymce.PluginManager.add('copyheadstyle', function (editor) {\n    // Since TinyMCE is in an iframe the <style> tags and <link> tags from the root document need to be copied into the iframe\n    editor.on('init', _e => {\n        const styleTags = document.head.querySelectorAll('style');\n        styleTags.forEach(element => {\n            const newEl = element.cloneNode(true);\n            editor.contentDocument.head.appendChild(newEl);\n        });\n        const linkTags = document.head.querySelectorAll('link');\n        linkTags.forEach(element => {\n            if(element.attributes.rel && element.attributes.rel.nodeValue === \"stylesheet\") {\n                const newEl = element.cloneNode(true);\n                editor.contentDocument.head.appendChild(newEl);\n            }\n        });\n\n        let addedStyles = document.createElement('style');\n        //This is a fix for firefox since the body element's height is 100% be default\n        addedStyles.innerHTML += 'body {height: auto;}';\n        //They do not want links to be seen in the editor.\n        addedStyles.innerHTML += \"a, a:link, a:hover, a:link:hover {color: #333333; text-decoration: none;}\"\n        editor.contentDocument.head.appendChild(addedStyles);\n    });\n    \n});","import tinymce from 'tinymce/tinymce';\n\ntinymce.PluginManager.add('rejectedbutton', function (editor) {\n    let intialValue = \"REJECTED\";\n    let hasFocus = false;\n    editor.on(\"contextmenu\", e => {\n        // Right clicking the tinymce editor when the editor is not in focus does not add the cursor in the right area.\n        // This is used to counteract that and place the cursor in the about the right spot\n        // At the front of the clicked element\n        if(!hasFocus) {\n            const points = editor.contentDocument.elementsFromPoint(e.x, e.y);\n            if(points.length > 0) {\n                editor.selection.select(points[0], true);\n                editor.selection.collapse(true);\n            }\n            hasFocus = true;\n        }\n    });\n    // Since the contextmenu event fires after focus is gained the state of focus has to be manually controlled here.\n    editor.on(\"click\", () => hasFocus = true);\n    editor.on(\"blur\", () => hasFocus = false);\n\n    const getButton = (buttonText, intialText) => {\n        return {\n            type: \"menuitem\",\n            text: buttonText,\n            onAction: () => {\n                intialValue = intialText;\n                editor.fire(\"contexttoolbar-show\", {toolbarKey:\"rejectedinput\"});\n            }\n        }\n    }\n    const items = [\n        getButton(\"Rejected\", \"REJECTED\"),\n        getButton(\"Withdrawn\", \"WITHDRAWN\"),\n        getButton(\"Ruled Out Of Order\", \"RULED OUT OF ORDER\"),\n        getButton(\"Passed By\", \"PASSED BY\"),\n        getButton(\"Not Specific Or Severable\", \"NOT SPECIFIC OR SEVERABLE\"),\n        getButton(\"Ruled Not Germane\", \"RULED NOT GERMANE\"),\n    ]\n     // Create buttons in the toolbar to add the rejected text\n    editor.ui.registry.addMenuButton('rejectedbuttons', {\n        text:\"Rejected\",\n        fetch: callback => {\n            callback(items)\n        }\n    });\n    // Create button in the right-click context menu to add the rejected text\n    editor.ui.registry.addNestedMenuItem('rejectedbuttonscontext', {\n        text: \"Rejected\",\n        getSubmenuItems: () => {\n            return items;\n        }\n    });\n\n    editor.ui.registry.addContextForm(\"rejectedinput\", {\n        position: \"selection\",\n        scope: \"node\",\n        initValue: () => intialValue,\n        launch: {\n            type: 'contextformbutton',\n            text: 'Submit'\n        },\n        commands: [{\n            type: \"contextformbutton\",\n            text: 'Submit',\n            onAction: formApi => {\n                const value = formApi.getValue();\n                editor.insertContent(`<span class=\"rejected\"> [${value}] </span>`);\n                formApi.hide();\n            }\n        }]\n    })\n});","import tinymce from 'tinymce/tinymce';\n\ntinymce.PluginManager.add('agreedbutton', function (editor) {\n    let intialValue = \"AGREED\";\n    let hasFocus = false;\n    editor.on(\"contextmenu\", e => {\n        // Right clicking the tinymce editor when the editor is not in focus does not add the cursor in the right area.\n        // This is used to counteract that and place the cursor in the about the right spot\n        // At the front of the clicked element\n        if(!hasFocus) {\n            const points = editor.contentDocument.elementsFromPoint(e.x, e.y);\n            if(points.length > 0) {\n                editor.selection.select(points[0], true);\n                editor.selection.collapse(true);\n            }\n            hasFocus = true;\n        }\n    });\n    // Since the contextmenu event fires after focus is gained the state of focus has to be manually controlled here.\n    editor.on(\"click\", () => hasFocus = true);\n    editor.on(\"blur\", () => hasFocus = false);\n\n     // Create buttons in the toolbar to add the agreed to text\n    editor.ui.registry.addButton('agreedbutton', {\n        text:\"Agreed\",\n        onAction: () => {\n            editor.fire(\"contexttoolbar-show\", {toolbarKey:\"agreedinput\"});\n        }\n    });\n    // Create button in the right-click context menu to add the agreed to text\n    editor.ui.registry.addMenuItem('agreedbuttoncontext', {\n        text:\"Agreed\",\n        onAction: () => {\n            editor.fire(\"contexttoolbar-show\", {toolbarKey:\"agreedinput\"});\n        }\n    });\n\n    editor.ui.registry.addContextForm(\"agreedinput\", {\n        position: \"selection\",\n        scope: \"node\",\n        initValue: () => intialValue,\n        launch: {\n            type: 'contextformbutton',\n            text: 'Submit'\n        },\n        commands: [{\n            type: \"contextformbutton\",\n            text: 'Submit',\n            onAction: formApi => {\n                const value = formApi.getValue();\n                intialValue = value\n                editor.insertContent(`<span class=\"agreed\"> [${value}] </span>`);\n                formApi.hide();\n            }\n        }]\n    })\n});","import tinymce from 'tinymce/tinymce';\n\ntinymce.PluginManager.add('createamendment', function (editor) {\n    let selections = {};\n    let members = editor.getParam(\"members\") || [];\n    let committees = editor.getParam(\"committees\") || [];\n    let addAmendmentCallback = editor.getParam(\"addAmendmentCallback\");\n    let userChamber = editor.getParam(\"userChamber\");\n    let billNumber = editor.getParam(\"billNumber\");\n    let allowGovernorAmendmentSponsor = editor.getParam(\"allowGovernorAmendmentSponsor\");\n    let amendmentOrigin = editor.getParam(\"amendmentOrigin\");\n    if (amendmentOrigin && amendmentOrigin === \"H\") { amendmentOrigin = \"HOUSE\" }\n    else if (amendmentOrigin && amendmentOrigin === \"S\") { amendmentOrigin = \"SENATE\" }\n    else if (allowGovernorAmendmentSponsor && amendmentOrigin && amendmentOrigin === \"G\") { amendmentOrigin = \"GOVERNOR\" }\n    let sponsor = editor.getParam(\"sponsor\");\n    let member = editor.getParam(\"member\");\n    let committee = editor.getParam(\"committee\");\n\n    let formItems = [];\n    const placeholder = {\n        text: \"Select\",\n        value: \"\"\n    }\n    if (members.length > 0) {\n        members.unshift(placeholder);\n        formItems = formItems.concat({\n            type: \"selectbox\",\n            name: \"member\",\n            label: \"Choose a member\",\n            items: members\n        });\n    }\n    if (committees.length > 0) {\n        committees.unshift(placeholder);\n        formItems = formItems.concat({\n            type: \"selectbox\",\n            name: \"committee\",\n            label: \"Choose a committee\",\n            items: committees\n        });\n    }\n    editor.ui.registry.addButton('createamendment', {\n        text: 'Add Amendment',\n        onAction: () => {\n            const dialog = editor.windowManager.open(initialPageConfig);\n            if (billNumber) {\n                dialog.setData({ billnumber: billNumber });\n            }\n            if (amendmentOrigin && ['HOUSE', 'SENATE', 'GOVERNOR'].includes(amendmentOrigin.toUpperCase())) {\n                dialog.setData({ amendmentorigin: amendmentOrigin });\n            }\n        }\n    })\n\n    const initialPageConfig = {\n        title: \"Insert Amendment\",\n        body: {\n            type: \"panel\",\n            items: [\n                {\n                    type: \"input\",\n                    name: \"billnumber\",\n                    label: \"Type in a bill number\"\n                },\n                {\n                    type: 'htmlpanel',\n                    html: '<p class=\"small-text\">Select the origin of the amendments and press Next to continue or Cancel to exit</p>'\n                },\n                {\n                    type: \"selectbox\",\n                    name: \"amendmentorigin\",\n                    label: \"Amendment origin\",\n                    items: userChamber === \"Admin\"\n                        ? [\n                            { value: \"HOUSE\", text: \"House\" },\n                            { value: \"SENATE\", text: \"Senate\" },\n                            ...(allowGovernorAmendmentSponsor ? [{ value: \"GOVERNOR\", text: \"Governor\" }] : [])\n                        ]\n                        : userChamber === \"H\"\n                            ? [\n                                { value: \"HOUSE\", text: \"House\" },\n                                ...(allowGovernorAmendmentSponsor ? [{ value: \"GOVERNOR\", text: \"Governor\" }] : [])\n                            ]\n                            : [\n                                { value: \"SENATE\", text: \"Senate\" },\n                                ...(allowGovernorAmendmentSponsor ? [{ value: \"GOVERNOR\", text: \"Governor\" }] : [])\n                            ]\n                },\n            ]\n        },\n        buttons: [\n            {\n                type: \"cancel\",\n                name: \"cancel\",\n                text: \"Cancel\"\n            },\n            {\n                type: \"custom\",\n                name: \"next\",\n                text: \"Next\",\n                disabled: !billNumber || billNumber.length <= 2\n            }\n        ],\n        onChange: (dialogApi) => {\n            const data = dialogApi.getData();\n            // bill numbers will always have more than two characters\n            if (data.billnumber.length > 2 && data.amendmentorigin) {\n                dialogApi.enable('next')\n            } else {\n                dialogApi.disable('next')\n            }\n        },\n        onAction: (dialogApi, details) => {\n            if (details.name === 'next') {\n                selections = { ...selections, ...dialogApi.getData() }\n                if ((!selections.amendmentorigin || selections.amendmentorigin !== \"GOVERNOR\") && (members.length > 0 || committees.length > 0)) {\n                    dialogApi.redial(committeeAndMemberConfig);\n                    if (sponsor && sponsor === \"Member\") {\n                        dialogApi.disable('committee')\n                        if (member) {\n                            dialogApi.setData({ member: member })\n                        }\n                    } else if (sponsor && sponsor === \"Committee\") {\n                        dialogApi.disable('member')\n                        if (committee) {\n                            dialogApi.setData({ committee: committee })\n                        }\n                    }\n                } else {\n                    dialogApi.redial(amendmentTypeDialog);\n                    if (selections.amendmentorigin === 'GOVERNOR' && !selections.versiontype) {\n                        dialogApi.setData({ versiontype: 'enrolled' })\n                    } else if (selections.versiontype) {\n                        dialogApi.setData({ versiontype: selections.versiontype })\n                    }\n                }\n            }\n        }\n    }\n\n    const committeeAndMemberConfig = {\n        title: \"Insert Amendment\",\n        body: {\n            type: \"panel\",\n            items: formItems\n        },\n        buttons: [\n            {\n                type: \"custom\",\n                name: \"previous\",\n                text: \"Previous\"\n            },\n            {\n                type: \"custom\",\n                name: \"next\",\n                text: \"Next\",\n            }\n        ],\n        onChange: (dialogApi) => {\n            const data = dialogApi.getData();\n            if (data.member !== undefined) {\n                if (data.member !== '') {\n                    dialogApi.disable('committee')\n                    dialogApi.setData({ amendmenttype: \"floor\" })\n                } else {\n                    dialogApi.enable('committee')\n                    dialogApi.setData({ amendmenttype: \"\" })\n                }\n            }\n\n            if (data.committee !== undefined) {\n                if (data.committee !== '') {\n                    dialogApi.disable('member')\n                    dialogApi.setData({ amendmenttype: \"committee\" })\n                } else {\n                    dialogApi.enable('member')\n                    dialogApi.setData({ amendmenttype: \"\" })\n                }\n            }\n        },\n        onAction: (dialogApi, details) => {\n            selections = { ...selections, ...dialogApi.getData() }\n            if (details.name === 'next') {\n                dialogApi.redial(amendmentTypeDialog);\n                if (selections.amendmentorigin === 'GOVERNOR' && !selections.versiontype) {\n                    dialogApi.setData({ versiontype: 'enrolled' })\n                } else if (selections.versiontype) {\n                    dialogApi.setData({ versiontype: selections.versiontype })\n                }\n            }\n            if (details.name === \"previous\") {\n                dialogApi.redial(initialPageConfig);\n                if (selections.billnumber) {\n                    dialogApi.setData({ billnumber: selections.billnumber });\n                } else if (billNumber) {\n                    dialogApi.setData({ billnumber: billNumber });\n                }\n                if (selections.amendmentorigin) {\n                    dialogApi.setData({ amendmentorigin: selections.amendmentorigin });\n                } else if (amendmentOrigin && ['HOUSE', 'SENATE', 'GOVERNOR'].includes(amendmentOrigin.toUpperCase())) {\n                    dialogApi.setData({ amendmentorigin: amendmentOrigin });\n                }\n            }\n        }\n    }\n\n    let previousValue = \"1\";\n    const amendmentTypeDialog = {\n        title: \"Insert Amendment\",\n        initialData: {\n            amendmentstobeinserted: previousValue\n        },\n        body: {\n            type: \"panel\",\n            items: [\n                {\n                    type: \"selectbox\",\n                    name: \"versiontype\",\n                    label: \"Version type\",\n                    items: [\n                        { value: \"introduced\", text: \"Introduced\" },\n                        { value: \"substitute\", text: \"Substitute\" },\n                        { value: \"engrossed\", text: \"Engrossed\" },\n                        { value: \"enrolled\", text: \"Enrolled\" }\n                    ]\n                },\n                {\n                    type: \"input\",\n                    name: \"amendmentstobeinserted\",\n                    label: \"Number of amendments to be inserted\",\n                    width: 45,\n                    class: \"fake-class\"\n                }\n            ]\n        },\n        buttons: [\n            {\n                type: \"custom\",\n                name: \"previous\",\n                text: \"Previous\"\n            },\n            {\n                type: \"submit\",\n                name: \"submitbutton\",\n                text: \"OK\"\n            }\n        ],\n        onChange: (dialogApi, details) => {\n            if (details.name === \"amendmentstobeinserted\") {\n                const data = dialogApi.getData();\n                // The amount of amendments to be inserted need to be a number\n                if (isNaN(data.amendmentstobeinserted)) {\n                    dialogApi.setData({ amendmentstobeinserted: previousValue })\n                } else {\n                    previousValue = data.amendmentstobeinserted\n                    if (data.amendmentstobeinserted) {\n                        dialogApi.enable('submitbutton')\n                    } else {\n                        dialogApi.disable('submitbutton')\n                    }\n                }\n            }\n        },\n        onAction: (dialogApi, details) => {\n            if (details.name === 'previous') {\n                selections = { ...selections, ...dialogApi.getData() }\n                if ((!selections.amendmentorigin || selections.amendmentorigin !== \"GOVERNOR\") && (members.length > 0 || committees.length > 0)) {\n                    dialogApi.redial(committeeAndMemberConfig);\n                    if (selections.member) {\n                        dialogApi.disable('committee')\n                        dialogApi.setData({ member: selections.member })\n                    } else if (selections.committee) {\n                        dialogApi.disable('member')\n                        dialogApi.setData({ committee: selections.committee })\n                    } else if (sponsor && sponsor === \"Member\") {\n                        dialogApi.disable('committee')\n                        if (member) {\n                            dialogApi.setData({ member: member })\n                        }\n                    } else if (sponsor && sponsor === \"Committee\") {\n                        dialogApi.disable('member')\n                        if (committee) {\n                            dialogApi.setData({ committee: committee })\n                        }\n                    }\n                } else {\n                    dialogApi.redial(initialPageConfig);\n                    if (selections.billnumber) {\n                        dialogApi.setData({ billnumber: selections.billnumber });\n                    } else if (billNumber) {\n                        dialogApi.setData({ billnumber: billNumber });\n                    }\n                    if (selections.amendmentorigin) {\n                        dialogApi.setData({ amendmentorigin: selections.amendmentorigin });\n                    } else if (amendmentOrigin && ['HOUSE', 'SENATE', 'GOVERNOR'].includes(amendmentOrigin.toUpperCase())) {\n                        dialogApi.setData({ amendmentorigin: amendmentOrigin });\n                    }\n                }\n            }\n        },\n        onSubmit: dialogApi => {\n            selections = { ...selections, ...dialogApi.getData() }\n            const textToBeInserted = amendmentBuilder(selections);\n            // Insert the text after whatever the current selection is\n            const endNode = editor.selection.getEnd();\n            editor.selection.select(endNode);\n            editor.selection.collapse();\n            editor.insertContent(textToBeInserted);\n\n            if (addAmendmentCallback) {\n                addAmendmentCallback(selections);\n            }\n\n            dialogApi.close();\n        }\n    }\n});\n\nconst amendmentBuilder = formData => {\n    const amendmentsToBeInserted = parseInt(formData.amendmentstobeinserted, 10)\n    const billNumberSection = formData.amendmentorigin === 'GOVERNOR' ? '' : `<p class=\"textbl\">(${formData.billnumber.toUpperCase()})</p>`;\n    const titleSection = formData.amendmentorigin === 'GOVERNOR' ? '' : `<p class=\"textbl\">AMENDMENT${amendmentsToBeInserted > 1 ? \"S\" : \"\"} PROPOSED BY ${formData.amendmentorigin !== \"CONFERENCE\" ? \"THE\" : \"\"} ${formData.amendmentorigin}</p>`\n    const committeeSection = formData.committee ? `<p class='i0'>${formData.committee.toUpperCase()}</p>` : \"\";\n    const patronSection = formData.member ? `<p class='i0'>${formData.member.toUpperCase()}</p>` : \"\";\n    let lineSections = '';\n    for (let i = 1; i <= amendmentsToBeInserted; i++) {\n        const lineSection = (i > 1 ? `<p></p>` : '') + (patronSection || committeeSection) + `\n            <p class='textbi'>${i}. Line #, ${formData.versiontype}, after </p>\n            <p class='i10'>strike</p>\n            <p class='i15'></p>\n            <p class='i10'>insert</p>\n            <p class='i15'></p>\n        `;\n        lineSections += lineSection\n    }\n\n    return billNumberSection + titleSection + lineSections;\n}","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\nimport { memberActionCreators } from '../../../stores/lis-members-store';\nimport 'tinymce/themes/silver/theme';\nimport 'tinymce/icons/default'\nimport 'tinymce/plugins/paste/plugin';\nimport 'tinymce/plugins/link/plugin';\nimport 'tinymce/plugins/save/plugin';\nimport 'tinymce/plugins/lists/plugin';\nimport 'tinymce/plugins/code/plugin';\nimport 'tinymce/plugins/preview/plugin';\nimport 'tinymce/plugins/searchreplace/plugin';\nimport 'tinymce/plugins/pagebreak/plugin';\nimport 'tinymce/plugins/table/plugin';\nimport '../../../stylesheets/tinymce/oxide/skin.min.css';\nimport '../../../stylesheets/tinymce/legislation_text_stylesheet.scss';\nimport '../../../stylesheets/tinymce/custom.scss';\nimport { Editor } from '@tinymce/tinymce-react';\nimport '../../../lis-shared/tinymce/lineNumberPlugin';\nimport '../../../lis-shared/tinymce/copyHeadStylePlugin';\nimport '../../../lis-shared/tinymce/rejectedButtonPlugin';\nimport '../../../lis-shared/tinymce/agreedButtonPlugin';\nimport '../../../lis-shared/tinymce/createAmendmentPlugin';\nimport '../../../lis-shared/tinymce/rightMarginPlugin';\nimport tinymce from 'tinymce';\n\nclass ReviewSection extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            members: [],\n            committees: [],\n            selectedBillNumberIsLoaded: true,\n            selectedSponsorIsLoaded: true,\n            selectedMemberIsLoaded: true,\n            selectedCommitteeIsLoaded: true,\n            showLineNumbers: true,\n            showTooltip: false,\n            currentFormats: \"\"\n        }\n\n        this.toggleShowLineNumbers = this.toggleShowLineNumbers.bind(this);\n        this.toggleTooltip = this.toggleTooltip.bind(this);\n        this.setFormat = this.setFormat.bind(this);\n    }\n\n    loadMembers(sessionId) {\n        this.setState({ memberIsLoaded: false })\n        this.props.actions.getMemberList(`sessionID=${sessionId}`)\n            .then(() => {\n                const members = this.props.members.memberList\n                    .filter(m => m.ListDisplayName)\n                    .map(m => ({ value: (m.ChamberCode === \"H\" ? \"DEL. \" : \"SEN. \") + m.PatronDisplayName, text: m.ListDisplayName }));\n                this.setState({\n                    members: members\n                }, () => {\n                    if (this.props.membersCallback) {\n                        this.props.membersCallback(this.props.members.memberList)\n                    }\n                });\n            }).finally(() => {\n                this.setState({\n                    memberIsLoaded: true\n                })\n            });\n    }\n\n    loadCommittees(sessionId) {\n        this.setState({ committeIsLoaded: false })\n        this.props.actions.getCommitteeList(`sessionID=${sessionId}` + \"&includeSubCommittees=true\")\n            .then(() => {\n                const committees = this.props.committee.committeeList.filter(x => !x.ParentCommitteeID).map(c => ({ value: c.Name, text: c.Name }));\n                this.setState({\n                    committees: committees\n                }, () => {\n                    if (this.props.committeesCallback) {\n                        this.props.committeesCallback(this.props.committee.committeeList)\n                    }\n                });\n            }).finally(() => {\n                this.setState({\n                    committeeIsLoaded: true\n                })\n            });\n    }\n\n    handleEditorChange(content) {\n        this.props.handleEditorChange(content);\n        //Hack to set the cursor position to the right of the first character entered\n        //This is because the editor sets the cursor position to index 0 after automatically applying the default style to the first paragraph\n\n        //We replace the content of the editor with itself after entering the first character and automatically applying the default format in the parent component\n        //This places the cursor on the right hand side of the character\n        //The booleans are used to prevent an infinite loop of handleEditorChange calls\n\n        //If the editor had no content after the last keydown then mark the editor as having been empty\n        if (content.length === 0 && !this.props.wasEmpty) {\n            this.props.setWasEmpty(true);\n            //Else if the content length is 24 (Paragraph tag with the section class apllied containing one character)\n            //And the editor was previously empty\n            //And there has been no replacement yet\n            //Then mark that the edior was not empty after the last keydown, that the text has been replaced, and then execute the replacement\n        } else if (content.length == 24 && this.props.wasEmpty && !this.props.replaced) {\n            this.props.setWasEmpty(false, () => {\n                this.props.setReplaced(true, () => {\n                    tinymce.activeEditor.execCommand('selectAll');\n                    tinymce.activeEditor.execCommand('mceReplaceContent', true, content);\n                });\n            })\n            //Else this was any other kind of keydown event, mark that the editor was not empty, and that no replacement took place\n        } else {\n            this.props.setWasEmpty(false, () => {\n                this.props.setReplaced(false);\n            })\n        }\n    }\n\n    toggleShowLineNumbers() {\n        this.setState({\n            showLineNumbers: !this.state.showLineNumbers\n        }, () => {\n            if (this.state.showLineNumbers) {\n                localStorage.setItem(\"showLineNumbers\", true)\n                tinymce.activeEditor.execCommand(\"mceInsertNewLine\");\n                tinymce.activeEditor.execCommand(\"Undo\");\n            } else {\n                localStorage.setItem(\"showLineNumbers\", false)\n                tinymce.activeEditor.execCommand(\"mceInsertNewLine\");\n                tinymce.activeEditor.execCommand(\"Undo\");\n            }\n        })\n    }\n\n    toggleTooltip() {\n        this.setState({\n            showTooltip: !this.state.showTooltip\n        })\n    }\n\n    setFormat() {\n        this.setState({\n            currentFormats: tinymce.activeEditor.contentWindow.getSelection().focusNode.parentElement.classList[0] //We can always assume classList[0] because we only allow one format at a time\n        })\n    }\n\n    componentDidMount() {\n        //Default line numbers off for very large bills to prevent crashing on initial laod\n        if (this.props.editorContent.length < 80000 && !this.props.versionAuthoring) {\n            localStorage.setItem(\"showLineNumbers\", true);\n        } else {\n            this.setState({\n                showLineNumbers: false\n            }, () => {\n                localStorage.setItem(\"showLineNumbers\", false);\n            })\n        }\n\n        if (this.props.sessionId) {\n            this.loadCommittees(this.props.sessionId);\n            this.loadMembers(this.props.sessionId);\n        } else {\n            this.setState({\n                committeeIsLoaded: true,\n                memberIsLoaded: true\n            })\n        }\n    }\n\n    componentDidUpdate(prevProps) {\n        if (prevProps.sessionId !== this.props.sessionId) {\n            this.loadCommittees(this.props.sessionId);\n            this.loadMembers(this.props.sessionId);\n        }\n\n        //below is annoying and seems useless but is needed in order to get the add amendment wizard to auto-populate based on user's sponsor/member/cmte choices\n        if (prevProps.billNumber !== this.props.billNumber || prevProps.selectedSponsor !== this.props.selectedSponsor || prevProps.selectedMember !== this.props.selectedMember || prevProps.selectedCommittee !== this.props.selectedCommittee) {\n            this.setState({ selectedBillNumberIsLoaded: false, selectedSponsorIsLoaded: false, selectedMemberIsLoaded: false, selectedCommitteeIsLoaded: false, }, () => {\n                this.setState({ selectedBillNumberIsLoaded: true, selectedSponsorIsLoaded: true, selectedMemberIsLoaded: true, selectedCommitteeIsLoaded: true })\n            })\n        }\n    }\n\n    render() {\n        if (!this.state.memberIsLoaded || !this.state.committeeIsLoaded || !this.state.selectedBillNumberIsLoaded || !this.state.selectedSponsorIsLoaded || !this.state.selectedMemberIsLoaded || !this.state.selectedCommitteeIsLoaded) {\n            return <div className=\"spinner center-spinner\"></div>;\n        }\n\n        const setup = (editor) => {\n            editor.ui.registry.addToggleButton('bracketbutton', {\n                text: \"[ ]\",\n                tooltip: \"Insert Brackets\",\n                onAction: function () {\n                    editor.insertContent('<span class=\"bracket\">[</span> ');\n                    let bookmark = editor.selection.getBookmark(2);\n                    editor.insertContent('<span class=\"bracket\">]</span>')\n                    editor.selection.moveToBookmark(bookmark);\n                }\n            });\n            editor.ui.registry.addToggleButton('lBracketbutton', {\n                text: \"[\",\n                tooltip: \"Insert Left Bracket\",\n                onAction: function () {\n                    editor.insertContent('<span class=\"bracket\">[</span>');\n                }\n            });\n            editor.ui.registry.addToggleButton('rBracketbutton', {\n                text: \"]\",\n                tooltip: \"Insert Right Bracket\",\n                onAction: function () {\n                    editor.insertContent('<span class=\"bracket\">]</span>');\n                }\n            });\n            editor.ui.registry.addToggleButton('sectionButton', {\n                text: \"§\",\n                tooltip: \"Insert Section Symbol\",\n                onAction: function () {\n                    editor.insertContent('§');\n                }\n            });\n            editor.on(\"keydown\", (e) => {\n                this.setFormat();\n            });\n            editor.on(\"click\", (e) => {\n                this.setFormat();\n            })\n        }\n\n        return (\n            <React.Fragment key={this.props.reviewKey}>\n                <div className='inner-grid eight-and-one'>\n                    <div />\n                    <div style={{ display: \"inline-flex\", marginBottom: \"20px\", marginTop: this.props.location === \"/amendment-management\" ? \"13px\" : \"8px\" }}>\n                        <a onClick={(e) => { e.stopPropagation(e); this.toggleTooltip() }} className=\"button info\" style={{ margin: \"10px 10px 0 0\" }}>Info</a>\n                        <button type=\"button\" className=\"button primary\" onClick={() => this.toggleShowLineNumbers()}>{(this.state.showLineNumbers ? \"Hide\" : \"Show\") + \" Line Numbers\"}</button>\n                        {this.state.showTooltip &&\n                            <div className=\"info-box editor-tooltip\">\n                                <p>Hiding line numbers will improve the response time of the editor. You may turn them back on at any point during editing. It may take some time to turn on line numbers for exceptionally large bills.</p>\n                            </div>\n                        }\n                    </div>\n                </div>\n                <div style={{ width: \"100%\", height: \"40px\" }}>\n                    {this.state.currentFormats &&\n                        <span style={{ float: \"right\" }}>{\"Format: \" + this.state.currentFormats}</span>\n                    }\n                </div>\n                <Editor\n                    value={this.props.editorContent}\n                    init={{\n                        setup: setup,\n                        browser_spellcheck: true,\n                        height: this.props.height || 500,\n                        plugins: 'paste save lists preview searchreplace pagebreak code linenumbers table copyheadstyle rightmargin' + (this.props.allowAmendmentActions ? ' rejectedbutton agreedbutton createamendment' : ''),\n                        toolbar: 'undo redo | styleselect | fontsizeselect | bold italic strikethrough underline | alignleft aligncenter alignright | bracketButton lBracketbutton rBracketbutton | sectionButton | ' + (this.props.allowAmendmentActions && !this.props.overrideRemoveAgreeRejectButtons ? ' | rejectedbuttons agreedbutton' : '') + (this.props.allowAmendmentActions && !this.props.overrideRemoveCreateAmendmentButton ? ' | createamendment' : ''),\n                        contextmenu: this.props.allowAmendmentActions ? 'rejectedbuttonscontext agreedbuttoncontext' : '',\n                        skin: false,\n                        paste_as_text: this.props.pasteAsText || this.props.pasteAsText === undefined,\n                        members: this.state.members,\n                        committees: this.state.committees,\n                        valid_children: '+body[style]',\n                        content_css: false,\n                        content_style: 'table { border-collapse: collapse; border: 1px solid #FFFFFF; }' + 'td { padding: 12px 0px; }',\n                        userChamber: this.props.userChamber,\n                        billNumber: this.props.billNumber,\n                        sponsor: this.props.selectedSponsor ? this.props.selectedSponsor.value : '',\n                        member: this.props.selectedMember && this.state.members.find(m => m.text === this.props.selectedMember.value.ListDisplayName) ? this.state.members.find(m => m.text === this.props.selectedMember.value.ListDisplayName).value : '',\n                        committee: this.props.selectedCommittee && this.state.committees.find(c => c.text === this.props.selectedCommittee.value.Name) ? this.state.committees.find(c => c.text === this.props.selectedCommittee.value.Name).value : '',\n                        amendmentOrigin: this.props.selectedMember && this.state.members.find(m => m.text === this.props.selectedMember.value.ListDisplayName) ? this.props.selectedMember.value.ChamberCode : this.props.selectedCommittee && this.state.committees.find(c => c.text === this.props.selectedCommittee.value.Name) ? this.props.selectedCommittee.value.ChamberCode : this.props.amendmentOrigin ? this.props.amendmentOrigin : '',\n                        allowGovernorAmendmentSponsor: this.props.allowGovernorAmendmentSponsor,\n                        paste_word_valid_elements: 'p,table,tbody,td,tr,s,u,b,sup,sub',\n                        paste_convert_word_fake_lists: false, //doesn't convert indented <p> tags to <ul>,<ol> etc...\n                        paste_enable_default_filters: false, //doesn't add the TinyMCE classes\n                        paste_data_images: true,\n                        paste_preprocess: function (plugin, args) { //removes the Word \"curved quotes\"\n                            args.content = args.content.replace('&ldquo;', '\"').replace('&rdquo;', '\"').replace('\"', '\"').replace('\"', '\"');\n                        },\n                        table_default_attributes: {\n                            border: '0'\n                        },\n                        formats: {\n                            section: {\n                                block: 'p', attributes: { class: 'section' }\n                            },\n                            ldtitle: {\n                                block: 'p', attributes: { class: 'ldtitle' }\n                            },\n                            enactstatement: {\n                                block: 'p', attributes: { class: 'enactstm' }\n                            },\n                            enactclause: {\n                                block: 'p', attributes: { class: 'enactcls' }\n                            },\n                            billnumber: {\n                                block: 'p', attributes: { class: 'billno' }\n                            },\n                            catchline: {\n                                block: 'p', attributes: { class: 'catchln' }\n                            },\n                            rejected: {\n                                block: 'p', attributes: { class: 'rejected' }\n                            },\n                            i10: {\n                                block: 'p', attributes: { class: 'i10' }\n                            },\n                            i0: {\n                                block: 'p', attributes: { class: 'i0' }\n                            },\n                            i15: {\n                                block: 'p', attributes: { class: 'i15' }\n                            },\n                            i20: {\n                                block: 'p', attributes: { class: 'i20' }\n                            },\n                            customcenter: {\n                                block: 'p', attributes: { class: 'center' }\n                            },\n                            strikethrough: {\n                                inline: 's'\n                            },\n                            end: {\n                                block: 'p', attributes: { class: 'end' }\n                            },\n                            textind: {\n                                block: 'p', attributes: { class: 'textind' }\n                            },\n                            textbl: {\n                                block: 'p', attributes: { class: 'textbl' }\n                            },\n                            textbi: {\n                                block: 'p', attributes: { class: 'textbi' }\n                            },\n                            textasis: {\n                                block: 'p', attributes: { class: 'textasis' }\n                            },\n                            table: {\n                                block: 'p', attributes: { class: 'table' }\n                            },\n                            testc: {\n                                block: 'p', attributes: { class: 'testc' }\n                            },\n                            tablec: {\n                                block: 'p', attributes: { class: 'tablec' }\n                            },\n                            tblhdn: {\n                                block: 'p', attributes: { class: 'tblhdn' }\n                            },\n                            tbllft: {\n                                block: 'p', attributes: { class: 'tbllft' }\n                            },\n                            tblctr: {\n                                block: 'p', attributes: { class: 'tblctr' }\n                            },\n                            tblrt: {\n                                block: 'p', attributes: { class: 'tblrt' }\n                            },\n                            txtctr: {\n                                block: 'p', attributes: { class: 'txtctr' }\n                            },\n                            drafter: {\n                                block: 'p', attributes: { class: 'drafter' }\n                            },\n                            billblank: {\n                                block: 'p', attributes: { class: 'billblank' }\n                            },\n                            pro: {\n                                block: 'p', attributes: { class: 'pro' }\n                            },\n                            sumtext: {\n                                block: 'p', attributes: { class: 'sumtext' }\n                            },\n                            lddata: {\n                                block: 'p', attributes: { class: 'lddata' }\n                            },\n                            ld: {\n                                block: 'p', attributes: { class: 'ld' }\n                            },\n                            patctr: {\n                                block: 'p', attributes: { class: 'patctr' }\n                            },\n                            patalt: {\n                                block: 'p', attributes: { class: 'patalt' }\n                            },\n                            textrt: {\n                                block: 'p', attributes: { class: 'textrt' }\n                            },\n                            testhdrchar: {\n                                block: 'p', attributes: { class: 'testhdrchar' }\n                            },\n                            texthdr: {\n                                block: 'p', attributes: { class: 'texthdr' }\n                            },\n                            new: {\n                                block: 'p', classes: 'new'\n                            }\n                        },\n                        style_formats: [\n                            { title: 'Section', format: 'section' },\n                            { title: 'LD Title', format: 'ldtitle' },\n                            { title: 'Enact Statement', format: 'enactstatement' },\n                            { title: 'Enact Clause', format: 'enactclause' },\n                            { title: 'Bill Number', format: 'billnumber' },\n                            { title: 'Catchline', format: 'catchline' },\n                            { title: 'Rejected', format: 'rejected' },\n                            { title: 'i10', format: 'i10' },\n                            { title: 'i0', format: 'i0' },\n                            { title: 'i15', format: 'i15' },\n                            { title: 'i20', format: 'i20' },\n                            { title: 'Center', format: 'customcenter' },\n                            { title: \"End\", format: \"end\" },\n                            { title: \"Textind\", format: \"textind\" },\n                            { title: \"Textbl\", format: \"textbl\" },\n                            { title: \"Textbi\", format: \"textbi\" },\n                            { title: \"Textasis\", format: \"textasis\" },\n                            { title: \"Table\", format: \"table\" },\n                            { title: \"Testc\", format: \"testc\" },\n                            { title: \"Tablec\", format: \"tablec\" },\n                            { title: \"Tblhdn\", format: \"tblhdn\" },\n                            { title: \"Tbllft\", format: \"tbllft\" },\n                            { title: \"Tblctr\", format: \"tblctr\" },\n                            { title: \"Tblrt\", format: \"tblrt\" },\n                            { title: \"Txtctr\", format: \"txtctr\" },\n                            { title: \"Drafter\", format: \"drafter\" },\n                            { title: \"Billblank\", format: \"billblank\" },\n                            { title: \"Pro\", format: \"pro\" },\n                            { title: \"Sumtext\", format: \"sumtext\" },\n                            { title: \"Lddata\", format: \"lddata\" },\n                            { title: \"Ld\", format: \"ld\" },\n                            { title: \"Patctr\", format: \"patctr\" },\n                            { title: \"Patalt\", format: \"patalt\" },\n                            { title: \"Textrt\", format: \"textrt\" },\n                            { title: \"Testhdrchar\", format: \"testhdrchar\" },\n                            { title: \"Texthdr\", format: \"texthdr\" },\n                            { title: \"New\", format: \"new\" }\n                        ],\n                    }}\n                    onEditorChange={(e) => this.handleEditorChange(e)}\n                />\n            </React.Fragment>\n        );\n    }\n}\n\n\nexport default connect(\n    (state) => {\n        const { committee, members } = state;\n        return {\n            committee,\n            members\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, committeeActionCreators, memberActionCreators), dispatch)\n        }\n    }\n)(ReviewSection)","import jwtDecode from 'jwt-decode';\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst idToken = 'LIS_ID_TOKEN';\nconst refreshToken = 'LIS_REFRESH_TOKEN';\nconst refreshTokenExpiration = 'LIS_REFRESH_TOKEN_EXPIRATION';\nconst claims = \"LIS_CLAIMS\";\nconst graphToken = 'GRAPH_ID_TOKEN';\n\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nlet abortController = new window.AbortController();\nlet signal = abortController ? abortController.signal : \"\";\n\nexport const cancelRequest = () => {\n    if (abortController)\n        abortController.abort();\n}\n\n//The only difference between publicRequest and partnerRequest is that partnerRequest checks to see if the token is valid and sends it with the fetch\nexport const publicRequest = (url, method, headers, body, params) => {\n    let config = {\n        method: method,\n    }\n    if (headers) {\n        headers.WebAPIKey = process.env.REACT_APP_API_KEY;\n        config.headers = headers;\n    } else {\n        config.headers = {\n            WebAPIKey: process.env.REACT_APP_API_KEY\n        }\n    }\n    if (body) {\n        config.body = JSON.stringify(body)\n    }\n    if (signal && signal != \"\" && signal.aborted === true) {\n        //Refresh the abortController because you can't reset the abort property of a signal\n        abortController = new window.AbortController();\n        signal = abortController ? abortController.signal : \"\";\n    }\n    if (signal && signal != \"\") {\n        config.signal = signal;\n    }\n    return fetch(url + params, config)\n        .then(response => {\n            if (response.status === 204) {\n                //Some endpoints do not return anything if there is no data to be returned. So NO_CONTENT must be specified as it is not always an error\n                throw [NO_CONTENT, 'No Content'];\n            } else if (response.status > 399) {\n                //There was a request failure. Return the response. Do not try to convert it to a JSON object as there is no guarantee that it is formatted as a json\n                return (response.text()\n                    .then(text => {\n                        console.log(text);\n                        return Promise.reject([REQUEST_FAILURE, text])\n                    })\n                )\n            }\n            return response\n\n        })\n        .then(response =>\n            //Our request is successful. Convert it to JSON\n            response.json().then(data => ({ data, response }))\n        )\n        .then(({ data, response }) => {\n            return [REQUEST_SUCCESS, data, response.headers]\n        })\n        .catch(err => err);\n}\n\nexport const partnerRequest = (url, method, headers, body, params, nonAbortable) => {\n    //Check the token first to see if it is valid\n    return checkToken()\n        .then(() => {\n            //Just in case the method is initiated with a blank string as the headers\n            if (!headers) {\n                headers = {\n                    'content-type': \"application/json; charset=utf-8\"\n                }\n            }\n            headers.Authorization = \"Bearer \" + localStorage.getItem(idToken);\n            headers.WebAPIKey = process.env.REACT_APP_API_KEY;\n            let config = {\n                method: method,\n                headers: headers,\n            }\n            if (body) {\n                if (body instanceof FormData) {\n                    config.body = body\n                } else {\n                    config.body = JSON.stringify(body);\n                }\n            }\n            if (signal && signal != \"\" && signal.aborted === true) {\n                //Refresh the abortController because you can't reset the abort property of a signal\n                abortController = new window.AbortController();\n                signal = abortController ? abortController.signal : \"\";\n            }\n            if (signal && !nonAbortable) {\n                config.signal = signal;\n            }\n            return fetch(url + params, config)\n        })\n        .then(response => {\n            if (response.status === 204) {\n                throw [NO_CONTENT, 'No Content'];\n            } else if (response.status > 399) {\n                return (response.text()\n                    .then(text => {\n                        return Promise.reject([REQUEST_FAILURE, text])\n                    })\n                )\n            }\n            return response\n\n        })\n        .then(response =>\n            response.json().then(data => ({ data, response }))\n        )\n        .then(({ data, response }) => {\n            return [REQUEST_SUCCESS, data, response.headers]\n        })\n        .catch(err => err);\n\n}\n\nexport const checkToken = () => {\n    let token = localStorage.getItem(idToken);\n\n    if (token !== null && token !== 'undefined') {\n        const decode = jwtDecode(token);\n        const stringToken = JSON.stringify(decode);\n        const parsedToken = JSON.parse(stringToken);\n        //If true then then expiration hasn't passed yet. So return a promise so partnerRequest can keep on running\n        if (parsedToken.exp < new Date().getTime() / 1000) {\n            return getNewToken(function (result) {\n                return result\n            })\n        } else {\n            return new Promise(function (resolve, reject) { resolve(true) });\n        }\n    } else {\n        return Promise.reject([REQUEST_FAILURE, 'Error: No Token']);\n    }\n}\n\nconst getNewToken = (callback) => {\n    let rtoken = localStorage.getItem(refreshToken);\n    let config = {\n        method: 'POST',\n        headers: {\n            \"authorization\": rtoken,\n            \"content-type\": \"application/json; charset=utf-8\",\n            \"WebAPIKey\": process.env.REACT_APP_API_KEY\n        }\n    }\n    return fetch((API_URL || process.env.REACT_APP_AUTH_API_URL) + '/Authentication/api/RefreshAccessTokenAsync', config)\n        .then(response => {\n            if (response.status === 204) { return Promise.reject('Error: No Content') }\n            else if (response.status === 401) {\n                //The user's token is expired. Log them out\n                localStorage.removeItem(idToken);\n                localStorage.removeItem(refreshToken);\n                localStorage.removeItem(refreshTokenExpiration);\n                localStorage.removeItem(claims);\n                localStorage.removeItem(graphToken);\n\n                return Promise.reject(\"Error: Refresh Token Expired\");\n            }\n            else if (response.status > 399) { return Promise.reject([REQUEST_FAILURE, response.text()]) }\n            else { return response }\n        })\n        .then(response =>\n            response.json().then(user => ({ user, response }))\n        ).then(({ user, response }) => {\n            // If refresh was successful, set the tokens in local storage\n            let roles = [];\n            if (user.Claims && user.Claims.Roles) {\n                roles = user.Claims.Roles;\n            }\n            localStorage.setItem(claims, JSON.stringify(roles));\n            localStorage.setItem(idToken, user.AccessToken);\n            localStorage.setItem(refreshToken, user.RefreshToken);\n            //604800000 is 7 days in milliseconds\n            localStorage.setItem(refreshTokenExpiration, new Date().getTime() + 604800000)\n            callback(0);\n        }).catch(err => callback([REQUEST_FAILURE, Promise.reject(err)]))\n}","const getHtml = (jsonObject) => {\n    //Check that the param is an object before beginning\n    if (typeof jsonObject !== 'object' || jsonObject === null) {\n        console.error(\"jsonObject param is not an object\")\n        return null;\n    }\n    return mapJson(jsonObject);\n}\n\n\nconst mapJson = (object) => {\n    if (typeof object === \"string\") {\n        return object;\n    }\n\n    let headerContent = document.createElement('div');\n    headerContent.id = \"header-content\";\n\n    for (const c of object[\"Content\"]) {\n        if (c !== \"\") {\n            if (c[\"Content\"] && c[\"Content\"].length > 1) {\n                let content = document.createElement(c[\"TagName\"]);\n\n                for (const nc of c[\"Content\"]) {\n                    //If the nested content has its own content then build out an element for it\n                    //Otherwise it's a string, so just append it to the parent content                    \n                    if (nc[\"Content\"]) {\n                        //We have nested content within the nested content\n                        if (nc[\"Content\"].length > 1) {\n                            let hierarchicalContent = document.createElement(nc[\"TagName\"]);\n                            for (const nnc of nc[\"Content\"]) {\n                                if (nnc[\"Content\"]) {\n                                    let nestedNestedContent = document.createElement(nnc[\"TagName\"]);\n                                    nestedNestedContent.appendChild(document.createTextNode(nnc[\"Content\"]));\n                                    nestedNestedContent.style.cssText = (nnc[\"Attributes\"] && nnc[\"Attributes\"].Style) ? nnc[\"Attributes\"].Style : \"\";\n                                    if (nnc[\"Attributes\"] && nnc[\"Attributes\"].Class) {\n                                        nestedNestedContent.classList = nnc[\"Attributes\"].Class;\n                                    }\n                                    hierarchicalContent.appendChild(nestedNestedContent);\n                                    content.appendChild(hierarchicalContent);\n                                } else {\n                                    hierarchicalContent.appendChild(document.createTextNode(nnc));\n                                    content.appendChild(hierarchicalContent)\n                                }\n                            }\n                        } else {\n                            let nestedContent = document.createElement(nc[\"TagName\"]);\n                            nestedContent.appendChild(document.createTextNode(nc[\"Content\"]));\n                            nestedContent.style.cssText = (nc[\"Attributes\"] && nc[\"Attributes\"].Style) ? nc[\"Attributes\"].Style : \"\";\n                            if (nc[\"Attributes\"] && nc[\"Attributes\"].Class) {\n                                nestedContent.classList = nc[\"Attributes\"].Class;\n                            }\n                            content.appendChild(nestedContent);\n                        }\n                    } else {\n                        content.appendChild(document.createTextNode(nc));\n                    }\n                }\n\n                content.style.cssText = c[\"Attributes\"].Style ? c[\"Attributes\"].Style : \"\";\n                if (c[\"Attributes\"].Class) {\n                    content.classList = c[\"Attributes\"].Class;\n                }\n                headerContent.appendChild(content)\n            } else {\n                let content = document.createElement(c[\"TagName\"]);\n                content.appendChild(document.createTextNode(c[\"Content\"]));\n                content.style.cssText = c[\"Attributes\"].Style ? c[\"Attributes\"].Style : \"\";\n                if (c[\"Attributes\"].Class) {\n                    content.classList = c[\"Attributes\"].Class;\n                }\n                headerContent.appendChild(content)\n            }\n        }\n    }\n\n    return headerContent.outerHTML.toString()\n}\n\nexport default getHtml;","import React from 'react';\nimport renderHTML from 'react-render-html';\n\nclass AmendmentSection extends React.Component {\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            shown: [],\n            showAll: false,\n            showInactiveAmendments: false\n        }\n\n        this.getAmendmentDescription = this.getAmendmentDescription.bind(this);\n        this.showAmendment = this.showAmendment.bind(this);\n        this.showAllAmendments = this.showAllAmendments.bind(this);\n        this.toggleInactiveAmendments = this.toggleInactiveAmendments.bind(this);\n    }\n\n    getAmendmentDescription(amendment) {\n        let descriptionAndDisposition = amendment.Description;\n\n        if (!amendment.DocumentCode || amendment.DocumentCode === \"\") {\n            return descriptionAndDisposition;\n        }\n\n        if (amendment.TextDispositionID === 12) {\n            return descriptionAndDisposition + \" Engrossed\"\n        }\n\n        if (amendment.TextDisposition === \"Hold\") {\n            return descriptionAndDisposition;\n        } else if (amendment.TextDisposition !== \"Posted\") {\n            descriptionAndDisposition = `${amendment.Description} ${amendment.TextDisposition || ''}`;\n        }\n\n        if (amendment.IsReprint && !descriptionAndDisposition.includes(\"(Reprint)\")) {\n            descriptionAndDisposition = descriptionAndDisposition + \" (Reprint)\";\n        }\n\n        if (amendment.LDNumber) {\n            descriptionAndDisposition = descriptionAndDisposition + \" - \" + amendment.LDNumber;\n        }\n\n        return descriptionAndDisposition;\n    }\n\n    showAmendment(e, index) {\n        if (e) {\n            e.stopPropagation();\n        }\n        let shown = [...this.state.shown];\n        shown[index] = !shown[index];\n        this.setState({\n            shown: shown\n        });\n    }\n\n    showAllAmendments(e) {\n        if (e) {\n            e.stopPropagation();\n        }\n        const opposite = !this.state.showAll;\n        let shown = new Array(this.props.amendments.length).fill(opposite);\n        this.setState({\n            showAll: opposite,\n            shown: shown\n        });\n    }\n\n    toggleInactiveAmendments() {\n        this.setState(state => ({\n            showInactiveAmendments: !state.showInactiveAmendments\n        }));\n    }\n\n    componentDidUpdate(prevProps) {\n        if (this.props.amendments !== prevProps.amendments) {\n            this.setState({\n                shown: [],\n                showAll: false,\n                showInactiveAmendments: false\n            });\n        }\n    }\n\n    render() {\n        const { shown, showAll, showInactiveAmendments } = this.state;\n        let amendments = [...this.props.amendments];\n        if (!showInactiveAmendments) {\n            amendments = amendments.filter(amendment => amendment.IsActive);\n        }\n        return (\n            <div style={{ backgroundColor: 'white', padding: \"10px\" }}>\n                <div className=\"flex-row\">\n                    <div className=\"flex-row flex-vertical-center\">\n                        {this.props.amendments.find(amendment => !amendment.IsActive) &&\n                            <React.Fragment>\n                                <input style={{ margin: '0px 5px' }} type=\"checkbox\" onChange={this.toggleInactiveAmendments} checked={showInactiveAmendments} />\n                                <label>Show Inactive Amendments</label>\n                            </React.Fragment>\n                        }\n                    </div>\n                    <div>\n                        {this.props.amendments.length > 0 &&\n                            <button onClick={this.showAllAmendments} className=\"button-link\" type=\"button\">{showAll ? \"Collapse All +/-\" : \"Expand All +/-\"}</button>\n                        }\n                    </div>\n                </div>\n                {amendments.map((amendment, index) =>\n                    <div key={index}>\n                        <div>\n                            <button onClick={e => this.showAmendment(e, index)} className={`data-url ${shown[index] ? \"arrow-up\" : \"arrow-down\"}`}></button>\n                            <label className=\"small-text\">{this.getAmendmentDescription(amendment)}</label>\n                            {!amendment.IsActive && <label>{\" (INACTIVE)\"}</label>}\n                        </div>\n                        {shown[index] &&\n                            <div className=\"dlas-forms amendments-review\">\n                                {amendment.DraftText ? renderHTML(amendment.DraftText) : ''}\n                            </div>\n                        }\n                        {index !== amendments.length - 1 && <hr />}\n                    </div>\n                )}\n            </div>\n        );\n    }\n}\n\nexport default AmendmentSection;\n","import React from 'react';\nimport { Prompt } from 'react-router';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { billActionCreators } from '../../../stores/lis-legislation-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport moment from 'moment-timezone';\nimport ReactToPrint from 'react-to-print';\nimport Popout from '../../../lis-shared/lis-layout/components/lis-popout-component';\nimport DatePicker from 'react-datepicker';\nimport getHtml from '../../../services/json-to-html';\n\nimport BillGridSection from './lis-bill-grid';\nimport SelectorSection from './lis-selectors';\nimport AmendmentSection from './lis-amendments';\nimport ReviewSection from './lis-review';\nimport PreviewSection from './lis-bill-preview';\nimport TextList from './lis-text-list';\nimport { printActionCreators } from '../../../stores/lis-print-store';\n\nclass VersionManagement extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            billFieldsetIsActive: true,\n            amendmentFieldsetIsActive: false,\n            reviewFieldsetIsActive: false,\n            sessionOptions: [],\n            legOptions: [],\n            billVersionRef: [],\n            selectedSession: '',\n            selectedLegType: '',\n            originalBillText: [],\n            selectedBillText: '',\n            selectedBillTextIndex: -1,\n            isLoaded: true,\n            billList: [],\n            selectedBill: '',\n            billText: '',\n            amendments: [],\n            isPreviewVisible: false,\n            processingFile: false,\n            showPortal: false,\n            billDataIsLoading: null,\n            showCompletedItems: false,\n            versionDate: moment(),\n            legDateOptions: [],\n            selectedLegDate: '',\n            selectedLegNum: '',\n            showHeaders: true,\n            headers: null,\n            reviewKey: 1,\n            previewContent: '',\n            previewContentError: '',\n            editorChanged: false,\n            savedReviewContent: '',\n            gettingIncompletePdf: false,\n            showIncompletePdf: false,\n            checkedBills: [],\n            enrolledPrintQueue: [],\n            useCurrentPublishDates: true,\n            reviewContent: '',\n            onReconvene: false,\n            isDirty: false,\n            showTextConfirmation: false,\n            showBillConfirmation: false,\n            changeCount: 0,\n            storedTextIndex: 0,\n            storedBill: \"\",\n            storedBillIndex: 0,\n            sessionBillsList: [],\n            wasEmpty: false,\n            replaced: false,\n            checkAll: false,\n            lastCheckedBills: []\n        };\n\n        //Ref used to scroll down to amendment section\n        this.amendmentRef = React.createRef();\n        this.reviewRef = React.createRef();\n\n        this.togglePreview = this.togglePreview.bind(this);\n        this.togglePortal = this.togglePortal.bind(this);\n        this.toggleFieldsetCollapse = this.toggleFieldsetCollapse.bind(this);\n        this.handleSelectorChange = this.handleSelectorChange.bind(this);\n        this.checkHandleSelectorChange = this.checkHandleSelectorChange.bind(this);\n        this.selectBill = this.selectBill.bind(this);\n        this.selectBillIndex = this.selectBillIndex.bind(this);\n        this.checkBill = this.checkBill.bind(this);\n        this.batchPublish = this.batchPublish.bind(this);\n        this.batchComplete = this.batchComplete.bind(this);\n        this.togglePublishDatePreference = this.togglePublishDatePreference.bind(this);\n        this.handlePublishDateChange = this.handlePublishDateChange.bind(this);\n        this.toggleCompleteItems = this.toggleCompleteItems.bind(this);\n        this.handleEditorChange = this.handleEditorChange.bind(this);\n        this.handleSave = this.handleSave.bind(this);\n        this.handleSaveCompletedItem = this.handleSaveCompletedItem.bind(this);\n        this.handleVersionDateChange = this.handleVersionDateChange.bind(this);\n        this.toggleHeaders = this.toggleHeaders.bind(this);\n        this.resetWarning = this.resetWarning.bind(this);\n        this.getJsonHeadersRequestString = this.getJsonHeadersRequestString.bind(this);\n        this.getPreviewRequest = this.getPreviewRequest.bind(this);\n        this.previewPdf = this.previewPdf.bind(this);\n        this.toggleReprint = this.toggleReprint.bind(this);\n        this.filterReprints = this.filterReprints.bind(this);\n        this.setLegDateOptions = this.setLegDateOptions.bind(this);\n        this.closeConfirmation = this.closeConfirmation.bind(this);\n        this.updateBillListByLegislationID = this.updateBillListByLegislationID.bind(this);\n        this.setWasEmpty = this.setWasEmpty.bind(this);\n        this.setReplaced = this.setReplaced.bind(this);\n        this.toggleCheckAll = this.toggleCheckAll.bind(this);\n\n        this.pdfRef = React.createRef();\n    }\n\n    toggleFieldsetCollapse(isActive) {\n        this.setState(state => ({\n            [isActive]: !state[isActive]\n        }));\n    }\n\n    filterReprints() {\n        this.setState({ reprintsFiltered: !this.state.reprintsFiltered }, () => {\n            this.setLegDateOptions(this.state.billList);\n        })\n    }\n\n    toggleReprint() {\n        let billTexts = [...this.state.originalBillText];\n        billTexts[this.state.selectedBillTextIndex].IsReprint = !billTexts[this.state.selectedBillTextIndex].IsReprint;\n        this.setState({ billTexts });\n    }\n\n    setWasEmpty(val, callback) {\n        this.setState({ wasEmpty: val }, () => {\n            if (callback) {\n                callback();\n            }\n        })\n    }\n\n    setReplaced(val, callback) {\n        this.setState({ replaced: val }, () => {\n            if (callback) {\n                callback();\n            }\n        })\n    }\n\n    getPreviewRequest() {\n        let previewRequest = { ...this.state.originalBillText[this.state.selectedBillTextIndex] };\n\n        let newDraftText;\n        let doc = document.createElement('div');\n        //Use what's in the editor for completed items, otherwise use what's been saved\n        doc.insertAdjacentHTML(\"afterbegin\", this.state.showCompletedItems ? this.state.reviewContent : previewRequest.DraftText);\n        if (!this.state.showCompletedItems) {\n            //Remove ldtitle from document\n            let docParagraphs = doc.getElementsByTagName('p');\n\n            for (let j = 0; j < docParagraphs.length; j++) {\n                //Do not remove the patronLine from the original text before requesting preview for incomplete items\n                if (['section', 'enactstm'].includes(docParagraphs[j].classList[0])) {\n                    break; //reached the actal body of the text, don't remove any more\n                } else if (['ldtitle', 'ld'].includes(docParagraphs[j].classList[0])) {\n                    doc.removeChild(docParagraphs[j])\n                    j--\n                }\n            }\n        } else {\n            //remove header-content from document\n            let docDivs = doc.getElementsByTagName('div');\n            for (let j = 0; j < docDivs.length; j++) {\n                //Do not remove the patronLine from the original text before requesting preview for incomplete items\n                if (this.state.showCompletedItems) {\n                    if (docDivs[j].id === 'header-content') {\n                        doc.removeChild(docDivs[j]);\n                    }\n                }\n            }\n        }\n\n        newDraftText = doc.innerHTML;\n\n        previewRequest.DraftText = newDraftText;\n        if (this.state.showCompletedItems) {\n            //Try to find the draft title in the text and set it\n            //For incomplete items, the text has to have already been saved before previewing, which means the DraftTitle attribute will already be set appropriately\n            //but for completed items, they preview without saving, so the DraftTitle needs to be updated in the request we send to the API in order for the title in the headers (programmatically added) to be correct\n            let searchForLDTitleContainer = document.createElement('div');\n            searchForLDTitleContainer.innerHTML = this.state.reviewContent;\n            //The first element in the content with this class is the draft title\n            let draftLDTitle = searchForLDTitleContainer.querySelector('.ldtitle');\n            if (draftLDTitle && draftLDTitle.innerHTML !== '') {\n                previewRequest.DraftTitle = draftLDTitle.innerHTML;\n                previewRequest.EditTitle = draftLDTitle.innerHTML;\n            }\n        }\n        previewRequest.SessionCode = this.state.selectedSession.SessionCode;\n        previewRequest.Chamber = previewRequest.LegislationChamberCode === \"H\" ? \"House\" : \"Senate\";\n        previewRequest.VersionChamber = previewRequest.ChamberCode === \"H\" ? \"House\" : \"Senate\";\n        previewRequest.LegislationKey = previewRequest.LegislationNumber.substr(2, previewRequest.LegislationNumber.length);\n        previewRequest.OnReconvene = this.state.onReconvene;\n        previewRequest.LegislationClass = this.state.selectedBill.LegislationClass;\n        previewRequest.LegislationClassID = this.state.selectedBill.LegislationClassID;\n\n        //Pull the ReferredCommittee out of the doc in case the text version hasn't been saved before and doesn't already have a ReferredCommittee\n        //Only when authoring engrossed or renengrossed\n        if (this.state.selectedLegType.LegislationVersionID === 6 || this.state.selectedLegType.LegislationVersionID === 2) {\n            let headers = document.createElement('div');\n            headers.insertAdjacentHTML(\"afterbegin\", this.state.headers);\n\n            if (headers.getElementsByClassName(\"CommitteeReferral\")[0]) {\n                previewRequest.ReferredCommittee = headers.getElementsByClassName(\"CommitteeReferral\")[0].innerText.split(\"Committee on the \")[1]\n                    ? headers.getElementsByClassName(\"CommitteeReferral\")[0].innerText.split(\"Committee on the \")[1].trim()\n                    : headers.getElementsByClassName(\"CommitteeReferral\")[0].innerText.split(\"Committee for \")[1]\n                        ? headers.getElementsByClassName(\"CommitteeReferral\")[0].innerText.split(\"Committee for \")[1].trim()\n                        : headers.getElementsByClassName(\"CommitteeReferral\")[0].innerText.split(\"Committee on \")[1].trim();\n            }\n        }\n\n        return previewRequest;\n    }\n\n    previewPdf() {\n        if (!this.state.showCompletedItems) {\n            this.setState({ showIncompletePdf: true, gettingIncompletePdf: true })\n        } else {\n            this.setState({ showIncompletePdf: false, gettingCompletedItemPreview: true })\n        }\n        const previewRequest = this.getPreviewRequest();\n\n        this.props.actions.previewPdfFile(previewRequest)\n            .then(() => {\n                if (this.state.showCompletedItems) {\n                    this.setState({\n                        previewContent: 'true', //just makes it so the preview page will indeed show\n                        isPreviewVisible: !this.state.isPreviewVisible,\n                        gettingCompletedItemPreview: false\n                    }, () => {\n                        document.querySelector(\"iframe\").src = this.props.bills.sasUrl;\n                    })\n                } else {\n                    if (this.pdfRef && this.pdfRef.current) {\n                        let pdfRef = this.pdfRef.current;\n                        pdfRef.setAttribute('src', this.props.bills.sasUrl);\n                        pdfRef.onload = () => {\n                            this.setState({\n                                gettingIncompletePdf: false\n                            });\n                        };\n                    }\n                }\n            }).catch((e) => {\n                console.log(e);\n                this.setState({ gettingCompletedItemPreview: false, gettingIncompletePdf: false })\n            })\n    }\n\n    togglePreview() {\n        if (!this.state.isPreviewVisible) {\n            if (this.state.showCompletedItems) {\n                this.previewPdf();\n            } else {\n                const previewRequest = this.getPreviewRequest();\n                this.props.actions.getHtmlPreview(previewRequest)\n                    .then(() => {\n                        if (this.props.bills.htmlPreview && this.props.bills.htmlPreview.body && !this.props.bills.htmlPreview.body.locked) {\n                            //checking 'locked' prevents this  if-block from returning true because of an old htmlPreview - \n                            //for example, hitting preview on a bill that results in a valid htmlPreview obj, then switching bills to one that does not result in a valid htmlPreview would break here \n                            //because 'this.props.bills.htmlPreview.body' is still true, but getReader is invalid on it since it is locked\n                            this.props.bills.htmlPreview.body.getReader().read().then(({ value }) => {\n                                this.setState({\n                                    isPreviewVisible: !this.state.isPreviewVisible,\n                                    showIncompletePdf: false,\n                                    previewContent: Buffer.from(value.buffer).toString(),\n                                    previewContentError: ''\n                                }, () => {\n                                    if (document.getElementsByClassName(\"billpatron\")[0] && this.state.selectedLegType.Name === \"Engrossed\" && this.state.patronageInfo) {\n                                        document.getElementsByClassName(\"billpatron\")[0].textContent = this.state.patronageInfo\n                                    }\n                                })\n                            })\n                        } else if (this.props.bills.htmlPreviewError) {\n                            this.setState({\n                                isPreviewVisible: !this.state.isPreviewVisible,\n                                showIncompletePdf: false,\n                                previewContent: '',\n                                previewContentError: this.props.bills.htmlPreviewError\n                            })\n                        }\n                    })\n\n                if (this.state.selectedLegType.Name === \"Enrolled\") {\n                    this.props.actions.previewPdfFile(previewRequest)\n                        .then(() => {\n                            //don't do anything; this just puts a non-public/SasURL-driven blob in blob storage that can later be used in print management\n                        });\n                }\n            }\n        } else {\n            this.setState({\n                isPreviewVisible: !this.state.isPreviewVisible,\n                showIncompletePdf: false,\n                previewContent: \"\"\n            })\n        }\n    }\n\n    togglePortal(state, e) {\n        if (e) {\n            e.stopPropagation();\n        }\n        this.setState({\n            showPortal: !state\n        });\n    }\n\n    handleSave(publish, isComplete) {\n        this.setState({ isSaving: true, enrolledPrintQueue: [], checkedBills: [], useCurrentPublishDates: true, customPublishDate: null });\n\n        //if publishing any of the below versions, skip all the processing and just use the batch publish endpoint (US10097)\n        if (publish && [\"Engrossed\", \"Reengrossed\", \"Enrolled\", \"Reenrolled\", \"Chaptered\"].includes(this.state.selectedLegType.Name)) {\n            this.props.actions.batchPublish({ \"PublishDate\": null, \"legislationTextIDs\": [this.state.originalBillText[this.state.selectedBillTextIndex].LegislationTextID], \"legislationIDs\": [this.state.selectedBill.LegislationID] })\n                .then(() => {\n                    this.props.actions.batchGenBillFile(\"?sessionID=\" + this.state.selectedSession.SessionID, [this.state.originalBillText[this.state.selectedBillTextIndex].LegislationTextID])\n                        .then(() => {\n                            this.props.actions.makeToast([{ message: \"Save Successful\", type: \"success\" }])\n\n                            this.setState({\n                                isPreviewVisible: false,\n                                selectedBill: '',\n                                reviewContent: '',\n                                savedReviewContent: '',\n                                editorChanged: false,\n                                selectedBillTextIndex: -1,\n                                reviewFieldsetIsActive: false,\n                                amendmentFieldsetIsActive: false,\n                                billFieldsetIsActive: true,\n                                reviewKey: 1,\n                                isSaving: false,\n                                isDirty: false\n                            });\n                            this.handleSelectorChange('selectedSession', this.state.selectedSession);\n                        }).catch((err) => {\n                            if (err === 'Aborted') {\n                                return;\n                            }\n                            this.props.actions.makeToast([{ message: \"File Generation Failed\", type: \"failure\" }]);\n                            this.setState({ isSaving: false });\n                        })\n                }).catch((err) => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.props.actions.makeToast([{ message: \"Publish Failed\", type: \"failure\" }]);\n                    this.setState({ isSaving: false });\n                })\n        } else {\n            let originalBillText = [...this.state.originalBillText];\n            let selectedBillTextIndex = this.state.selectedBillTextIndex;\n            if (!publish && [\"Gov Recommendation\", \"Veto Explanation\"].includes(this.state.selectedLegType.Name) && selectedBillTextIndex === -1) {\n                //they manually added this bill, so we need to set a new object in the event that there wasn't a bill text object already\n                originalBillText.push({\n                    LegislationVersionID: this.state.selectedLegType.LegislationVersionID,\n                    LegislationID: this.state.selectedBill.LegislationID,\n                    DraftTitle: \"\",\n                    EditTitle: \"\",\n                    IsPublic: false,\n                    isDirty: false\n                });\n                selectedBillTextIndex = originalBillText.length - 1;\n            }\n            // if the selected bill text is published or is not the correct version then a new version needs to be created.\n            if (originalBillText[selectedBillTextIndex].IsPublic || this.state.selectedLegType.LegislationVersionID !== originalBillText[selectedBillTextIndex].LegislationVersionID) {\n                let newBillText = { ...originalBillText[selectedBillTextIndex] };\n                //Delete ID and mod date since this is a new text entry onto the bill\n                delete newBillText.LegislationTextID;\n                delete newBillText.LegislationTextActionID;\n                delete newBillText.ModificationDate;\n                delete newBillText.Description;\n                delete newBillText.TextDisposition;\n                delete newBillText.TextDispositionID;\n                delete newBillText.IsComplete;\n                delete newBillText.HTMLFile;\n                delete newBillText.JSONFile;\n                delete newBillText.PDFFile;\n                delete newBillText.IsReprint;\n                //Delete the document code so that the DB can construct it if it is not preengrossing; if it is preengrossing, we need to set it ourselves since we are the ones with knowledge of the base document\n                if (this.state.selectedLegType.Name !== \"Engrossed\" || this.state.selectedBill.CandidateDate) {\n                    delete newBillText.DocumentCode;\n                } else {\n                    if (newBillText.LegislationVersion === \"Introduced\") {\n                        newBillText.DocumentCode = this.state.selectedBill.LegislationNumber + \"E\";\n                    } else if (newBillText.LegislationVersion === \"Substitute\") {\n                        const subNumber = newBillText.DocumentCode.replaceAll(/\\D{2,3}\\d+/g, \"\"); //e.g. HB8660H1 -> H1\n                        newBillText.DocumentCode = this.state.selectedBill.LegislationNumber + \"E\" + subNumber;\n                    } else {\n                        //we were promised multiple times it would only ever be an introduced or substitute, but I'm going to delete the doc code if it isn't for whatever reason, and hope the DB sets it correctly\n                        delete newBillText.DocumentCode;\n                    }\n                }\n                newBillText.LegislationVersionID = this.state.selectedLegType.LegislationVersionID;\n                delete newBillText.LegislationVersion;\n                //delete the chambercode and set sponsor to Governor if Governor's Recommendation or Governor's Veto\n                if ([\"Gov Recommendation\", \"Veto Explanation\"].includes(this.state.selectedLegType.Name)) {\n                    delete newBillText.ChamberCode;\n                    newBillText.Sponsor = \"Governor\";\n                    newBillText.SponsorTypeID = 1;\n                } else if (this.state.selectedLegType.Name === \"Engrossed\") {\n                    delete newBillText.Sponsor;\n                    delete newBillText.SponsorTypeID;\n                    delete newBillText.CommitteeID;\n                    delete newBillText.Patrons;\n                }\n\n                originalBillText.push(newBillText);\n                selectedBillTextIndex = originalBillText.length - 1;\n            }\n            // Set the session code. This must be done for file generation to properly work\n            originalBillText[selectedBillTextIndex].SessionCode = this.state.selectedBill.SessionCode;\n            // Set the chamber code to the legislation's chamber code if it is an enrolled/reenrolled version, and remove committee info\n            if ([\"Enrolled\", \"Reenrolled\"].includes(this.state.selectedLegType.Name)) {\n                originalBillText[selectedBillTextIndex].ChamberCode = this.state.selectedBill.ChamberCode;\n                delete originalBillText[selectedBillTextIndex].CommitteeID;\n                delete originalBillText[selectedBillTextIndex].CommitteeName;\n                delete originalBillText[selectedBillTextIndex].CommitteeNumber;\n            }\n            //Try to find the draft title in the text and set it\n            let searchForLDTitleContainer = document.createElement('div');\n            searchForLDTitleContainer.innerHTML = this.state.reviewContent;\n            //The first element in the content with this class is the draft title\n            let draftLDTitle = searchForLDTitleContainer.querySelector('.ldtitle');\n            if (draftLDTitle && draftLDTitle.innerHTML !== '') {\n                originalBillText[selectedBillTextIndex].DraftTitle = draftLDTitle.innerHTML;\n                originalBillText[selectedBillTextIndex].EditTitle = draftLDTitle.innerHTML;\n            }\n\n            //add LegislationClassID/LegislationClass to the LegislationText obj\n            originalBillText[selectedBillTextIndex].LegislationClass = this.state.selectedBill.LegislationClass\n            originalBillText[selectedBillTextIndex].LegislationClassID = this.state.selectedBill.LegislationClassID\n\n            if (isComplete) { originalBillText[selectedBillTextIndex].IsComplete = true }\n\n            originalBillText[selectedBillTextIndex].VersionDate = this.state.versionDate;\n            originalBillText[selectedBillTextIndex].DraftText = this.state.reviewContent;\n            originalBillText[selectedBillTextIndex].IsActive = true;\n            originalBillText[selectedBillTextIndex].IsPublic = publish;\n\n            //Remove ldtitle from document if the header is present in the header and the header also contains the ldtitle\n            let doc = document.createElement('div');\n            doc.insertAdjacentHTML(\"afterbegin\", originalBillText[selectedBillTextIndex].DraftText);\n\n            //Remove any tags TinyMCE may have added when pasting from Word\n            doc.childNodes.forEach(node => {\n                if (node.nodeName !== \"#text\") {\n                    node.removeAttribute('data-mce-fragment');\n                    if (node.childNodes.length > 0) {\n                        node.childNodes.forEach(childNode => {\n                            if (childNode.nodeName !== \"#text\") {\n                                childNode.removeAttribute('data-mce-fragment');\n                            }\n                        })\n                    }\n                }\n            });\n\n            let header = doc.getElementsByTagName('div');\n            let newDraftText;\n\n            if (header[0]) {\n                //Store the header somewhere while we find and iterate over paragraphs in the rest of the doc\n                let headerContainer = header[0].innerHTML;\n                let headerParagraphs = header[0].getElementsByTagName('p');\n\n                for (let i = 0; i < headerParagraphs.length; i++) {\n                    if (['ldtitle', 'ld', 'patronLine', 'patctr'].includes(headerParagraphs[i].classList[0])) {\n                        //Temporarily remove header                              \n                        header[0].innerHTML = \"\";\n\n                        //We found the ldtitle or patronage in the header, so iterate over the paragraphs to find any duplicate ldtitles or patronages and eliminate them\n                        let docParagraphs = doc.getElementsByTagName('p');\n\n                        for (let j = 0; j < docParagraphs.length; j++) {\n                            if (['section', 'enactstm'].includes(docParagraphs[j].classList[0])) {\n                                break; //reached the actal body of the text, don't remove any more\n                            } else if (['ldtitle', 'ld', 'patronLine', 'patctr', 'center'].includes(docParagraphs[j].classList[0])) {\n                                doc.removeChild(docParagraphs[j])\n                                j--\n                            }\n                        }\n                    }\n                }\n                //Reattach the header\n                header[0].innerHTML = headerContainer;\n\n                newDraftText = doc.innerHTML\n            }\n\n            if (newDraftText != undefined) {\n                originalBillText[selectedBillTextIndex].DraftText = newDraftText\n            }\n\n            if (this.state.onReconvene) {\n                originalBillText[selectedBillTextIndex].OnReconvene = true;\n            }\n\n            this.props.actions.saveBillText({ TextsList: [originalBillText[selectedBillTextIndex]] })\n                .then(() => {\n                    let billTextParams = \"?legislationID=\" + this.state.selectedBill.LegislationID;\n                    this.props.actions.getBillText(billTextParams, true)\n                        .then(() => {\n                            const newbillTextList = [...this.props.bills.billText];\n                            const priorBillText = originalBillText[selectedBillTextIndex];\n                            // Need to figure out what the index of the bill text we saved was. It isn't always the same one that was sent.\n                            if (priorBillText && priorBillText.LegislationTextID) {\n                                selectedBillTextIndex = newbillTextList.findIndex(t => t.LegislationTextID === priorBillText.LegislationTextID)\n                            } else {\n                                // Hopefully this finds it, but since the API might change the draft text around the second findIndex function is used.\n                                selectedBillTextIndex = newbillTextList.findIndex(t => t.DraftText === priorBillText.DraftText && t.LegislationVersionID === priorBillText.LegislationVersionID);\n                                selectedBillTextIndex = selectedBillTextIndex !== -1 ? selectedBillTextIndex : newbillTextList.findIndex(t => t.LegislationVersionID === priorBillText.LegislationVersionID)\n                            }\n                            if (publish) {\n                                this.props.actions.makeToast([{ message: \"Save Successful\", type: \"success\" }])\n                                //Bill's status has changed. So move it out of the grid and of the review pane\n                                this.setState({\n                                    isSaving: false,\n                                    isPreviewVisible: false,\n                                    selectedBill: '',\n                                    reviewContent: '',\n                                    savedReviewContent: '',\n                                    editorChanged: false,\n                                    selectedBillTextIndex: -1,\n                                    reviewFieldsetIsActive: false,\n                                    amendmentFieldsetIsActive: false,\n                                    billFieldsetIsActive: true,\n                                    reviewKey: 1,\n                                    isDirty: false\n                                });\n                                this.handleSelectorChange('selectedSession', this.state.selectedSession);\n                                //Create the pdf version of the bill if the bill is published\n                                const legFileGenParams = \"?legislationID=\" + newbillTextList[selectedBillTextIndex].LegislationID\n                                    + \"&legislationTextID=\" + newbillTextList[selectedBillTextIndex].LegislationTextID\n                                    + \"&legislationVersionID=\" + newbillTextList[selectedBillTextIndex].LegislationVersionID\n                                    + \"&sessionID=\" + this.state.selectedSession.SessionID;\n                                this.props.actions.genBillFile(legFileGenParams)\n                            } else {\n                                // Refresh the bill info in the billList state (billGridSection)\n                                if (newbillTextList[selectedBillTextIndex]) {\n                                    this.updateBillListByLegislationID(newbillTextList[selectedBillTextIndex].LegislationID);\n                                }\n                                // Get the text again to get the mod dates\n                                this.setState(prevState => ({\n                                    originalBillText: newbillTextList,\n                                    selectedBillTextIndex: selectedBillTextIndex,\n                                    savedReviewContent: prevState.reviewContent,\n                                    editorChanged: true //have to do this to mimic the automatic editing the editor does when it is first initialized (see handleEditorChange method comments for more info)\n                                }), () => {\n                                    originalBillText = [...this.state.originalBillText];\n                                    selectedBillTextIndex = this.state.selectedBillTextIndex;\n\n                                    if (originalBillText[selectedBillTextIndex]) {\n                                        let newDraftText, jsonPromise;\n\n                                        //update headers; e.g. if chaptered, chapter number may have changed\n                                        if (this.state.selectedLegType.Name === \"Engrossed\"\n                                            || this.state.selectedLegType.Name === \"Reengrossed\"\n                                            || this.state.selectedLegType.Name === \"Chaptered\"\n                                            || this.state.selectedLegType.Name === \"Enrolled\"\n                                            || this.state.selectedLegType.Name === \"Reenrolled\") {\n                                            const billText = originalBillText[selectedBillTextIndex];\n                                            const bill = this.state.selectedBill;\n                                            const jsonHeadersRequestString = this.getJsonHeadersRequestString(billText.LegislationTextID, billText.DocumentCode);\n\n                                            jsonPromise = this.props.actions.getJsonHeaders(jsonHeadersRequestString)\n                                                .then(() => {\n                                                    if (this.props.bills.jsonHeaders) {\n                                                        let headers = getHtml(this.props.bills.jsonHeaders);\n\n                                                        //Add the PassageDates to the draft text if this is a resolution and in the enrolled queue\n                                                        if ((this.state.selectedLegType.Name === \"Chaptered\" || this.state.selectedLegType.Name === \"Enrolled\") && (bill.LegislationTypeCode === \"J\" || bill.LegislationTypeCode === \"R\")) {\n                                                            headers = this.applyPassageDates(headers, billText, bill.LegislationTypeCode, bill.HousePassageDate, bill.SenatePassageDate);\n                                                        }\n\n                                                        let reviewContent = headers + billText.DraftText;\n\n                                                        //Remove ldtitle from document if the header is present and the header also contains the ldtitle\n                                                        let doc = document.createElement('div');\n                                                        doc.insertAdjacentHTML(\"afterbegin\", reviewContent);\n                                                        let header = doc.getElementsByTagName('div');\n\n                                                        if (header[0] != undefined) {\n                                                            //Store the header somewhere while we find and iterate over paragraphs in the rest of the doc\n                                                            let headerContainer = header[0].innerHTML;\n                                                            let headerParagraphs = header[0].getElementsByTagName('p');\n\n                                                            for (let i = 0; i < headerParagraphs.length; i++) {\n                                                                if (['ldtitle', 'ld', 'patronLine', 'patctr'].includes(headerParagraphs[i].classList[0])) {\n                                                                    //Temporarily remove header                              \n                                                                    header[0].innerHTML = \"\";\n\n                                                                    //We found the ldtitle or patronage in the header, so iterate over the paragraphs to find any duplicate ldtitles or patronages and eliminate them\n                                                                    let docParagraphs = doc.getElementsByTagName('p');\n\n                                                                    for (let j = 0; j < docParagraphs.length; j++) {\n                                                                        if (billText.LegislationVersion === \"Substitute\" && ['pro', 'center', 'patronLine', 'patctr', 'textbl', 'ldtitle', 'ld'].includes(docParagraphs[j].classList[0])) {\n                                                                            doc.removeChild(docParagraphs[j])\n                                                                            j--;\n                                                                        } else if (billText.LegislationVersion === \"Substitute\") {\n                                                                            continue;\n                                                                        }\n\n                                                                        if (docParagraphs[j] && ['section', 'enactstm'].includes(docParagraphs[j].classList[0])) {\n                                                                            break; //reached the actal body of the text, don't remove any more\n                                                                        } else if (docParagraphs[j] && ['ldtitle', 'ld', 'patronLine', 'patctr', 'center'].includes(docParagraphs[j].classList[0])) {\n                                                                            doc.removeChild(docParagraphs[j])\n                                                                            j--\n                                                                        }\n                                                                    }\n                                                                } else if (this.state.selectedLegType.Name === \"Engrossed\" && doc.getElementsByClassName(\"billpatron\")[0]) {\n                                                                    //Not needed on save, but part of copy-paste; If working on an engrossed version, store the headers' patronage info which is needed for the preview (the object returned in the GetLegislationTextById call is not always correct)\n                                                                    //patronageInfo = doc.getElementsByClassName(\"billpatron\")[0].textContent\n                                                                }\n                                                            }\n\n                                                            if (this.state.selectedLegType.Name === \"Reenrolled\"\n                                                                && this.props.session.sessionList.find(x => x.SessionID === this.state.selectedSession.SessionID).SessionEvents.find(x => x.DisplayName === \"Reconvene\")\n                                                                && moment(this.props.session.sessionList.find(x => x.SessionID === this.state.selectedSession.SessionID).SessionEvents.find(x => x.DisplayName === \"Reconvene\").ActualDate).isSameOrBefore(moment(billText.VersionDate) ?? moment(), \"day\")) {\n                                                                //Set the header to reconvened session and reattach the header \n                                                                let headerDoc = document.createElement('div');\n                                                                headerDoc.insertAdjacentHTML(\"afterbegin\", headerContainer);\n                                                                let paragraphs = headerDoc.getElementsByTagName('p');\n                                                                paragraphs[0].innerHTML = this.state.selectedSession.SessionYear + \" RECONVENED SESSION\";\n\n                                                                header[0].appendChild(headerDoc);\n\n                                                                this.setState({\n                                                                    onReconvene: true\n                                                                })\n                                                            } else {\n                                                                //Reattach the header\n                                                                header[0].innerHTML = headerContainer;\n                                                                this.setState({\n                                                                    onReconvene: false\n                                                                })\n                                                            }\n\n                                                            newDraftText = doc.innerHTML\n                                                        }\n\n                                                        if (newDraftText != undefined) {\n                                                            this.setState({\n                                                                reviewContent: newDraftText\n                                                            })\n                                                        }\n                                                    }\n                                                }).catch(e => {\n                                                    console.log(e)\n                                                    this.setState({ reviewContent: `<p class=\"message-error\">${typeof e === 'object' && !Array.isArray ? JSON.parse(e).Name || \"Unknown Error\" : e}</p>` });\n                                                })\n                                        } else {\n                                            //Remove ldtitle from document if the header is present and the header also contains the ldtitle\n                                            let doc = document.createElement('div');\n                                            doc.insertAdjacentHTML(\"afterbegin\", originalBillText[selectedBillTextIndex].DraftText);\n                                            let header = doc.getElementsByTagName('div');\n\n                                            if (header[0]) {\n                                                //Store the header somewhere while we find and iterate over paragraphs in the rest of the doc\n                                                let headerContainer = header[0].innerHTML;\n                                                let headerParagraphs = header[0].getElementsByTagName('p');\n\n                                                for (let i = 0; i < headerParagraphs.length; i++) {\n                                                    if (['ldtitle', 'ld', 'patronLine', 'patctr'].includes(headerParagraphs[i].classList[0])) {\n                                                        //Temporarily remove header                              \n                                                        header[0].innerHTML = \"\";\n\n                                                        //We found the ldtitle or patronage in the header, so iterate over the paragraphs to find any duplicate ldtitles or patronages and eliminate them\n                                                        let docParagraphs = doc.getElementsByTagName('p');\n\n                                                        for (let j = 0; j < docParagraphs.length; j++) {\n                                                            if (['section', 'enactstm'].includes(docParagraphs[j].classList[0])) {\n                                                                break; //reached the actal body of the text, don't remove any more\n                                                            } else if (['ldtitle', 'ld', 'patronLine', 'patctr', 'center'].includes(docParagraphs[j].classList[0])) {\n                                                                doc.removeChild(docParagraphs[j])\n                                                                j--\n                                                            }\n                                                        }\n                                                    }\n                                                }\n                                                //Reattach the header\n                                                header[0].innerHTML = headerContainer;\n\n                                                newDraftText = doc.innerHTML;\n                                            }\n\n                                            if (newDraftText != undefined) {\n                                                originalBillText[selectedBillTextIndex].DraftText = newDraftText;\n\n                                                this.setState({\n                                                    originalBillText: originalBillText,\n                                                })\n                                            }\n                                        }\n\n                                        Promise.all([jsonPromise]).finally(() => {\n                                            this.setState(prevState => ({ isDirty: false, isSaving: false, savedReviewContent: prevState.reviewContent, editorChanged: false }));\n                                            this.props.actions.makeToast([{ message: \"Save Successful\", type: \"success\" }])\n                                        });\n                                    }\n\n                                });\n                            }\n                        })\n\n                })\n                .catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n                    this.setState({\n                        isSaving: false\n                    });\n                });\n        }\n    }\n\n    handleSaveCompletedItem() {\n        this.setState({ isSaving: true, enrolledPrintQueue: [], checkedBills: [], useCurrentPublishDates: true, customPublishDate: null });\n\n        let billText = [...this.state.originalBillText];\n        let selectedBillTextIndex = this.state.selectedBillTextIndex;\n        billText[selectedBillTextIndex].DraftText = this.state.reviewContent;\n        //Try to find the draft title in the text and set it\n        let searchForLDTitleContainer = document.createElement('div');\n        searchForLDTitleContainer.innerHTML = this.state.reviewContent;\n\n        //Remove any tags TinyMCE may have added when pasting from Word (Borrowing the doc we're using for ldtitle search)\n        searchForLDTitleContainer.childNodes.forEach(node => {\n            if (node.nodeName !== \"#text\") {\n                node.removeAttribute('data-mce-fragment');\n                if (node.childNodes.length > 0) {\n                    node.childNodes.forEach(childNode => {\n                        if (childNode.nodeName !== \"#text\") {\n                            childNode.removeAttribute('data-mce-fragment');\n                        }\n                    })\n                }\n            }\n        });\n\n        //The first element in the content with this class is the draft title\n        let draftLDTitle = searchForLDTitleContainer.querySelector('.ldtitle');\n        if (draftLDTitle && draftLDTitle.innerHTML !== '') {\n            billText[selectedBillTextIndex].DraftTitle = draftLDTitle.innerHTML;\n            billText[selectedBillTextIndex].EditTitle = draftLDTitle.innerHTML;\n        }\n\n        //add LegislationClassID/LegislationClass to the LegislationText obj\n        billText.forEach(text => {\n            text.LegislationClass = this.state.selectedBill.LegislationClass\n            text.LegislationClassID = this.state.selectedBill.LegislationClassID\n        })\n\n        this.props.actions.saveBillText({ TextsList: billText })\n            .then(() => {\n                this.setState({ isSaving: false });\n                this.props.actions.makeToast([{ message: \"Save Successful\", type: \"success\" }]);\n                let billTextParams = \"?legislationID=\" + this.state.selectedBill.LegislationID;\n                this.props.actions.getBillText(billTextParams, true)\n                    .then(() => {\n                        const newbillTextList = [...this.props.bills.billText];\n                        const priorBillText = billText[selectedBillTextIndex];\n                        // Need to figure out what the index of the bill text we saved was. It isn't always the same one that was sent.\n                        if (priorBillText && priorBillText.LegislationTextID) {\n                            selectedBillTextIndex = newbillTextList.findIndex(t => t.LegislationTextID === priorBillText.LegislationTextID)\n                        } else {\n                            // Hopefully this finds it, but since the API might change the draft text around the second findIndex function is used.\n                            selectedBillTextIndex = newbillTextList.findIndex(t => t.DraftText === priorBillText.DraftText && t.LegislationVersionID === priorBillText.LegislationVersionID);\n                            selectedBillTextIndex = selectedBillTextIndex !== -1 ? selectedBillTextIndex : newbillTextList.findIndex(t => t.LegislationVersionID === priorBillText.LegislationVersionID)\n                        }\n\n                        this.handleSelectorChange('selectedSession', this.state.selectedSession);\n                        const legFileGenParams = \"?legislationID=\" + newbillTextList[selectedBillTextIndex].LegislationID\n                            + \"&legislationTextID=\" + newbillTextList[selectedBillTextIndex].LegislationTextID\n                            + \"&legislationVersionID=\" + newbillTextList[selectedBillTextIndex].LegislationVersionID\n                            + \"&sessionID=\" + this.state.selectedSession.SessionID;\n                        this.props.actions.genBillFile(legFileGenParams)\n\n                        this.setState({\n                            isPreviewVisible: false,\n                            selectedBill: '',\n                            reviewFieldsetIsActive: false,\n                            amendmentFieldsetIsActive: false,\n                            billFieldsetIsActive: true,\n                            originalBillText: [],\n                            billText: '',\n                            reviewContent: '',\n                            savedReviewContent: '',\n                            editorChanged: false,\n                            selectedBillTextIndex: -1,\n                            reviewKey: 1,\n                            isDirty: false\n                        });\n                    })\n            })\n            .catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n                this.setState({\n                    isSaving: false\n                });\n            });\n    }\n\n    handleEditorChange(content) {\n        let replacement = false;\n        let doc = document.createElement('div');\n        doc.insertAdjacentHTML(\"afterbegin\", content);\n\n        //Remove the header information from the dom so none of the <p> tags within get styled\n        let header = doc.getElementsByTagName('div');\n        this.setState({\n            header: header[0] ? header[0].innerHTML : \"\"\n        }, () => {\n            if (header[0] !== undefined) {\n                header[0].innerHTML = \"\";\n            }\n\n            let paragraphs = doc.getElementsByTagName('p');\n\n            //Loop the paragraphs and add the section class to each paragraph with a class list length of 0\n            for (let i = 0; i < paragraphs.length; i++) {\n                if (paragraphs[i].classList.length === 0) {\n                    paragraphs[i].classList.add(\"section\");\n                    replacement = true;\n                }\n            }\n\n            if (header[0] !== undefined) {\n                header[0].innerHTML = this.state.header;\n            }\n\n            //If we've added a section class to a classless <p> tag then replace the content with the dom HTML\n            //Otherwise update normally\n            //This check is done because updating reviewContent in this way was causing tinyMCE to move the cursor position back to the first line\n            if (replacement) {\n                this.setState(prevState => ({\n                    reviewContent: doc.innerHTML,\n                    savedReviewContent: !prevState.editorChanged ? doc.innerHTML : prevState.savedReviewContent, //see notes below\n                    editorChanged: true,\n                    changeCount: this.state.changeCount + 1,\n                    isDirty: this.state.changeCount > 0 && this.state.reviewContent !== doc.innerHTML ? true : false\n                }));\n            } else {\n                this.setState(prevState => ({\n                    reviewContent: content,\n                    savedReviewContent: !prevState.editorChanged ? content : prevState.savedReviewContent, //see notes below\n                    editorChanged: true,\n                    changeCount: this.state.changeCount + 1,\n                    isDirty: this.state.changeCount > 0 && this.state.reviewContent !== doc.innerHTML ? true : false\n                }))\n            }\n        })\n\n        //I know changeCount is hack-y, using editorChanged wasn't working as expected -JGB\n\n        //handleEditorChange gets called when the editor is initalized, as some of the content is modified slightly; \n        //we therefore need to update the savedReviewContent state on this FIRST call only, as this will be the comparison used to know if the editor has been changed by the user\n    }\n\n    setLegDateOptions(billList) {\n        let legDates;\n        if (this.state.showCompletedItems) {\n            legDates = billList.map(x => { if (moment(x.VersionDate).isValid() && (!this.state.reprintsFiltered || x.IsReprint)) return { label: moment(x.VersionDate).format(\"MM/DD/YYYY\"), value: x.VersionDate } })\n        } else {\n            legDates = billList.map(x => { if (moment(x.CandidateDate).isValid()) return { label: moment(x.CandidateDate).format(\"MM/DD/YYYY\"), value: x.CandidateDate } })\n        }\n        let legDateOptions = legDates.filter((e, i) => legDates.findIndex(a => a && e && (a[\"label\"] === e[\"label\"])) === i);\n        legDateOptions.sort((a, b) => { return moment(a.value) - moment(b.value) })\n\n        this.setState({\n            billList: billList,\n            legDateOptions: legDateOptions\n        });\n    }\n\n    checkHandleSelectorChange(key, value, confirmed) {\n        if (this.state.isDirty && !confirmed) {\n            this.setState({\n                storedKey: key,\n                storedValue: value,\n                showCategoryConfirmation: true\n            })\n        } else if (confirmed) {\n            this.handleSelectorChange(this.state.storedKey, this.state.storedValue)\n        } else {\n            this.handleSelectorChange(key, value)\n        }\n\n        this.setState({\n            checkedBills: [],\n            checkAll: false\n        })\n    }\n\n    handleSelectorChange(key, value) {\n        //An option in the Selector section has been changed.\n        if (this.state[key] !== undefined) {\n            this.setState({\n                [key]: value,\n                showCategoryConfirmation: false\n            }, () => {\n                if (['showCompletedItems', 'selectedSession', 'selectedLegType'].includes(key)) {\n                    this.setState({\n                        enrolledPrintQueue: [],\n                        checkedBills: [],\n                        useCurrentPublishDates: true,\n                        customPublishDate: null,\n                    });\n                    //If switching between completed items and incomplete items, change the version type dropdown list\n                    if (key === 'showCompletedItems') {\n                        let legOptions = [...this.state.legOptions];\n                        legOptions.forEach(version => {\n                            version.label = this.state.showCompletedItems ? version.Name : version.AuthoringLabel;\n                            this.setState({ legOptions })\n                        })\n                    }\n                }\n                //If both a session is selected and a legislation type then load a list of bills that adhere to the two selected criteria\n                //Close the review and amendment field because the selected bill is no longer valid for the selected criteria\n                if (this.state.selectedLegType && this.state.selectedSession) {\n                    this.setState({\n                        isLoaded: false,\n                        selectedBill: '',\n                        originalBillText: [],\n                        reviewContent: '',\n                        amendmentFieldsetIsActive: false,\n                        reviewFieldsetIsActive: false,\n                        reprintsFiltered: key === \"selectedLegNum\" || key === \"selectedLegDate\" ? this.state.reprintsFiltered : false,\n                        reviewKey: 1\n                    });\n\n                    const params = \"?sessionID=\" + this.state.selectedSession.SessionID + \"&legislationVersionID=\" + this.state.selectedLegType.LegislationVersionID + \"&IsComplete=\" + (this.state.showCompletedItems ? 'true' : 'false');\n                    this.props.actions.getBillManagementList(params)\n                        .then(() => {\n                            if ([\"Gov Recommendation\", \"Veto Explanation\"].includes(this.state.selectedLegType.Name)) {\n                                //Get bills in the session for the bill dropdown\n                                this.getSessionBills();\n                            }\n\n                            let billList = [...this.props.bills.billManagementList];\n\n                            if (this.state.showCompletedItems) { billList = billList.filter(text => !text.PendingChange) }\n\n                            if (key === \"selectedLegNum\" || key === \"selectedLegDate\") {\n                                if (key === \"selectedLegNum\" && value.value !== \"clear\") {\n                                    billList = billList.filter(x => x.LegislationNumber.toLowerCase().includes(value.value.toLowerCase()))\n                                }\n\n                                if (key === \"selectedLegDate\" && value.value != \"clear\") {\n                                    billList = billList.filter(x => moment(this.state.showCompletedItems ? x.VersionDate : x.CandidateDate).format(\"MM/DD/YYYY\") === moment(value.value).format(\"MM/DD/YYYY\"));\n                                }\n\n                                //Apply previously set filters if needed\n                                if (key === \"selectedLegDate\" && this.state.selectedLegNum !== '' && this.state.selectedLegNum.value !== 'clear') {\n                                    billList = billList.filter(x => x.LegislationNumber.toLowerCase().includes(this.state.selectedLegNum.value.toLowerCase()))\n                                }\n\n                                if (key === \"selectedLegNum\" && this.state.selectedLegDate !== '' && this.state.selectedLegDate.value !== \"clear\") {\n                                    billList = billList.filter(x => moment(this.state.showCompletedItems ? x.VersionDate : x.CandidateDate).format(\"MM/DD/YYYY\") === moment(this.state.selectedLegDate.value).format(\"MM/DD/YYYY\"));\n                                }\n                            } else {\n                                this.setState({\n                                    selectedLegNum: '',\n                                    selectedLegDate: ''\n                                })\n                            }\n\n                            this.setLegDateOptions(billList);\n\n                            this.setState({\n                                isLoaded: true\n                            });\n                        }).catch(err => {\n                            if (err === 'Aborted') {\n                                return;\n                            }\n                            this.setState({\n                                billList: [], // makes it apparent that something may have gone wrong but also prevents the list retaining old values\n                                isLoaded: true\n                            });\n                        });\n\n                }\n            });\n        }\n    }\n\n    updateBillListByLegislationID(legislationID) {\n        const params = \"?sessionID=\" + this.state.selectedSession.SessionID + \"&legislationID=\" + legislationID + \"&legislationVersionID=\" + this.state.selectedLegType.LegislationVersionID + \"&IsComplete=\" + (this.state.showCompletedItems ? 'true' : 'false');\n        this.props.actions.getBillManagementList(params)\n            .then(() => {\n                let billListGetResponse = [...this.props.bills.billManagementList];\n                let billListInState = [...this.state.billList];\n\n                const associatedBillInStateIndex = billListInState.findIndex(b => b.LegislationID === legislationID);\n                if (associatedBillInStateIndex > -1) {\n                    const associatedBillInGetResponse = billListGetResponse.find(b => b.LegislationID === legislationID);\n                    if (associatedBillInGetResponse) {\n                        billListInState[associatedBillInStateIndex] = associatedBillInGetResponse;\n                        this.setState({ billList: billListInState })\n                    }\n                }\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    billList: [] // makes it apparent that something may have gone wrong but also prevents the list retaining old values\n                });\n            });\n    }\n\n    handleVersionDateChange(value) {\n        //Need to +1 the key to refresh the editor content\n        let key = this.state.reviewKey + 1;\n\n        this.setState({\n            versionDate: value,\n            reviewContent: this.updateDraftTextVersionDate(this.state.reviewContent, value),\n            reviewKey: key\n        }, () => {\n            //If the bill is reenrolled check the version publish date against the reconvene date to decide whether to set the header to SESSION or RECONVENED SESSION\n            if (this.state.selectedLegType.Name === \"Reenrolled\") {\n                let doc = new DOMParser().parseFromString(this.state.reviewContent, \"text/html\");\n                let paragraphs = doc.getElementsByTagName('p');\n\n                if (this.props.session.sessionList.find(x => x.SessionID === this.state.selectedSession.SessionID).SessionEvents.find(x => x.DisplayName === \"Reconvene\")\n                    && moment(this.props.session.sessionList.find(x => x.SessionID === this.state.selectedSession.SessionID).SessionEvents.find(x => x.DisplayName === \"Reconvene\").ActualDate).isSameOrBefore(this.state.versionDate, \"day\")) {\n                    paragraphs[0].innerHTML = this.state.selectedSession.SessionYear + \" RECONVENED SESSION\";\n\n                    this.setState({\n                        reviewContent: doc.body.innerHTML,\n                        onReconvene: true\n                    })\n                } else {\n                    paragraphs[0].innerHTML = this.state.selectedSession.SessionYear + \" SESSION\";\n\n                    this.setState({\n                        reviewContent: doc.body.innerHTML,\n                        onReconvene: false\n                    })\n                }\n            }\n        })\n    }\n\n    updateDraftTextVersionDate(draftText, versionDate) {\n        let doc = new DOMParser().parseFromString(draftText, \"text/html\");\n        let elements = doc.getElementsByClassName('versiondate');\n\n        //elements is an array, may as well iterate over it, especially since some bad data has had multiple tags with class versiondate \n        for (var i = 0; i < elements.length; i++) {\n            elements[i].innerText = moment(versionDate).format(\"LL\");\n        }\n\n        return doc.body.innerHTML;\n    }\n\n    selectBill(bill, billIndex, confirmed, LDNumber, callback) {\n        if (this.state.isDirty && !confirmed) {\n            this.setState({\n                showBillConfirmation: () => this.selectBill(bill, billIndex, true, LDNumber, callback),\n                storedBill: bill,\n                storedBillIndex: billIndex\n            })\n        } else {\n            this.setState({\n                showBillConfirmation: false,\n                replaced: false,\n                wasEmpty: false,\n                isDirty: false,\n                changeCount: 0\n            }, () => {\n                //A bill has been selected. Load the amendments and legislation text then scroll down to it\n                let billTextParams = bill ? \"?legislationID=\" + (bill.LegislationID) : ('?LDNumber=' + LDNumber + '&sessionID=' + this.state.selectedSession.SessionID);\n                this.setState({\n                    billDataIsLoading: billIndex\n                }, () => {\n                    this.props.actions.getBillText(billTextParams, true)\n                        .then(() => {\n                            if (!bill) {\n                                bill = (this.state.sessionBillsList.find(sbl => sbl.SessionID === this.state.selectedSession.SessionID) ? this.state.sessionBillsList.find(sbl => sbl.SessionID === this.state.selectedSession.SessionID).bills : []).find(b => b.LegislationID === this.props.bills.billText.find(bt => bt.LegislationID).LegislationID)\n                            }\n                            if (!bill) {\n                                this.setState({\n                                    billDataIsLoading: null\n                                })\n                                this.props.actions.makeToast([{ message: \"Bill data not found for LD Number provided\", type: \"failure\" }]);\n                                return;\n                            }\n                            //The first step to deciding what text should show by default is to filter out all the amendments and conference reports\n                            let billTextForReviewPane = this.props.bills.billText.filter(text => ![\"Amendment\", \"Conference Report\"].includes(text.LegislationVersion) && (text.LegislationVersion !== \"Gov Recommendation\" || this.state.selectedLegType.Name === \"Gov Recommendation\"))\n                            let billText;\n                            if (!this.state.showCompletedItems && [\"Gov Recommendation\", \"Veto Explanation\"].includes(this.state.selectedLegType.Name) && isNaN(billIndex) && this.props.bills.billText.find(bt => bt.LegislationVersion === this.state.selectedLegType.Name)) {\n                                //they are adding a bill to the queue via the session bill selector, but there is already a gov rec on their desired bill\n                                //notify them as such, and if there is a public version, propose a link to red edit for them to edit/re-publish this version;\n                                //otherwise, select the non-public version for editing\n                                //if we allowed them to edit the existing public version (if present), it could result in the version being saved but not having file gen run (if they save but don't publish)\n                                if (this.props.bills.billText.find(bt => bt.LegislationVersion === this.state.selectedLegType.Name && bt.IsPublic)) {\n                                    this.setState({\n                                        billDataIsLoading: null\n                                    })\n                                    if (callback) callback();\n                                    let a = document.createElement('a');\n                                    a.target = '_blank';\n                                    a.href = `/bill-details/${this.state.selectedSession.SessionCode}/${bill.LegislationNumber}/text/${this.props.bills.billText.find(bt => bt.LegislationVersion === this.state.selectedLegType.Name)?.DocumentCode}`;\n                                    document.body.appendChild(a);\n                                    if (confirm(`This bill already has a PUBLISHED ${this.state.selectedLegType.Name === \"Gov Recommendation\" ? \"Governor's Recommendation\" : \"Veto Explanation\"}. Press OK to be taken to the red-edit page for this existing version.`)) {\n                                        a.click();\n                                    }\n                                    document.body.removeChild(a);\n                                    return;\n                                } else {\n                                    billText = this.props.bills.billText.find(bt => bt.LegislationVersion === this.state.selectedLegType.Name);\n                                }\n                            }\n                            //If there is one that matches the legislation text id, use that one for the review pane\n                            billText = billText ?? billTextForReviewPane.find(bt => bt.LegislationTextID === bill.LegislationTextID);\n                            //If the search is by LD Number and there is only one returned, use that one\n                            if (LDNumber && billTextForReviewPane.length === 1) {\n                                billText = billTextForReviewPane[0];\n                            }\n                            //Otherwise, if there is an unpublished active version, then set that one as the main text since unpublished changes are from a previous save                            \n                            if (!billText) {\n                                billText = !isNaN(billIndex) ? billTextForReviewPane.find(text => !text.IsPublic && text.IsActive) : { DraftText: '' }; //if selecting a session bill, just use new object with only draft text\n                            }\n                            //If one isn't found then select the text that is active\n                            if (!billText) {\n                                billText = billTextForReviewPane.find(text => text.IsActive);\n                            }\n                            //If there still isn't one then select the first one in the list, or nothing if the list is empty\n                            if (!billText) {\n                                billText = billTextForReviewPane.length > 0 ? billTextForReviewPane[0] : { DraftText: '' }\n                            }\n                            //If the text is already of the version specified in the selector, then it has been previously saved (e.g. not just the base doc anymore)\n                            //Therefore, for the version date, use the existing version date if it has already been saved, otherwise default to today's date\n                            const billVersionDate = billText && this.state.selectedLegType.LegislationVersionID === billText.LegislationVersionID ? moment(billText.VersionDate) : moment();\n                            //Now get the index of the selected bill text\n                            const selectedBillTextIndex = this.props.bills.billText.findIndex(text => text.LegislationTextID === billText.LegislationTextID);\n                            const amendments = this.props.bills.billText.filter(text => [\"Amendment\", \"Conference Report\", \"Gov Recommendation\"].includes(text.LegislationVersion));\n\n                            // Get the json headers if the selected version queue is \"Engrossed\" and we are not in completed items\n                            let jsonPromise, headers, reviewContent, patronageInfo;\n                            let headerError = false;\n\n                            if (this.state.selectedLegType.Name === \"Engrossed\"\n                                || this.state.selectedLegType.Name === \"Reengrossed\"\n                                || this.state.selectedLegType.Name === \"Chaptered\"\n                                || this.state.selectedLegType.Name === \"Enrolled\"\n                                || this.state.selectedLegType.Name === \"Reenrolled\") {\n\n                                const jsonHeadersRequestString = this.getJsonHeadersRequestString(billText.LegislationTextID, bill.DocumentCode);\n\n                                jsonPromise = this.props.actions.getJsonHeaders(jsonHeadersRequestString)\n                                    .then(() => {\n                                        if (this.props.bills.jsonHeaders) {\n                                            headers = getHtml(this.props.bills.jsonHeaders);\n\n                                            //Add the PassageDates to the draft text if this is a resolution and in the enrolled queue\n                                            if ((this.state.selectedLegType.Name === \"Chaptered\" || this.state.selectedLegType.Name === \"Enrolled\") && (bill.LegislationTypeCode === \"J\" || bill.LegislationTypeCode === \"R\")) {\n                                                headers = this.applyPassageDates(headers, billText, bill.LegislationTypeCode, bill.HousePassageDate, bill.SenatePassageDate);\n                                            }\n\n                                            reviewContent = headers + billText.DraftText;\n\n                                            //Remove ldtitle from document if the header is present and the header also contains the ldtitle\n                                            let doc = document.createElement('div');\n                                            doc.insertAdjacentHTML(\"afterbegin\", reviewContent);\n                                            let header = doc.getElementsByTagName('div');\n                                            let newDraftText;\n\n                                            if (header[0] != undefined) {\n                                                //Store the header somewhere while we find and iterate over paragraphs in the rest of the doc\n                                                let headerContainer = header[0].innerHTML;\n                                                let headerParagraphs = header[0].getElementsByTagName('p');\n\n                                                for (let i = 0; i < headerParagraphs.length; i++) {\n                                                    if (['ldtitle', 'ld', 'patronLine', 'patctr'].includes(headerParagraphs[i].classList[0])) {\n                                                        //Temporarily remove header                              \n                                                        header[0].innerHTML = \"\";\n\n                                                        //We found the ldtitle or patronage in the header, so iterate over the paragraphs to find any duplicate ldtitles or patronages and eliminate them\n                                                        let docParagraphs = doc.getElementsByTagName('p');\n\n                                                        for (let j = 0; j < docParagraphs.length; j++) {\n                                                            if (billText.LegislationVersion === \"Substitute\" && ['pro', 'center', 'patronLine', 'patctr', 'ldtitle', 'ld'].includes(docParagraphs[j].classList[0])) {\n                                                                doc.removeChild(docParagraphs[j])\n                                                                j--;\n                                                            } else if (billText.LegislationVersion === \"Substitute\") {\n                                                                continue;\n                                                            }\n\n                                                            if (docParagraphs[j] && ['section', 'enactstm'].includes(docParagraphs[j].classList[0])) {\n                                                                break; //reached the actal body of the text, don't remove any more\n                                                            } else if (docParagraphs[j] && ['ldtitle', 'ld', 'patronLine', 'patctr', 'center'].includes(docParagraphs[j].classList[0])) {\n                                                                doc.removeChild(docParagraphs[j])\n                                                                j--\n                                                            }\n                                                        }\n                                                    } else if (this.state.selectedLegType.Name === \"Engrossed\" && doc.getElementsByClassName(\"billpatron\")[0]) {\n                                                        //If working on an engrossed version, store the headers' patronage info which is needed for the preview (the object returned in the GetLegislationTextById call is not always correct)\n                                                        patronageInfo = doc.getElementsByClassName(\"billpatron\")[0].textContent\n                                                    }\n                                                }\n\n                                                if (this.state.selectedLegType.Name === \"Reenrolled\"\n                                                    && this.props.session.sessionList.find(x => x.SessionID === this.state.selectedSession.SessionID).SessionEvents.find(x => x.DisplayName === \"Reconvene\")\n                                                    && moment(this.props.session.sessionList.find(x => x.SessionID === this.state.selectedSession.SessionID).SessionEvents.find(x => x.DisplayName === \"Reconvene\").ActualDate).isSameOrBefore(billVersionDate, \"day\")) {\n                                                    //Set the header to reconvened session and reattach the header \n                                                    let headerDoc = document.createElement('div');\n                                                    headerDoc.insertAdjacentHTML(\"afterbegin\", headerContainer);\n                                                    let paragraphs = headerDoc.getElementsByTagName('p');\n                                                    paragraphs[0].innerHTML = this.state.selectedSession.SessionYear + \" RECONVENED SESSION\";\n\n                                                    header[0].appendChild(headerDoc);\n\n                                                    this.setState({\n                                                        onReconvene: true\n                                                    })\n                                                } else {\n                                                    //Reattach the header\n                                                    header[0].innerHTML = headerContainer;\n                                                    this.setState({\n                                                        onReconvene: false\n                                                    })\n                                                }\n\n                                                newDraftText = doc.innerHTML\n                                            }\n\n                                            if (newDraftText != undefined) {\n                                                reviewContent = newDraftText\n                                            }\n                                        }\n                                    }).catch(e => {\n                                        console.log(e)\n                                        reviewContent = `<p class=\"message-error\">${typeof e === 'object' && !Array.isArray ? JSON.parse(e).Name || \"Unknown Error\" : e}</p>`;\n                                        headerError = true;\n                                    })\n                            } else {\n                                reviewContent = billText.DraftText\n                            }\n\n                            Promise.all([jsonPromise])\n                                .finally(() => {\n                                    let storedBill;\n\n                                    if (bill) {\n                                        bill.SessionCode = this.state.selectedSession.SessionCode;\n                                    } else {\n                                        storedBill = { ...this.state.storedBill }\n                                        storedBill.SessionCode = this.state.selectedSession.SessionCode;\n                                    }\n\n                                    //if this is a gov rec/veto version that has NOT already been saved, display the header info\n                                    if (!this.state.showCompletedItems && [\"Gov Recommendation\", \"Veto Explanation\"].includes(this.state.selectedLegType.Name) && !(/^\\<p class=['\"].*['\"]>\\([HS][BJR]\\d{1,5}\\)\\<\\/p>\\s{0,1}\\<p class=['\"].*['\"]>GOVERNOR'S (RECOMMENDATION|VETO)\\<\\/p>/).test(reviewContent)) {\n                                        //if it has bill number, but not the GOVERNOR'S RECOMMENDATION or GOVERNOR'S VETO line, remove the existing bill number line before we add both (to prevent duplicate bill # lines)\n                                        //if it has no bill number, but does have the GOVERNOR'S RECOMMENDATION or GOVERNOR'S VETO line, remove the existing GOV line before we add both (to prevent duplicate GOV lines)\n                                        reviewContent = reviewContent.replace(/^(\\<p class=['\"].*['\"]>\\([HS][BJR]\\d{1,5}\\)\\<\\/p>\\s{0,1}|\\<p class=['\"].*['\"]>GOVERNOR'S (RECOMMENDATION|VETO)\\<\\/p>\\s{0,1})/, \"\");\n                                        reviewContent = \"<p class='textbl'>\" + \"(\" + (bill.LegislationNumber) + \")</p><p class='textbl'>\" + (this.state.selectedLegType.Name === \"Gov Recommendation\" ? \"GOVERNOR'S RECOMMENDATION\" : \"GOVERNOR'S VETO\") + \"</p>\" + this.updateDraftTextVersionDate(reviewContent, billVersionDate);\n                                    } else {\n                                        //default version date within the draft text if present\n                                        reviewContent = this.updateDraftTextVersionDate(reviewContent, billVersionDate)\n                                    }\n\n                                    //remove selected bill from checkBills/enrolledPrintQueue arrays so they don't publish it from batch publish, or batch print, while they have maybe made unsaved changes in the tinymce editor\n                                    let checkedBills = [...this.state.checkedBills];\n                                    const checkedBillsIndex = checkedBills.map(b => b.LegislationID).indexOf((bill.LegislationID));\n                                    if (checkedBillsIndex !== -1) {\n                                        checkedBills.splice(checkedBillsIndex, 1);\n                                    }\n                                    let enrolledPrintQueue = [...this.state.enrolledPrintQueue];\n                                    const enrolledPrintQueueIndex = enrolledPrintQueue.map(b => b.LegislationID).indexOf((bill.LegislationID));\n                                    if (enrolledPrintQueueIndex !== -1) {\n                                        enrolledPrintQueue.splice(enrolledPrintQueueIndex, 1);\n                                    }\n\n                                    this.setState({\n                                        headers: headers,\n                                        patronageInfo: patronageInfo,\n                                        billDataIsLoading: null,\n                                        selectedBill: bill ? bill : storedBill,\n                                        originalBillText: this.props.bills.billText,\n                                        amendments: amendments,\n                                        amendmentFieldsetIsActive: true,\n                                        reviewFieldsetIsActive: true,\n                                        billFieldsetIsActive: false,\n                                        reviewContent: reviewContent,\n                                        savedReviewContent: reviewContent,\n                                        editorChanged: false,\n                                        checkedBills,\n                                        enrolledPrintQueue,\n                                        headerError: headerError,\n                                        selectedBillTextIndex: selectedBillTextIndex,\n                                        versionDate: billVersionDate,\n                                        reviewKey: 1\n                                    }, () => {\n                                        //Get the size and position of the amendment or review form and scroll down to it\n                                        const rect = this.state.showCompletedItems ? this.reviewRef.current.getBoundingClientRect() : this.amendmentRef.current.getBoundingClientRect();\n                                        const windowY = window.scrollY;\n                                        window.scrollTo({\n                                            top: rect.top + windowY,\n                                            behavior: 'smooth'\n                                        });\n                                        if (callback) callback();\n                                    });\n                                })\n                        }).catch(err => {\n                            if (err === 'Aborted') {\n                                return;\n                            }\n                            console.log(err);\n                            this.setState({\n                                billDataIsLoading: null\n                            });\n                            this.props.actions.makeToast([{ message: \"Failed to get Bill Text\", type: \"failure\" }]);\n                            if (callback) callback();\n                        });\n                });\n            })\n        }\n    }\n\n    closeConfirmation() {\n        this.setState({\n            showTextConfirmation: false,\n            showBillConfirmation: false,\n            showCategoryConfirmation: false\n        })\n    }\n\n    selectBillIndex(index, confirmed) {\n        if (this.state.isDirty && !confirmed) {\n            this.setState({\n                showTextConfirmation: true,\n                storedTextIndex: index\n            })\n        } else {\n            this.setState({\n                showTextConfirmation: false,\n                isDirty: false,\n                wasEmpty: false,\n                replaced: false,\n                changeCount: 0,\n                changingBillIndex: index\n            }, () => {\n                if (this.state.originalBillText[index]) {\n                    const selectedBillText = this.state.originalBillText[index];\n\n                    //If the text is already of the version specified in the selector, then it has been previously saved (e.g. not just the base doc anymore)\n                    //Therefore, for the version date, use the existing version date if it has already been saved, otherwise default to today's date\n                    const billVersionDate = this.state.selectedLegType.LegislationVersionID === selectedBillText.LegislationVersionID ? moment(selectedBillText.VersionDate) : moment();\n\n                    let jsonPromise, headers, reviewContent, patronageInfo;\n                    let headerError = false;\n                    const bill = this.state.billList.find(it => it.LegislationID === this.state.originalBillText[index].LegislationID) || (this.state.sessionBillsList.find(sbl => sbl.SessionID === this.state.selectedSession.SessionID) && this.state.sessionBillsList.find(sbl => sbl.SessionID === this.state.selectedSession.SessionID).bills.find(it => it.LegislationID === this.state.originalBillText[index].LegislationID));\n\n                    if (this.state.selectedLegType.Name === \"Engrossed\"\n                        || this.state.selectedLegType.Name === \"Reengrossed\"\n                        || this.state.selectedLegType.Name === \"Chaptered\"\n                        || this.state.selectedLegType.Name === \"Enrolled\"\n                        || this.state.selectedLegType.Name === \"Reenrolled\") {\n\n                        const jsonHeadersRequestString = this.getJsonHeadersRequestString(this.state.originalBillText[index].LegislationTextID, bill.DocumentCode);\n\n                        jsonPromise = this.props.actions.getJsonHeaders(jsonHeadersRequestString)\n                            .then(() => {\n                                if (this.props.bills.jsonHeaders) {\n                                    headers = getHtml(this.props.bills.jsonHeaders);\n\n                                    //Add the PassageDates to the draft text if this is a resolution and in the enrolled queue\n                                    if ((this.state.selectedLegType.Name === \"Chaptered\" || this.state.selectedLegType.Name === \"Enrolled\") && (bill.LegislationTypeCode === \"J\" || bill.LegislationTypeCode === \"R\")) {\n                                        headers = this.applyPassageDates(headers, selectedBillText, bill.LegislationTypeCode, bill.HousePassageDate, bill.SenatePassageDate)\n                                    }\n\n                                    reviewContent = headers + this.state.originalBillText[index].DraftText;\n\n                                    //Remove ldtitle from document if the header is present and the header also contains the ldtitle\n                                    let doc = document.createElement('div');\n                                    doc.insertAdjacentHTML(\"afterbegin\", reviewContent);\n                                    let header = doc.getElementsByTagName('div');\n                                    let newDraftText;\n\n                                    if (header[0] != undefined) {\n                                        //Store the header somewhere while we find and iterate over paragraphs in the rest of the doc\n                                        let headerContainer = header[0].innerHTML;\n                                        let headerParagraphs = header[0].getElementsByTagName('p');\n\n                                        for (let i = 0; i < headerParagraphs.length; i++) {\n                                            if (['ldtitle', 'ld', 'patronLine', 'patctr'].includes(headerParagraphs[i].classList[0])) {\n                                                //Temporarily remove header                              \n                                                header[0].innerHTML = \"\";\n\n                                                //We found the ldtitle or patronage in the header, so iterate over the paragraphs to find any duplicate ldtitles or patronages and eliminate them\n                                                let docParagraphs = doc.getElementsByTagName('p');\n\n                                                for (let j = 0; j < docParagraphs.length; j++) {\n                                                    if (selectedBillText.LegislationVersion === \"Substitute\" && ['pro', 'center', 'patronLine', 'patctr', 'ldtitle', 'ld'].includes(docParagraphs[j].classList[0])) {\n                                                        doc.removeChild(docParagraphs[j])\n                                                        j--;\n                                                    } else if (selectedBillText.LegislationVersion === \"Substitute\") {\n                                                        continue;\n                                                    }\n\n                                                    if (docParagraphs[j] && ['section', 'enactstm'].includes(docParagraphs[j].classList[0])) {\n                                                        break; //reached the actal body of the text, don't remove any more\n                                                    } else if (docParagraphs[j] && ['ldtitle', 'ld', 'patronLine', 'patctr', 'center'].includes(docParagraphs[j].classList[0])) {\n                                                        doc.removeChild(docParagraphs[j])\n                                                        j--\n                                                    }\n                                                }\n                                            } else if (this.state.selectedLegType.Name === \"Engrossed\" && doc.getElementsByClassName(\"billpatron\")[0]) {\n                                                //If working on an engrossed version, store the headers' patronage info which is needed for the preview (the object returned in the GetLegislationTextById call is not always correct)\n                                                patronageInfo = doc.getElementsByClassName(\"billpatron\")[0].textContent\n                                            }\n                                        }\n\n                                        if (this.state.selectedLegType.Name === \"Reenrolled\"\n                                            && this.props.session.sessionList.find(x => x.SessionID === this.state.selectedSession.SessionID).SessionEvents.find(x => x.DisplayName === \"Reconvene\")\n                                            && moment(this.props.session.sessionList.find(x => x.SessionID === this.state.selectedSession.SessionID).SessionEvents.find(x => x.DisplayName === \"Reconvene\").ActualDate).isSameOrBefore(billVersionDate, \"day\")) {\n                                            //Set the header to reconvened session and reattach the header \n                                            let headerDoc = document.createElement('div');\n                                            headerDoc.insertAdjacentHTML(\"afterbegin\", headerContainer);\n                                            let paragraphs = headerDoc.getElementsByTagName('p');\n                                            paragraphs[0].innerHTML = this.state.selectedSession.SessionYear + \" RECONVENED SESSION\";\n\n                                            header[0].appendChild(headerDoc);\n\n                                            this.setState({\n                                                onReconvene: true\n                                            })\n                                        } else {\n                                            //Reattach the header\n                                            header[0].innerHTML = headerContainer;\n\n                                            this.setState({\n                                                onReconvene: false\n                                            })\n                                        }\n\n                                        newDraftText = doc.innerHTML\n                                    }\n\n                                    if (newDraftText != undefined) {\n                                        reviewContent = newDraftText\n                                    }\n                                }\n                            }).catch(e => {\n                                console.log(e)\n                                reviewContent = `<p class=\"message-error\">${typeof e === 'object' && !Array.isArray ? JSON.parse(e).Name || \"Unknown Error\" : e}</p>`;\n                                headerError = true;\n                            })\n                    } else {\n                        reviewContent = this.state.originalBillText[index].DraftText;\n                    }\n\n                    Promise.all([jsonPromise])\n                        .finally(() => {\n                            //if this is a gov rec/veto version that has NOT already been saved, display the header info\n                            if (!this.state.showCompletedItems && [\"Gov Recommendation\", \"Veto Explanation\"].includes(this.state.selectedLegType.Name) && ![\"Gov Recommendation\", \"Veto Explanation\"].includes(this.state.originalBillText[index].LegislationVersion)) {\n                                reviewContent = \"<p class='textbl'>\" + \"(\" + bill.LegislationNumber + \")</p><p class='textbl'>\" + (this.state.selectedLegType.Name === \"Gov Recommendation\" ? \"GOVERNOR'S RECOMMENDATION\" : \"GOVERNOR'S VETO\") + \"</p><p></p>\"\n                            } else {\n                                //default version date within the draft text if present\n                                reviewContent = this.updateDraftTextVersionDate(reviewContent, billVersionDate)\n                            }\n\n                            this.setState({\n                                headers: headers,\n                                patronageInfo: patronageInfo,\n                                selectedBillTextIndex: index,\n                                reviewContent: reviewContent,\n                                savedReviewContent: reviewContent,\n                                editorChanged: false,\n                                headerError: headerError,\n                                versionDate: billVersionDate,\n                                reviewKey: 1,\n                                changingBillIndex: false\n                            })\n                        })\n                }\n            })\n        }\n    }\n\n    toggleCheckAll() {\n        const opposite = !this.state.checkAll;\n        let checkedBills = [...this.state.checkedBills];\n\n        this.state.billList.forEach(bill => {\n            const billIndex = checkedBills.findIndex(b => b.LegislationTextID === bill.LegislationTextID)\n            if (!opposite) {\n                checkedBills.splice(billIndex, 1);\n            } else if (billIndex === -1) {\n                checkedBills.push(bill);\n            }\n        });\n        this.setState({\n            checkedBills: checkedBills,\n            checkAll: opposite\n        })\n    }\n\n    checkBill(bill, enrolledPrintQueue, e) {\n        let checkedBills = enrolledPrintQueue ? [...this.state.enrolledPrintQueue] : [...this.state.checkedBills];\n        const billIndex = checkedBills.findIndex(b => b.LegislationTextID === bill.LegislationTextID)\n\n        if (billIndex !== -1) {\n            checkedBills.splice(billIndex, 1);\n        } else {\n            checkedBills.push(bill);\n        }\n        if (enrolledPrintQueue) {\n            this.setState({ enrolledPrintQueue: checkedBills });\n        } else {\n            this.setState({ checkedBills }, () => {\n                if (!this.state.checkedBills.length) {\n                    this.setState({\n                        customPublishDate: null,\n                        useCurrentPublishDates: true\n                    })\n                }\n            });\n        }\n    }\n\n    togglePublishDatePreference() {\n        this.setState({ useCurrentPublishDates: !this.state.useCurrentPublishDates }, () => {\n            if (this.state.useCurrentPublishDates) {\n                this.setState({ customPublishDate: null })\n            }\n        })\n    }\n\n    handlePublishDateChange(date) {\n        this.setState({ customPublishDate: date })\n    }\n\n    getSessionBills() {\n        if (!this.state.sessionBillsList || !this.state.sessionBillsList.length || !this.state.sessionBillsList.find(sbl => sbl.SessionID === this.state.selectedSession.SessionID))\n            //Get bills in the session for the bill dropdown\n            this.props.actions.getSessionBills('?sessionID= ' + this.state.selectedSession.SessionID).then(() => {\n                let bills = [...this.props.bills.sessionBills].filter(b => b.LegislationTypeCode === \"B\" && (this.props.login.userClaims.roles.find((x) => x === \"Admin\") ? true : this.props.login.userClaims.roles.find((x) => x === \"HouseLegislationAuthor\") ? b.ChamberCode === \"H\" : b.ChamberCode === \"S\"));\n                bills.forEach(bill => {\n                    bill.label = bill.LegislationNumber\n                    bill.value = bill.LegislationID\n                });\n                let sessionBillsList = [...this.state.sessionBillsList];\n                sessionBillsList.push({ SessionID: this.state.selectedSession.SessionID, bills: bills })\n                this.setState({\n                    sessionBillsList\n                })\n            })\n    }\n\n    batchPublish() {\n        this.setState({ isSaving: true }, () => {\n            this.props.actions.batchPublish({ \"PublishDate\": !this.state.useCurrentPublishDates && this.state.customPublishDate ? this.state.customPublishDate : null, \"legislationTextIDs\": this.state.checkedBills.map(bills => bills.LegislationTextID), \"legislationIDs\": this.state.checkedBills.map(bills => bills.LegislationID) })\n                .then(() => {\n                    this.props.actions.batchGenBillFile(\"?sessionID=\" + this.state.selectedSession.SessionID, this.state.checkedBills.map(bills => bills.LegislationTextID))\n                        .then(() => {\n                            this.props.actions.makeToast([{ message: \"Publish Successful - Processing Files...\", type: \"success\" }])\n\n                            this.setState({\n                                checkedBills: [],\n                                checkAll: false,\n                                enrolledPrintQueue: [],\n                                useCurrentPublishDates: true,\n                                customPublishDate: null,\n                                isLoaded: false,\n                                selectedBill: '',\n                                originalBillText: [],\n                                reviewContent: '',\n                                amendmentFieldsetIsActive: false,\n                                reviewFieldsetIsActive: false,\n                                reviewKey: 1,\n                                isSaving: false\n                            }, () => {\n                                const params = \"?sessionID=\" + this.state.selectedSession.SessionID + \"&legislationVersionID=\" + this.state.selectedLegType.LegislationVersionID + \"&IsComplete=\" + (this.state.showCompletedItems ? 'true' : 'false');\n                                this.props.actions.getBillManagementList(params)\n                                    .then(() => {\n                                        let billList = [...this.props.bills.billManagementList];\n\n                                        if (this.state.showCompletedItems) { billList = billList.filter(text => !text.PendingChange) }\n\n                                        this.setState({\n                                            selectedLegDate: '',\n                                            selectedLegNum: ''\n                                        })\n\n                                        this.setLegDateOptions(billList);\n                                        this.setState({\n                                            isLoaded: true\n                                        });\n                                    }).catch(err => {\n                                        if (err === 'Aborted') {\n                                            return;\n                                        }\n                                        this.setState({\n                                            billList: [], // makes it apparent that something may have gone wrong but also prevents the list retaining old values\n                                            isLoaded: true\n                                        });\n                                    });\n                            });\n                        }).catch((err) => {\n                            if (err === 'Aborted') {\n                                return;\n                            }\n                            this.props.actions.makeToast([{ message: \"File Generation Failed\", type: \"failure\" }]);\n                            this.setState({ isSaving: false });\n                        })\n                }).catch((err) => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.props.actions.makeToast([{ message: \"Publish Failed\", type: \"failure\" }]);\n                    this.setState({ isSaving: false });\n                })\n        })\n    }\n\n    batchComplete() {\n        this.setState({ isSaving: true }, () => {\n            this.props.actions.batchComplete({ \"IsComplete\": true, \"IsReleased\": false, \"legislationTextIDs\": this.state.enrolledPrintQueue.map(bills => ({ LegislationTextID: bills.LegislationTextID })) })\n                .then(() => {\n                    let legislationNumbers = {\n                        LegislationNumbers: []\n                    };\n                    this.state.enrolledPrintQueue.forEach(x => {\n                        legislationNumbers.LegislationNumbers.push({\n                            LegislationNumber: x.LegislationNumber\n                        })\n                    })\n                    this.props.actions.sendParchmentEmail(legislationNumbers)\n                        .then(() => {\n                            this.props.actions.makeToast([{ message: \"Print Parchment Successful\", type: \"success\" }])\n\n                            this.setState({\n                                checkedBills: [],\n                                enrolledPrintQueue: [],\n                                useCurrentPublishDates: true,\n                                customPublishDate: null,\n                                isLoaded: false,\n                                selectedBill: '',\n                                originalBillText: [],\n                                reviewContent: '',\n                                amendmentFieldsetIsActive: false,\n                                reviewFieldsetIsActive: false,\n                                reviewKey: 1,\n                                isSaving: false\n                            }, () => {\n                                const params = \"?sessionID=\" + this.state.selectedSession.SessionID + \"&legislationVersionID=\" + this.state.selectedLegType.LegislationVersionID + \"&IsComplete=\" + (this.state.showCompletedItems ? 'true' : 'false');\n                                this.props.actions.getBillManagementList(params)\n                                    .then(() => {\n                                        let billList = [...this.props.bills.billManagementList];\n\n                                        if (this.state.showCompletedItems) { billList = billList.filter(text => !text.PendingChange) }\n\n                                        this.setState({\n                                            selectedLegDate: '',\n                                            selectedLegNum: ''\n                                        })\n\n                                        this.setLegDateOptions(billList);\n                                        this.setState({\n                                            isLoaded: true\n                                        });\n                                    }).catch(err => {\n                                        if (err === 'Aborted') {\n                                            return;\n                                        }\n                                        this.setState({\n                                            billList: [], // makes it apparent that something may have gone wrong but also prevents the list retaining old values\n                                            isLoaded: true\n                                        });\n                                    });\n                            });\n                        })\n                }).catch((err) => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.props.actions.makeToast([{ message: \"Print Parchment Failed\", type: \"failure\" }]);\n                    this.setState({ isSaving: false });\n                })\n        })\n    }\n\n    applyPassageDates(headers, billText, legislationTypeCode, housePassageDate, senatePassageDate) {\n        //Check the text of the header and doc to make sure the passage dates haven't already been added\n        let preDoc = document.createElement('div');\n        preDoc.insertAdjacentHTML(\"afterbegin\", headers + billText.DraftText);\n        let preDocParagraphs = preDoc.getElementsByTagName(\"p\");\n        let housePassage = false\n        let senatePassage = false;\n\n        for (let i = 0; i < preDocParagraphs.length; i++) {\n            if (preDocParagraphs[i].classList && preDocParagraphs[i].classList[0] === \"house-passage\") {\n                housePassage = true;\n            }\n\n            if (preDocParagraphs[i].classList && preDocParagraphs[i].classList[0] === \"senate-passage\") {\n                senatePassage = true;\n            }\n        }\n\n        //Add the passage dates if they exist in the data but aren't in the DraftText yet - add both chambers for joint resolutions, or just the originating chamber for normal resolutions\n        if (billText.ChamberCode === \"H\") {\n            headers = housePassageDate && housePassageDate != \"\" && !housePassage ? headers + \"<p class='house-passage center'>Agreed to by the House of Delegates, \" + moment(housePassageDate).format(\"LL\") + \"</p>\" : headers;\n            if (legislationTypeCode === \"J\") {\n                headers = senatePassageDate && senatePassageDate != \"\" && !senatePassage ? headers + \"<p class='senate-passage center'>Agreed to by the Senate, \" + moment(senatePassageDate).format(\"LL\") + \"</p><p></p>\" : headers;\n            } else {\n                headers = headers + \"<p></p>\";\n            }\n        } else {\n            headers = senatePassageDate && senatePassageDate != \"\" && !senatePassage ? headers + \"<p class='senate-passage center'>Agreed to by the Senate, \" + moment(senatePassageDate).format(\"LL\") + \"</p>\" : headers;\n            if (legislationTypeCode === \"J\") {\n                headers = housePassageDate && housePassageDate != \"\" && !housePassage ? headers + \"<p class='house-passage center'>Agreed to by the House of Delegates, \" + moment(housePassageDate).format(\"LL\") + \"</p><p></p>\" : headers;\n            } else {\n                headers = headers + \"<p></p>\";\n            }\n        }\n\n        return headers;\n    }\n\n    getJsonHeadersRequestString(legislationTextId, documentCode) {\n        let overrideParam = this.state.selectedLegType.Name.toLowerCase();\n\n        let jsonHeadersRequestString = \"?legislationTextID=\" + legislationTextId + \"&sessionID=\" + this.state.selectedSession.SessionID + \"&overrideLegislationVersion=\" + overrideParam + \"&onlyHeader=true\";\n        if (this.state.selectedLegType.Name === \"Chaptered\") {\n            //For chaptered legislation, add overrideDocumentCode param and use the future chapter number to be displayed in the headers\n            jsonHeadersRequestString += \"&overrideDocumentCode=\" + documentCode;\n        }\n\n        return jsonHeadersRequestString\n    }\n\n    toggleCompleteItems() {\n        this.handleSelectorChange('showCompletedItems', !this.state.showCompletedItems);\n    }\n\n    componentDidMount() {\n        //Get the list of active sessions for the session dropdown\n        this.props.actions.getSessionShallowList(\"IsActive=true\")\n            .then(() => {\n                let sessionList = [...this.props.session.sessionShallowList];\n                sessionList.forEach((session, index) => {\n                    session.label = session.SessionYear + ' ' + session.DisplayName;\n                    session.value = session.SessionID;\n                    //Set the last session in the list as the selected session\n                    if (session.IsDefault) {\n                        this.handleSelectorChange('selectedSession', session);\n                    }\n                });\n                this.setState({\n                    sessionOptions: sessionList\n                });\n            });\n\n        this.props.actions.getBillVersionRef()\n            .then(() => {\n                const billVersionRef = [...this.props.bills.billVersionRef];\n                // Only list the important versions in the dropdown. AKA any version that has an AuthoringLabel is important \n                const billVersionsToUse = billVersionRef.filter(v => v.AuthoringLabel);\n                let billVersionOptions = []\n                billVersionsToUse.forEach(version => {\n                    //Do not add Chaptered to the version list dropdown if Senate user\n                    if (version.Name !== \"Chaptered\" || this.props.login.userClaims.claims.find(x => x.Resource === \"LegislationText\" && (x.Scope === \"All\" || x.Scope === \"House\"))) {\n                        version.label = this.state.showCompletedItems ? version.Name : version.AuthoringLabel;\n                        version.value = version.LegislationVersionID;\n                        billVersionOptions.push(version);\n                    }\n                });\n                this.setState({\n                    billVersionRef: billVersionRef,\n                    legOptions: billVersionOptions.sort((a, b) => a.label.localeCompare(b.label)),\n                });\n            });\n    }\n\n    toggleHeaders() {\n        this.setState(prevState => ({\n            showHeaders: !prevState.showHeaders\n        }))\n    }\n\n    resetWarning() {\n        this.setState({\n            reviewKey: 1\n        })\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { selectedBill, originalBillText, headers } = this.state;\n        // Bills that were chaptered, vetoed, or had recommendations added need the date that they were originally signed by the governor visible to the user\n        const signedText = originalBillText.find(text =>\n            text.LegislationVersion === 'Veto Explanation' ||\n            text.LegislationVersion === 'Gov Recommendation' ||\n            text.LegislationVersion === 'Chaptered');\n        if (this.state.isPreviewVisible) {\n            return (\n                <div>\n                    {this.state.showIncompletePdf &&\n                        <Popout togglePortal={this.togglePortal} windowTitle=\"PDF Preview\">\n                            {this.state.gettingIncompletePdf &&\n                                <div className=\"center-spinner spinner\" />\n                            }\n                            <iframe style={{ display: this.state.gettingIncompletePdf ? 'none' : 'block', width: '100%', height: '100%' }} ref={this.pdfRef}></iframe>\n                        </Popout>\n                    }\n                    <div className=\"flex-row align-center bottomline\">\n                        <h2>{this.state.selectedSession.SessionYear} {this.state.selectedSession.DisplayName} / {selectedBill.LegislationNumber}</h2>\n                        <div>\n                            {!this.state.showCompletedItems && ['chaptered', 'enrolled', 'reenrolled', 'engrossed', 'reengrossed'].includes(this.state.selectedLegType.Name.toLowerCase()) &&\n                                <span><button type=\"button\" className=\"button pdf\" style={{ paddingTop: '5px' }} onClick={this.previewPdf}>PDF</button></span>\n                            }\n                            <ReactToPrint\n                                trigger={() => <span><button type=\"button\" className=\"button print\">Print</button></span>}\n                                content={() => this.componentRef}\n                                pageStyle={\"break-inside: avoid\"}\n                            />\n                        </div>\n                    </div>\n                    {this.state.previewContent !== '' && this.state.showCompletedItems\n                        ? <iframe ref={el => (this.componentRef = el)} src={this.state.previewContent} type=\"application/pdf\" width=\"100%\" height=\"1080px\" style={{ marginBottom: \"45px\" }}></iframe>\n                        : <PreviewSection ref={el => (this.componentRef = el)}\n                            headers={headers}\n                            selectedBill={selectedBill}\n                            editorContent={this.state.previewContent}\n                            error={this.state.previewContentError}\n                            selectedLegType={this.state.selectedLegType}\n                            billVersionRef={this.state.billVersionRef}\n                        />\n                    }\n                    <div className={\"align-right floating-button-bar inline-list\" + (!this.state.showCompletedItems && this.state.selectedLegType.Name === 'Enrolled' ? \" print-parchment\" : \"\")}>\n                        {\n                            this.state.showCompletedItems ?\n                                <button disabled={this.state.isSaving} onClick={this.togglePreview} className=\"button secondary\">Edit</button>\n                                : this.state.selectedLegType.Name === 'Enrolled' &&\n                                <React.Fragment>\n                                    <button disabled={this.state.isSaving} onClick={() => { this.handleSave(false, true); this.props.actions.sendParchmentEmail({ LegislationNumbers: [{ LegislationNumber: this.state.selectedBill.LegislationNumber }] }); }} className=\"button\">Print Parchment</button>\n                                    <div />\n                                </React.Fragment>\n                        }\n                        {this.state.showCompletedItems ?\n                            <React.Fragment>\n                                <div className=\"flex-row flex-vertical-center flex-end\">\n                                    <div className=\"toggle-switch\" onClick={this.toggleReprint}>\n                                        <input id=\"official-reprint-button\" checked={this.state.originalBillText[this.state.selectedBillTextIndex] && this.state.originalBillText[this.state.selectedBillTextIndex].IsReprint} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"official-reprint-button\" className=\"checkbox-label no-background\" style={{ whiteSpace: \"no-wrap\", marginTop: '0px', fontSize: '14px' }}>Mark As Official Reprint</label>\n                                    <button disabled={this.state.isSaving || !this.state.selectedBill || (!this.props.login.userClaims.scopes.find((x) => x === \"Senate\") && this.props.login.userClaims.roles.find((x) => x === \"HouseLegislationFilePublisher\") === undefined)} onClick={this.handleSaveCompletedItem} className=\"button\">{this.state.isSaving ? \"Republishing...\" : \"Republish\"}</button>\n                                </div>\n                            </React.Fragment>\n                            :\n                            <React.Fragment>\n                                <button disabled={this.state.isSaving} onClick={this.togglePreview} className=\"button secondary\">Edit</button>\n                                {(this.state.selectedBill.CandidateDate || ([2, 3, 6, 7, 9, 10].includes(this.state.selectedLegType.LegislationVersionID) && !this.state.selectedBill.CandidateDate)) &&\n                                    <button disabled={this.state.isSaving || !this.state.selectedBill || !this.state.originalBillText[this.state.selectedBillTextIndex].DocumentCode || (!this.props.login.userClaims.scopes.find((x) => x === \"Senate\") && this.props.login.userClaims.roles.find((x) => x === \"HouseLegislationFilePublisher\") === undefined)} onClick={() => this.handleSave(true)} className=\"button\">{this.state.isSaving ? \"Publishing...\" : \"Publish\"}</button>\n                                }\n                            </React.Fragment>\n                        }\n                    </div>\n                </div >\n            );\n        } else {\n            return (\n                <div>\n                    {(this.state.showTextConfirmation || this.state.showBillConfirmation) &&\n                        <div className=\"schedule-modal\">\n                            <div className=\"schedule-modal-content\">\n                                <p>You have unsaved changes. Are you sure you want to open a different document?</p>\n                                <button className=\"button secondary float-right\" onClick={() => this.closeConfirmation()}>No</button>\n                                <button className=\"button primary float-right\" onClick={() => this.state.showTextConfirmation ? this.selectBillIndex(this.state.storedTextIndex, true) : this.state.showBillConfirmation()} style={{ marginRight: \"10px\" }}>Yes</button>\n                                <br />\n                            </div>\n                        </div>\n                    }\n                    {this.state.showCategoryConfirmation &&\n                        <div className=\"schedule-modal\">\n                            <div className=\"schedule-modal-content\">\n                                <p>You have unsaved changes. Are you sure you want to select a different option?</p>\n                                <button className=\"button secondary float-right\" onClick={() => this.closeConfirmation()}>No</button>\n                                <button className=\"button primary float-right\" onClick={() => this.checkHandleSelectorChange(this.state.storedKey, this.state.storedValue, true)} style={{ marginRight: \"10px\" }}>Yes</button>\n                                <br />\n                            </div>\n                        </div>\n                    }\n                    <Prompt\n                        when={this.state.isDirty}\n                        message={`You have unsaved changes. Are you sure you would like to leave?`}\n                    />\n                    <div className=\"header-half\">\n                        <h1>Version Authoring{this.state.showCompletedItems && ' (Published Versions)'}</h1>\n                        <p>\n                            <button onClick={() => this.toggleCompleteItems()} className=\"button\" type=\"button\">{this.state.showCompletedItems ? 'Back' : 'View Published Versions'}</button>\n                        </p>\n                    </div>\n                    <div className=\"user-forms dlas-forms\" style={{ paddingBottom: \"40px\" }}>\n                        <fieldset className={this.state.billFieldsetIsActive ? 'fieldset-collapse fieldset-open' : 'fieldset-collapse fieldset-closed'} >\n                            <legend onClick={this.toggleFieldsetCollapse.bind(this, 'billFieldsetIsActive')}>Bills {this.state.processingFile && <span> | <i>Creating file...</i></span>}</legend>\n                            <div>\n                                <SelectorSection\n                                    onChange={this.checkHandleSelectorChange}\n                                    sessionOptions={this.state.sessionOptions}\n                                    legOptions={this.state.legOptions}\n                                    selectedSession={this.state.selectedSession}\n                                    selectedLegType={this.state.selectedLegType}\n                                    selectedLegDate={this.state.selectedLegDate}\n                                    selectedLegNum={this.state.selectedLegNum}\n                                    legDateOptions={this.state.legDateOptions}\n                                    disable={this.state.isSaving}\n                                />\n                                <span className=\"insert-message small-text fail\">{this.props.bills.billManagementListError}</span>\n                                <BillGridSection\n                                    billList={this.state.billList.filter(b => !this.state.reprintsFiltered ? true : b.IsReprint)}\n                                    selectBill={this.selectBill}\n                                    selectedBill={this.state.selectedBill}\n                                    checkBill={this.checkBill}\n                                    checkedBills={this.state.checkedBills}\n                                    enrolledPrintQueue={this.state.enrolledPrintQueue}\n                                    batchPublish={this.batchPublish}\n                                    batchComplete={this.batchComplete}\n                                    isSaving={this.state.isSaving}\n                                    isLoaded={this.state.isLoaded}\n                                    billDataIsLoading={this.state.billDataIsLoading}\n                                    completedItems={this.state.showCompletedItems}\n                                    legislationVersionID={this.state.selectedLegType.LegislationVersionID}\n                                    useCurrentPublishDates={this.state.useCurrentPublishDates}\n                                    togglePublishDatePreference={this.togglePublishDatePreference}\n                                    handlePublishDateChange={this.handlePublishDateChange}\n                                    customPublishDate={this.state.customPublishDate}\n                                    reprintsFiltered={this.state.reprintsFiltered}\n                                    filterReprints={this.filterReprints}\n                                    sessionBillsList={this.state.sessionBillsList.find(sbl => sbl.SessionID === this.state.selectedSession.SessionID) ? this.state.sessionBillsList.find(sbl => sbl.SessionID === this.state.selectedSession.SessionID).bills : []}\n                                    toggleCheckAll={this.toggleCheckAll}\n                                    checkAll={this.state.checkAll}\n                                />\n                            </div>\n                        </fieldset>\n                        {!this.state.showCompletedItems &&\n                            <fieldset ref={this.amendmentRef} className={this.state.amendmentFieldsetIsActive ? 'fieldset-collapse fieldset-open' : 'fieldset-collapse fieldset-closed'} >\n                                <legend onClick={this.toggleFieldsetCollapse.bind(this, 'amendmentFieldsetIsActive')}>\n                                    Amendments {this.state.amendments.length > 0 && <span style={{ verticalAlign: 'bottom' }} className=\"icon popout\" onClick={(e) => this.togglePortal(this.state.showPortal, e)}></span>}\n                                    {this.state.showPortal &&\n                                        <Popout togglePortal={this.togglePortal} windowTitle={this.state.selectedBill.LegislationNumber + ' Amendments'}>\n                                            <AmendmentSection\n                                                amendments={this.state.amendments}\n                                            />\n                                        </Popout>\n                                    }\n                                </legend>\n                                <div>\n                                    <AmendmentSection\n                                        amendments={this.state.amendments}\n                                    />\n                                </div>\n                            </fieldset>\n                        }\n                        <fieldset ref={this.reviewRef} className={this.state.reviewFieldsetIsActive ? 'fieldset-collapse fieldset-open' : 'fieldset-collapse fieldset-closed'} >\n                            <legend onClick={this.toggleFieldsetCollapse.bind(this, 'reviewFieldsetIsActive')}><span>Review </span>\n                                {selectedBill &&\n                                    <span>\n                                        | {selectedBill.LegislationNumber}\n                                        {signedText && signedText.VersionDate &&\n                                            <React.Fragment> | Signed: {moment(signedText.VersionDate).format('MM/DD/YYYY')} </React.Fragment>\n                                        }\n                                    </span>\n                                }</legend>\n                            {!this.state.showCompletedItems && selectedBill &&\n                                <>\n                                    <label htmlFor=\"version-date-picker\">Version Publish Date</label>\n                                    <DatePicker\n                                        id=\"version-date-picker\"\n                                        selected={this.state.versionDate}\n                                        onChange={this.handleVersionDateChange}\n                                    />\n                                </>\n                            }\n                            <div>\n                                {!this.state.showCompletedItems &&\n                                    <React.Fragment>\n                                        <TextList\n                                            originalBillText={this.state.originalBillText}\n                                            selectedBillTextIndex={this.state.selectedBillTextIndex}\n                                            selectBillIndex={this.selectBillIndex}\n                                            selectedLegType={this.state.selectedLegType}\n                                            changingBillIndex={this.state.changingBillIndex}\n                                        />\n                                    </React.Fragment>\n                                }\n                                <ReviewSection\n                                    editorContent={this.state.reviewContent}\n                                    handleEditorChange={this.handleEditorChange}\n                                    sessionId={this.state.selectedSession.SessionID}\n                                    reviewKey={this.state.reviewKey}\n                                    resetWarning={this.resetWarning}\n                                    setWasEmpty={this.setWasEmpty}\n                                    wasEmpty={this.state.wasEmpty}\n                                    setReplaced={this.setReplaced}\n                                    replaced={this.state.replaced}\n                                    billNumber={this.state.selectedBill.LegislationNumber}\n                                    userChamber={this.props.login.userClaims.roles.find((x) => x === \"Admin\") ? \"Admin\" : this.props.login.userClaims.roles.find((x) => x === \"HouseLegislationAuthor\") ? \"H\" : \"S\"}\n                                    allowAmendmentActions={this.state.selectedLegType.Name === \"Gov Recommendation\"}\n                                    allowGovernorAmendmentSponsor={this.state.selectedLegType.Name === \"Gov Recommendation\"}\n                                    amendmentOrigin={this.state.selectedLegType.Name === \"Gov Recommendation\" ? \"G\" : \"\"}\n                                    overrideRemoveAgreeRejectButtons={true}\n                                    legislationVersion={originalBillText[this.state.selectedBillTextIndex] && originalBillText[this.state.selectedBillTextIndex].LegislationVersion}\n                                    pasteAsText={this.state.selectedLegType.Name !== \"Gov Recommendation\"}\n                                    versionAuthoring={true}\n                                />\n                                {this.state.reviewContent != \"\" &&\n                                    <div className=\"align-right floating-button-bar inline-list\">\n                                        {!this.state.showCompletedItems && <button type=\"button\" className=\"button\" disabled={this.state.isSaving || !this.state.selectedBill || this.state.headerError} onClick={() => this.handleSave(false)}>{this.state.isSaving ? \"Saving...\" : \"Save\"}</button>}\n                                        <button type=\"button\" className=\"button\" disabled={this.state.gettingCompletedItemPreview || this.state.isSaving || !this.state.selectedBill || !this.state.originalBillText[this.state.selectedBillTextIndex] || this.state.headerError || (!this.state.showCompletedItems && (this.state.reviewContent !== this.state.savedReviewContent || this.state.selectedLegType && this.state.originalBillText[this.state.selectedBillTextIndex] && this.state.selectedLegType.LegislationVersionID !== this.state.originalBillText[this.state.selectedBillTextIndex].LegislationVersionID))} onClick={this.togglePreview}>{this.state.gettingCompletedItemPreview ? 'Getting Preview' : 'Preview'}</button>\n                                    </div>\n                                }\n                            </div>\n                        </fieldset>\n                    </div>\n                </div>\n            );\n        }\n    }\n}\nexport default connect(\n    (state) => {\n        const { bills, session, nav, login } = state;\n        return {\n            bills,\n            session,\n            nav,\n            login\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, billActionCreators, sessionActionCreators, navActionCreators, printActionCreators), dispatch)\n        }\n    }\n)(VersionManagement)","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport DatePicker from 'react-datepicker';\nimport ReactTable from 'react-table';\nimport moment from 'moment-timezone';\nimport { LargeListSelect } from '../../../lis-shared/lis-layout/components/lis-forms-component';\n\nclass BillGridSection extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            selectedSessionBill: null,\n            ldNumberSearch: '',\n            searchingLDNumber: false\n        }\n\n        this.selectSessionBill = this.selectSessionBill.bind(this);\n        this.handleLdNumberSearchChange = this.handleLdNumberSearchChange.bind(this);\n        this.searchByLDNumber = this.searchByLDNumber.bind(this);\n    }\n\n    componentDidUpdate(prevProps) {\n        if ((this.state.selectedSessionBill && prevProps.selectedBill.LegislationNumber !== this.props.selectedBill.LegislationNumber && this.props.selectedBill.LegislationNumber !== this.state.selectedSessionBill.LegislationNumber) || prevProps.legislationVersionID !== this.props.legislationVersionID) {\n            this.setState({ selectedSessionBill: null })\n        }\n    }\n\n    selectSessionBill(legislation) {\n        this.setState({ selectedSessionBill: legislation })\n        this.props.selectBill(legislation, legislation.LegislationNumber);\n    }\n\n    handleLdNumberSearchChange(val) {\n        this.setState({ ldNumberSearch: val })\n    }\n\n    searchByLDNumber(e) {\n        if (e) e.preventDefault()\n        this.setState({ searchingLDNumber: true }, () => {\n            this.props.selectBill(null, null, null, this.state.ldNumberSearch, () => {\n                this.setState({ searchingLDNumber: false })\n            });\n        })\n    }\n\n    render() {\n        let columns = [\n            {\n                Header: 'Bill #',\n                sortable: true,\n                sortMethod: ((rowA, rowB, desc) => {\n                    const legChamberA = rowA[0];\n                    const legChamberB = rowB[0];\n                    if (legChamberA !== legChamberB) {\n                        return legChamberA.localeCompare(legChamberB);\n                    }\n\n                    const legTypeA = rowA[1];\n                    const legTypeB = rowB[1];\n                    if (legTypeA !== legTypeB) {\n                        return legTypeA.localeCompare(legTypeB);\n                    }\n\n                    const legKeyA = rowA.substr(2);\n                    const legKeyB = rowB.substr(2);\n                    return legKeyA - legKeyB;\n                }),\n                filterable: false,\n                width: 90,\n                accessor: \"LegislationNumber\",\n                Cell: ({ original, index }) => {\n                    const checked = this.props.enrolledPrintQueue.find(b => b.LegislationTextID === original.LegislationTextID);\n                    if (original.SessionCode) {\n                        return <div>\n                            <Link to={`/bill-details/${original.SessionCode}/${original.LegislationNumber}`} target=\"_blank\" rel=\"noreferrer\">{original.LegislationNumber}</Link>\n                            {!this.props.completedItems && original.VersionDate && this.props.legislationVersionID === 3 && <input id=\"sr-publish\" type=\"checkbox\" style={{ float: 'right' }} disabled={this.props.selectedBill && this.props.selectedBill.LegislationTextID === original.LegislationTextID ? true : false} onChange={(e) => this.props.checkBill(original, true, e)} checked={checked ? checked : false} />}\n                        </div>\n                    } else {\n                        return (<span>{original.LegislationNumber}</span>)\n                    }\n                }\n            },\n            {\n                Header: 'Patron',\n                sortable: true,\n                filterable: false,\n                accessor: \"Patrons\",\n                width: 100,\n                Cell: row =>\n                    <span>{row.value && row.value.map((patron, index) => <React.Fragment key={index}>{patron.PatronDisplayName}{index !== row.value.length - 1 && \", \"}</React.Fragment>)}</span>\n            },\n            {\n                Header: 'Caption',\n                sortable: true,\n                filterable: false,\n                accessor: \"Description\",\n                Cell: row => <span>{row.value}</span>\n            },\n            {\n                Header: this.props.completedItems\n                    ? <>Published Date <input\n                        id={'pd-checkbox-selectall'}\n                        type=\"checkbox\"\n                        className=\"checkbox\"\n                        checked={this.props.checkAll}\n                        onChange={this.props.toggleCheckAll}\n                    /></>\n                    : this.props.legislationVersionID === 2 ? 'Engrossed On' : this.props.legislationVersionID === 6 ? 'Reengrossed On' : [3, 7].includes(this.props.legislationVersionID) ? 'Passed on' : 'Candidate Date',\n                sortable: false,\n                filterable: false,\n                accessor: this.props.completedItems ? \"\" : \"CandidateDate\",\n                width: 135,\n                Cell: ({ original, index }) => {\n                    if (!this.props.completedItems) { return <span>{original.CandidateDate ? moment(original.CandidateDate).format(\"MM/DD/YYYY\") : [2, 3, 6, 7].includes(this.props.legislationVersionID) ? \"Pending\" : \"\"}</span> }\n                    else {\n                        const checked = this.props.checkedBills.find(b => b.LegislationTextID === original.LegislationTextID);\n                        return (<div>\n                            <span>{checked && this.props.customPublishDate ? moment(this.props.customPublishDate).format(\"MM/DD/YYYY\") : original.VersionDate ? moment(original.VersionDate).format(\"MM/DD/YYYY\") : \"\"}</span>\n                            {original.VersionDate && <input id=\"sr-publish\" type=\"checkbox\" style={{ float: 'right' }} disabled={this.props.selectedBill && this.props.selectedBill.LegislationTextID === original.LegislationTextID ? true : false} onChange={(e) => this.props.checkBill(original, false, e)} checked={checked ? checked : false} />}\n                        </div>)\n                    }\n                }\n            },\n            {\n                Header: 'Actions',\n                sortable: false,\n                filterable: false,\n                accessor: \"\",\n                width: 90,\n                Cell: ({ original, index }) =>\n                    <div className=\"committee-action-column\">\n                        {this.props.billDataIsLoading === index ?\n                            <div><span className=\"small-spinner\"></span></div>\n                            :\n                            <button className=\"button edit\" type=\"button\" onClick={() => this.props.selectBill(original, index)}>Edit</button>\n                        }\n                        {original.PendingChange\n                            ? <span className=\"icon flag\"></span>\n                            : <div />\n                        }\n                        {original.IsComplete\n                            ? !this.props.completedItems\n                                ? [3, 7].includes(this.props.legislationVersionID) && <i className=\"icon paper-yellow\" style={{ cursor: \"default\" }} />\n                                : <a className=\"icon book\" href={`/bill-details/${original.SessionCode}/${original.LegislationNumber}/text/${original.DocumentCode}`} target=\"_blank\" rel=\"noreferrer\" />\n                            : null\n                        }\n                    </div>\n            }\n        ];\n\n        if (this.props.completedItems) {\n            let docCodeColumn = {\n                Header: 'Doc Code',\n                sortable: true,\n                filterable: false,\n                accessor: \"DocumentCode\",\n                width: 110,\n                Cell: row =>\n                    <span>{row.value}</span>\n            }\n\n            columns.splice(1, 0, docCodeColumn)\n        }\n\n        if (!this.props.completedItems) {\n            let publishDateColumn = {\n                Header: <>Publish On <input\n                    id={'pd-checkbox-selectall'}\n                    type=\"checkbox\"\n                    className=\"checkbox\"\n                    checked={this.props.checkAll}\n                    onChange={this.props.toggleCheckAll}\n                /></>,\n                sortable: false,\n                filterable: false,\n                accessor: \"\",\n                width: 135,\n                Cell: ({ original, index }) => {\n                    const checked = this.props.checkedBills.find(b => b.LegislationTextID === original.LegislationTextID);\n                    return (<div>\n                        <span>{checked && this.props.customPublishDate ? moment(this.props.customPublishDate).format(\"MM/DD/YYYY\") : original.VersionDate ? moment(original.VersionDate).format(\"MM/DD/YYYY\") : \"\"}</span>\n                        {original.VersionDate && <input id=\"sr-publish\" type=\"checkbox\" style={{ float: 'right' }} disabled={((this.props.selectedBill && this.props.selectedBill.LegislationID === original.LegislationID) || (!original.CandidateDate && ![2, 3, 6, 7].includes(this.props.legislationVersionID))) ? true : false} onChange={(e) => this.props.checkBill(original, false, e)} defaultChecked={checked} />}\n                    </div>)\n                }\n            }\n\n            columns.splice(4, 0, publishDateColumn)\n        }\n\n        const billListIDs = this.props.billList && this.props.billList.length ? this.props.billList.map(b => b.LegislationID) : null;\n        return (\n            <div>\n                <div>\n                    <div style={{ display: 'flex', height: (this.props.billList && this.props.billList.length) || [9, 10].includes(this.props.legislationVersionID) ? '25px' : null }}>\n                        <div style={{ width: '90px' }}>\n                            {this.props.completedItems && ((this.props.billList && this.props.billList.length) || this.props.reprintsFiltered) ? <button type=\"button\" className=\"button\" onClick={this.props.filterReprints} style={{ left: '0px', position: 'absolute' }}>{this.props.reprintsFiltered ? 'Show All Legislation' : 'Only Show Reprints'}</button> : null}\n                            {!this.props.completedItems && [9, 10].includes(this.props.legislationVersionID) &&\n                                <div style={{ display: 'flex' }}>\n                                    <LargeListSelect\n                                        className=\"grid-selector-dropdown\"\n                                        classNamePrefix=\"grid-selector-dropdown\"\n                                        placeholder={\"Add a bill...\"}\n                                        options={[...this.props.sessionBillsList].filter(sb => billListIDs && billListIDs.length ? !billListIDs.includes(sb.LegislationID) : true)}\n                                        onChange={(value) => { this.selectSessionBill(value) }}\n                                        styles={{ container: provided => ({ ...provided, width: '130px', position: 'absolute' }) }}\n                                        value={this.state.selectedSessionBill}\n                                    />\n                                    <div style={{ left: '135px', position: 'absolute' }}>\n                                        {this.state.selectedSessionBill && this.props.billDataIsLoading === this.state.selectedSessionBill.LegislationNumber ?\n                                            <span className=\"small-spinner\"></span> : this.props.legislationVersionID === 10 ? <span style={{ fontSize: '12px' }}>OR</span> : null\n                                        }\n                                    </div>\n                                    {this.props.legislationVersionID === 10 &&\n                                        <form className=\"inner-grid\" style={{ left: '160px', width: '180px', position: 'absolute', gridTemplateColumns: '1fr min-content' }}>\n                                            <input\n                                                placeholder='Add by LD Number'\n                                                onChange={(e) => this.handleLdNumberSearchChange(e.target.value)}\n                                                value={this.state.ldNumberSearch}\n                                            />\n                                            {this.state.ldNumberSearch && <button className=\"button\" type=\"submit\" disabled={this.state.searchingLDNumber} onClick={(e) => this.searchByLDNumber(e)}>{this.state.searchingLDNumber ? <div><span className=\"small-spinner\"></span></div> : 'Search'}</button>}\n                                        </form>\n                                    }\n                                </div>\n                            }\n                            {!this.props.completedItems && this.props.legislationVersionID === 3 &&\n                                <button type=\"button\" className=\"button\" disabled={this.props.isSaving || !this.props.enrolledPrintQueue || !this.props.enrolledPrintQueue.length} onClick={this.props.batchComplete} style={{ position: 'relative' }}>Print Parchment</button>\n                            }\n                        </div>\n                        <div style={{ width: \"65px\"}}/>\n                        <div style={{ width: '200px' }}>\n                            {!this.props.completedItems && this.props.legislationVersionID === 3 && ((this.props.billList && this.props.billList.length) || this.props.reprintsFiltered) &&\n                                <button type=\"button\" className=\"button\" disabled={this.props.isSaving || !this.props.enrolledPrintQueue || !this.props.enrolledPrintQueue.length || !this.props.checkedBills || !this.props.checkedBills.length} onClick={() => { this.props.batchComplete(); this.props.batchPublish(); }} style={{ position: 'relative' }}>{\"Print Parchment & \" + (this.props.completedItems ? 'Republish' : 'Publish')}</button>\n                            }\n                        </div>\n                        <div style={{ flex: '100 0 auto', width: '100px' }} />\n                        <div style={{ width: '135px' }} />\n                        <div style={{ width: '135px' }}>\n                            {((this.props.billList && this.props.billList.length) || this.props.reprintsFiltered) ? <button type=\"button\" className=\"button\" disabled={this.props.isSaving || !this.props.checkedBills || !this.props.checkedBills.length} onClick={this.props.batchPublish} style={{ width: '135px', position: 'absolute' }}>{this.props.completedItems ? 'Batch Republish' : 'Batch Publish'}</button> : null}\n                            {this.props.checkedBills && this.props.checkedBills.length ?\n                                <div className=\"flex-row flex-vertical-center flex-start\" style={{ right: '91px', marginRight: '135px', position: 'absolute', height: '35px' }} >\n                                    <div className=\"toggle-switch\" onClick={this.props.togglePublishDatePreference}>\n                                        <input id=\"sr-status-change\" disabled={this.props.isSaving} readOnly checked={!this.props.useCurrentPublishDates} type=\"checkbox\" />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"sr-status-change\" style={{ padding: '0.25em 5px', margin: '0px' }}>Use custom publish date</label>\n                                </div>\n                                :\n                                null\n                            }\n                            {this.props.checkedBills && this.props.checkedBills.length && !this.props.useCurrentPublishDates ?\n                                <div id=\"publish-date-datepicker\" style={{ marginRight: '330px', position: 'absolute' }}>\n                                    <DatePicker\n                                        isClearable\n                                        selected={this.props.customPublishDate}\n                                        onChange={this.props.handlePublishDateChange}\n                                    />\n                                </div>\n                                :\n                                null\n                            }\n                        </div>\n                        <div style={{ width: '90px' }} />\n                    </div>\n                </div>\n                {\n                    this.props.reprintsFiltered && this.props.checkedBills && this.props.checkedBills.length && this.props.checkedBills.filter(b => !b.IsReprint).length ?\n                        <div style={{ display: 'flex' }}>\n                            <span className=\"input-feedback\" style={{ marginBottom: '0px' }}>You have checked legislation that are no longer in view as you are only viewing reprints.</span>\n                        </div>\n                        : null\n                }\n                <div>\n                    <ReactTable\n                        resizable={false}\n                        data={this.props.billList}\n                        loading={!this.props.isLoaded}\n                        ref={r => this.reactTable = r}\n                        columns={columns}\n                        minRows={1}\n                        defaultPageSize={20}\n                        pageSizeOptions={[5, 10, 15, 20, 25, 50, 100]}\n                        className=\"committee-table -striped -highlight react-table-hide-no-data\"\n                    />\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default BillGridSection;","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { billActionCreators } from '../../../stores/lis-legislation-store';\nimport * as Fields from '../../../lis-shared/lis-layout/components/lis-forms-component';\n\nclass SelectorSection extends React.Component {\n\n    constructor(props) {\n        super(props);\n        this.state = {\n        };\n\n        this.handleSessionChange = this.handleSessionChange.bind(this);\n        this.handleLegTypeChange = this.handleLegTypeChange.bind(this);\n        this.handleLegDateChange = this.handleLegDateChange.bind(this);\n        this.handleLegNumChange = this.handleLegNumChange.bind(this);\n    }\n\n    handleSessionChange(value) {\n        this.props.onChange('selectedSession', value);\n    }\n\n    handleLegTypeChange(value) {\n        this.props.onChange('selectedLegType', value);\n    }\n\n    handleLegDateChange(value) {\n        this.props.onChange('selectedLegDate', value)\n    }\n\n    handleLegNumChange(value) {\n        if (value === \"\") {\n            value = \"clear\";\n        }\n\n        this.props.onChange('selectedLegNum', { value: value })\n    }\n\n    render() {\n        return (\n            <div className=\"inner-grid four\">\n                <div>\n                    <Fields.Dropdown\n                        isDisabled={this.props.disable}\n                        value={this.props.selectedSession}\n                        options={this.props.sessionOptions}\n                        id=\"sessionDropdown\"\n                        onChange={this.handleSessionChange}\n                        placeholder=\"Select Session\"\n                    />\n                </div>\n                <div>\n                    <Fields.Dropdown\n                        isDisabled={this.props.disable}\n                        value={this.props.selectedLegType}\n                        options={this.props.legOptions}\n                        id=\"legDropdown\"\n                        onChange={this.handleLegTypeChange}\n                        placeholder=\"Select Legislation Version\"\n                    />\n                </div>\n                <div>\n                    <Fields.Dropdown\n                        value={this.props.selectedLegDate}\n                        placeholder=\"Filter by Date\"\n                        options={this.props.legDateOptions}\n                        id=\"billDateSearch\"\n                        onChange={(selectedOption, triggeredAction) => {\n                            if (triggeredAction.action === 'clear') {\n                                this.handleLegDateChange({ value: \"clear\" })\n                            } else {\n                                this.handleLegDateChange(selectedOption)\n                            }\n                        }}\n                        isDisabled={this.props.disable || this.props.selectedLegType === \"\"}\n                        isSearchable\n                        isClearable\n                    />\n                </div>\n                <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 50px\" }}>\n                    <input\n                        value={this.props.selectedLegNum.value === \"clear\" ? \"\" : this.props.selectedLegNum.value}\n                        id=\"billNumSearch\"\n                        onChange={(e) => this.handleLegNumChange(e.target.value)}\n                        disabled={this.props.disable || this.props.selectedLegType === \"\"}\n                        style={{ height: \"100%\", width: \"100%\" }}\n                        placeholder=\"Filter by Bill Number\"\n                    />\n                    <a className='icon delete' style={{ marginTop: \"10px\", marginLeft: \"15px\" }} onClick={() => this.handleLegNumChange(\"clear\")}></a>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { session, bills } = state;\n        return {\n            session,\n            bills\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, sessionActionCreators, billActionCreators), dispatch)\n        }\n    }\n)(SelectorSection)","import React from 'react';\nimport renderHTML from 'react-render-html';\n\nclass PreviewSection extends React.Component {\n    render() {\n        const { billVersionRef, selectedLegType, editorContent, selectedBill, error } = this.props;\n        const version = billVersionRef.find(version => version.LegislationVersionID === selectedLegType.LegislationVersionID);\n        // A list of versions that get vertical text running down the side of the document\n        const verticalTextVersionTypes = ['Substitute', 'Introduced', 'Engrossed', 'Enrolled'];\n\n        return (\n            <div className=\"inner-grid two-col-sidebar version-print-preview\" style={{marginBottom: \"45px\"}}>\n                {error ?\n                    <div className=\"message-error\">{error}</div>\n                    :\n                    <React.Fragment>\n                        <div>\n                            {editorContent ? renderHTML(editorContent.replaceAll(\"&nbsp;\", \"\")) : ''}\n                        </div>\n                        {verticalTextVersionTypes.find(type => type === version.Name) &&\n                            <div className=\"status-text\">\n                                <div className=\"vertical-text-lg\">{version.Name}</div>\n                                <div className=\"vertical-text-sm\"><span>{selectedBill.LegislationNumber}{version ? version.Suffix : ''}</span></div>\n                            </div>\n                        }\n                    </React.Fragment>\n                }\n            </div>\n        );\n    }\n}\n\nexport default PreviewSection;","import React from 'react';\nimport ReactTable from \"react-table\";\n\nclass TextList extends React.Component {\n\n    render() {\n        let nonAmendments = [];\n        this.props.originalBillText.forEach((text, index) => {\n            if (![\"Amendment\", \"Conference Report\"].includes(text.LegislationVersion) && (text.LegislationVersion !== \"Gov Recommendation\" || this.props.selectedLegType.Name === \"Gov Recommendation\")) {\n                nonAmendments.push({ ...text, originalIndex: index })\n            }\n        });\n        return (\n            <div>\n                <ReactTable\n                    data={nonAmendments}\n                    showPageSizeOptions={false}\n                    showPagination={false}\n                    showPageJump={false}\n                    pageSize={nonAmendments.length}\n                    getTrProps={(_state, rowInfo) => {\n                        const original = rowInfo ? rowInfo.original : null;\n                        return {\n                            style: {\n                                background: original && original.originalIndex === this.props.selectedBillTextIndex ? '#89ff89' : '',\n                                cursor: 'pointer'\n                            },\n                            onClick: () => {\n                                this.props.selectBillIndex(original.originalIndex);\n                            }\n                        }\n                    }}\n                    noDataText=\"\"\n                    columns={[\n                        {\n                            id: \"checkbox\",\n                            className: \"checkbox-column\",\n                            Cell: ({ original }) => this.props.changingBillIndex !== false && this.props.changingBillIndex === original.originalIndex ? <span className=\"small-spinner\"></span> : <span className={original.originalIndex === this.props.selectedBillTextIndex ? \"icon checkmark\" : \"\"}></span>,\n                            sortable: false,\n                            filterable: false,\n                            width: 45\n                        },\n                        {\n                            Cell: ({ original }) => <span>{`${original.DocumentCode} ${!original.IsActive ? \"INACTIVE\" : ''} ${!original.IsPublic ? \"NOT PUBLISHED\" : ''}`}</span>\n                        }\n                    ]}\n                    className=\"-striped -highlight\"\n                />\n            </div>\n        );\n\n    }\n}\nexport default TextList;","import { createBrowserHistory } from \"history\";\nimport { publicRequest } from \"../services/request.service\";\n\nconst previousLocationRequest = \"REQUEST_PREVIOUS_LOCATION\";\nconst changeSessionRequest = \"CHANGE_SESSION\";\nconst makeToastRequest = \"MAKE_TOAST\";\nconst toggleOverlayRequest = \"TOGGLE_OVERLAY\"\nconst fileSuccess = \"FILE_SUCCESS\";\nconst fileFailure = \"FILE_FAILURE\";\nconst reloadSessionSelectorChange = \"RELOAD_SESSION_SELECTOR_CHANGE\";\n\nconst history = createBrowserHistory;\n\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst initialState = {\n    currentLocation: history.location,\n    previousLocation: '',\n    session: '',\n    toasts: [],\n    hideSessionSelectorPaths: [\n        '/profile',\n        '/developers',\n        'change-password',\n        'passwordreset',\n        '/forgot-password',\n        '/register-account',\n        '/committee-management',\n        '/session-management',\n        '/docket-management',\n        '/calendar-management',\n        '/minutes-management',\n        '/journal-management',\n        '/communications-management',\n        '/configurations-management',\n        '/version-management',\n        '/bill-search-report',\n        '/bill-details',\n        '/vote-details',\n        '/vote-management',\n        '/vote-search',\n        '/member-management',\n        '/print-management',\n        '/pdf',\n        '\\/calendar\\/[0-9]+',\n        '/member-legislation',\n        'notifications',\n        '/apiregistration'\n    ],\n    showOverlay: false\n};\n\nexport const navActionCreators = {\n    getPreviousLocation: (previousLocation) => ({\n        type: previousLocationRequest,\n        previousLocation: previousLocation\n    }),\n\n    changeSession: (session) => ({\n        type: changeSessionRequest,\n        session: session\n    }),\n\n    makeToast: (message) => ({\n        type: makeToastRequest,\n        toasts: message\n    }),\n\n    toggleOverlay: (overlay) => ({\n        type: toggleOverlayRequest,\n        showOverlay: overlay\n    }),\n\n    receiveFile: (result) => ({\n        type: fileSuccess,\n        file: result\n    }),\n\n    fileError: (message) => ({\n        type: fileFailure,\n        fileError: message\n    }),\n\n    getFile(url) {\n        return dispatch => {\n            let config = {\n                method: 'GET',\n                headers: { \"WebAPIKey\": process.env.REACT_APP_API_KEY }\n            }\n            return fetch(url, config)\n                .then(response => {\n                    if (response.status === 204) {\n                        dispatch(navActionCreators.fileError('No Content'));\n                        return Promise.reject('No Content');\n                    } else if (response.status > 399) {\n                        return (response.text()\n                            .then(text => {\n                                dispatch(navActionCreators.fileError(text));\n                                return Promise.reject(text)\n                            })\n                        )\n                    }\n                    return response.text();\n                })\n                .then((data) => {\n                    dispatch(navActionCreators.receiveFile(data));\n                }).catch(err => {\n                    console.log(err);\n                    return Promise.reject(err);\n                });\n        }\n    },\n\n    reloadSessionSelector: (reload) => ({\n        type: reloadSessionSelectorChange,\n        reloadSessionSelector: reload\n    })\n};\n\nexport const reducer = (state, action) => {\n    state = state || initialState;\n    switch (action.type) {\n        case previousLocationRequest:\n            return Object.assign({}, state, {\n                previousLocation: action.previousLocation\n            });\n        case changeSessionRequest:\n            return Object.assign({}, state, {\n                session: action.session\n            });\n        case makeToastRequest:\n            return Object.assign({}, state, {\n                toasts: action.toasts\n            });\n        case toggleOverlayRequest:\n            return Object.assign({}, state, {\n                showOverlay: action.showOverlay\n            });\n        case fileSuccess:\n            return Object.assign({}, state, {\n                file: action.file\n            });\n        case fileFailure:\n            return Object.assign({}, state, {\n                fileError: action.fileError\n            });\n        case reloadSessionSelectorChange:\n            return Object.assign({}, state, {\n                reloadSessionSelector: action.reloadSessionSelector\n            });\n        default:\n            return state;\n    }\n};\n","import { partnerRequest, publicRequest } from '../services/request.service'\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst getDefaultSessionAsyncRequest = 'GET_DEFAULT_SESSION_ASYNC_REQUEST';\nconst getDefaultSessionAsyncSuccess = 'GET_DEFAULT_SESSION_ASYNC_SUCCESS';\nconst getDefaultSessionAsyncFailure = 'GET_DEFAULT_SESSION_ASYNC_FAILURE';\n\nconst getSessionListRequest = 'GET_SESSION_LIST_REQUEST';\nconst getSessionListSuccess = 'GET_SESSION_LIST_SUCCESS';\nconst getSessionListFailure = 'GET_SESSION_LIST_FAILURE';\n\nconst getSessionShallowListSuccess = 'GET_SESSION_SHALLOW_LIST_SUCCESS';\nconst getSessionShallowListFailure = 'GET_SESSION_SHALLOW_LIST_FAILURE';\n\nconst getDefaultSessionSuccess = 'GET_DEFAULT_SESSION_SUCCESS';\n\nconst getSessionByIdRequest = 'GET_SESSION_BY_ID_REQUEST';\nconst getSessionByIdSuccess = 'GET_SESSION_BY_ID_SUCCESS';\nconst getSessionByIdFailure = 'GET_SESSION_BY_ID_FAILURE';\n\nconst getSessionEventTypesRequest = 'GET_SESSION_EVENT_TYPES_REQUEST';\nconst getSessionEventTypesSuccess = 'GET_SESSION_EVENT_TYPES_SUCCESS';\nconst getSessionEventTypesFailure = 'GET_SESSION_EVENT_TYPES_FAILURE';\n\nconst editSessionRequest = 'EDIT_SESSION_REQUEST';\nconst editSessionSuccess = 'EDIT_SESSION_SUCCESS';\nconst editSessionFailure = 'EDIT_SESSION_FAILURE';\n\nconst createSessionRequest = 'CREATE_SESSION_REQUEST';\nconst createSessionSuccess = 'CREATE_SESSION_SUCCESS';\nconst createSessionFailure = 'CREATE_SESSION_FAILURE';\n\nconst getSessionByCodeRequest = 'GET_SESSION_BY_CODE_REQUEST';\n\nconst initialState = {\n    defaultSession: [], // sets default session from the session list\n    defaultSessionAsync: [], // sets default session from a call to API to find the default\n    sessionList: [],\n    sessionListError: '',\n    sessionShallowList: [],\n    sessionEventTypes: [],\n    sessionEvents: [],\n    selectedSession: {\n        SessionCode: '',\n        DisplayName: '',\n        SessionID: '',\n        SessionYear: '',\n        SessionType: { value: '', label: '' },\n        IsDefault: false,\n        SessionStart: null,\n        BillCrossover: null,\n        PrefileStart: null,\n        BillCutoff: null,\n        Adjournment: null,\n        Reconvene: null,\n        SessionEvents: []\n    },\n    getSessionError: '',\n    saveSession: '',\n    saveSessionError: '',\n    createSession: '',\n    createSessionError: ''\n};\n\nexport const sessionActionCreators = {\n\n    requestSessionEventTypes: () => ({\n        type: getSessionEventTypesRequest,\n        sessionEventTypes: [],\n        isFetching: true\n    }),\n\n    receiveSessionEventTypes: (responseObj) => ({\n        type: getSessionEventTypesSuccess,\n        isFetching: false,\n        sessionEventTypes: responseObj\n    }),\n\n    sessionEventTypesError: (message) => ({\n        type: getSessionEventTypesFailure,\n        isFetching: false,\n        sessionEventTypes: [],\n        sessionEventTypesError: message\n    }),\n\n    getSessionEventTypes: () => {\n        return dispatch => {\n            dispatch(sessionActionCreators.requestSessionEventTypes());\n\n            return publicRequest((API_URL || process.env.REACT_APP_SESSION_API_URL) + '/Session/api/GetSessionEventTypeReferencesAsync/', 'GET', '', '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(sessionActionCreators.sessionEventTypesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(sessionActionCreators.receiveSessionEventTypes(result[1].SessionEventTypes))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(sessionActionCreators.sessionEventTypesError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    requestDefaultSessionAsync: () => ({\n        type: getDefaultSessionAsyncRequest,\n        defaultSessionAsync: [],\n        isFetching: true\n    }),\n\n    receiveDefaultSessionAsync: (responseObj) => ({\n        type: getDefaultSessionAsyncSuccess,\n        isFetching: false,\n        defaultSessionAsync: responseObj\n    }),\n\n    defaultSessionAsyncError: (message) => ({\n        type: getDefaultSessionAsyncFailure,\n        isFetching: false,\n        defaultSessionAsync: [],\n        defaultSessionAsyncError: message\n    }),\n\n    getDefaultSessionAsync: () => {\n        return dispatch => {\n            dispatch(sessionActionCreators.requestDefaultSessionAsync());\n\n            return publicRequest((API_URL || process.env.REACT_APP_SESSION_API_URL) + '/Session/api/getDefaultSessionAsync', 'GET', '', '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(sessionActionCreators.defaultSessionAsyncError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        let session = result[1];\n                        dispatch(sessionActionCreators.receiveDefaultSessionAsync(session))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(sessionActionCreators.defaultSessionAsyncError('No Content'))\n                        return Promise.reject('No Content')\n                    }\n                }).catch(err => console.log(err))\n        }\n    },\n\n    receiveDefaultSession: (sessiondata) => ({\n        type: getDefaultSessionSuccess,\n        defaultSession: sessiondata\n    }),\n\n    setDefaultSession: (defaultSessionObject) => {\n        return dispatch => {\n            dispatch(sessionActionCreators.receiveDefaultSession(defaultSessionObject));\n        }\n    },\n\n    requestSessionList: () => ({\n        type: getSessionListRequest,\n        sessionList: [],\n        isFetching: true\n    }),\n\n    receiveSessionList: (sessiondata) => ({\n        type: getSessionListSuccess,\n        isFetching: false,\n        sessionList: sessiondata\n    }),\n\n    sessionListError: (message) => ({\n        type: getSessionListFailure,\n        isFetching: false,\n        sessionList: [],\n        sessionListError: message\n    }),\n\n    getSessionList: (year = '') => {\n        return dispatch => {\n            dispatch(sessionActionCreators.requestSessionList());\n            let params = ''\n            if (year) params += 'year=' + year\n\n            return publicRequest((API_URL || process.env.REACT_APP_SESSION_API_URL) + '/Session/api/GetSessionListAsync/?', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(sessionActionCreators.sessionListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(sessionActionCreators.receiveSessionList(result[1].Sessions))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(sessionActionCreators.receiveSessionList([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveSessionShallowList: (sessiondata) => ({\n        type: getSessionShallowListSuccess,\n        sessionShallowList: sessiondata\n    }),\n\n    sessionShallowListError: (message) => ({\n        type: getSessionShallowListFailure,\n        sessionShallowList: [],\n        sessionShallowListMessage: message\n    }),\n\n    getSessionShallowList: (params) => {\n        return dispatch => {\n            return publicRequest((API_URL || process.env.REACT_APP_SESSION_API_URL) + '/Session/api/GetSessionShallowListAsync/?', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(sessionActionCreators.sessionShallowListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        let session = result[1];\n                        dispatch(sessionActionCreators.receiveSessionShallowList(session.Sessions))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(sessionActionCreators.sessionShallowListError('No Content'))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    requestSessionById: () => ({\n        type: getSessionByIdRequest,\n        selectedSession: '',\n        isFetching: true\n    }),\n\n    receiveSessionById: (sessiondata, sessionEvents) => ({\n        type: getSessionByIdSuccess,\n        isFetching: false,\n        selectedSession: sessiondata,\n        sessionEvents: sessionEvents\n    }),\n\n    sessionByIdError: (message) => ({\n        type: getSessionByIdFailure,\n        isFetching: false,\n        selectedSession: '',\n        message\n    }),\n\n    getSessionById: (params, partner) => {\n        return dispatch => {\n            dispatch(sessionActionCreators.requestSessionById());\n            let request;\n            if (partner) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_SESSION_API_URL) + '/Session/api/GetPartnerSessionByIdAsync/', 'GET', '', '', params)    \n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_SESSION_API_URL) + '/Session/api/GetSessionByIdAsync/', 'GET', '', '', params)\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(sessionActionCreators.sessionByIdError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        const sessionData = result[1].Sessions[0];\n                        dispatch(sessionActionCreators.receiveSessionById(sessionData, sessionData.SessionEvents))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(sessionActionCreators.sessionByIdError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    getSessionByCode: (params) => {\n        return dispatch => {\n            return publicRequest((API_URL || process.env.REACT_APP_SESSION_API_URL) + '/Session/api/GetSessionByCodeAsync/', 'GET', '', '', params)\n            .then(result => {\n                if (result[0] === REQUEST_FAILURE) {\n                    dispatch({\n                        type: getSessionByCodeRequest,\n                        getSessionError: result[1]\n                    });\n                    return Promise.reject(result[1])\n                } else if (result[0] === REQUEST_SUCCESS) {\n                    dispatch({\n                        type: getSessionByCodeRequest,\n                        selectedSession: result[1].Sessions[0]\n                    });\n                } else if (result[0] === NO_CONTENT) {\n                    dispatch({\n                        type: getSessionByCodeRequest,\n                        getSessionError: \"No Content\"\n                    });\n                    return Promise.reject('No Content')\n                } else if (result.name === 'AbortError') {\n                    return Promise.reject(\"Aborted\");\n                }\n            }).catch(err => Promise.reject(err))\n        }\n    },\n\n    setSelectedSession: (sessionObject, sessionEvents) => {\n        return dispatch => {\n            dispatch(sessionActionCreators.receiveSessionById(sessionObject, sessionEvents));\n        }\n    },\n\n    receiveEditSession: (res) => ({\n        type: editSessionSuccess,\n        isFetching: false,\n        saveSession: res\n    }),\n    editSessionError: (res) => ({\n        type: editSessionFailure,\n        isFetching: false,\n        saveSessionError: res\n    }),\n    editSession: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_SESSION_API_URL) + '/Session/api/SaveSessionAsync/', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(sessionActionCreators.editSessionError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(sessionActionCreators.receiveEditSession(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(sessionActionCreators.editSessionError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveCreateSession: (res) => ({\n        type: createSessionSuccess,\n        isFetching: false,\n        createSession: res\n    }),\n    createSessionError: (res) => ({\n        type: createSessionFailure,\n        isFetching: false,\n        createSessionError: res\n    }),\n    createSession: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_SESSION_API_URL) + '/Session/api/CreateSessionAsync/', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(sessionActionCreators.createSessionError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(sessionActionCreators.receiveCreateSession(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(sessionActionCreators.createSessionError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    }\n};\n\n\nexport const reducer = (state, action) => {\n\n    state = state || initialState;\n\n    switch (action.type) {\n        case getDefaultSessionAsyncRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            })\n        case getDefaultSessionAsyncSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                defaultSessionAsync: action.defaultSessionAsync,\n                defaultSessionAsyncMessage: ''\n            })\n        case getDefaultSessionAsyncFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                defaultSessionAsyncError: action.defaultSessionAsyncMessage\n            })\n        case getSessionEventTypesRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            })\n        case getSessionEventTypesSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                sessionEventTypes: action.sessionEventTypes,\n                sessionEventTypesMessage: ''\n            })\n        case getSessionEventTypesFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                sessionEventTypesMessage: action.sessionEventTypesMessage\n            })\n        case getSessionListRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            })\n        case getSessionListSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                sessionList: action.sessionList,\n                sessionListError: ''\n            })\n        case getSessionListFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                sessionListError: action.sessionListError\n            })\n        case getSessionShallowListSuccess:\n            return Object.assign({}, state, {\n                sessionShallowList: action.sessionShallowList,\n                sessionShallowListMessage: ''\n            })\n        case getSessionShallowListFailure:\n            return Object.assign({}, state, {\n                sessionShallowListMessage: action.sessionShallowListMessage\n            })\n        case getDefaultSessionSuccess:\n            return Object.assign({}, state, {\n                defaultSession: action.defaultSession\n            })\n        case getSessionByIdRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            })\n        case getSessionByIdSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                selectedSession: action.selectedSession,\n                sessionEvents: action.sessionEvents,\n                errorMessage: ''\n            })\n        case getSessionByIdFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.message\n            })\n        case editSessionRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            })\n        case editSessionSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                saveSession: action.saveSession,\n                saveSessionError: ''\n            })\n        case editSessionFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                saveSessionError: action.saveSessionError\n            })\n        case createSessionRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            })\n        case createSessionSuccess:\n            return Object.assign({}, state, {\n                createSession: action.createSession,\n                createSessionError: ''\n            })\n        case createSessionFailure:\n            return Object.assign({}, state, {\n                createSessionError: action.createSessionError\n            })\n        case getSessionByCodeRequest:\n            return Object.assign({}, state, {\n                selectedSession: action.selectedSession || state.selectedSession,\n                getSessionError: action.getSessionError || ''\n            });\n        default:\n            return state\n    }\n};","import React from 'react';\nimport classnames from 'classnames';\nimport Select, { createFilter } from 'react-select';\nimport DatePicker from 'react-datepicker';\nimport { FixedSizeList as List } from \"react-window\";\n\nconst InputFeedback = ({ error }) =>\n    error ? (\n        <div className=\"input-feedback\">{error}</div>\n    ) : null;\n\nconst Label = ({\n    error,\n    className,\n    children,\n    ...props\n}) => {\n    return (\n        <label className=\"label\" {...props}>\n            {children}\n        </label>\n    );\n};\n\n\n//ADVANCED SEARCH OPTIONS\n\nexport const patronTypeOptions = [\n    { value: '1', label: 'Chief Patron' },\n    { value: '2', label: 'Co-Patron' },\n    { value: '3', label: 'Other' }\n];\n\nexport const searchTypeOptions = [\n    { value: 'all', label: 'All' },\n    { value: 'billNumber', label: 'Bill Number' },\n    { value: 'catchline', label: 'Catchline' }\n];\n\nexport const billActionsOptions = [\n    { value: 'introduced', label: 'Introduced' },\n    { value: 'passedHouse', label: 'Passed House' },\n    { value: 'passedSenate', label: 'Passed Senate' },\n    { value: 'passedBoth', label: 'Passed Both' },\n    { value: 'approvedEnacted', label: 'Approved/Enacted' }\n];\n\nexport const originatingChamberOptions = [\n    { value: 'H', label: 'House' },\n    { value: 'S', label: 'Senate' }\n];\n\n//EDIT/CREATE SESSION OPTIONS\n\nexport const sessionOptions = [\n    { value: 'Current Biennium', label: 'Current Biennium' },\n    { value: 'All Sessions', label: 'All Sessions' }\n];\n\nexport const districtOptions = [\n    { value: 'District 1', label: 'District 1' },\n    { value: 'District 2', label: 'District 2' }\n];\n\nexport const activeSessionOptions = [\n    { value: 'primary', label: 'Primary' },\n    { value: 'secondary', label: 'Secondary' },\n    { value: 'none', label: 'None' }\n];\n\nexport const sessionTypeOptions = [\n    { value: 1, label: 'Regular' },\n    { value: 2, label: 'Special' }\n];\n\n//EDIT/CREATE USER OPTIONS\n\nexport const orgOptions = [\n    { value: 'OrgName1', label: 'OrgName1' },\n    { value: 'OrgName2', label: 'OrgName2' },\n    { value: 'OrgName4', label: 'OrgName4' },\n    { value: 'OrgName5', label: 'OrgName5' },\n    { value: 'OrgName6', label: 'OrgName6' }\n];\n\n\nexport const stateOptions = [\n    {\n        \"value\": \"Alabama\",\n        \"label\": \"AL\"\n    },\n    {\n        \"value\": \"Alaska\",\n        \"label\": \"AK\"\n    },\n    {\n        \"value\": \"American Samoa\",\n        \"label\": \"AS\"\n    },\n    {\n        \"value\": \"Arizona\",\n        \"label\": \"AZ\"\n    },\n    {\n        \"value\": \"Arkansas\",\n        \"label\": \"AR\"\n    },\n    {\n        \"value\": \"California\",\n        \"label\": \"CA\"\n    },\n    {\n        \"value\": \"Colorado\",\n        \"label\": \"CO\"\n    },\n    {\n        \"value\": \"Connecticut\",\n        \"label\": \"CT\"\n    },\n    {\n        \"value\": \"Delaware\",\n        \"label\": \"DE\"\n    },\n    {\n        \"value\": \"District Of Columbia\",\n        \"label\": \"DC\"\n    },\n    {\n        \"value\": \"Federated States Of Micronesia\",\n        \"label\": \"FM\"\n    },\n    {\n        \"value\": \"Florida\",\n        \"label\": \"FL\"\n    },\n    {\n        \"value\": \"Georgia\",\n        \"label\": \"GA\"\n    },\n    {\n        \"value\": \"Guam\",\n        \"label\": \"GU\"\n    },\n    {\n        \"value\": \"Hawaii\",\n        \"label\": \"HI\"\n    },\n    {\n        \"value\": \"Idaho\",\n        \"label\": \"ID\"\n    },\n    {\n        \"value\": \"Illinois\",\n        \"label\": \"IL\"\n    },\n    {\n        \"value\": \"Indiana\",\n        \"label\": \"IN\"\n    },\n    {\n        \"value\": \"Iowa\",\n        \"label\": \"IA\"\n    },\n    {\n        \"value\": \"Kansas\",\n        \"label\": \"KS\"\n    },\n    {\n        \"value\": \"Kentucky\",\n        \"label\": \"KY\"\n    },\n    {\n        \"value\": \"Louisiana\",\n        \"label\": \"LA\"\n    },\n    {\n        \"value\": \"Maine\",\n        \"label\": \"ME\"\n    },\n    {\n        \"value\": \"Marshall Islands\",\n        \"label\": \"MH\"\n    },\n    {\n        \"value\": \"Maryland\",\n        \"label\": \"MD\"\n    },\n    {\n        \"value\": \"Massachusetts\",\n        \"label\": \"MA\"\n    },\n    {\n        \"value\": \"Michigan\",\n        \"label\": \"MI\"\n    },\n    {\n        \"value\": \"Minnesota\",\n        \"label\": \"MN\"\n    },\n    {\n        \"value\": \"Mississippi\",\n        \"label\": \"MS\"\n    },\n    {\n        \"value\": \"Missouri\",\n        \"label\": \"MO\"\n    },\n    {\n        \"value\": \"Montana\",\n        \"label\": \"MT\"\n    },\n    {\n        \"value\": \"Nebraska\",\n        \"label\": \"NE\"\n    },\n    {\n        \"value\": \"Nevada\",\n        \"label\": \"NV\"\n    },\n    {\n        \"value\": \"New Hampshire\",\n        \"label\": \"NH\"\n    },\n    {\n        \"value\": \"New Jersey\",\n        \"label\": \"NJ\"\n    },\n    {\n        \"value\": \"New Mexico\",\n        \"label\": \"NM\"\n    },\n    {\n        \"value\": \"New York\",\n        \"label\": \"NY\"\n    },\n    {\n        \"value\": \"North Carolina\",\n        \"label\": \"NC\"\n    },\n    {\n        \"value\": \"North Dakota\",\n        \"label\": \"ND\"\n    },\n    {\n        \"value\": \"Northern Mariana Islands\",\n        \"label\": \"MP\"\n    },\n    {\n        \"value\": \"Ohio\",\n        \"label\": \"OH\"\n    },\n    {\n        \"value\": \"Oklahoma\",\n        \"label\": \"OK\"\n    },\n    {\n        \"value\": \"Oregon\",\n        \"label\": \"OR\"\n    },\n    {\n        \"value\": \"Palau\",\n        \"label\": \"PW\"\n    },\n    {\n        \"value\": \"Pennsylvania\",\n        \"label\": \"PA\"\n    },\n    {\n        \"value\": \"Puerto Rico\",\n        \"label\": \"PR\"\n    },\n    {\n        \"value\": \"Rhode Island\",\n        \"label\": \"RI\"\n    },\n    {\n        \"value\": \"South Carolina\",\n        \"label\": \"SC\"\n    },\n    {\n        \"value\": \"South Dakota\",\n        \"label\": \"SD\"\n    },\n    {\n        \"value\": \"Tennessee\",\n        \"label\": \"TN\"\n    },\n    {\n        \"value\": \"Texas\",\n        \"label\": \"TX\"\n    },\n    {\n        \"value\": \"Utah\",\n        \"label\": \"UT\"\n    },\n    {\n        \"value\": \"Vermont\",\n        \"label\": \"VT\"\n    },\n    {\n        \"value\": \"Virgin Islands\",\n        \"label\": \"VI\"\n    },\n    {\n        \"value\": \"Virginia\",\n        \"label\": \"VA\"\n    },\n    {\n        \"value\": \"Washington\",\n        \"label\": \"WA\"\n    },\n    {\n        \"value\": \"West Virginia\",\n        \"label\": \"WV\"\n    },\n    {\n        \"value\": \"Wisconsin\",\n        \"label\": \"WI\"\n    },\n    {\n        \"value\": \"Wyoming\",\n        \"label\": \"WY\"\n    }\n]\n\n// Styles for select dropdowns to make them same size as other fields\nconst customStyles = {\n    option: (base, state) => ({\n        ...base,\n        fontSize: '0.8em',\n    }),\n    control: (base) => ({\n        ...base,\n        padding: '1px',\n        margin: 0,\n        minHeight: 0,\n        fontSize: '0.8em',\n    }),\n    menu: (base) => ({\n        ...base,\n        zIndex: '102' //show over fixed floating save bars\n    }),\n    singleValue: (base, state) => {\n        return { ...base, };\n    }\n}\n\nexport class CustomSelect extends React.Component {\n    handleChange = value => {\n        this.props.onChange(this.props.id, value);\n    };\n    handleBlur = () => {\n        this.props.onBlur(this.props.id, true);\n    };\n\n    render() {\n        return (\n            <div>\n                <label>{this.props.label}</label>\n                <Select\n                    className={this.props.className}\n                    placeholder={this.props.placeholder}\n                    styles={customStyles}\n                    options={this.props.options}\n                    isMulti={this.props.isMulti}\n                    isDisabled={this.props.isDisabled}\n                    onChange={this.handleChange}\n                    onBlur={this.handleBlur}\n                    value={this.props.value}\n                    filterOption={this.props.filterOption}\n                />\n            </div>\n        );\n    }\n}\n\nexport class CustomDatepicker extends React.Component {\n    handleChange = value => {\n        this.props.onChange(this.props.id, value);\n    };\n    handleBlur = () => {\n        this.props.onBlur(this.props.id, true);\n    };\n\n    render() {\n        return (\n            <div>\n                <label>{this.props.label}</label>\n                <DatePicker\n                    id={this.props.id}\n                    className={this.props.className}\n                    selected={this.props.value}\n                    onChange={this.handleChange}\n                    disabled={this.props.disabled}\n                    placeholderText={this.props.placeholderText}\n                    popperPlacement={this.props.popperPlacement}\n                    withPortal={this.props.withPortal}\n                    filterDate={this.props.filterDate}\n                />\n            </div>\n        );\n    }\n}\n\nclass MenuList extends React.Component {\n    render() {\n        const { options, children, maxHeight, getValue } = this.props;\n        const [value] = getValue();\n        const height = this.props.height || 35;\n        const initialOffset = options.indexOf(value) * height;\n        return (\n            <List\n                height={maxHeight}\n                itemCount={children.length}\n                itemSize={height}\n                initialScrollOffset={initialOffset}\n            >\n                {({ index, style }) => <div style={style}>{children[index]}</div>}\n            </List>\n        );\n    }\n}\n\n//React-select does not work well with large lists greater than 1000 items. This component utilizes react-window to only render a portion of the list so perfomance is not degraded.\nexport class LargeListSelect extends React.Component {\n    render() {\n        return (<Select\n            {...this.props}\n            filterOption={createFilter({ ignoreCase: true, ignoreAccents: false, matchFrom: 'any', stringify: option => `${option.label}`, trim: true, })}\n            components={{ MenuList }}\n        />)\n    }\n}\n\nexport const Dropdown = ({\n    options,\n    styles,\n    value,\n    onChange,\n    multi,\n    onBlur,\n    ...props\n}) => {\n    return (\n        <Select\n            options={options}\n            styles={customStyles}\n            multi={multi}\n            onChange={onChange}\n            onBlur={onBlur}\n            value={value}\n            {...props}\n        />\n    );\n};\n\nexport const TextInput = ({\n    type,\n    id,\n    label,\n    error,\n    value,\n    onChange,\n    className,\n    defaultValue,\n    ...props\n}) => {\n    return (\n        <div>\n            <Label htmlFor={id} error={error}>\n                {label}\n            </Label>\n            <input\n                id={id}\n                className={className}\n                type={type}\n                value={value}\n                defaultValue={defaultValue}\n                onChange={onChange}\n                {...props}\n            />\n            <InputFeedback error={error} />\n        </div>\n    );\n};\n\nexport const TextArea = ({\n    id,\n    label,\n    error,\n    value,\n    onChange,\n    className,\n    ...props\n}) => {\n    return (\n        <div>\n            <Label htmlFor={id} error={error}>\n                {label}\n            </Label>\n            <textarea\n                id={id}\n                className={className}\n                value={value}\n                onChange={onChange}\n                {...props}\n            />\n            <InputFeedback error={error} />\n        </div>\n    );\n};\n\nexport const CheckboxInput = ({\n    type,\n    id,\n    label,\n    error,\n    value,\n    onChange,\n    className,\n    ...props\n}) => {\n    const classes = classnames(\n        'input-group',\n        {\n            'animated shake error': !!error,\n        },\n        className\n    );\n    return (\n        <div className={classes}>\n            <Label htmlFor={id} error={error}>\n                {label}\n            </Label>\n            <label className=\"checkbox-label\">\n                <input\n                    id={id}\n                    className=\"formCheckbox\"\n                    type={type}\n                    checked={value}\n                    value={value}\n                    onChange={onChange}\n                    {...props}\n                />\n                <span>\n                    {value ? 'Yes' : 'No'}\n                </span>\n            </label>\n            <InputFeedback error={error} />\n        </div>\n    );\n};","tinymce.PluginManager.add('rightmargin', function (editor) {\n    const width = '10px'    \n    const container = document.createElement('div');\n    editor.on('init', _e => {        \n        const root = editor.contentDocument.activeElement;        \n        root.style.marginRight = width;                \n        editor.contentAreaContainer.appendChild(container);\n    });\n})","import { partnerRequest, publicRequest } from '../services/request.service'\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst legislationIdsListRequest = \"GET_LEGISLATION_IDS_LIST_REQUEST\";\nconst legislationIdsListSuccess = \"GET_LEGISLATION_IDS_LIST_SUCCESS\";\nconst legislationIdsListFailure = \"GET_LEGISLATION_IDS_LIST_FAILURE\";\n\nconst billListByIdsRequest = \"GET_BILL_LIST_BY_IDS_REQUEST\";\nconst billListByIdsSuccess = \"GET_BILL_LIST_BY_IDS_SUCCESS\";\nconst billListByIdsFailure = \"GET_BILL_LIST_BY_IDS_FAILURE\";\n\nconst legislationTextsHitCountsRequest = \"GET_LEGISLATION_TEXTS_HIT_COUNTS_REQUEST\";\nconst legislationTextsHitCountsSuccess = \"GET_LEGISLATION_TEXTS_HIT_COUNTS_SUCCESS\";\nconst legislationTextsHitCountsFailure = \"GET_LEGISLATION_TEXTS_HIT_COUNTS_FAILURE\";\n\nconst billListRequest = \"GET_BILL_LIST_REQUEST\";\nconst billListSuccess = \"GET_BILL_LIST_SUCCESS\";\nconst billListFailure = \"GET_BILL_LIST_FAILURE\";\n\nconst mostFrequentBillListRequest = \"GET_MOST_FREQUENT_BILL_LIST_REQUEST\";\nconst mostFrequentBillListSuccess = \"GET_MOST_FREQUENT_BILL_LIST_SUCCESS\";\nconst mostFrequentBillListFailure = \"GET_MOST_FREQUENT_BILL_LIST_FAILURE\";\n\nconst billSummaryRequest = \"GET_BILL_SUMMARY_REQUEST\";\nconst billSummarySuccess = \"GET_BILL_SUMMARY_SUCCESS\";\nconst billSummaryFailure = \"GET_BILL_SUMMARY_FAILURE\";\n\nconst saveBillSummaryRequest = \"SAVE_BILL_SUMMARY_REQUEST\";\nconst saveBillSummarySuccess = \"SAVE_BILL_SUMMARY_SUCCESS\";\nconst saveBillSummaryFailure = \"SAVE_BILL_SUMMARY_FAILURE\";\n\nconst billHistorySuccess = \"GET_BILL_HISTORY_SUCCESS\";\nconst billHistoryFailure = \"GET_BILL_HISTORY_FAILURE\";\n\nconst billVersionRequest = \"GET_BILL_VERSION_REQUEST\";\nconst billVersionSuccess = \"GET_BILL_VERSION_SUCCESS\";\nconst billVersionFailure = \"GET_BILL_VERSION_FAILURE\";\n\nconst billNumbersSuccess = \"GET_BILL_NUMBERS_SUCCESS\";\nconst billNumbersFailure = \"GET_BILL_NUMBERS_FAILURE\";\n\nconst legislationClassesSuccess = \"GET_LEGISLATION_CLASSES_SUCCESS\";\nconst legislationClassesFailure = \"GET_LEGISLATION_CLASSES_FAILURE\";\n\nconst billStatusRefSuccess = \"GET_BILL_STATUS_REF_SUCCESS\";\nconst billStatusRefFailure = \"GET_BILL_STATUS_REF_FAILURE\";\n\nconst billStatusCategoryRefSuccess = \"GET_BILL_STATUS_CATEGORY_REF_SUCCESS\";\nconst billStatusCategoryRefFailure = \"GET_BILL_STATUS_CATEGORY_REF_FAILURE\";\n\nconst billEventRefSuccess = \"GET_BILL_EVENT_REF_SUCCESS\";\nconst billEventRefFailure = \"GET_BILL_EVENT_REF_FAILURE\";\n\nconst legislationEventsByIdSuccess = \"GET_LEGISLATION_EVENTS_BY_ID_SUCCESS\";\nconst legislationEventsByIdFailure = \"GET_LEGISLATION_EVENTS_BY_ID_FAILURE\";\n\nconst billTextSuccess = \"GET_BILL_TEXT_SUCCESS\";\nconst billTextFailure = \"GET_BILL_TEXT_FAILURE\";\n\nconst ihodAmendmentSaveSuccess = \"IHOD_AMENDMENT_SAVE_SUCCESS\";\nconst ihodAmendmentSaveFailure = \"IHOD_AMENDMENT_SAVE_FAILURE\";\n\nconst billVersionRefSuccess = \"GET_BILL_VERSION_REF_SUCCESS\";\nconst billVersionRefFailure = \"GET_BILL_VERSION_REF_FAILURE\";\n\nconst sponsorRefListSuccess = \"GET_SPONSOR_REF_LIST_SUCCESS\";\nconst sponsorRefListFailure = \"GET_SPONSOR_REF_LIST_FAILURE\";\n\nconst billSummaryRefSuccess = \"GET_BILL_SUMMARY_REF_SUCCESS\";\nconst billSummaryRefFailure = \"GET_BILL_SUMMARY_REF_FAILURE\";\n\nconst batchPublishSuccess = \"GET_BATCH_PUBLISH_SUCCESS\";\nconst batchPublishFailure = \"GET_BATCH_PUBLISH_FAILURE\";\n\nconst batchCompleteSuccess = \"GET_BATCH_COMPLETE_SUCCESS\";\nconst batchCompleteFailure = \"GET_BATCH_COMPLETE_FAILURE\";\n\nconst billTextSaveSuccess = \"GET_BILL_TEXT_SAVE_SUCCESS\";\nconst billTextSaveFailure = \"GET_BILL_TEXT_SAVE_FAILURE\";\n\nconst jsonHeadersSuccess = \"GET_JSON_HEADERS_SUCCESS\";\nconst jsonHeadersFailure = \"GET_JSON_HEADERS_FAILURE\";\n\nconst pdfPreviewSuccess = \"GET_VERSION_PREVIEW_SUCCESS\";\nconst pdfPreviewFailure = \"GET_VERSION_PREVIEW_FAILURE\";\n\nconst previewPdfFileSuccess = \"PREVIEW_PDF_FILE_SUCCESS\";\nconst previewPdfFileFailure = \"PREVIEW_PDF_FILE_FAILURE\";\n\nconst htmlPreviewSuccess = \"GET_HTML_PREVIEW_SUCCESS\";\nconst htmlPreviewFailure = \"GET_HTML_PREVIEW_FAILURE\";\n\nconst htmlFilePreviewSuccess = \"GET_HTML_FILE_PREVIEW_SUCCESS\";\nconst htmlFilePreviewFailure = \"GET_HTML_FILE_PREVIEW_FAILURE\";\n\nconst billSaveSuccess = \"GET_BILL_SAVE_SUCCESS\";\nconst billSaveFailure = \"GET_BILL_SAVE_FAILURE\";\n\nconst billFileGenSuccess = \"GET_BILL_FILE_GEN_SUCCESS\";\nconst billFileGenFailure = \"GET_BILL_FILE_GEN_FAILURE\";\n\nconst batchBillFileGenSuccess = \"GET_BATCH_BILL_FILE_GEN_SUCCESS\";\nconst batchBillFileGenFailure = \"GET_BATCH_BILL_FILE_GEN_FAILURE\";\n\nconst billManagementListSuccess = \"GET_BILL_MANAGEMENT_LIST_SUCCESS\";\nconst billManagementListFailure = \"GET_BILL_MANAGEMENT_LIST_FAILURE\";\n\nconst sessionBillsSuccess = \"GET_BILL_BY_SESSION_SUCCESS\";\nconst sessionBillsFailure = \"GET_BILL_BY_SESSION_FAILURE\";\n\nconst billEventsSuccess = \"GET_BILL_EVENT_TYPES_SUCCESS\";\nconst billEventsFailure = \"GET_BILL_EVENT_TYPES_FAILURE\";\n\nconst billEventSaveSuccess = \"GET_BILL_EVENT_SAVE_SUCCESS\";\nconst billEventSaveFailure = \"GET_BILL_EVENT_SAVE_FAILURE\";\n\nconst textListSuccess = \"GET_TEXT_LIST_SUCCESS\";\nconst textListFailure = \"GET_TEXT_LIST_FAILURE\";\n\nconst subjectListSuccess = \"GET_SUBJECT_LIST_SUCCESS\";\nconst subjectListFailure = \"GET_SUBJECT_LIST_FAILURE\";\n\nconst introDateListSuccess = \"GET_INTRO_DATE_LIST_SUCCESS\";\nconst introDateListFailure = \"GET_INTRO_DATE_LIST_FAILURE\";\n\nconst legislationAmendmentListSuccess = \"GET_LEGISLATION_AMENDMENT_LIST_SUCCESS\";\nconst legislationAmendmentListFailure = \"GET_LEGISLATION_AMENDMENT_LIST_FAILURE\";\n\nconst legislationDispositionsSuccess = \"GET_LEGISLATION_DISPOSITION_LIST_SUCCESS\";\nconst legislationDispositionsFailure = \"GET_LEGISLATION_DISPOSITION_LIST_FAILURE\";\n\nconst legislationStatusHistorySuccess = \"GET_LEGISLATION_STATUS_HISTORY_SUCCESS\";\nconst legislationStatusHistoryFailure = \"GET_LEGISLATION_STATUS_HISTORY_FAILURE\";\n\nconst deleteBlobFileSuccess = \"DELETE_BLOB_FILE_SUCCESS\";\nconst deleteBlobFileFailure = \"DELETE_BLOB_FILE_FAILURE\";\n\nconst sasURLSuccess = \"GET_SAS_URL_SUCCESS\";\nconst sasURLFailure = \"GET_SAS_URL_FAILURE\";\n\nconst billSuccess = \"GET_BILL_BY_ID_SUCCESS\";\nconst billFailure = \"GET_BILL_BY_ID_FAILURE\";\n\nconst uploadImpactStatementRequest = \"UPLOAD_IMPACT_STATEMENT_REQUEST\";\n\nconst initialState = {\n    legislationIdsList: [],\n    legislationIdsListPagination: null,\n    billListByIds: [],\n    billListByIdsPagination: null,\n    legislationTextsHitCounts: [],\n    billList: [],\n    billListPagination: null,\n    mostFrequentBillList: [],\n    billManagementList: [],\n    billManagementListError: '',\n    searchCriteria: [],\n    billDetails: [],\n    billsByMember: [],\n    billHistory: [],\n    billVersion: [],\n    billNumbers: [],\n    billSummary: [],\n    billSummarySave: [],\n    billVersionRef: [],\n    billVersionRefError: '',\n    sponsorRefList: [],\n    sponsorRefListError: '',\n    billEventRef: '',\n    billEventRefError: '',\n    billText: [],\n    billTextError: '',\n    batchPublishSave: [],\n    batchPublishError: '',\n    batchCompleteSave: [],\n    batchCompleteError: '',\n    billTextSave: [],\n    billTextSaveError: '',\n    jsonHeaders: [],\n    jsonHeadersError: '',\n    pdfPreview: '',\n    pdfPreviewError: '',\n    sasUrl: '',\n    sasUrlError: '',\n    htmlPreview: '',\n    htmlPreviewError: '',\n    htmlFilePreview: '',\n    htmlFilePreviewError: '',\n    billFileGen: '',\n    billFileGenError: '',\n    batchBillFileGen: '',\n    batchBillFileGenError: '',\n    billStatusReferences: [],\n    legislationClasses: [],\n    billStatusCategoryReferences: [],\n    sessionBills: [],\n    sessionBillsError: '',\n    billEvents: [],\n    billEventsError: '',\n    billEventSave: '',\n    billEventSaveError: '',\n    textList: [],\n    textListError: '',\n    subjectList: [],\n    subjectListError: '',\n    introDateList: [],\n    introDateListError: '',\n    legislationAmendmentList: [],\n    legislationAmendmentListError: '',\n    legislationDispositions: [],\n    legislationDispositionsError: '',\n    legislationStatusHistory: [],\n    legislationStatusHistoryError: '',\n    sasURLLink: '',\n    sasURLLinkError: '',\n    bill: '',\n    billError: '',\n    uploadImpactStatementResponse: '',\n    uploadImpactStatementError: '',\n    deleteBlobFileResponse: '',\n    deleteBlobFileError: '',\n};\n\nexport const billActionCreators = {\n\n    receiveBill: responseObj => ({\n        type: billSuccess,\n        bill: responseObj\n    }),\n\n    billError: message => ({\n        type: billFailure,\n        billError: message\n    }),\n\n    getBill: (params, partner) => {\n        return dispatch => {\n            let request = '';\n            if (partner) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_API_URL) + '/Legislation/api/GetPartnerLegislationByIdAsync/', 'GET', '', '', params)\n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_API_URL) + '/Legislation/api/GetLegislationByIdAsync/', 'GET', '', '', params)\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveBill(result[1].Legislations[0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.billError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveBillHistory: responseObj => ({\n        type: billHistorySuccess,\n        billHistory: responseObj\n    }),\n\n    billHistoryError: message => ({\n        type: billHistoryFailure,\n        billHistoryError: message\n    }),\n\n    getBillHistoryByBillID: (params, partner) => {\n        return dispatch => {\n            let request = '';\n\n            let headers = {\n                'cache-control': 'no-cache'\n            }\n\n            if (partner) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_EVENT_API_URL) + '/LegislationEvent/api/GetLegislationEventListAsync/', 'GET', headers, '', params)\n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_EVENT_API_URL) + '/LegislationEvent/api/GetLegislationEventByLegislationIDAsync/', 'GET', headers, '', params)\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billHistoryError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveBillHistory(result[1].LegislationEvents))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveBillHistory([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    //BILL VERSIONS\n    requestBillVersion: () => ({\n        type: billVersionRequest,\n        isFetching: true\n    }),\n\n    receiveBillVersion: responseObj => ({\n        type: billVersionSuccess,\n        isFetching: false,\n        billVersion: responseObj\n    }),\n\n    billVersionError: message => ({\n        type: billVersionFailure,\n        isFetching: false,\n        errorMessage: message\n    }),\n\n    getBillVersionByBillNumber: (params) => {\n        return dispatch => {\n            dispatch(billActionCreators.requestBillVersion());\n\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_VERSION_API_URL) + '/LegislationVersion/api/GetLegislationVersionbyBillNumberAsync', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billVersionError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveBillVersion(result[1].LegislationsVersion))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.billVersionError('No Content'))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    getBillVersionsByBillID: (params) => {\n        return dispatch => {\n            dispatch(billActionCreators.requestBillVersion());\n\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_VERSION_API_URL) + '/LegislationVersion/api/GetLegislationVersionbyLegislationIDAsync', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billVersionError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveBillVersion(result[1].LegislationsVersion))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.billVersionError('No Content'))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    //BILL SUMMARIES\n    requestBillSummary: () => ({\n        type: billSummaryRequest,\n        isFetching: true\n    }),\n\n    receiveBillSummary: responseObj => ({\n        type: billSummarySuccess,\n        isFetching: false,\n        billSummary: responseObj\n    }),\n\n    billSummaryError: message => ({\n        type: billSummaryFailure,\n        isFetching: false,\n        billSummary: [],\n        errorMessage: message\n    }),\n\n    getBillSummary: (params, partner) => {\n\n        return dispatch => {\n            dispatch(billActionCreators.requestBillSummary());\n\n            let request;\n            if (partner) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_SUMMARY_SERVICE) + '/LegislationSummary/api/GetLegislationSummaryByIDAsync', 'GET', '', '', params);\n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_SUMMARY_SERVICE) + '/LegislationSummary/api/GetLegislationSummaryListAsync', 'GET', '', '', params);\n            }\n\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billSummaryError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveBillSummary(partner ? result[1].SummaryList : result[1].LegislationSummaries))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.billSummaryError('No Content'))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    //SAVE BILL SUMMARY\n    requestSaveBillSummary: () => ({\n        type: saveBillSummaryRequest,\n        isFetching: true\n    }),\n\n    receiveSaveBillSummary: responseObj => ({\n        type: saveBillSummarySuccess,\n        isFetching: false,\n        billSummarySave: responseObj\n    }),\n\n    saveBillSummaryError: message => ({\n        type: saveBillSummaryFailure,\n        isFetching: false,\n        billSummarySave: [],\n        errorMessage: message\n    }),\n\n    saveBillSummary: (body) => {\n        return dispatch => {\n            dispatch(billActionCreators.requestSaveBillSummary());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_TEXT_API_URL) + '/LegislationSummary/api/SaveLegislationSummaryAsync', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.saveBillSummaryError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveSaveBillSummary(result[1]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveSaveBillSummary([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    //BILL STATUS REFERENCES\n    receiveBillStatusRefs: responseObj => ({\n        type: billStatusRefSuccess,\n        isFetching: false,\n        billStatusReferences: responseObj\n    }),\n\n    billStatusRefsError: message => ({\n        type: billStatusRefFailure,\n        isFetching: false,\n        errorMessage: message\n    }),\n\n    getBillStatusReferences: () => {\n        return dispatch => {\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_ADVANCED_SEARCH_API_URL) + '/AdvancedLegislationSearch/api/GetStatusReferencesAsync', 'GET', '', '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billStatusRefsError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveBillStatusRefs(result[1].References))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.billStatusRefsError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    //LEGISLATION CLASSES\n    receiveLegislationClasses: responseObj => ({\n        type: legislationClassesSuccess,\n        isFetching: false,\n        legislationClasses: responseObj\n    }),\n\n    legislationClassesError: message => ({\n        type: legislationClassesFailure,\n        isFetching: false,\n        errorMessage: message\n    }),\n\n    getLegislationClasses: () => {\n        return dispatch => {\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_API_URL) + '/Legislation/api/GetLegislationClassesAsync', 'GET', '', '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.legislationClassesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveLegislationClasses(result[1].LegislationClasses))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.legislationClassesError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    //BILL STATUS CATEGORY REFERENCES\n    receiveBillStatusCategoryRefs: responseObj => ({\n        type: billStatusCategoryRefSuccess,\n        isFetching: false,\n        billStatusCategoryReferences: responseObj\n    }),\n\n    billStatusCategoryRefsError: message => ({\n        type: billStatusCategoryRefFailure,\n        isFetching: false,\n        errorMessage: message\n    }),\n\n    getBillStatusCategoryReferences: () => {\n        return dispatch => {\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_ADVANCED_SEARCH_API_URL) + '/AdvancedLegislationSearch/api/GetLegislationCategoryReferencesAsync', 'GET', '', '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billStatusCategoryRefsError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveBillStatusCategoryRefs(result[1].LegislationCategoriesList))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.billStatusCategoryRefsError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveBillEventRefs: responseObj => ({\n        type: billEventRefSuccess,\n        billEventRef: responseObj\n    }),\n\n    billEventRefsError: message => ({\n        type: billEventRefFailure,\n        billEventRefError: message\n    }),\n\n    getBillEventReferences: (params) => {\n        return dispatch => {\n\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_EVENT_API_URL) + '/LegislationEvent/api/getLegislationEventTypeReferencesAsync', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billEventRefsError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveBillEventRefs(result[1].EventTypes))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.billEventRefsError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveLegislationEventsById: responseObj => ({\n        type: legislationEventsByIdSuccess,\n        legislationEventsById: responseObj\n    }),\n\n    legislationEventsByIdError: message => ({\n        type: legislationEventsByIdFailure,\n        legislationEventsByIdError: message\n    }),\n\n    //Events for reconsideration\n    getLegislationEventsByLegislationId: (params) => {\n        return dispatch => {\n\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_EVENT_API_URL) + '/LegislationEvent/api/GetLegislationEventByLegislationIDAsync', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.legislationEventsByIdError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveLegislationEventsById(result[1].LegislationEvents))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.legislationEventsByIdError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    // ADVANCED BILL SEARCH\n    requestLegislationIdsList: () => ({\n        type: legislationIdsListRequest,\n        isFetching: true\n    }),\n\n    receiveLegislationIdsList: (responseObj, pagination) => ({\n        type: legislationIdsListSuccess,\n        isFetching: false,\n        legislationIdsList: responseObj,\n        legislationIdsListPagination: pagination,\n        errorMessage: responseObj.FailureMessage\n    }),\n\n    legislationIdsListError: message => ({\n        type: legislationIdsListFailure,\n        isFetching: false,\n        errorMessage: message\n    }),\n\n    getLegislationIdsList: (body, pagination) => {\n        return dispatch => {\n            dispatch(billActionCreators.requestLegislationIdsList());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            if (pagination) { headers['X-Pagination'] = JSON.stringify(pagination) }\n            let request = publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_API_URL) + '/Legislation/api/GetLegislationIdsListAsync', 'POST', headers, body, '');\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.legislationIdsListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveLegislationIdsList(result[1], result[2] && result[2].get('X-Pagination') ? JSON.parse(result[2].get('X-Pagination')) : null))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveLegislationIdsList([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    requestBillListByIds: () => ({\n        type: billListByIdsRequest,\n        isFetching: true\n    }),\n\n    receiveBillListByIds: (responseObj, pagination) => ({\n        type: billListByIdsSuccess,\n        isFetching: false,\n        billListByIds: responseObj,\n        billListByIdsPagination: pagination,\n        errorMessage: responseObj.FailureMessage\n    }),\n\n    billListByIdsError: message => ({\n        type: billListByIdsFailure,\n        isFetching: false,\n        errorMessage: message\n    }),\n\n    getBillListByIds: (body, pagination) => {\n        return dispatch => {\n            dispatch(billActionCreators.requestBillListByIds());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            if (pagination) { headers['X-Pagination'] = JSON.stringify(pagination) }\n            let request = publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_API_URL) + '/Legislation/api/GetLegislationByLegislationIDsAsync', 'POST', headers, body, '');\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billListByIdsError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveBillListByIds(result[1].Legislations, result[2] && result[2].get('X-Pagination') ? JSON.parse(result[2].get('X-Pagination')) : null))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveBillListByIds([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    requestLegislationTextsHitCounts: () => ({\n        type: legislationTextsHitCountsRequest,\n        isFetching: true\n    }),\n\n    receiveLegislationTextsHitCounts: (responseObj) => ({\n        type: legislationTextsHitCountsSuccess,\n        isFetching: false,\n        legislationTextsHitCounts: responseObj,\n        errorMessage: responseObj.FailureMessage\n    }),\n\n    legislationTextsHitCountsError: message => ({\n        type: legislationTextsHitCountsFailure,\n        isFetching: false,\n        errorMessage: message\n    }),\n\n    getLegislationTextsHitCounts: (body) => {\n        return dispatch => {\n            dispatch(billActionCreators.requestLegislationTextsHitCounts());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            let request = publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_TEXT_API_URL) + '/LegislationText/api/GetLegislationTextsHitCountsAsync', 'POST', headers, body, '');\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.legislationTextsHitCountsError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveLegislationTextsHitCounts(result[1].HitCounts))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveLegislationTextsHitCounts([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    requestBillList: () => ({\n        type: billListRequest,\n        isFetching: true\n    }),\n\n    receiveBillList: (responseObj, pagination) => ({\n        type: billListSuccess,\n        isFetching: false,\n        billList: responseObj,\n        billListPagination: pagination,\n        errorMessage: responseObj.FailureMessage\n    }),\n\n    billListError: message => ({\n        type: billListFailure,\n        isFetching: false,\n        errorMessage: message\n    }),\n\n    getBillList: (body, partner, pagination) => {\n        return dispatch => {\n            dispatch(billActionCreators.requestBillList());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            if (pagination) { headers['X-Pagination'] = JSON.stringify(pagination) }\n            let request = '';\n            if (partner) {\n                // THIS REQUEST NOT CURRENTLY IN USE. ADD THE SERVICE NAME TO THE REQUEST URL ONCE AVAILABLE\n                request = partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_ADVANCED_SEARCH_API_URL) + '/AdvancedLegislationSearch/api/GetPartnerLegislationListAsync', 'GET', '', '', '');\n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_ADVANCED_SEARCH_API_URL) + '/AdvancedLegislationSearch/api/GetLegislationListAsync', 'POST', headers, body, '');\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveBillList(result[1].Legislations, result[2] && result[2].get('X-Pagination') ? JSON.parse(result[2].get('X-Pagination')) : null))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveBillList([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    requestMostFrequentBillList: () => ({\n        type: mostFrequentBillListRequest,\n        isFetching: true\n    }),\n\n    receiveMostFrequentBillList: responseObj => ({\n        type: mostFrequentBillListSuccess,\n        isFetching: false,\n        mostFrequentBillList: responseObj,\n        errorMessage: responseObj.FailureMessage\n    }),\n\n    mostFrequentBillListError: message => ({\n        type: mostFrequentBillListFailure,\n        isFetching: false,\n        errorMessage: message\n    }),\n\n    getMostFrequentBillList: params => {\n        return dispatch => {\n            dispatch(billActionCreators.requestMostFrequentBillList());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_ADVANCED_SEARCH_API_URL) + '/AdvancedLegislationSearch/api/GetMostFrequentLegislationsAsync', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.mostFrequentBillListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveMostFrequentBillList(result[1].Legislations))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveMostFrequentBillList([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveBillNumbers: responseObj => ({\n        type: billNumbersSuccess,\n        billNumbers: responseObj\n    }),\n\n    billNumbersError: message => ({\n        type: billNumbersFailure,\n        isFetching: false,\n        billNumberMessage: message\n    }),\n\n    getBillNumbers: (params) => {\n        return dispatch => {\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_ADVANCED_SEARCH_API_URL) + '/AdvancedLegislationSearch/api/GetLegislativeNumbersAsync', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billNumbersError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveBillNumbers(result[1].LegislationNumbersList))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveBillNumbers([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveBillVersionRef: responseObj => ({\n        type: billVersionRefSuccess,\n        billVersionRef: responseObj\n    }),\n\n    billVersionRefError: message => ({\n        type: billVersionRefFailure,\n        billVersionRefError: message\n    }),\n\n    getBillVersionRef: () => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_TEXT_API_URL) + '/LegislationText/api/GetLegislationVersionListAsync', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billVersionRefError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveBillVersionRef(result[1].LegislationVersionList));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.billVersionRefError('No Content'));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveSponsorRefList: responseObj => ({\n        type: sponsorRefListSuccess,\n        sponsorRefList: responseObj\n    }),\n\n    sponsorRefListError: message => ({\n        type: sponsorRefListFailure,\n        sponsorRefListError: message\n    }),\n\n    getSponsorRefList: () => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_TEXT_API_URL) + '/LegislationText/api/GetSponsorTypeListAsync', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.sponsorRefListError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveSponsorRefList(result[1].SponsorTypes));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.sponsorRefListError('No Content'));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveBillSummaryRef: responseObj => ({\n        type: billSummaryRefSuccess,\n        billSummaryRef: responseObj\n    }),\n\n    billSummaryRefError: message => ({\n        type: billSummaryRefFailure,\n        billSummaryRefError: message\n    }),\n\n    getBillSummaryRef: () => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_SUMMARY_SERVICE) + '/LegislationSummary/api/GetSummaryVersionsReferenceAsync', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billSummaryRefError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveBillSummaryRef(result[1].SummaryVersions));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.billSummaryRefError('No Content'));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveBillText: responseObj => ({\n        type: billTextSuccess,\n        billText: responseObj\n    }),\n\n    billTextError: message => ({\n        type: billTextFailure,\n        billTextError: message\n    }),\n\n    getBillText: (params, partner) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            let request = '';\n            if (partner) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_TEXT_API_URL) + '/LegislationText/api/GetPartnerLegislationTextByIDAsync', 'GET', headers, '', params)\n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_TEXT_API_URL) + '/LegislationText/api/GetLegislationTextByIDAsync', 'GET', headers, '', params)\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billTextError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveBillText(result[1].TextsList));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveBillText([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveBillTextSave: responseObj => ({\n        type: billTextSaveSuccess,\n        billTextSave: responseObj\n    }),\n\n    billTextSaveError: message => ({\n        type: billTextSaveFailure,\n        billTextSaveError: message\n    }),\n\n    saveBillText: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_TEXT_API_URL) + '/LegislationText/api/SaveLegislationTextAsync', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billTextSaveError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveBillTextSave(result[1]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveBillTextSave([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveIhodAmendmentSave: responseObj => ({\n        type: ihodAmendmentSaveSuccess,\n        ihodAmendmentSave: responseObj\n    }),\n\n    ihodAmendmentSaveError: message => ({\n        type: ihodAmendmentSaveFailure,\n        ihodAmendmentSaveError: message\n    }),\n\n    saveIhodAmendment: (params) => {\n        let config = {\n            method: 'POST',\n            headers: {\n                \"content-type\": \"application/json; charset=utf-8\",\n            }\n        }\n\n        return dispatch => {\n            return fetch(\"https://ihod-lisva.herokuapp.com/floor_amendments/create_amendment\" + params, config)\n                .then(() => {\n                    dispatch(billActionCreators.receiveIhodAmendmentSave([]));\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveBatchPublish: responseObj => ({\n        type: batchPublishSuccess,\n        batchPublishSave: responseObj\n    }),\n\n    batchPublishError: message => ({\n        type: batchPublishFailure,\n        batchPublishError: message\n    }),\n\n    batchPublish: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_TEXT_API_URL) + '/LegislationText/api/PublishLegislationTextsAsync', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.batchPublishError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveBatchPublish(result[1]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveBatchPublish([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveCompletePublish: responseObj => ({\n        type: batchCompleteSuccess,\n        batchCompleteSave: responseObj\n    }),\n\n    batchCompleteError: message => ({\n        type: batchCompleteFailure,\n        batchCompleteError: message\n    }),\n\n    batchComplete: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_TEXT_API_URL) + '/LegislationText/api/CompletePrintLegislationTextsAsync', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.batchCompleteError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveCompletePublish(result[1]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveCompletePublish([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveJsonHeaders: responseObj => ({\n        type: jsonHeadersSuccess,\n        jsonHeaders: responseObj\n    }),\n\n    jsonHeadersError: message => ({\n        type: jsonHeadersFailure,\n        jsonHeadersError: message\n    }),\n\n    getJsonHeaders: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_FILE_GEN_API_URL) + '/LegislationFileGeneration/api/PreviewJSONById', 'POST', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.jsonHeadersError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveJsonHeaders(result[1]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveJsonHeaders([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receivePdfPreview: responseObj => ({\n        type: pdfPreviewSuccess,\n        pdfPreview: responseObj\n    }),\n\n    pdfPreviewError: message => ({\n        type: pdfPreviewFailure,\n        pdfPreviewError: message\n    }),\n\n    getPdfPreview: (body) => {\n        return dispatch => {\n            let config = {\n                method: 'POST',\n                headers: {\n                    \"Content-Type\": \"application/json; charset=utf-8\",\n                    \"authorization\": \"Bearer \" + localStorage.getItem('LIS_ID_TOKEN'),\n                    \"WebAPIKey\": process.env.REACT_APP_API_KEY\n                },\n                body: JSON.stringify(body)\n            }\n\n            let url = (API_URL || process.env.REACT_APP_LEGISLATION_FILE_GEN_API_URL) + '/LegislationFileGeneration/api/PreviewPDFFile';\n\n            return fetch(url, config)\n                .then(result => {\n                    if (result) {\n                        dispatch(billActionCreators.receivePdfPreview(result));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    } else {\n                        dispatch(billActionCreators.pdfPreviewError(\"No preview file\"));\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receivePreviewPdfFile: responseObj => ({\n        type: previewPdfFileSuccess,\n        sasUrl: responseObj\n    }),\n\n    previewPdfFileError: message => ({\n        type: previewPdfFileFailure,\n        sasUrlFailure: message\n    }),\n\n    previewPdfFile: (body) => {\n        return dispatch => {\n            let headers = {\n                \"Content-Type\": \"application/json; charset=utf-8\"\n            }\n\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_FILE_GEN_API_URL) + '/LegislationFileGeneration/api/PreviewStoredPDFFileAsync', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.previewPdfFileError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receivePreviewPdfFile(result[1].sasTokenUrl));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.previewPdfFileError([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveHtmlPreview: responseObj => ({\n        type: htmlPreviewSuccess,\n        htmlPreview: responseObj\n    }),\n\n    htmlPreviewError: message => ({\n        type: htmlPreviewFailure,\n        htmlPreviewError: message\n    }),\n\n    getHtmlPreview: (body) => {\n        return dispatch => {\n            let config = {\n                method: \"POST\",\n                headers: {\n                    \"Content-Type\": \"application/json; charset=utf-8\",\n                    \"authorization\": \"Bearer \" + localStorage.getItem('LIS_ID_TOKEN'),\n                    \"WebAPIKey\": process.env.REACT_APP_API_KEY\n                },\n                body: JSON.stringify(body)\n            }\n\n            let url = (API_URL || process.env.REACT_APP_LEGISLATION_FILE_GEN_API_URL) + '/LegislationFileGeneration/api/PreviewHTMLFile';\n\n            return fetch(url, config)\n                .then(async result => {\n                    if (!result) {\n                        dispatch(billActionCreators.htmlPreviewError(\"Preview file not generated\"));\n                    } else if (result.status === 400) {\n                        await result.body.getReader().read().then(({ value }) => {\n                            const error = JSON.parse(Buffer.from(value.buffer).toString())\n                            dispatch(billActionCreators.htmlPreviewError(error.Name || \"Unknown Error\"));\n                        })\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    } else {\n                        dispatch(billActionCreators.receiveHtmlPreview(result));\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveHtmlFilePreview: responseObj => ({\n        type: htmlFilePreviewSuccess,\n        htmlFilePreview: responseObj\n    }),\n\n    htmlFilePreviewError: message => ({\n        type: htmlFilePreviewFailure,\n        htmlFilePreviewError: message\n    }),\n\n    getHtmlFilePreview: (params) => {\n        return dispatch => {\n            let config = {\n                method: \"POST\",\n                headers: {\n                    \"Content-Type\": \"application/json; charset=utf-8\",\n                    \"authorization\": \"Bearer \" + localStorage.getItem('LIS_ID_TOKEN'),\n                    \"WebAPIKey\": process.env.REACT_APP_API_KEY\n                }\n            }\n\n            let url = (API_URL || process.env.REACT_APP_LEGISLATION_FILE_GEN_API_URL) + '/LegislationFileGeneration/api/PreviewLegislationHTMLFileAsync' + params;\n\n            return fetch(url, config)\n                .then(async result => {\n                    if (!result) {\n                        dispatch(billActionCreators.htmlFilePreviewError(\"Preview file not generated\"));\n                    } else if (result.status === 400) {\n                        await result.body.getReader().read().then(({ value }) => {\n                            const error = JSON.parse(Buffer.from(value.buffer).toString())\n                            dispatch(billActionCreators.htmlFilePreviewError(error.Name || \"Unknown Error\"));\n                        })\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    } else {\n                        await result.body.getReader().read().then(({ value }) => {\n                            let decoder = new TextDecoder;\n                            dispatch(billActionCreators.receiveHtmlFilePreview(decoder.decode(value)));\n                        })\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveBillSave: responseObj => ({\n        type: billSaveSuccess,\n        billSave: responseObj\n    }),\n\n    billSaveError: message => ({\n        type: billSaveFailure,\n        billSaveError: message\n    }),\n\n    saveBill: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_API_URL) + '/Legislation/api/SaveLegislationAsync', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billSaveError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveBillSave(result[1]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveBillSave([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveBillFileGen: responseObj => ({\n        type: billFileGenSuccess,\n        billFileGen: responseObj\n    }),\n\n    billFileGenError: message => ({\n        type: billFileGenFailure,\n        billFileGenError: message\n    }),\n\n    genBillFile: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_FILE_GEN_API_URL) + '/LegislationFileGeneration/api/ProcessLegislationFilesAsync', 'POST', headers, '', params, true)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billFileGenError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveBillFileGen(result[1]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.billFileGenError('No Content'));\n                        return Promise.reject('No Content')\n                    }\n                }).catch(err => console.log(err))\n        }\n    },\n\n    receiveBatchBillFileGen: responseObj => ({\n        type: batchBillFileGenSuccess,\n        batchBillFileGen: responseObj\n    }),\n\n    batchBillFileGenError: message => ({\n        type: batchBillFileGenFailure,\n        batchBillFileGenError: message\n    }),\n\n    batchGenBillFile: (params, body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_FILE_GEN_API_URL) + '/LegislationFileGeneration/api/ProcessBatchLegislationFilesAsync', 'POST', headers, body, params, true)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.batchBillFileGenError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveBatchBillFileGen(result[1]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.batchBillFileGenError('No Content'));\n                        return Promise.reject('No Content')\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveBillManagementList: responseObj => ({\n        type: billManagementListSuccess,\n        billManagementList: responseObj,\n    }),\n\n    billManagementListError: message => ({\n        type: billManagementListFailure,\n        billManagementListError: message\n    }),\n\n    getBillManagementList: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_API_URL) + '/Legislation/api/getLegislationManagementListAsync', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billManagementListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveBillManagementList(result[1].Legislations))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveBillManagementList([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveSessionBills: responseObj => ({\n        type: sessionBillsSuccess,\n        sessionBills: responseObj,\n    }),\n\n    sessionBillsError: message => ({\n        type: sessionBillsFailure,\n        sessionBillsError: message\n    }),\n\n    getSessionBills: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_API_URL) + '/Legislation/api/getLegislationSessionListAsync/', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.sessionBillsError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveSessionBills(result[1].Legislations))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveSessionBills([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveBillEvents: responseObj => ({\n        type: billEventsSuccess,\n        billEvents: responseObj,\n    }),\n\n    billEventsError: message => ({\n        type: billEventsFailure,\n        billEventsError: message\n    }),\n\n    getBillEvents: (params = '') => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_EVENT_API_URL) + '/LegislationEvent/api/getlegislationeventtypereferencesasync/', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billEventsError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveBillEvents(result[1].EventTypes))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.billEventsError('No Content'))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveBillEventSave: responseObj => ({\n        type: billEventSaveSuccess,\n        billEventSave: responseObj,\n    }),\n\n    billEventSaveError: message => ({\n        type: billEventSaveFailure,\n        billEventSaveError: message\n    }),\n\n    saveBillEvent: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_EVENT_API_URL) + '/LegislationEvent/api/savelegislationeventasync/', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.billEventSaveError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(billActionCreators.receiveBillEventSave(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.billEventSaveError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveTextList: responseObj => ({\n        type: textListSuccess,\n        textList: responseObj,\n    }),\n\n    textListError: message => ({\n        type: textListFailure,\n        textListError: message\n    }),\n\n    getTextList: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_TEXT_API_URL) + '/LegislationText/api/getlegislationtextlistasync/', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.textListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveTextList(result[1].LegislationTextList))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveTextList([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveSubjectList: responseObj => ({\n        type: subjectListSuccess,\n        subjectList: responseObj,\n    }),\n\n    subjectListError: message => ({\n        type: subjectListFailure,\n        subjectListError: message\n    }),\n\n    getSubjectList: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_SUBJECT_SERVICE) + '/LegislationSubject/api/GetSubjectReferencesAsync/', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.subjectListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        const subjectList = result[1].SubjectsReference;\n                        subjectList.forEach(subject => {\n                            subject.label = subject.Subject;\n                            subject.value = subject.SubjectIndexID;\n                        })\n                        dispatch(billActionCreators.receiveSubjectList(subjectList))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveSubjectList([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveIntroDateList: responseObj => ({\n        type: introDateListSuccess,\n        introDateList: responseObj,\n    }),\n\n    introDateListError: message => ({\n        type: introDateListFailure,\n        introDateListError: message\n    }),\n\n    getIntroDateList: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_ADVANCED_SEARCH_API_URL) + '/AdvancedLegislationSearch/api/GetIntroductionDateListAsync/', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.introDateListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveIntroDateList(result[1].LegislationDatesList))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveIntroDateList([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveLegislationAmendmentList: responseObj => ({\n        type: legislationAmendmentListSuccess,\n        legislationAmendmentList: responseObj,\n    }),\n\n    legislationAmendmentListError: message => ({\n        type: legislationAmendmentListFailure,\n        legislationAmendmentListError: message\n    }),\n\n    getLegislationAmendmentList: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_API_URL) + '/Legislation/api/GetLegislationAmendmentListAsync/', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.legislationAmendmentListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveLegislationAmendmentList(result[1].LegislationAmendmentList))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveLegislationAmendmentList([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveLegislationDispositions: responseObj => ({\n        type: legislationDispositionsSuccess,\n        legislationDispositions: responseObj,\n    }),\n\n    legislationDispositionsError: message => ({\n        type: legislationDispositionsFailure,\n        legislationDispositionsError: message\n    }),\n\n    getLegislationDispositions: () => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_TEXT_API_URL) + '/LegislationText/api/GetTextDispositionsReferenceAsync/', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.legislationDispositionsError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveLegislationDispositions(result[1].TextDispositionList))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveLegislationDispositions([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveLegislationStatusHistory: responseObj => ({\n        type: legislationStatusHistorySuccess,\n        legislationStatusHistory: responseObj,\n    }),\n\n    legislationStatusHistoryError: message => ({\n        type: legislationStatusHistoryFailure,\n        legislationStatusHistoryError: message\n    }),\n\n    getBillStatusHistory: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_API_URL) + '/Legislation/api/GetLegislationStatusHistoryByLegislationIDAsync/', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.legislationStatusHistoryError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveLegislationStatusHistory(result[1].LegislationsStatusHistory))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveLegislationStatusHistory([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveSasURL: responseObj => ({\n        type: sasURLSuccess,\n        sasURLLink: responseObj,\n    }),\n\n    sasURLError: message => ({\n        type: sasURLFailure,\n        sasURLLinkError: message\n    }),\n\n    getSasURL: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_FILE_GEN_API_URL) + '/LegislationFileGeneration/api/GetSASUrlForPreviewAsync/', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.sasUrlError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveSasURL(result[1].sasTokenUrl))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveSasURL([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    uploadImpactStatement: (params, file) => {\n        return dispatch => {\n            const headers = {\n                'cache-control': 'no-cache'\n            }\n            let formData = new FormData();\n            formData.append('fiscalImpactPDF', file);\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_FILE_GEN_API_URL) + '/LegislationFileGeneration/api/SaveImpactStatementFileAsync', 'POST', headers, formData, params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch({\n                            type: uploadImpactStatementRequest,\n                            uploadImpactStatementError: result[1]\n                        });\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch({\n                            type: uploadImpactStatementRequest,\n                            uploadImpactStatementResponse: result[1]\n                        });\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch({\n                            type: uploadImpactStatementRequest,\n                            uploadImpactStatementError: \"No Content\"\n                        });\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveDeleteBlobFile: responseObj => ({\n        type: deleteBlobFileSuccess,\n        deleteBlobFileResponse: responseObj,\n    }),\n\n    deleteBlobFileError: message => ({\n        type: deleteBlobFileFailure,\n        deleteBlobFileError: message\n    }),\n\n    deleteBlobFileStatement: (params) => {\n        return dispatch => {\n            const headers = {\n                'cache-control': 'no-cache'\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_EVENT_API_URL) + '/LegislationEvent/api/DeleteFileFromBlobStorageAsync', 'DELETE', headers, null, params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(billActionCreators.deleteBlobFileError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(billActionCreators.receiveDeleteBlobFile(result[1].FilesDeleted))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(billActionCreators.receiveDeleteBlobFile([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    }\n};\n\nexport const reducer = (state, action) => {\n    state = state || initialState;\n\n    switch (action.type) {\n        case billFailure:\n            return Object.assign({}, state, {\n                billError: action.billError\n            });\n        case billSuccess:\n            return Object.assign({}, state, {\n                bill: action.bill,\n                billError: ''\n            });\n        case billStatusRefFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.message\n            });\n        case billStatusRefSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                billStatusReferences: action.billStatusReferences,\n                errorMessage: ''\n            });\n        case legislationClassesFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.message\n            });\n        case legislationClassesSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                legislationClasses: action.legislationClasses,\n                errorMessage: ''\n            });\n        case billStatusCategoryRefFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.message\n            });\n        case billStatusCategoryRefSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                billStatusCategoryReferences: action.billStatusCategoryReferences,\n                errorMessage: ''\n            });\n        case billNumbersFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                billNumberMessage: action.billNumberMessage\n            });\n        case billNumbersSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                billNumbers: action.billNumbers,\n                billNumberMessage: ''\n            });\n        case legislationIdsListRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case legislationIdsListSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                legislationIdsList: action.legislationIdsList,\n                legislationIdsListPagination: action.legislationIdsListPagination,\n                errorMessage: ''\n            });\n        case legislationIdsListFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.errorMessage\n            });\n        case billListByIdsRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case billListByIdsSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                billListByIds: action.billListByIds,\n                billListByIdsPagination: action.billListByIdsPagination,\n                errorMessage: ''\n            });\n        case billListByIdsFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.errorMessage\n            });\n        case legislationTextsHitCountsRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case legislationTextsHitCountsSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                legislationTextsHitCounts: action.legislationTextsHitCounts,\n                errorMessage: ''\n            });\n        case legislationTextsHitCountsFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.errorMessage\n            });\n        case billListRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case billListSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                billList: action.billList,\n                billListPagination: action.billListPagination,\n                errorMessage: ''\n            });\n        case billListFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.errorMessage\n            });\n        case mostFrequentBillListSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                mostFrequentBillList: action.mostFrequentBillList,\n                errorMessage: ''\n            });\n        case mostFrequentBillListFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.errorMessage\n            });\n        case billSummaryRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case billSummarySuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                billSummary: action.billSummary,\n                errorMessage: ''\n            });\n        case billSummaryFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.errorMessage\n            });\n        case saveBillSummaryRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case saveBillSummarySuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                billSummarySave: action.billSummarySave,\n                errorMessage: ''\n            });\n        case saveBillSummaryFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.errorMessage\n            });\n        case billHistorySuccess:\n            return Object.assign({}, state, {\n                billHistory: action.billHistory,\n                billHistoryError: ''\n            });\n        case billHistoryFailure:\n            return Object.assign({}, state, {\n                billHistoryError: action.errorMessage\n            });\n        case billVersionRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case billVersionSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                billVersion: action.billVersion,\n                errorMessage: ''\n            });\n        case billVersionFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.errorMessage\n            });\n        case sponsorRefListSuccess:\n            return Object.assign({}, state, {\n                sponsorRefList: action.sponsorRefList,\n                sponsorRefListError: ''\n            });\n        case sponsorRefListFailure:\n            return Object.assign({}, state, {\n                sponsorRefListError: action.sponsorRefListError\n            });\n        case billVersionRefSuccess:\n            return Object.assign({}, state, {\n                billVersionRef: action.billVersionRef,\n                billVersionRefError: ''\n            });\n        case billVersionRefFailure:\n            return Object.assign({}, state, {\n                billVersionRefError: action.billVersionRefError\n            });\n        case billSummaryRefSuccess:\n            return Object.assign({}, state, {\n                billSummaryRef: action.billSummaryRef,\n                billSummaryRefError: ''\n            });\n        case billSummaryRefFailure:\n            return Object.assign({}, state, {\n                billSummaryRefError: action.billSummaryRefError\n            });\n        case billEventRefSuccess:\n            return Object.assign({}, state, {\n                billEventRef: action.billEventRef,\n                billEventRefError: ''\n            });\n        case billEventRefFailure:\n            return Object.assign({}, state, {\n                billEventRefError: action.billEventRefError\n            });\n        case legislationEventsByIdSuccess:\n            return Object.assign({}, state, {\n                legislationEventsById: action.legislationEventsById,\n                legislationEventsByIdError: ''\n            });\n        case legislationEventsByIdFailure:\n            return Object.assign({}, state, {\n                legislationEventsByIdError: action.legislationEventsByIdError\n            });\n        case billTextSuccess:\n            return Object.assign({}, state, {\n                billText: action.billText,\n                billTextError: ''\n            });\n        case billTextFailure:\n            return Object.assign({}, state, {\n                billTextError: action.billTextError\n            });\n        case batchPublishSuccess:\n            return Object.assign({}, state, {\n                batchPublishSave: action.batchPublishSave,\n                batchPublishSaveError: ''\n            });\n        case batchPublishFailure:\n            return Object.assign({}, state, {\n                batchPublishError: action.batchPublishError\n            });\n        case batchCompleteSuccess:\n            return Object.assign({}, state, {\n                batchCompleteSave: action.batchCompleteSave,\n                batchCompleteSaveError: ''\n            });\n        case batchCompleteFailure:\n            return Object.assign({}, state, {\n                batchCompleteError: action.batchCompleteError\n            });\n        case billTextSaveSuccess:\n            return Object.assign({}, state, {\n                billTextSave: action.billTextSave,\n                billTextSaveError: ''\n            });\n        case billTextSaveFailure:\n            return Object.assign({}, state, {\n                billTextSaveError: action.billTextSaveError\n            });\n        case ihodAmendmentSaveSuccess:\n            return Object.assign({}, state, {\n                ihodAmendmentSave: action.ihodAmendmentSave,\n                ihodAmendmentSaveError: ''\n            });\n        case ihodAmendmentSaveFailure:\n            return Object.assign({}, state, {\n                ihodAmendmentSaveError: action.ihodAmendmentSaveError\n            });\n        case jsonHeadersSuccess:\n            return Object.assign({}, state, {\n                jsonHeaders: action.jsonHeaders,\n                jsonHeadersError: ''\n            });\n        case jsonHeadersFailure:\n            return Object.assign({}, state, {\n                jsonHeadersError: action.jsonHeadersError\n            });\n        case pdfPreviewSuccess:\n            return Object.assign({}, state, {\n                pdfPreview: action.pdfPreview,\n                pdfPreviewError: ''\n            });\n        case pdfPreviewFailure:\n            return Object.assign({}, state, {\n                pdfPreviewError: action.pdfPreviewError\n            });\n        case previewPdfFileSuccess:\n            return Object.assign({}, state, {\n                sasUrl: action.sasUrl,\n                sasUrlError: ''\n            });\n        case previewPdfFileFailure:\n            return Object.assign({}, state, {\n                sasUrlError: action.sasUrlError\n            });\n        case htmlPreviewSuccess:\n            return Object.assign({}, state, {\n                htmlPreview: action.htmlPreview,\n                htmlPreviewError: ''\n            });\n        case htmlPreviewFailure:\n            return Object.assign({}, state, {\n                htmlPreviewError: action.htmlPreviewError\n            });\n        case htmlFilePreviewSuccess:\n            return Object.assign({}, state, {\n                htmlFilePreview: action.htmlFilePreview,\n                htmlFilePreviewError: ''\n            });\n        case htmlFilePreviewFailure:\n            return Object.assign({}, state, {\n                htmlFilePreviewError: action.htmlFilePreviewError\n            });\n        case billSaveSuccess:\n            return Object.assign({}, state, {\n                billSave: action.billSave,\n                billSaveError: ''\n            });\n        case billSaveFailure:\n            return Object.assign({}, state, {\n                billSaveError: action.billSaveError\n            });\n        case billFileGenSuccess:\n            return Object.assign({}, state, {\n                billFileGen: action.billFileGen,\n                billFileGenError: ''\n            });\n        case billFileGenFailure:\n            return Object.assign({}, state, {\n                billFileGenError: action.billFileGenError\n            });\n        case batchBillFileGenSuccess:\n            return Object.assign({}, state, {\n                batchBillFileGen: action.batchBillFileGen,\n                batchBillFileGenError: ''\n            });\n        case batchBillFileGenFailure:\n            return Object.assign({}, state, {\n                batchBillFileGenError: action.batchBillFileGenError\n            });\n        case billManagementListSuccess:\n            return Object.assign({}, state, {\n                billManagementList: action.billManagementList,\n                billManagementListError: ''\n            });\n        case billManagementListFailure:\n            return Object.assign({}, state, {\n                billManagementListError: action.billManagementListError\n            });\n        case sessionBillsSuccess:\n            return Object.assign({}, state, {\n                sessionBills: action.sessionBills,\n                sessionBillsError: ''\n            });\n        case sessionBillsFailure:\n            return Object.assign({}, state, {\n                sessionBillsError: action.sessionBillsError\n            });\n        case billEventsSuccess:\n            return Object.assign({}, state, {\n                billEvents: action.billEvents,\n                billEventsError: ''\n            });\n        case billEventsFailure:\n            return Object.assign({}, state, {\n                billEventsError: action.billEventsError\n            });\n        case billEventSaveSuccess:\n            return Object.assign({}, state, {\n                billEventSave: action.billEventSave,\n                billEventSaveError: ''\n            });\n        case billEventSaveFailure:\n            return Object.assign({}, state, {\n                billEventSaveError: action.billEventSaveError\n            });\n        case textListSuccess:\n            return Object.assign({}, state, {\n                textList: action.textList,\n                textListError: ''\n            });\n        case textListFailure:\n            return Object.assign({}, state, {\n                textListError: action.textListError\n            });\n        case subjectListSuccess:\n            return Object.assign({}, state, {\n                subjectList: action.subjectList,\n                subjectListError: ''\n            });\n        case subjectListFailure:\n            return Object.assign({}, state, {\n                subjectListError: action.subjectListError\n            });\n        case introDateListSuccess:\n            return Object.assign({}, state, {\n                introDateList: action.introDateList,\n                introDateListError: ''\n            });\n        case introDateListFailure:\n            return Object.assign({}, state, {\n                introDateListError: action.introDateListError\n            });\n        case legislationAmendmentListSuccess:\n            return Object.assign({}, state, {\n                legislationAmendmentList: action.legislationAmendmentList,\n                legislationAmendmentListError: ''\n            });\n        case legislationAmendmentListFailure:\n            return Object.assign({}, state, {\n                legislationAmendmentListError: action.legislationAmendmentListError\n            });\n        case legislationDispositionsSuccess:\n            return Object.assign({}, state, {\n                legislationDispositions: action.legislationDispositions,\n                legislationDispositionsError: ''\n            });\n        case legislationDispositionsFailure:\n            return Object.assign({}, state, {\n                legislationDispositionsError: action.legislationDispositionsError\n            });\n        case legislationStatusHistorySuccess:\n            return Object.assign({}, state, {\n                legislationStatusHistory: action.legislationStatusHistory,\n                legislationStatusHistoryError: ''\n            });\n        case legislationStatusHistoryFailure:\n            return Object.assign({}, state, {\n                legislationStatusHistoryError: action.legislationStatusHistoryError\n            });\n        case sasURLSuccess:\n            return Object.assign({}, state, {\n                sasURLLink: action.sasURLLink,\n                sasURLLinkError: ''\n            });\n        case sasURLFailure:\n            return Object.assign({}, state, {\n                sasURLLinkError: action.sasURLLinkError\n            });\n        case uploadImpactStatementRequest:\n            return Object.assign({}, state, {\n                uploadImpactStatementResponse: action.uploadImpactStatementResponse || state.uploadImpactStatementResponse,\n                uploadImpactStatementError: action.uploadImpactStatementError || ''\n            });\n        case deleteBlobFileSuccess:\n            return Object.assign({}, state, {\n                deleteBlobFileResponse: action.deleteBlobFileResponse,\n                deleteBlobFileError: ''\n            });\n        case deleteBlobFileFailure:\n            return Object.assign({}, state, {\n                deleteBlobFileError: action.deleteBlobFileError\n            });\n        default:\n            return state;\n    }\n};\n","import { LogLevel } from \"@azure/msal-browser\";\n\nexport const msalConfig = {\n    auth: {\n        clientId: [\"dev\", \"test\", \"qa\"].includes(window.env.APP_ENV.toLowerCase()) ? \"d0952a15-c248-42cb-a3d5-31a104e6fe94\" : \"370fbf66-8bed-4f65-8938-9d97d9ff8e07\",\n        authority: \"https://login.microsoftonline.com/house.virginia.gov\",\n        redirectUri: [\"dev\", \"test\", \"qa\"].includes(window.env.APP_ENV.toLowerCase()) ? \"https://\" + window.env.APP_ENV + \".lis.virginia.gov\" : \"https://lis.virginia.gov\",\n        postLogoutRedirectUri: [\"dev\", \"test\", \"qa\"].includes(window.env.APP_ENV.toLowerCase()) ? \"https://\" + window.env.APP_ENV + \".lis.virginia.gov\" : \"https://lis.virginia.gov\"\n    },\n    cache: {\n        cacheLocation: \"localStorage\",\n        storeAuthStateInCookie: false,\n    },\n    system: {\n        loggerOptions: {\n            loggerCallback: (level, message, containsPii) => {\n                if (containsPii) {\n                    return;\n                }\n                switch (level) {\n                    case LogLevel.Error:\n                        console.error(message);\n                        return;\n                    case LogLevel.Info:\n                        console.info(message);\n                        return;\n                    case LogLevel.Verbose:\n                        console.debug(message);\n                        return;\n                    case LogLevel.Warning:\n                        console.warn(message);\n                        return;\n                    default:\n                        return;\n                }\n            } \n        }\n    }\n};\n\nexport const loginRequest = {\n    scopes: [\"User.Read\"]\n};\n\nexport const logoutRequest = {\n    scopes: [\"User.Read\"]\n};\n\nexport const graphConfig = {\n    graphMeEndpoint: \"https://graph.microsoft.com/v1.0/me\"\n};","import jwtDecode from 'jwt-decode';\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst graphToken = 'GRAPH_ID_TOKEN';\nconst idToken = 'LIS_ID_TOKEN';\nconst refreshToken = 'LIS_REFRESH_TOKEN';\nconst refreshTokenExpiration = 'LIS_REFRESH_TOKEN_EXPIRATION';\nconst claims = \"LIS_CLAIMS\";\n\nconst loginRequest = 'LOGIN_REQUEST';\nconst loginSuccess = 'LOGIN_SUCCESS';\nconst loginFailure = 'LOGIN_FAILURE';\n\nconst logoutRequest = 'LOGOUT_REQUEST';\nconst logoutSuccess = 'LOGOUT_SUCCESS';\n\nconst refreshTokenRequest = 'REFRESH_TOKEN_REQUEST';\nconst refreshTokenSuccess = 'REFRESH_TOKEN_SUCCESS';\nconst refreshTokenFailure = 'REFRESH_TOKEN_FAILURE';\n\nconst houseLoginRequest = 'HOUSE_ACCESS_TOKEN_REQUEST';\nconst houseLoginSuccess = 'HOUSE_ACCESS_TOKEN_SUCCESS';\nconst houseLoginFailure = 'HOUSE_ACCESS_TOKEN_FAILURE';\n\n//const initialState = {\n//    loggedIn: false\n//};\n\n// Decode the token, if it exists\n\nconst decodedToken = () => {\n    const jwtToken = localStorage.getItem(idToken);\n\n    const userData = {\n        initials: '',\n        name: '',\n        chamber: '',\n        email: '',\n        claims: [],\n        roles: [],\n        scopes: [],\n        resources: []        \n    };\n\n    if (jwtToken !== null && jwtToken !== 'undefined') {\n        const decode = jwtDecode(jwtToken);\n        const stringToken = JSON.stringify(decode);\n        const parsedToken = JSON.parse(stringToken);\n        userData.initials = parsedToken.given_name.charAt(0) + parsedToken.family_name.charAt(0);\n        userData.name = parsedToken.given_name + ' ' + parsedToken.family_name;\n        userData.expr = parsedToken.exp;\n        userData.email = parsedToken.email\n    }\n    return userData;\n}\n\nconst isTokenExpired = () => {\n    const jwtToken = localStorage.getItem(idToken);\n\n    var expr = '';\n\n    if (jwtToken !== null && jwtToken !== 'undefined') {\n        const decode = jwtDecode(jwtToken);\n        const stringToken = JSON.stringify(decode);\n        const parsedToken = JSON.parse(stringToken);\n\n        expr = parsedToken.exp;\n        return expr < new Date().getTime() / 1000;\n    } else {\n        return true;\n    }\n}\n\nconst parsedClaims = () => {\n    const claimsObject = JSON.parse(localStorage.getItem(claims));\n\n    let userClaims = {\n        scopes: [],\n        roles: [],\n        resources: [],\n        claims: []\n    };\n\n    if (claimsObject)\n        for (let i = 0; i < claimsObject.length; i++) {\n            userClaims.scopes.push(claimsObject[i].Scope)\n            userClaims.roles.push(claimsObject[i].RoleName)\n            userClaims.resources.push(claimsObject[i].Resource)\n            userClaims.claims.push(claimsObject[i])\n        }\n\n    return userClaims;\n}\n\nexport const authActionCreators = {\n\n    // LOGIN THE USER\n\n    requestLogin: (creds) => ({\n        type: loginRequest,\n        isFetching: true,\n        initiateRedirect: false,\n        creds\n    }),\n\n    receiveLogin: (user) => ({\n        type: loginSuccess,\n        isFetching: false,\n        initiateRedirect: true,\n        isAuthenticated: true,\n        isTokenExpired: isTokenExpired(user.AccessToken),\n        userProfile: decodedToken(user.AccessToken),\n        userClaims: parsedClaims()\n    }),\n\n    loginError: (message) => ({\n        type: loginFailure,\n        isFetching: false,\n        isAuthenticated: false,\n        message\n    }),\n\n    loginUser: (creds) => {\n        let config = {\n            method: 'POST',\n            headers: { \"Content-Type\": \"application/json; charset=utf-8\", \"WebAPIKey\": process.env.REACT_APP_API_KEY },\n            body: JSON.stringify({ UserID: creds.userId, Password: creds.userPassword })\n        }\n        return dispatch => {\n            // dispatch requestLogin and kickoff the call to the API\n            dispatch(authActionCreators.requestLogin(creds));\n\n            return fetch((API_URL || process.env.REACT_APP_AUTH_API_URL) + '/Authentication/api/LoginAsync', config)\n                .then(response =>\n                    response.json().then(user => ({ user, response }))\n                ).then(({ user, response }) => {\n                    if (response.status >= 400) {\n                        // If there was a problem, \n                        // dispatch the error condition\n                        dispatch(authActionCreators.loginError(user.FailureMessage))\n                        return Promise.reject(user)\n                    } else {\n                        // If login was successful, set the token in local storage\n                        let roles = [];\n                        if (user.Claims && user.Claims.Roles) {\n                            roles = user.Claims.Roles;\n                        }\n                        localStorage.setItem(claims, JSON.stringify(roles));\n                        localStorage.setItem(idToken, user.AccessToken);\n                        localStorage.setItem(refreshToken, user.RefreshToken);\n                        localStorage.setItem(graphToken, user.GraphToken);\n                        //604800000 is 7 days in milliseconds\n                        localStorage.setItem(refreshTokenExpiration, new Date().getTime() + 604800000);\n                        // Dispatch the success action\n                        dispatch(authActionCreators.receiveLogin(user))\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    // LOGOUT THE USER\n\n    requestLogout: () => ({\n        type: logoutRequest,\n        isFetching: true,\n        initiateRedirect: false,\n        isAuthenticated: true\n    }),\n\n    receiveLogout: () => ({\n        type: logoutSuccess,\n        isFetching: false,\n        initiateRedirect: false,\n        isAuthenticated: false,\n        userProfile: false,\n        userClaims: false\n    }),\n\n    logoutUser: () => {\n        return dispatch => {\n            dispatch(authActionCreators.requestLogout());\n            localStorage.removeItem(idToken);\n            localStorage.removeItem(refreshToken);\n            localStorage.removeItem(refreshTokenExpiration);\n            localStorage.removeItem(claims);\n            localStorage.removeItem(graphToken);\n            dispatch(authActionCreators.receiveLogout())\n        }\n    },\n\n    // RERESH ACCESS TOKEN\n\n    requestRefreshToken: () => ({\n        type: refreshTokenRequest,\n        isFetching: true\n    }),\n\n    receiveRefreshToken: (user) => ({\n        type: refreshTokenSuccess,\n        isFetching: false,\n        userProfile: decodedToken(user.AccessToken),\n        userClaims: parsedClaims(),\n        isTokenExpired: isTokenExpired(user.AccessToken)\n    }),\n\n    refreshTokenError: (message) => ({\n        type: refreshTokenFailure,\n        message\n    }),\n\n    refreshAccessToken: () => {\n        let rtoken = localStorage.getItem(refreshToken);\n\n        let config = {\n            method: 'POST',\n            headers: {\n                \"authorization\": rtoken,\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"WebAPIKey\": process.env.REACT_APP_API_KEY\n            }\n        }\n\n        return dispatch => {\n            // dispatch requestLogin and kickoff the call to the API\n            dispatch(authActionCreators.requestRefreshToken());\n\n            return fetch((API_URL || process.env.REACT_APP_AUTH_API_URL) + '/Authentication/api/RefreshAccessTokenAsync', config)\n                .then(response => {\n                    if (response.status > 399) {\n                        dispatch(authActionCreators.refreshTokenError(response));\n                        return Promise.reject(response);\n                    }\n                    return response\n                })\n                .then(response =>\n                    response.json().then(user => ({ user, response }))\n                ).then(({ user, response }) => {\n                    // If refresh was successful, set the tokens in local storage\n                    let roles = [];\n                    if (user.Claims && user.Claims.Roles) {\n                        roles = user.Claims.Roles;\n                    }\n                    localStorage.setItem(claims, JSON.stringify(roles));        \n                    localStorage.setItem(idToken, user.AccessToken);\n                    localStorage.setItem(refreshToken, user.RefreshToken);\n                    //604800000 is 7 days in milliseconds\n                    localStorage.setItem(refreshTokenExpiration, new Date().getTime() + 604800000);\n                    // Dispatch the success action\n                    dispatch(authActionCreators.receiveRefreshToken(user))\n                }).catch(err => console.log(\"Error: \", err))\n        }\n    },\n\n    requestHouseLogin: () => ({\n        type: houseLoginRequest,\n        isFetching: true\n    }),\n\n    receiveHouseLogin: (user) => ({\n        type: houseLoginSuccess,\n        isFetching: false,\n        initiateRedirect: true,\n        isAuthenticated: true,\n        isTokenExpired: isTokenExpired(user.AccessToken),\n        userProfile: decodedToken(user.AccessToken),\n        userClaims: parsedClaims()\n    }),\n\n    houseLoginFailure: (message) => ({\n        isFetching: false,\n        type: houseLoginFailure,\n        message\n    }),\n\n    houseLogin: (authToken, refreshToken, expirationDate) => {\n        let config = {\n            method: 'POST',\n            headers: { \"Content-Type\": \"application/json; charset=utf-8\", \"WebAPIKey\": process.env.REACT_APP_API_KEY },            \n        }\n\n        return dispatch => {\n            dispatch(authActionCreators.requestHouseLogin());\n\n            return fetch((API_URL || process.env.REACT_APP_AUTH_API_URL) + '/Authentication/api/GetAccessTokenAsync?accesstoken=' + authToken, config)\n                .then(response =>\n                    response.json().then(user => ({ user, response }))\n                ).then(({ user, response }) => {\n                    if (response.status >= 400) {                        \n                        dispatch(authActionCreators.houseLoginFailure(user.FailureMessage))\n                        return Promise.reject(user)\n                    } else {\n                        let roles = [];\n                        if (user.Claims && user.Claims.Roles) {\n                            roles = user.Claims.Roles;\n                        }\n                        localStorage.setItem(claims, JSON.stringify(roles));\n                        localStorage.setItem(idToken, user.AccessToken);\n                        localStorage.setItem(refreshToken, refreshToken);\n                        localStorage.setItem(graphToken, user.GraphToken);\n                        localStorage.setItem(refreshTokenExpiration, expirationDate.getTime() + 604800000);\n\n                        dispatch(authActionCreators.receiveHouseLogin(user))\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    }\n};\n\nexport const reducer = (state, action) => {\n\n    state = {\n        ...state,\n        isFetching: false,\n        initiateRedirect: false,\n        isAuthenticated: isTokenExpired() ? false : true,\n        userProfile: decodedToken(),\n        userClaims: parsedClaims(),\n        isTokenExpired: isTokenExpired()        \n    }\n\n    switch (action.type) {\n        case loginRequest:\n            return Object.assign({}, state, {\n                isFetching: true,\n                initiateRedirect: false,\n                user: action.creds\n            })\n        case loginSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                initiateRedirect: true,\n                isAuthenticated: true,\n                errorMessage: '',\n                userProfile: action.userProfile,\n                userClaims: action.userClaims,\n                isTokenExpired: action.isTokenExpired\n            })\n        case loginFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                initiateRedirect: false,\n                isAuthenticated: false,\n                errorMessage: action.message\n            })\n        case refreshTokenRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            })\n        case refreshTokenSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                userProfile: action.userProfile,\n                userClaims: action.userClaims,\n                isTokenExpired: action.isTokenExpired,\n                errorMessage: ''\n            })\n        case refreshTokenFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                initiateRedirect: false,\n                isAuthenticated: false,\n                errorMessage: action.message\n            })\n        case logoutSuccess:\n            return Object.assign({}, state, {\n                isFetching: true,\n                initiateRedirect: false,\n                isAuthenticated: false\n            })\n        case houseLoginRequest:\n            return Object.assign({}, state, {\n                isFetching: true,\n                initiateRedirect: false\n            })\n        case houseLoginFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                initiateRedirect: false,\n                isAuthenticated: false,\n                errorMessage: action.message\n            })\n        case houseLoginSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                initiateRedirect: true,\n                isAuthenticated: true,\n                errorMessage: '',\n                userProfile: action.userProfile,\n                userClaims: action.userClaims,\n                isTokenExpired: action.isTokenExpired\n            })\n        default:\n            return state\n    }\n};","import React from \"react\";\nimport { useMsal } from \"@azure/msal-react\";\nimport { loginRequest } from \"../../../authConfig\";\n\nconst HouseLoginButton = (props) => {\n    const { instance } = useMsal();\n    const user = props.username;\n    const handleLogin = (loginType) => {\n        if (loginType === \"redirect\") {\n            loginRequest.loginHint = user\n            instance.loginRedirect(loginRequest).catch(e => {\n                console.log(e);\n            });\n        }\n    }\n    return (\n        <button className=\"button secondary\" type=\"submit\" onClick={() => handleLogin(\"redirect\")}>Login</button>\n    );\n}\n\nexport default HouseLoginButton;","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport * as Fields from '../../lis-layout/components/lis-forms-component';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport HouseLoginButton from './lis-house-login-button';\n\nclass LoginForm extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            username: '',\n            password: '',\n            isSubmitting: false,\n            errorMessage: '',\n            houseLogin: false\n        };\n\n        this.checkForHouseDomain = this.checkForHouseDomain.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n        this.handleSubmit = this.handleSubmit.bind(this);\n    }\n\n    checkForHouseDomain() {\n        let userNameSplit = this.state.username.split(\"@\");\n\n        this.setState({\n            houseLogin: userNameSplit[1] && userNameSplit[1] === \"house.virginia.gov\" ? true : false\n        })\n    }\n\n    handleChange(key, val) {\n        this.setState({\n            [key]: val\n        }, () => {\n            if (key === \"username\") {\n                this.checkForHouseDomain();\n            }\n        });\n    }\n\n    handleSubmit(e) {\n        e.preventDefault();\n        if (this.state.houseLogin) { return; }\n        this.setState({\n            isSubmitting: true\n        })\n        const params = {\n            userId: this.state.username,\n            userPassword: this.state.password\n        }\n        this.props.actions.loginUser(params)\n            .catch(err => {\n                if (err.IsPasswordTemporaryOrExpired) {\n                    this.props.history.push('/change-password?emailaddress=' + params.userId + '&passwordistemporaryorexpired=true');\n                } else {\n                    const failureMessage = err.FailureMessage;\n                    const failureCode = failureMessage?.match(/Login failed \\(\\d+\\)/);\n                    this.setState({\n                        errorMessage: failureCode ? <span className=\"message-error\">Login failed. Invalid Email or Password. Please try again or <a style={{ display: \"inline-block\", padding: \"0px\", margin: \"0px\" }} href={`mailto:LIS@dlas.virginia.gov?subject=Login failed - invalid User ID or Password -- ${failureCode[0].match(/\\(\\d+\\)/)}`}>contact us</a> for assistance if the issue persists.</span> : <span className=\"message-error\">{failureMessage ?? JSON.stringify(err)}</span>,\n                        isSubmitting: false\n                    });\n                }\n            })\n    }\n\n    render() {\n        const {\n            isSubmitting,\n            errorMessage,\n            username,\n            password,\n            houseLogin\n        } = this.state;\n\n        const {\n            isSubmenu\n        } = this.props;\n\n        return (\n            <div className={!isSubmenu && \"inner-grid two multi-row\"}>\n                <div className=\"dlas-forms\">\n                    <form onSubmit={this.handleSubmit}>\n                        <div>\n                            <div className=\"single-row\">\n                                {isSubmenu\n                                    ? <span className=\"bold txt-blue\">Log In to LIS</span>\n                                    : <h3>Log In to LIS</h3>}\n                            </div>\n                            <div className=\"single-row\">\n                                <Fields.TextInput\n                                    id=\"userId\"\n                                    autoFocus={true}\n                                    type=\"text\"\n                                    placeholder=\"Email\"\n                                    value={username}\n                                    onChange={e => this.handleChange('username', e.target.value)}\n                                />\n                            </div>\n                            <div className=\"single-row\">\n                                {!houseLogin\n                                    ? <Fields.TextInput\n                                        id=\"userPassword\"\n                                        type=\"password\"\n                                        placeholder=\"Password\"\n                                        value={password}\n                                        onChange={e => this.handleChange('password', e.target.value)}\n                                        onFocus={() => this.checkForHouseDomain()}\n                                    />\n                                    : <HouseLoginButton username={username} />\n                                }\n                            </div>\n                            <div className=\"single-row\" style={!isSubmenu ? { marginTop: \"10px\" } : {}}>\n                                {!houseLogin && <button className=\"button secondary\" type=\"submit\" disabled={!username || !password || isSubmitting}>Login</button>}\n                            </div>\n                            {!houseLogin && errorMessage}\n                        </div>\n                    </form>\n                    {isSubmenu && <hr className=\"faded-line full-width\" />}\n                    <div className=\"flex-row\" style={!isSubmenu ? { marginTop: \"10px\" } : {}}>\n                        <Link style={{ textDecoration: \"none\" }} to=\"/forgot-password\">Forgot Password</Link>\n                        <Link style={{ textDecoration: \"none\" }} to=\"/register-account\">Register Account</Link>\n                    </div>\n                </div>\n                {!isSubmenu &&\n                    <div className=\"txt-blue\">\n                        <h3><b>Track up to 5 bills for free</b></h3>\n                        <p>Your new free account will allow you to track up to 5 bills in one Watchlist and set up notifications.</p>\n                        <p>Email notification triggers an email when bills are sponsored by a member of the General Assembly, referred to a House or Senate Committee or contain a specific key word(s), phrases, or Code section(s).</p>\n\n                        <h3><b>Lobbyist-in-a-Box Subscription</b></h3>\n                        <p>A subscription to Lobbyist-in-a-Box offers up to 100 Watchlists (previously called \"Profiles\") containing 300 bills each.</p>\n                        <p>The cost of this service is $400 per user for state agencies, and $600 per user for all other subscribers.  More user accounts can be added, please refer to the Subscription Information on the <a style={{ textDecoration: \"none\" }} target=\"_blank\" rel=\"noreferrer\" href=\"http://help.lis.virginia.gov/liab/index.asp\">LIS Learning Center</a> for additional options and fees, the 2-Step Registration and Payment process, and complete LIAB registration instructions.</p>\n                        <p><span className=\"bold\">Need additional information or assistance?</span> Please send an e-mail message to <a style={{ textDecoration: \"none\" }} href=\"mailto:lis@dlas.virginia.gov\">lis@dlas.virginia.gov</a>.</p>\n                        <p>For questions relating to LIAB Subscription payment procedures, please contact Virginia Interactive, LLC (VI) dba Tyler Virginia at <a style={{ textDecoration: \"none\" }} href=\"mailto:va-customerservice@tylertech.com\">va-customerservice@tylertech.com</a> or (804) 318-4133.</p>\n                    </div>\n                }\n            </div>\n        );\n\n    }\n};\n\nexport default connect(\n    (state) => {\n        const { login, nav } = state;\n        return {\n            login,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, authActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(LoginForm);\n\n\n\n\n\n","import React from \"react\";\nimport { useMsal } from \"@azure/msal-react\";\n\nconst graphToken = 'GRAPH_ID_TOKEN';\nconst idToken = 'LIS_ID_TOKEN';\nconst refreshToken = 'LIS_REFRESH_TOKEN';\nconst refreshTokenExpiration = 'LIS_REFRESH_TOKEN_EXPIRATION';\nconst claims = \"LIS_CLAIMS\";\n\nconst HouseLogoutButton = (props) => {\n    const { instance } = useMsal();\n\n    const handleLogout = (logoutType) => {\n        if (logoutType === \"redirect\") {\n            localStorage.removeItem(idToken);\n            localStorage.removeItem(refreshToken);\n            localStorage.removeItem(refreshTokenExpiration);\n            localStorage.removeItem(claims);\n            localStorage.removeItem(graphToken);\n            instance.logoutRedirect()\n                .then(() => {\n                    props.logout();\n                })\n        }\n    }\n\n    return (\n        <button type=\"button\" className=\"button profile-action danger\" onClick={() => handleLogout(\"redirect\")}>Logout</button>\n    );\n}\n\nexport default HouseLogoutButton","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\nimport HouseLogoutButton from './lis-house-logout-button';\n\nconst Links = (props) => {\n    let unsortedLinks = [];\n    props.canAccessMemberMgmt &&\n        unsortedLinks.push({\n            route: \"/member-management\", label: \"Member Management\"\n        });\n    props.canAccessSessionMgmt &&\n        unsortedLinks.push({\n            route: \"/session-management\", label: \"Session Management\"\n        });\n    props.canAccessCommitteeMgmt &&\n        unsortedLinks.push({\n            route: \"/committee-management\", label: \"Committee Management\"\n        });\n    props.canAccessMinutesMgmt &&\n        unsortedLinks.push({\n            route: \"/minutes-management\", label: \"Minutes Management\"\n        });\n    props.canAccessDocketMgmt &&\n        unsortedLinks.push({\n            route: \"/docket-management\", label: \"Docket Management\"\n        });\n    props.canAccessBillMgmt &&\n        unsortedLinks.push({\n            route: \"/bill-management\", label: \"Bill Management\"\n        });\n    props.canAccessVersionMgmt &&\n        unsortedLinks.push({\n            route: \"/version-management\", label: \"Version Management\"\n        });\n    props.canAccessAmendmentMgmt &&\n        unsortedLinks.push({\n            route: \"/amendment-management\", label: \"Amendment Management\"\n        });\n    props.canAccessCommMgmt &&\n        unsortedLinks.push({\n            route: \"/communications-management\", label: \"Communications Management\"\n        });\n    props.canAccessCalendarMgmt &&\n        unsortedLinks.push({\n            route: \"/calendar-management\", label: \"Calendar Management\"\n        });\n    props.canAccessConfigurationsMgmt &&\n        unsortedLinks.push({\n            route: \"/configurations-management\", label: \"Configurations Management\"\n        });\n    props.canAccessJournalMgmt &&\n        unsortedLinks.push({\n            route: \"/journal-management\", label: \"Journal Management\"\n        });\n    props.canAccessVoteMgmt &&\n        unsortedLinks.push({\n            route: \"/vote-management\", label: \"Vote Management\"\n        });\n    props.canAccessPrintMgmt &&\n        unsortedLinks.push({\n            route: \"/print-management\", label: \"Print Management\"\n        });\n    props.canAccessMeetingsMgmt &&\n        unsortedLinks.push({\n            route: \"/schedule\", label: \"Meetings Management\"\n        });\n    props.canAccessPartnerMgmt &&\n        unsortedLinks.push({\n            route: \"/partner-management\", label: \"Partner Management\"\n        });\n    props.canAccessUserMgmt &&\n        unsortedLinks.push({\n            route: \"/user-management\", label: \"User Management\"\n        });\n    props.canAccessBds &&\n        unsortedLinks.push({\n            route: window.env?.APP_ENV === \"Production\" ? \"http://leg5.state.va.us/bd/frmBDSlogin.aspx\" : (\"http://test-bds.dlas.virginia.gov/default.aspx?srv=6&ses=\" + props.selectedSession.SessionCode.substr(2, 5) + \"&usr=D\"), label: \"Bill Drafting System (BDS)\", outside: true\n        });\n\n    return (\n        <div>\n            {unsortedLinks.sort((a, b) => a.label.localeCompare(b.label)).map((link, idx) => {\n                return !link.outside ? <li key={idx}><Link to={link.route}>{link.label}</Link></li> : <li key={idx}><a href={link.route}>{link.label}</a></li>\n            })\n            }\n            {\n                props.canAccessReportMgmt &&\n                <li><Link to=\"/report-management\">Rule Reports</Link></li>\n            }\n            {\n                props.canAccessSenateLinks &&\n                <React.Fragment>\n                    <li><a href=\"http://apps.dlas.virginia.gov/newamendments/ViewAmendmentsCommittee.aspx?hou=S\" target=\"_blank\" rel=\"noopener noreferrer\">Senate Committee Amendments</a></li>\n                    <li><a href=\"https://apps.dlas.virginia.gov/ComSubNew/Default.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">Senate Committee Substitutes</a></li>\n                    <li><a href=\"https://apps.dlas.virginia.gov/newamendments/frmFloorAmendments.aspx?hou=S\" target=\"_blank\" rel=\"noopener noreferrer\">Senate Floor Amendments</a></li>\n                    <li><a href=\"https://apps.dlas.virginia.gov/newamendments/frmFloorSubstitutes.aspx?hou=S\" target=\"_blank\" rel=\"noopener noreferrer\">Senate Floor Substitutes</a></li>\n                    <li><a href=\"https://apps.dlas.virginia.gov/comsubnew/frmCommitteeSummary.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">Senate Committee Vote Summary</a></li>\n                    <li><a href=\"http://leg4.state.va.us/dockets/frmLogin.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">Senate Patron Notification System</a></li>\n                    <li><a href=\"https://apps.senate.virginia.gov/calendar/comListVoting.php\" target='_blank'>Committee Room Docket Load</a></li>                    \n                    <li><a href=\"https://apps.dlas.virginia.gov/comsubnew/frmLogin.aspx\" target='_blank'>Committee Vote Push</a></li>                            \n                </React.Fragment>\n            }\n            {\n                props.canAccessPatronStatusReport &&\n                <li><a href=\"http://efile.dlas.virginia.gov/frmMemberBD.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">Patron Status Report</a></li>\n            }\n            {\n                props.isLoggedIn &&\n                <li><Link to=\"/watchlists\">{props.canAccessWatchlists ? \"My Watchlists\" : \"My Watchlist\"}</Link></li>\n            }\n        </div>\n    )\n}\n\nclass UserProfile extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            tabIndexNum: '-1',\n        }\n\n        this.targetFocus = React.createRef();\n    }\n\n    handleLogout(props) {\n        this.props.actions.logoutUser();\n        if (this.props.login.slideout) {\n            this.props.login.slideoutToggle();\n        }\n    }\n\n    render() {\n        const {\n            isOpen,\n            isAriaHidden,\n            isAriaExpanded,\n            isMenuVisible,\n            slideout,\n            permissions\n        } = this.props;\n\n        const {\n            tabIndexNum\n        } = this.state;\n\n        if (isOpen) {\n            this.targetFocus.current.focus();\n        }\n\n        return (\n            <div>\n                {!slideout\n                    ?\n                    <div>\n                        <p className=\"welcome-txt\">Hi, {this.props.login.userProfile.name}</p>\n                        <ul>\n                            <Links\n                                canAccessMemberMgmt={Boolean(permissions.find(p => p.canAccessMemberMgmt))}\n                                canAccessSessionMgmt={Boolean(permissions.find(p => p.canAccessSessionMgmt))}\n                                canAccessCommitteeMgmt={Boolean(permissions.find(p => p.canAccessCommitteeMgmt))}\n                                canAccessMinutesMgmt={Boolean(permissions.find(p => p.canAccessMinutesMgmt))}\n                                canAccessDocketMgmt={Boolean(permissions.find(p => p.canAccessDocketMgmt))}\n                                canAccessVersionMgmt={Boolean(permissions.find(p => p.canAccessVersionMgmt))}\n                                canAccessAmendmentMgmt={Boolean(permissions.find(p => p.canAccessAmendmentMgmt))}\n                                canAccessBillMgmt={Boolean(permissions.find(p => p.canAccessBillMgmt))}\n                                canAccessCommMgmt={Boolean(permissions.find(p => p.canAccessCommMgmt))}\n                                canAccessCalendarMgmt={Boolean(permissions.find(p => p.canAccessCalendarMgmt))}\n                                canAccessConfigurationsMgmt={Boolean(permissions.find(p => p.canAccessConfigurationsMgmt))}\n                                canAccessJournalMgmt={Boolean(permissions.find(p => p.canAccessJournalMgmt))}\n                                canAccessVoteMgmt={Boolean(permissions.find(p => p.canAccessVoteMgmt))}\n                                canAccessPrintMgmt={Boolean(permissions.find(p => p.canAccessPrintMgmt))}\n                                canAccessReportMgmt={Boolean(permissions.find(p => p.canAccessReportMgmt))}\n                                canAccessMeetingsMgmt={Boolean(permissions.find(p => p.canAccessMeetingsMgmt))}\n                                canAccessWatchlists={Boolean(permissions.find(p => p.canAccessWatchlists))}\n                                canAccessPartnerMgmt={Boolean(permissions.find(p => p.canAccessPartnerMgmt))}\n                                canAccessUserMgmt={Boolean(permissions.find(p => p.canAccessUserMgmt))}\n                                canAccessSenateLinks={Boolean(permissions.find(p => p.canAccessSenateLinks))}\n                                canAccessPatronStatusReport={Boolean(permissions.find(p => p.canAccessPatronStatusReport))}\n                                canAccessBds={Boolean(permissions.find(p => p.canAccessBds))}\n                                isLoggedIn={this.props.login.isAuthenticated}\n                                bdsRole={this.props.login.bdsRole}\n                                selectedSession={this.props.session.selectedSession}\n                            />\n                        </ul>\n                        <p className=\"profile-action-container\">\n                            <Link to=\"/profile\" className=\"button profile-action informational\" style={{ margin: '0px', padding: '7px 20px' }}>Profile</Link>\n                            {this.props.login.userProfile.email.split(\"@\")[1] === \"house.virginia.gov\"\n                                ? <HouseLogoutButton\n                                    logout={this.props.actions.logoutUser}\n                                />\n                                : <button className=\"button profile-action danger\" onClick={this.handleLogout.bind(this)}>Logout</button>}\n                        </p>\n                    </div>\n                    :\n                    <nav id=\"slideout-menu\" tabIndex={tabIndexNum} aria-expanded={isAriaExpanded} aria-hidden={isAriaHidden}>\n                        <div className={isMenuVisible ? 'slideout-inner show' : 'slideout-inner'}>\n                            <ul>\n                                <li className=\"menu-heading\">LIS</li>\n                                <li className='small-li'><a ref={this.targetFocus} href=\"http://virginiageneralassembly.gov/\">VIRGINIA GENERAL ASSEMBLY</a></li>\n                                <li className='small-li'><a href=\"http://help.lis.virginia.gov/\" target=\"_blank\" rel=\"noreferrer\">LIS LEARNING CENTER</a></li>\n                                <li className='small-li'><Link to=\"/home\">LIS HOME</Link></li>\n                                {\n                                    this.props.login.isAuthenticated &&\n                                    <li className='small-li'><Link to=\"/profile\">PROFILE</Link></li>\n                                }\n                                {this.props.login.userProfile.name === \"\"\n                                    ?\n                                    <React.Fragment>\n                                        <li className='small-li'><Link to=\"/register-account\">REGISTER ACCOUNT</Link></li>\n                                        <li className='small-li'><Link to=\"/login\">LOGIN</Link></li>\n                                    </React.Fragment>\n                                    : this.props.login.userProfile.email.split(\"@\")[1] === \"house.virginia.gov\"\n                                        ? <HouseLogoutButton />\n                                        : <li className='small-li' onClick={this.handleLogout.bind(this)}><a className=\"slideout-nav-logout\">LOGOUT</a></li>\n                                }\n                                <li><Link to={`/`}>Session Information</Link></li>\n                                <li><Link to=\"/bill-search\">Bills & Resolutions</Link></li>\n                                <li><a target=\"_blank\" href={\"https://budget.lis.virginia.gov/\"}>State Budget</a></li>\n                                <li><a target=\"_blank\" href=\"https://law.lis.virginia.gov/\">Virginia Law</a></li>\n                                <li><a target=\"_blank\" href=\"https://rga.lis.virginia.gov/\">Reports to the General Assembly</a></li>\n                                <Links\n                                    canAccessMemberMgmt={Boolean(permissions.find(p => p.canAccessMemberMgmt))}\n                                    canAccessSessionMgmt={Boolean(permissions.find(p => p.canAccessSessionMgmt))}\n                                    canAccessCommitteeMgmt={Boolean(permissions.find(p => p.canAccessCommitteeMgmt))}\n                                    canAccessMinutesMgmt={Boolean(permissions.find(p => p.canAccessMinutesMgmt))}\n                                    canAccessDocketMgmt={Boolean(permissions.find(p => p.canAccessDocketMgmt))}\n                                    canAccessBillMgmt={Boolean(permissions.find(p => p.canAccessBillMgmt))}\n                                    canAccessVersionMgmt={Boolean(permissions.find(p => p.canAccessVersionMgmt))}\n                                    canAccessAmendmentMgmt={Boolean(permissions.find(p => p.canAccessAmendmentMgmt))}\n                                    canAccessCommMgmt={Boolean(permissions.find(p => p.canAccessCommMgmt))}\n                                    canAccessCalendarMgmt={Boolean(permissions.find(p => p.canAccessCalendarMgmt))}\n                                    canAccessConfigurationsMgmt={Boolean(permissions.find(p => p.canAccessConfigurationsMgmt))}\n                                    canAccessJournalMgmt={Boolean(permissions.find(p => p.canAccessJournalMgmt))}\n                                    canAccessVoteMgmt={Boolean(permissions.find(p => p.canAccessVoteMgmt))}\n                                    canAccessPrintMgmt={Boolean(permissions.find(p => p.canAccessPrintMgmt))}\n                                    canAccessReportMgmt={Boolean(permissions.find(p => p.canAccessReportMgmt))}\n                                    canAccessMeetingsMgmt={Boolean(permissions.find(p => p.canAccessMeetingsMgmt))}\n                                    canAccessWatchlists={Boolean(permissions.find(p => p.canAccessWatchlists))}\n                                    canAccessPartnerMgmt={Boolean(permissions.find(p => p.canAccessPartnerMgmt))}\n                                    canAccessUserMgmt={Boolean(permissions.find(p => p.canAccessUserMgmt))}\n                                    canAccessSenateLinks={Boolean(permissions.find(p => p.canAccessSenateLinks))}\n                                    canAccessPatronStatusReport={Boolean(permissions.find(p => p.canAccessPatronStatusReport))}\n                                    canAccessBds={Boolean(permissions.find(p => p.canAccessBds))}\n                                    isLoggedIn={this.props.login.isAuthenticated}\n                                    selectedSession={this.props.session.selectedSession}\n                                />\n                                <li></li>\n                            </ul>\n                        </div>\n                    </nav>\n                }\n            </div>\n        )\n    }\n};\n\nexport default connect(\n    (state) => {\n        const { login, session } = state;\n        return {\n            session,\n            login\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, authActionCreators), dispatch)\n        }\n    }\n)(UserProfile)","import React from 'react';\nimport Login from '../../lis-login/components/lis-login-form';\nimport UserProfile from './lis-profile-component';\n\n\nclass Submenu extends React.Component {\n\n    render() {\n        const {\n            isAuth\n        } = this.props;\n\n        if (!isAuth) {\n            return (\n                <ul className=\"nav-submenu\">\n                    <Login\n                        history={this.props.history}\n                        isSubmenu={true}\n                    />\n                </ul>\n            )\n        }\n        else {\n            return (\n                <ul className=\"nav-submenu\">\n                    <UserProfile permissions={this.props.permissions} />\n                </ul>\n            )\n        }\n    }\n}\n\nexport default Submenu;","import React from 'react';\nimport { withRouter } from 'react-router';\nimport { connect } from 'react-redux';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { bindActionCreators } from 'redux';\nimport queryString from 'query-string';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\n\nclass SearchInputComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            search: ''\n        };\n        this.handleInputChange = this.handleInputChange.bind(this);\n        this.handleSubmit = this.handleSubmit.bind(this);\n    }\n\n    handleInputChange(event) {\n        this.setState({ search: event.target.value });\n    }\n\n    handleSubmit(event) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        //If nothing is in the search box then don't search\n        if (this.state.search.replace(/\\s/g, '') === '') {\n            return;\n        }\n\n        let session, getSessionPromise;\n        if (this.props.session.sessionList && this.props.session.sessionList.length) {\n            session = this.props.session.sessionList.find(session => session.SessionCode === this.props.nav.session).SessionID;\n        } else {\n            getSessionPromise = this.props.actions.getSessionByCode(this.props.nav.session)\n                .then(() => {\n                    session = this.props.session.selectedSession.SessionID;\n                })\n        }\n\n        Promise.all([getSessionPromise]).finally(() => {\n            // Check to see if the search term contains a bill number\n            // This regex means 'match any of the bill prefixes even if it is seperated by non alpha-numberic characters. Only match if it is followed by a number. Also, include the number in the match'\n            // A greater than sign (>) or less than sign (<) is a symbol used to search multiple bills. It also is part of a valid bill number\n            const regexResult = this.state.search.match(/[HS][^0-9A-Z]*[BJR][^0-9A-Z]*(?=[0-9])[0-9]+[<>-]?/gi);\n            let legNumbers = '';\n            let searchTerms = '';\n            if (regexResult) {\n                //bill number(s) found\n                legNumbers = '';\n                let foundRange = false;\n                let searchWithRemovedBillNumbers = this.state.search;\n                regexResult.forEach((result, resultIndex) => {\n                    foundRange = result.match(/-/g);\n                    //If it has a dash then it is a range of bills and should not get a comma after it\n                    if (foundRange !== null) {\n                        //Remove all the characters that are not a letter, number, or dash\n                        legNumbers += result.replace(/[^A-Za-z0-9\\-]+/g, '');\n                    } else {\n                        //Remove all the characters that are not a letter, number, greater than sign, or less than sign\n                        legNumbers += result.replace(/[^A-Za-z0-9<>]+/g, '');\n                        //Add a comma between the legislation numbers so the api can search for multiple legislation numbers\n                        if (regexResult.length !== resultIndex + 1) {\n                            legNumbers += ','\n                        }\n                    }\n                    // Remove the bill numbers from the search string. If there is anything left then add them as search terms\n                    searchWithRemovedBillNumbers = searchWithRemovedBillNumbers.replace(result, '')\n                });\n                searchTerms = searchWithRemovedBillNumbers;\n                // Remove any commas since those were probably added by the user to seperate the bill numbers\n                searchTerms = searchTerms.replace(',', '');\n\n            } else {\n                searchTerms = this.state.search;\n            }\n\n            if (/[A-Za-z0-9]+/g.test(searchTerms)) {\n                searchTerms = searchTerms.trim();\n            } else {\n                // Don't add search terms if there are no letters or numbers in it\n                searchTerms = '';\n            }\n            const param = {\n                selectedBillNumbers: legNumbers,\n                selectedKeywords: searchTerms,\n                selectedSession: session\n            }\n            const link = window.btoa(JSON.stringify(param));\n            let url = '/bill-search?q=' + link;\n            if (this.props.location.pathname === '/bill-search') {\n                //if they have selected a watchlist, keep the watchlist set in the url\n                if (queryString.parse(this.props.location.search).collection) url += \"&collection=\" + queryString.parse(this.props.location.search).collection;\n                //if they are re-executing the same search (i.e. same parameters) as they're currently viewing (essentially a refresh), just add a rnd so the url changes (needed for search to execute)\n                const parsed = queryString.parse(this.props.location.search, { decode: false });\n                if (parsed.q && parsed.q === link) {\n                    url += '&rnd=' + new Date().getTime();\n                }\n            }\n            this.props.history.push(url);\n        });\n    }\n\n    render() {\n        return (\n            <div className=\"global-search-box\">\n                <form>\n                    <label htmlFor=\"quick-search\" className=\"screen-reader-only\">Search for keyword or bill number</label>\n                    <input type=\"text\" id=\"quick-search\" className=\"quick-search\" onChange={this.handleInputChange} value={this.state.search} placeholder=\"Search for keyword or bill number\" />\n                    <input type=\"submit\" aria-label=\"search\" value=\"GO\" onClick={this.handleSubmit} className=\"input-searchbtn\" />\n                </form>\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { nav, session } = state;\n        return {\n            nav,\n            session\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, navActionCreators, sessionActionCreators), dispatch)\n        }\n    }\n)(withRouter(SearchInputComponent))","import React from 'react';\nimport { Link, withRouter } from 'react-router-dom';\nimport { CSSTransitionGroup } from 'react-transition-group';\nimport Submenu from './lis-submenu-component';\nimport SearchInput from './lis-global-search-input-component';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\n\n\nclass NavMenu extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            showLogin: false,\n            pathName: ''\n        };\n        this.handleClick = this.handleClick.bind(this);\n        this.handleClosingLoginOnOffClick = this.handleClosingLoginOnOffClick.bind(this);\n        this.mousedownListener = this.mousedownListener.bind(this);\n    }\n\n    componentDidMount() {\n        const pathName = this.props.location.pathname;\n        this.setState({ pathName: pathName })\n\n        document.body.addEventListener('mousedown', this.mousedownListener);\n    }\n\n    componentDidUpdate(prevProps) {\n        if (this.props.location !== prevProps.location) {\n            this.setState(prevState => ({\n                showLogin: false,\n                pathName: this.props.location.pathname\n            }));\n        }\n        if (this.props.location.pathname !== prevProps.location.pathname && this.props.isOpen) {\n            this.props.slideoutToggle();\n        }\n    }\n\n    componentWillUnmount() {\n        document.body.removeEventListener('mousedown', this.mousedownListener)\n    }\n\n    mousedownListener(e) {\n        if (this.state.showLogin) {\n            const loginBox = document.getElementsByClassName(\"nav-submenu\")[0];\n            const profileLink = document.getElementsByClassName(\"profile-link\")[0];\n            const loginLink = document.getElementsByClassName(\"login-link\")[0];\n            if ((!loginBox || (loginBox !== e.target && !loginBox.contains(e.target))) &&\n                (!loginLink || (loginLink !== e.target && !loginLink.contains(e.target))) &&\n                (!profileLink || (profileLink !== e.target && !profileLink.contains(e.target)))) {\n                this.handleClosingLoginOnOffClick();\n            }\n        }\n    }\n\n    handleClosingLoginOnOffClick() {\n        if (this.state.showLogin) {\n            this.setState({\n                showLogin: false\n            });\n        }\n    }\n\n    handleClick() {\n        this.setState(prevState => ({\n            showLogin: !prevState.showLogin\n        }));\n    }\n\n    slideoutToggle() {\n        this.props.slideoutToggle();\n    }\n\n    render() {\n        const { isAuthenticated, userProfile } = this.props.login;\n        // Make dynamic button based on user's auth state\n        let button;\n        if (!isAuthenticated) {\n            button = <LoginButton onClick={this.handleClick} />;\n        } else {\n            button = <ProfileButton onClick={this.handleClick} name={userProfile.initials} />\n        }\n        // Make dynamic header based on URL path\n        let header;\n        let isBillPath = this.state.pathName.includes('/bill-search');\n        if (isBillPath) {\n            header = <h1>Bills &amp; Resolutions </h1>\n        } else {\n            header = <h1>Legislative Information System </h1>\n        }\n        // Assemble session-aware budget url\n        let budgetUrl = \"https://budget.lis.virginia.gov/\";\n        if (this.props.session) {\n           // budgetUrl += `default/${this.props.session.SessionCode.substr(0, 4)}/${this.props.session.SessionCode.substr(4)}`\n        }\n\n        return (\n            <nav>\n                <div className=\"lis-links-content full\">\n                    <ul>\n                        <li><a href=\"http://virginiageneralassembly.gov/\">Virginia General Assembly</a> /</li>\n                        <li><a href=\"http://help.lis.virginia.gov/\" target=\"_blank\" rel=\"noreferrer\">LIS Learning Center</a> /</li>\n                        <li><Link to=\"/privacy\" target=\"_blank\" rel=\"noreferrer\">Privacy Policy</Link> /</li>\n                        <li>\n                            <Link to=\"/home\">LIS Home</Link> /\n                        </li>\n                        {!isAuthenticated && <li>\n                            <Link to=\"/register-account\">Register Account</Link> /\n                        </li>}\n                        <li onClick={e => e.stopPropagation()} className=\"parent-link\">\n                            {button}\n                            <div className=\"submenu-container\">\n                                <CSSTransitionGroup\n                                    transitionName=\"slide\"\n                                    transitionEnterTimeout={300}\n                                    transitionLeaveTimeout={300}\n                                >\n                                    {this.state.showLogin && <Submenu history={this.props.history} isAuth={isAuthenticated} permissions={this.props.permissions} />}\n                                </CSSTransitionGroup>\n                            </div>\n                        </li>\n                    </ul>\n                </div>\n                <div className=\"grid-wrapper one-and-three halves\">\n                    <div className=\"menu-title\">\n                        <Link to=\"/home\">LIS</Link>\n                    </div>\n                    <div className=\"menu-links\">\n                        <div className=\"menu-btn\">\n                            <button type=\"button\" onClick={this.slideoutToggle.bind(this)} href=\"#menu\" tabIndex=\"0\" aria-label=\"Menu\">Menu</button>\n                        </div>\n                        <ul>\n                            <li>\n                                <Link className=\"txt-blue\" to={`/`}>Session Information</Link>\n                            </li>\n                            <li>\n                                <Link className=\"txt-dark-blue\" to=\"/bill-search\">Bills & Resolutions</Link>\n                            </li>\n                            <li>\n                                <a className=\"txt-green\" target=\"_blank\" href={`${budgetUrl}`}>State Budget</a>\n                            </li>\n                            <li>\n                                <a className=\"txt-light-green\" target=\"_blank\" href=\"https://law.lis.virginia.gov/\">Virginia Law</a>\n                            </li>\n                            <li>\n                                <a className=\"txt-orange\" target=\"_blank\" href=\"https://rga.lis.virginia.gov/\">Reports to the General Assembly</a>\n                            </li>\n                        </ul>\n                    </div>\n                </div>\n                <div id=\"site-title-container\" className={isBillPath ? 'bill-theme' : null}>\n                    <div className=\"site-title-content grid-wrapper three-and-two\">\n                        {header}\n                        <SearchInput />\n                    </div>\n                </div>\n            </nav>\n        )\n    }\n}\n\nfunction LoginButton(props) {\n    return (\n        <a className=\"login-link\" onClick={props.onClick}>\n            Login\n        </a>\n    );\n}\n\nfunction ProfileButton(props) {\n    return (\n        <a className=\"profile-link\" onClick={props.onClick}>\n            {props.name}\n        </a>\n    );\n}\n\nconst Menu = connect(\n    (state) => {\n        const { login, nav } = state;\n        return {\n            login,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, navActionCreators, authActionCreators), dispatch)\n        }\n    }\n)(NavMenu)\n\nexport default withRouter(Menu);","import React from 'react';\nimport Select from 'react-select';\nimport { Link } from 'react-router-dom';\nimport { withRouter } from 'react-router';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\n\nconst customStyles = {\n    option: (base, state) => ({\n        ...base,\n        fontSize: '14px',\n        fontWeight: state.data.IsActive ? 'bold' : 'normal'\n    }),\n    control: (base) => ({\n        ...base,\n        fontSize: '14px',\n        background: '#f1f1f1',\n        border: '1px solid #d8d8d8',\n        borderRadius: '0 0 5px 5px'\n    }),\n    menu: (base) => ({\n        ...base,\n        width: '245px',\n        marginTop: '1px',\n\n    }),\n    menuList: (base) => ({\n        ...base,\n        marginTop: '1px'\n    }),\n    indicatorSeparator: (base) => ({\n        ...base,\n        display: \"none\"\n    }),\n    singleValue: (base, state) => {\n        return { ...base, };\n    }\n}\n\nclass SessionSelector extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            data: [],\n            selectedSession: {},\n            sessionListMessage: '',\n            sessionOptions: []\n        };\n\n        this.getSessions = this.getSessions.bind(this);\n    }\n\n    componentDidMount() {\n        this.getSessions();\n    }\n\n    getSessions() {\n        this.props.actions.getSessionList().then(() => {\n            if (this.props.session.sessionList.length > 0) {\n                // FORMAT DATA FOR DROPDOWN\n                let sessionList = [...this.props.session.sessionList]\n                sessionList.forEach(session => {\n                    session.value = session.SessionID;\n                    session.label = session.SessionYear + ' ' + session.DisplayName + (session.IsActive ? ' (Active)' : '');\n                    if (session.SessionCode === this.props.nav.session) {\n                        this.setState({\n                            selectedSession: session\n                        });\n                    } else if (session.IsDefault && !this.props.nav.session) {\n                        this.props.actions.changeSession(session.SessionCode);\n                        this.setState({\n                            selectedSession: session\n                        });\n                    }\n                });\n                sessionList = sessionList.reverse();\n                this.setState({\n                    sessionOptions: sessionList\n                });\n            } else {\n                this.setState({\n                    sessionListMessage: this.props.session.sessionListMessage\n                });\n            }\n        });\n    }\n\n    handleChange = value => {\n        if (window.env && window.env.HISTORICAL_DATA_REDIRECT && value && !value.IsDefault && value.LegacySessionID && value.SessionCode != \"20242\") {\n            this.setState({\n                historicalSessionRedirect: (redirect) => {\n                    if (redirect) {\n                        let a = document.createElement('a');\n                        a.target = '_blank';\n                        a.href = `https://legacylis.virginia.gov/cgi-bin/legp604.exe?ses=${value.SessionCode.substring(2)}&typ=lnk&val=${value.LegacySessionID}`;\n                        document.body.appendChild(a);\n                        a.click();\n                        document.body.removeChild(a);\n                    }\n                    this.setState({ historicalSessionRedirect: false })\n                }\n            })\n            return;\n        }\n        if (value && value.SessionCode) {\n            this.setState({\n                selectedSession: this.state.sessionOptions.find(s => s.SessionCode === value.SessionCode)\n            });\n            this.props.actions.changeSession(value.SessionCode);\n        }\n    }\n\n    componentDidUpdate(prevProps, prevState) {\n        if (prevProps.nav.session !== this.props.nav.session || (prevState.sessionOptions.length !== this.state.sessionOptions.length && this.state.selectedSession?.SessionCode !== this.props.nav.session)) {\n            const selectedSession = this.state.sessionOptions.find(option => option.SessionCode?.toString() === this.props.nav.session?.toString())\n            if (selectedSession) {\n                this.setState({\n                    selectedSession: selectedSession\n                })\n            }\n        }\n        if (prevProps.nav.reloadSessionSelector !== this.props.nav.reloadSessionSelector && this.props.nav.reloadSessionSelector === true) {\n            this.getSessions();\n            this.props.actions.reloadSessionSelector(false);\n        }\n\n        if (this.props.overrideSession != \"\") {\n            this.handleChange(this.props.overrideSession)\n        }\n    }\n\n    getSelectedSessionLabel(selectedSession) {\n        let newSession = { ...selectedSession } //don't modify existing session values stored at state level & used in dropdown\n        if (newSession && newSession.label) {\n            newSession.label = newSession.label.replace(' (Active)', '')\n        }\n        return newSession;\n    }\n\n    render() {\n        const { sessionOptions, selectedSession } = this.state;\n        const hide = this.props.nav.hideSessionSelectorPaths.find(path => new RegExp(path, 'g').test(this.props.location.pathname))\n\n        return (\n            <div className=\"full\" id=\"session-select-container\">\n                {this.state.historicalSessionRedirect &&\n                    <div className=\"schedule-modal\">\n                        <div className=\"schedule-modal-content fit-content center-content\">\n                            <p>For historical data, please use <b>Legacy LIS</b>, available at <b><a href=\"https://legacylis.virginia.gov\" target=\"_blank\" rel=\"noreferrer\">https://legacylis.virginia.gov</a></b>.</p>\n                            <p>Click 'Go' to be taken to Legacy LIS, or 'Close' to remain here.</p>\n                            <div className=\"inline-list\">\n                                <button className=\"button primary float-right\" onClick={() => this.state.historicalSessionRedirect(true)}>Go</button>\n                                <button className=\"button secondary float-right\" onClick={() => this.state.historicalSessionRedirect(false)}>Close</button>\n                            </div>\n                            <br />\n                        </div>\n                    </div>\n\n                }\n                <div className={hide && this.props.location.pathname !== \"/profile\" ? \"session-select-tab hidden\" : \"session-select-tab\"}>\n                    <Select\n                        id=\"sessionSelector\"\n                        classNamePrefix=\"global-session-selector\"\n                        isSearchable={false}\n                        options={sessionOptions}\n                        maxMenuHeight={170}\n                        value={this.getSelectedSessionLabel(selectedSession)}\n                        onChange={this.handleChange}\n                        styles={customStyles}\n                    />\n                </div>\n                <div className=\"link-wrapper\">\n                    <Link to=\"/bill-search\">Advanced Search</Link>\n                </div>\n            </div>\n        )\n\n    }\n};\n\nexport default connect(\n    (state) => {\n        const { session, nav } = state;\n        return {\n            session,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, sessionActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(withRouter(SessionSelector))","import React from 'react';\nimport { checkToken } from '../../../services/request.service'\n\nclass Popup extends React.Component  {\n    constructor(props) {\n        super(props);\n        this.state = {\n        };\n        this.closePopup = this.closePopup.bind(this);\n        this.logOut = this.logOut.bind(this);\n    }\n\n    closePopup() {\n        checkToken()\n            .then(this.props.togglePopup());\n    }\n\n    logOut() {\n        this.props.logOut();\n        this.props.togglePopup();\n    }\n\n    componentDidMount() {\n        if (this.props.isIdle) {\n            this.timerHandle = setTimeout(() => {\n                this.props.logOut();\n                this.props.togglePopup();\n                this.timerHandle = 0\n            }, 60000 * 15);\n        }\n    }\n\n    componentWillUnmount = () => {\n        if (this.timerHandle) {\n            clearTimeout(this.timerHandle);\n            this.timerHandle = 0;\n        }\n    };\n\n    render() {\n        return (\n            <div className='popup'>\n                <div className='popup-inner'>\n                    <p>{this.props.text}</p>\n\n                        <div>\n                            <button className=\"button primary\" onClick={this.closePopup}>Yes</button>\n                            <button className=\"button secondary\" onClick={this.logOut}>No</button>\n                        </div>\n                    {/*this.props.deletionWarning &&\n                        <div>\n                        <button className=\"button primary\" onClick={this.props.togglePopup}>Continue</button>\n                            <button className=\"button secondary\" onClick={this.props.logOut}>Cancel</button>\n                        </div>\n                    */}\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default Popup;","import React from 'react';\n\nclass ToastContainer extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            toasts: this.props.toasts,\n            visible: false\n        }\n\n        this.dismiss = this.dismiss.bind(this);\n    }\n\n    componentDidUpdate(prevProps) {\n        if (prevProps.toasts !== this.props.toasts) {\n            this.setState({\n                visible: true,\n                dismissed: false\n            }, function () {\n                setTimeout(() => {\n                    this.setState({\n                        visible: false\n                    })\n                }, 3000)\n            })\n        }\n    }\n\n    dismiss() {\n        this.setState({\n            visible: false,\n            dismissed: true\n        })\n    }\n\n    render() {\n\n        const { toasts } = this.props\n        const visible = this.state.visible\n        return (\n            <div className={\"toast-container \" + (\n                visible\n                    ? this.props.toasts[0] && this.props.toasts[0].long\n                        ? \"show-long\"\n                        : 'show'\n                    : this.props.toasts[0] && this.props.toasts[0].long\n                        ? 'hide-long'\n                        : 'hide'\n            )}>\n                <Toast toasts={toasts} dismiss={this.dismiss} visible={visible} dismissed={this.state.dismissed} />\n            </div>\n        )\n    }\n}\nclass Toast extends React.Component {\n    render() {\n        const items = this.props.toasts.map((item, index) => {\n            return (\n                <div key={index} className={`toast ${item.type}${this.props.visible ? '' : ` hide${item.long ? '-long' : ''}`}${this.props.dismissed ? ' dismissed' : ''}`}>\n                    <div className='toast-inner'>\n                        <p>{item.message}</p>\n                        {item.long && <button className=\"icon cross\" onClick={() => this.props.dismiss()} style={{ margin: \"30px 0px 0px 15px\" }} />}\n                    </div>\n                </div>\n            );\n        })\n\n        return (<React.Fragment>{items}</React.Fragment>);\n    }\n}\n\nexport default ToastContainer;","import React from \"react\"\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { Link, withRouter } from 'react-router-dom';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\n\nclass IconLinks extends React.Component {\n    constructor(props) {\n        super(props);\n\n    }\n\n    render() {\n        const { selectedSession } = this.props;\n        let budgetUrl = \"https://budget.lis.virginia.gov/\";\n        if (selectedSession) {\n            //budgetUrl += `default/${selectedSession.SessionCode.substr(0, 4)}/${selectedSession.SessionCode.substr(4)}`\n        }\n\n        return (\n            <div className=\"landing home-icon-links\">\n                <div className=\"grid-wrapper four-icons\">\n                    <div className=\"landing legislation\">\n                        <Link className=\"info-link legislation\" to=\"/bill-search\"></Link>\n                        <Link to=\"/bill-search\">Bills & Resolutions</Link>\n                    </div>\n                    <div className=\"landing state-budget\">\n                        <a className=\"info-link state-budget\" href={`${budgetUrl}`}></a>\n                        <a href={`${budgetUrl}`}>State Budget</a>\n                    </div>\n                    <div className=\"landing virginia-law\">\n                        <a className=\"info-link virginia-law\" href={`https://law.lis.virginia.gov/`}></a>\n                        <a href={`https://law.lis.virginia.gov/`}>Virginia Law</a>\n                    </div>\n                    <div className=\"landing legislative-resources\">\n                        <a className=\"info-link legislative-resources\" href={`https://rga.lis.virginia.gov/`}></a>\n                        <a href={`https://rga.lis.virginia.gov/`}>Reports to the General Assembly</a>\n                    </div>\n                </div>\n            </div>\n        )\n    }\n}\n\nconst Links = connect(\n    (state) => {\n        const { nav } = state;\n        return {\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, navActionCreators), dispatch)\n        }\n    }\n)(IconLinks)\n\nexport default withRouter(Links)","import React from 'react';\nimport Menu from './lis-nav-component';\nimport SessionSelector from './lis-session-selector';\nimport Popup from './lis-popup-component';\nimport Profile from './lis-profile-component';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport ToastContainer from './lis-toast-component';\nimport IconLinks from './lis-icon-links-component';\n\nclass Layout extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            helpBanner: !localStorage.getItem(\"HELP_BANNER_DISMISSED\"),\n            showPopup: false,\n            popupMessage: '',\n            isIdle: false,\n            isAriaExpanded: false,\n            isAriaHidden: true,\n            isMenuVisible: false,\n            isOpen: false,\n            overrideSession: \"\"\n        };\n\n        this.dismissHelpBanner = this.dismissHelpBanner.bind(this);\n    }\n\n    componentDidUpdate(prevProps) {\n        if (!prevProps.isIdle && this.props.isIdle) {\n            this.setState({\n                showPopup: true\n            })\n        }\n\n        if (this.props.location.pathname === \"/home\" && prevProps.location.pathname !== \"/home\" && this.state.overrideSession === \"\") {\n            let session = this.props.session.sessionList.find(x => x.IsDefault);\n            if (session) {\n                this.props.actions.changeSession(session.SessionCode)\n                this.setState({ overrideSession: session })\n            }\n        } else if (this.state.overrideSession !== \"\") {\n            this.setState({\n                overrideSession: \"\"\n            })\n        }\n    }\n\n    logOutUser() {\n        this.props.actions.logoutUser();\n    }\n\n    togglePopup() {\n        this.setState(state => ({\n            showPopup: !state.showPopup\n        }));\n    }\n\n    slideoutToggle() {\n        this.setState(prevState => ({\n            isMenuVisible: !prevState.isMenuVisible,\n            isAriaHidden: !prevState.isAriaHidden,\n            isAriaExpanded: !prevState.isAriaExpanded,\n            isOpen: !prevState.isOpen\n        }));\n    }\n\n    dismissHelpBanner() {\n        localStorage.setItem(\"HELP_BANNER_DISMISSED\", true);\n        this.setState({ helpBanner: false })\n    }\n\n    render() {\n        const {\n            popupMessage\n        } = this.props;\n        const { isOpen, isAriaHidden, isAriaExpanded, isMenuVisible, helpBanner } = this.state;\n\n        return (\n            <div className={isOpen ? 'open-state' : null}>\n                {isOpen &&\n                    <div className=\"slideout-overlay\" onClick={this.slideoutToggle.bind(this)} />\n                }\n                {window.env?.APP_ENV?.toLowerCase() !== \"production\" && window.env?.API_SERVER?.toLowerCase() !== \"https://lis.virginia.gov\" && <div className=\"alert alert-warning mb-0\"><b>This is a non-production environment</b>. This environment is NOT for public access. You may access LIS at <a href=\"https://lis.virginia.gov\">LIS.virginia.gov</a>.</div>}\n                {this.props.login.userClaims?.claims?.find(c => c.RoleName?.toLowerCase() === \"admin\") && (window.env?.APP_ENV?.toLowerCase() === \"production\" || window.env?.API_SERVER?.toLowerCase() === \"https://lis.virginia.gov\") && <div className=\"alert alert-danger mb-0\"><b>PLEASE BEWARE</b>: YOU ARE IN THE PRODUCTION LIS ENVIRONMENT AND ANY ACTIONS TAKEN WILL BE SUBMITTED IN THE PRODUCTION DATABASE.</div>}\n                {helpBanner && <div className=\"help-banner\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-label=\"Close\" onClick={this.dismissHelpBanner}><span aria-hidden=\"true\">×</span></button>Get acquainted with our new Virginia State Legislative Information System! <a href=\"https://help.lis.virginia.gov/start/index.asp\" target=\"_blank\" rel=\"noreferrer\">LIS Learning Center</a></div>}\n                <Menu slideoutToggle={this.slideoutToggle.bind(this)} isOpen={this.state.isOpen} session={this.props.session.sessionList.find(x => x.SessionCode === this.props.nav.session)} permissions={this.props.permissions} />\n                <Profile\n                    isMenuVisible={isMenuVisible}\n                    isAriaExpanded={isAriaExpanded}\n                    isAriaHidden={isAriaHidden}\n                    slideoutToggle={this.slideoutToggle.bind(this)}\n                    isOpen={isOpen}\n                    slideout={true}\n                    selectedSession={this.props.selectedSession}\n                    permissions={this.props.permissions}\n                />\n                <SessionSelector overrideSession={this.state.overrideSession} />\n                <ToastContainer toasts={this.props.nav.toasts} />\n                <main>\n                    <section>\n                        <div className=\"full\">\n                            <div className=\"content-wrapper\">\n                                {this.props.children}\n                            </div>\n                        </div>\n                    </section>\n                </main>\n                {this.state.showPopup ?\n                    <Popup\n                        text={popupMessage}\n                        showPopup={this.state.showPopup}\n                        togglePopup={this.togglePopup.bind(this)}\n                        logOut={this.logOutUser.bind(this)}\n                        isIdle={this.props.isIdle}\n                    />\n                    : null\n                }\n                {this.props.location.pathname != \"/\" && !this.props.location.pathname.includes('/home')\n                    ?\n                    null\n                    :\n                    <IconLinks selectedSession={this.props.session.selectedSession} />\n                }\n            </div>\n        )\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { login, nav, session } = state;\n        return {\n            login,\n            nav,\n            session\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, authActionCreators, navActionCreators, sessionActionCreators), dispatch)\n        }\n    }\n)(Layout)","import { partnerRequest, publicRequest } from '../services/request.service';\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\nconst graphToken = 'GRAPH_ID_TOKEN';\n\nconst contactReferencesSuccess = 'CONTACT_REF_LIST_SUCCESS';\nconst contactReferencesFailure = 'CONTACT_REF_LIST_FAILURE';\n\nconst contactSaveSuccess = 'CONTACT_SAVE_SUCCESS';\nconst contactSaveFailure = 'CONTACT_SAVE_FAILURE';\n\nconst personListSuccess = 'PERSON_LIST_SUCCESS';\nconst personListFailure = 'PERSON_LIST_FAILURE';\n\nconst personSuccess = 'PERSON_SUCCESS';\nconst personFailure = 'PERSON_FAILURE';\n\nconst personContactRequest = 'PERSON_CONTACT_REQUEST';\nconst personContactSuccess = 'PERSON_CONTACT_SUCCESS';\nconst personContactFailure = 'PERSON_CONTACT_FAILURE';\n\nconst userListSuccess = 'USER_LIST_SUCCESS';\nconst userListFailure = 'USER_LIST_FAILURE';\n\nconst userSuccess = 'USER_SUCCESS';\nconst userFailure = 'USER_FAILURE';\n\nconst userByEmailSuccess = 'USER_BY_EMAIL_SUCCESS';\nconst userByEmailFailure = 'USER_BY_EMAIL_FAILURE';\n\nconst userSaveSuccess = 'USER_SAVE_SUCCESS';\nconst userSaveFailure = 'USER_SAVE_FAILURE';\n\nconst userCreateSuccess = 'USER_CREATE_SUCCESS';\nconst userCreateFailure = 'USER_CREATE_FAILURE';\n\nconst newUserCreateSuccess = 'NEW_USER_CREATE_SUCCESS';\nconst newUserCreateFailure = 'NEW_USER_CREATE_FAILURE';\n\nconst personCreateSuccess = 'PERSON_CREATE_SUCCESS';\nconst personCreateFailure = 'PERSON_CREATE_FAILURE';\n\nconst personSaveSuccess = 'PERSON_SAVE_SUCCESS';\nconst personSaveFailure = 'PERSON_SAVE_FAILURE';\n\nconst dirListSuccess = 'DIRECTORIES_LIST_SUCCESS';\nconst dirListFailure = 'DIRECTORIES_LIST_FAILURE';\n\nconst userRegisterSuccess = 'USER_REGISTER_SUCCESS';\nconst userRegisterFailure = 'USER_REGISTER_FAILURE';\n\nconst userCreatePublicSuccess = 'USER_CREATE_PUBLIC_SUCCESS';\nconst userCreatePublicFailure = 'USER_CREATE_PUBLIC_FAILURE';\n\nconst requestPasswordResetSuccess = 'REQUEST_PASSWORD_RESET_SUCCESS';\nconst requestPasswordResetFailure = 'REQUEST_PASSWORD_RESET_FAILURE';\n\nconst passwordResetSuccess = 'PASSWORD_RESET_SUCCESS';\nconst passwordResetFailure = 'PASSWORD_RESET_FAILURE';\n\nconst changePasswordSuccess = 'CHANGE_PASSWORD_SUCCESS';\nconst changePasswordFailure = 'CHANGE_PASSWORD_FAILURE';\n\nconst initialState = {\n    contactReferences: [],\n    contactReferencesError: '',\n    contactSave: '',\n    contactSaveError: null,\n    userList: [],\n    userListError: '',\n    personList: [],\n    personListError: '',\n    personContact: [],\n    user: '',\n    userError: null,\n    userByEmail: '',\n    userByEmailError: null,\n    personCreate: '',\n    personCreateError: null,\n    dirList: [],\n    dirListError: '',\n    userSave: '',\n    userSaveError: null,\n    userCreate: '',\n    userCreateError: null,\n    newUserCreate: '',\n    newUserCreateError: null,\n    userCreatePublic: '',\n    userCreatePublicError: '',\n    userRegister: '',\n    userRegisterError: '',\n    requestPasswordReset: '',\n    requestPasswordResetError: '',\n    passwordReset: '',\n    passwordResetError: '',\n    changePassword: '',\n    changePasswordError: ''\n};\n\nexport const userActionCreators = {\n\n    receiveContactReferences: (resObj) => ({\n        type: contactReferencesSuccess,\n        contactReferences: resObj,\n    }),\n\n    contactReferencesError: (message) => ({\n        type: contactReferencesFailure,\n        contactReferencesError: message\n    }),\n\n    getContactReferences: () => {\n        return dispatch => {\n            return publicRequest((API_URL || process.env.REACT_APP_CONTACT_API_URL) + '/Contact/api/getcontacttypereferencesasync/', 'GET', '', '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.contactReferencesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(userActionCreators.receiveContactReferences(result[1].ContactTypeReferences))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.contactReferencesError('No Content'))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveContactSave: (resObj) => ({\n        type: contactSaveSuccess,\n        contactSave: resObj,\n    }),\n\n    contactSaveError: (message) => ({\n        type: contactSaveFailure,\n        contactSaveError: message\n    }),\n\n    saveContact: (body) => {\n        return dispatch => {\n            return partnerRequest((API_URL || process.env.REACT_APP_CONTACT_API_URL) + '/Contact/api/savecontactasync/', 'POST', '', body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.contactSaveError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(userActionCreators.receiveContactSave(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.contactSaveError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    requestPersonContact: () => ({\n        type: personContactRequest,\n        personContact: [],\n        isFetching: true\n    }),\n\n    receivePersonContact: (contact, message) => ({\n        type: personContactSuccess,\n        isFetching: false,\n        personContact: contact,\n        message\n    }),\n\n    personContactError: (message) => ({\n        type: personContactFailure,\n        isFetching: false,\n        personConact: [],\n        message\n    }),\n\n    getPersonContact: (params) => {\n        return dispatch => {\n            dispatch(userActionCreators.requestPersonContact());\n\n            return publicRequest((API_URL || process.env.REACT_APP_CONTACT_API_URL) + '/Contact/api/getContactsByOwnerAsync/', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.personContactError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(userActionCreators.receivePersonContact(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.personContactError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receivePersonList: (resObj) => ({\n        type: personListSuccess,\n        personList: resObj\n    }),\n\n    personListError: (message) => ({\n        type: personListFailure,\n        personListError: message\n    }),\n\n    getPersonList: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_PERSON_API_URL) + '/Person/api/getPartnerPersonListAsync?', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.personListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(userActionCreators.receivePersonList(result[1].Persons))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.personListError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receivePerson: (resObj) => ({\n        type: personSuccess,\n        person: resObj\n    }),\n\n    personError: (message) => ({\n        type: personFailure,\n        personError: message\n    }),\n\n    getPerson: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_PERSON_API_URL) + '/Person/api/getPartnerPersonByIdAsync/', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.personError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(userActionCreators.receivePerson(result[1].Persons[0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.personError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveUserList: (resObj) => ({\n        type: userListSuccess,\n        userList: resObj,\n    }),\n\n    userListError: (message) => ({\n        type: userListFailure,\n        userListError: message\n    }),\n\n    getUserList: () => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/User/api/ListUsersAsync/', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.userListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(userActionCreators.receiveUserList(result[1].UserProfiles))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.userListError('No Content'))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveUser: (userdata) => ({\n        type: userSuccess,\n        user: userdata\n    }),\n\n    userError: (message) => ({\n        type: userFailure,\n        userError: message\n    }),\n\n    getUser: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/User/api/GetUserAsync/', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.userError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(userActionCreators.receiveUser(result[1].UserProfiles[0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.userError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveUserByEmail: (userByEmaildata) => ({\n        type: userByEmailSuccess,\n        userByEmail: userByEmaildata\n    }),\n\n    userByEmailError: (message) => ({\n        type: userByEmailFailure,\n        userByEmailError: message\n    }),\n\n    getUserByEmail: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/User/api/GetUserByEmailAddressAsync/', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.userByEmailError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(userActionCreators.receiveUserByEmail(result[1].UserProfiles[0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.receiveUserByEmail(\"\"))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveUserSave: (message) => ({\n        type: userSaveSuccess,\n        userSave: message\n    }),\n\n    userErrorSave: (message) => ({\n        type: userSaveFailure,\n        userSaveError: message\n    }),\n\n    saveUser: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\",\n                'GraphAuthorization': 'Bearer ' + localStorage.getItem(graphToken)\n\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/User/api/SaveUserAsync/', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.userErrorSave(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(userActionCreators.receiveUserSave(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.userErrorSave('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveUserCreate: (message) => ({\n        type: userCreateSuccess,\n        userCreate: message\n    }),\n\n    userErrorCreate: (message) => ({\n        type: userCreateFailure,\n        userCreateError: message\n    }),\n\n\n    createUser: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\",\n                'GraphAuthorization': 'Bearer ' + localStorage.getItem(graphToken)\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/User/api/CreateUserAsync/', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.userErrorCreate(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(userActionCreators.receiveUserCreate(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.userErrorCreate('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveNewUserCreate: (message) => ({\n        type: newUserCreateSuccess,\n        newUserCreate: message\n    }),\n\n    newUserErrorCreate: (message) => ({\n        type: newUserCreateFailure,\n        newUserCreateError: message\n    }),\n\n\n    createNewUser: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\",\n                'GraphAuthorization': 'Bearer ' + localStorage.getItem(graphToken)\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/User/api/CreateNewUserAsync/', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.newUserErrorCreate(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(userActionCreators.receiveNewUserCreate(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.newUserErrorCreate('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receivePersonCreate: (resObj) => ({\n        type: personCreateSuccess,\n        personCreate: resObj\n    }),\n\n    personCreateError: (message) => ({\n        type: personCreateFailure,\n        personCreateError: message\n    }),\n\n\n    createPerson: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_PERSON_API_URL) + '/Person/api/createpersonasync/', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.personCreateError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(userActionCreators.receivePersonCreate(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.personCreateError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receivePersonSave: (resObj) => ({\n        type: personSaveSuccess,\n        personSave: resObj\n    }),\n\n    personSaveError: (message) => ({\n        type: personSaveFailure,\n        personSaveError: message\n    }),\n\n\n    savePerson: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_PERSON_API_URL) + '/Person/api/savepersonasync/', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.personSaveError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(userActionCreators.receivePersonSave(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.personSaveError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveDirList: (resObj) => ({\n        type: dirListSuccess,\n        dirList: resObj\n    }),\n\n    dirListError: (message) => ({\n        type: dirListFailure,\n        dirListError: message\n    }),\n\n\n    getDirReferences: () => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/User/api/GetDirectoryReferencesAsync/', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.dirListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(userActionCreators.receiveDirList(result[1].Directories))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.dirListError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveRegisterUser: (message) => ({\n        type: userRegisterSuccess,\n        userRegister: message\n    }),\n\n    userErrorRegister: (message) => ({\n        type: userRegisterFailure,\n        userRegisterError: message\n    }),\n\n    registerUser: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/User/api/registerpublicuserasync/', 'POST', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.userErrorRegister(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(userActionCreators.receiveRegisterUser(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.userErrorRegister('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveCreatePublicUser: (message) => ({\n        type: userCreatePublicSuccess,\n        userCreatePublic: message\n    }),\n\n    userErrorCreatePublic: (message) => {\n        let error = message;\n        try {\n            error = JSON.parse(message);\n            if (error.Value) { error = error.Value }\n        } catch (err) {\n            error = message;\n        }\n        if (typeof error === 'string' && error.startsWith('\"') && error.endsWith('\"')) {\n            error = error.substr(1, error.length - 2);\n        }\n\n        return ({\n            type: userCreatePublicFailure,\n            userCreatePublicError: error\n        })\n    },\n\n    createPublicUser: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/User/api/createpublicuserasync/', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.userErrorCreatePublic(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(userActionCreators.receiveCreatePublicUser(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.userErrorCreatePublic('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveRequestPasswordReset: (message) => ({\n        type: requestPasswordResetSuccess,\n        requestPasswordReset: message\n    }),\n\n    requestPasswordResetError: (message) => ({\n        type: requestPasswordResetFailure,\n        requestPasswordResetError: message\n    }),\n\n    requestPasswordReset: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/User/api/RequestResetUserPasswordAsync/', 'POST', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.requestPasswordResetError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(userActionCreators.receiveRequestPasswordReset(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.requestPasswordResetError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receivePasswordReset: (message) => ({\n        type: passwordResetSuccess,\n        passwordReset: message\n    }),\n\n    passwordResetError: (message) => {\n        let error = message;\n        try {\n            error = JSON.parse(message);\n        } catch (err) {\n            error = message;\n        }\n        return ({\n            type: passwordResetFailure,\n            passwordResetError: error\n        })\n    },\n\n    resetPassword: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/User/api/ResetUserPasswordAsync/', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.passwordResetError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(userActionCreators.receivePasswordReset(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.passwordResetError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveChangePassword: (message) => ({\n        type: changePasswordSuccess,\n        changePassword: message\n    }),\n\n    changePasswordError: (message) => {\n        let error = message;\n        try {\n            error = JSON.parse(message);\n            if (error.Value) { error = error.Value }\n        } catch (err) {\n            error = message;\n        }\n        if (typeof error === 'string' && error.startsWith('\"') && error.endsWith('\"')) {\n            error = error.substr(1, error.length - 2);\n        }\n        if (error === \"Login failed (150)\") {\n            error = \"Invalid current password.\";\n        }\n        return ({\n            type: changePasswordFailure,\n            changePasswordError: error\n        })\n    },\n\n    changePassword: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_AUTH_API_URL) + '/Authentication/api/ChangePasswordAsync/', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(userActionCreators.changePasswordError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(userActionCreators.receiveChangePassword(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(userActionCreators.changePasswordError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    }\n};\n\n\nexport const reducer = (state, action) => {\n\n    state = state || initialState;\n\n    switch (action.type) {\n        case contactReferencesSuccess:\n            return Object.assign({}, state, {\n                contactReferences: action.contactReferences,\n                contactReferencesError: ''\n            })\n        case contactReferencesFailure:\n            return Object.assign({}, state, {\n                contactReferencesError: action.contactReferencesError\n            })\n        case contactSaveSuccess:\n            return Object.assign({}, state, {\n                contactSave: action.contactSave,\n                contactSaveError: null\n            })\n        case contactSaveFailure:\n            return Object.assign({}, state, {\n                contactSaveError: action.contactSaveError\n            })\n        case personContactRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            })\n        case personContactSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                personContact: action.personContact,\n                message: ''\n            })\n        case personContactFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                personContact: action.personContact,\n                message: action.message\n            })\n        case personListSuccess:\n            return Object.assign({}, state, {\n                personList: action.personList,\n                personListError: ''\n            })\n        case personListFailure:\n            return Object.assign({}, state, {\n                personListError: action.personListError\n            })\n        case personSuccess:\n            return Object.assign({}, state, {\n                person: action.person,\n                personError: ''\n            })\n        case personFailure:\n            return Object.assign({}, state, {\n                personError: action.personError\n            })\n        case userListSuccess:\n            return Object.assign({}, state, {\n                userList: action.userList,\n                userListError: ''\n            })\n        case userListFailure:\n            return Object.assign({}, state, {\n                userListError: action.userListError\n            })\n        case userSuccess:\n            return Object.assign({}, state, {\n                user: action.user,\n                userError: null\n            })\n        case userFailure:\n            return Object.assign({}, state, {\n                userError: action.userError\n            })\n        case userByEmailSuccess:\n            return Object.assign({}, state, {\n                userByEmail: action.userByEmail,\n                userByEmailError: null\n            })\n        case userByEmailFailure:\n            return Object.assign({}, state, {\n                userByEmailError: action.userByEmailError\n            })\n        case userSaveSuccess:\n            return Object.assign({}, state, {\n                userSave: action.userSave,\n                userSaveError: null\n            })\n        case userSaveFailure:\n            return Object.assign({}, state, {\n                userSaveError: action.userSaveError\n            })\n        case userCreateSuccess:\n            return Object.assign({}, state, {\n                userCreate: action.userCreate,\n                userCreateError: null\n            })\n        case userCreateFailure:\n            return Object.assign({}, state, {\n                userCreateError: action.userCreateError\n            })\n        case newUserCreateSuccess:\n            return Object.assign({}, state, {\n                newUserCreate: action.newUserCreate,\n                newUserCreateError: null\n            })\n        case newUserCreateFailure:\n            return Object.assign({}, state, {\n                newUserCreateError: action.newUserCreateError\n            })\n        case personCreateSuccess:\n            return Object.assign({}, state, {\n                personCreate: action.personCreate,\n                personCreateError: null\n            })\n        case personCreateFailure:\n            return Object.assign({}, state, {\n                personCreateError: action.personCreateError\n            })\n        case personSaveSuccess:\n            return Object.assign({}, state, {\n                personSave: action.personSave,\n                personSaveError: null\n            })\n        case personSaveFailure:\n            return Object.assign({}, state, {\n                personSaveError: action.personSaveError\n            })\n        case dirListSuccess:\n            return Object.assign({}, state, {\n                dirList: action.dirList,\n                dirListError: ''\n            })\n        case dirListFailure:\n            return Object.assign({}, state, {\n                dirListError: action.dirListError\n            })\n        case userRegisterSuccess:\n            return Object.assign({}, state, {\n                userRegister: action.userRegister,\n                userRegisterError: ''\n            })\n        case userRegisterFailure:\n            return Object.assign({}, state, {\n                userRegisterError: action.userRegisterError\n            })\n        case userCreatePublicSuccess:\n            return Object.assign({}, state, {\n                userCreatePublic: action.userCreatePublic,\n                userCreatePublicError: ''\n            })\n        case userCreatePublicFailure:\n            return Object.assign({}, state, {\n                userCreatePublicError: action.userCreatePublicError\n            })\n        case requestPasswordResetSuccess:\n            return Object.assign({}, state, {\n                requestPasswordReset: action.requestPasswordReset,\n                requestPasswordResetError: ''\n            })\n        case requestPasswordResetFailure:\n            return Object.assign({}, state, {\n                requestPasswordResetError: action.requestPasswordResetError\n            })\n        case passwordResetSuccess:\n            return Object.assign({}, state, {\n                passwordReset: action.passwordReset,\n                passwordResetError: ''\n            })\n        case passwordResetFailure:\n            return Object.assign({}, state, {\n                passwordResetError: action.passwordResetError\n            })\n        case changePasswordSuccess:\n            return Object.assign({}, state, {\n                changePassword: action.changePassword,\n                changePasswordError: ''\n            })\n        case changePasswordFailure:\n            return Object.assign({}, state, {\n                changePasswordError: action.changePasswordError\n            })\n        default:\n            return state\n    }\n};","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { userActionCreators } from '../../../stores/lis-user-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport { Link } from 'react-router-dom';\n\nconst calculateNumberOfCriteriaMet = (password) => {\n    let criteriaMet = 0;\n    if (password.search(/[a-z]/) > -1) { criteriaMet++; }\n    if (password.search(/[A-Z]/) > -1) { criteriaMet++; }\n    if (password.search(/\\d/) > -1) { criteriaMet++; }\n    if (password.search(/[@^$!%*?=\\-_+&\\[\\]{}|\\\\:'\\,\\.\\?\\/`~\"\"\\(\\);<>]/) > -1) { criteriaMet++; }\n\n    return criteriaMet;\n}\n\nclass CreateAccount extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            firstname: '',\n            lastname: '',\n            password: '',\n            passwordconfirm: '',\n            showPassword: false\n        };\n\n        this.handleTextChange = this.handleTextChange.bind(this);\n        this.toggleShowPassword = this.toggleShowPassword.bind(this);\n        this.checkName = this.checkName.bind(this);\n        this.checkPassword = this.checkPassword.bind(this);\n        this.checkPasswordConfirm = this.checkPasswordConfirm.bind(this);\n        this.toggleShowTooltip = this.toggleShowTooltip.bind(this);\n        this.handleClickOutside = this.handleClickOutside.bind(this);\n        this.createAccount = this.createAccount.bind(this);\n\n        this.infoRef = React.createRef();\n        this.infoButtonRef = React.createRef();\n    }\n\n    toggleShowPassword() {\n        this.setState(state => ({\n            showPassword: !state.showPassword\n        }));\n    }\n\n    handleTextChange(e, key) {\n        const val = e.target.value;\n        this.setState({\n            [key]: val\n        });\n    }\n\n    checkName() {\n        if (!this.state.firstname || !this.state.lastname) {\n            this.setState({\n                nameError: 'first and last name are required'\n            });\n            return true;\n        }\n        this.setState({\n            nameError: false\n        });\n    }\n\n    checkPassword() {\n        this.setState({ showHelp: false })\n        if (this.state.password.length < 10) {\n            this.setState({ passwordError: 'password must be at least 10 characters long' });\n            return true;\n        }\n        if (this.state.password.length > 256) {\n            this.setState({ passwordError: 'password must be 256 characters or fewer' });\n            return true;\n        }\n        if (this.state.password.search(/^(?:(?=.*[a-z])(?:(?=.*[A-Z])(?=.*[\\d@$!%*?=\\-_+&\\[\\]{}|\\\\:'\\,\\.\\?\\/`~\"\"\\(\\);<>])|(?=.*[@^$!%*?=\\-_+&\\[\\]{}|\\\\:'\\,\\.\\?\\/`~\"\"\\(\\);<>])(?=.*\\d))|(?=.*[@^$!%*?=\\-_+&\\[\\]{}|\\\\:'\\,\\.\\?\\/`~\"\"\\(\\);<>])(?=.*[A-Z])(?=.*\\d)).{10,256}$/) === -1) {\n            this.setState({ passwordError: 'invalid password', showHelp: true });\n            return true;\n        } else {\n            this.setState({ showHelp: false })\n        }\n        if (this.state.password === this.state.currentpassword) {\n            this.setState({ passwordError: 'new password cannot be the same as your current password' });\n            return true;\n        }\n        this.setState({\n            passwordError: ''\n        });\n    }\n\n    checkPasswordConfirm() {\n        if (this.state.password && this.state.passwordconfirm !== this.state.password) {\n            this.setState({\n                passwordConfirmError: 'passwords do not match'\n            });\n            return true;\n        }\n        this.setState({\n            passwordConfirmError: ''\n        });\n    }\n\n    toggleShowTooltip() {\n        this.setState(state => ({\n            toolTip: !state.toolTip\n        }), () => {\n            if (this.state.toolTip) {\n                document.addEventListener('mousedown', this.handleClickOutside);\n            }\n        });\n    }\n\n    handleClickOutside(event) {\n        if (this.infoRef && !this.infoRef.current.contains(event.target) && this.infoButtonRef && !this.infoButtonRef.current.contains(event.target)) {\n            document.removeEventListener('mousedown', this.handleClickOutside);\n            this.setState({ toolTip: false })\n        }\n    }\n\n    createAccount(e) {\n        e.preventDefault();\n        let isError = false;\n        isError = this.checkName() || isError;\n        isError = this.checkPassword() || isError;\n        isError = this.checkPasswordConfirm() || isError;\n        if (isError) {\n            return\n        }\n\n        this.setState({\n            isCreating: true,\n            message: ''\n        });\n        const params = {\n            FirstName: this.state.firstname,\n            LastName: this.state.lastname,\n            Password: this.state.password,\n            HashedWord: this.props.match.params.registerhash\n        };\n        this.props.actions.createPublicUser(params)\n            .then(() => {\n                this.setState({\n                    isCreating: false,\n                    accountCreated: true,\n                    message: ''\n                });\n                setTimeout(() => {\n                    this.props.history.push('/login');\n                }, 5000)\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    message: this.props.users.userCreatePublicError ? this.props.users.userCreatePublicError : err.toString(),\n                    isCreating: false\n                });\n            })\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { showPassword, firstname, lastname, password, passwordconfirm, passwordError, passwordConfirmError, nameError, isCreating, accountCreated } = this.state;\n        if (accountCreated) {\n            return (\n                <div className=\"center\">\n                    <h2>You have finished creating your account</h2>\n                    <h3>You will be redirected to the login form in 5 seconds</h3>\n                    <div className=\"small-text\">Click <Link to='/login'>Here</Link> to go there now</div>\n                </div>)\n        }\n\n        const passwordHelp = (indicate) => (\n            <React.Fragment>\n                <span>Your password must meet the following criteria:</span>\n                <ul>\n                    <li> Must be between 10 and 256 characters  {indicate && <span className={`icon ${password.length < 10 || password.length > 256 ? 'delete' : 'save'}`} />}</li>\n                    <li> Must contain at least three of the following four types of characters: {indicate && <span className={`icon ${calculateNumberOfCriteriaMet(password) < 3 ? 'delete' : 'save'}`} />}</li>\n                    <ol>\n                        <li> lowercase letter {indicate && <span className={`icon ${password.search(/[a-z]/) === -1 ? 'delete' : 'save'}`} />}</li>\n                        <li> uppercase letter {indicate && <span className={`icon ${password.search(/[A-Z]/) === -1 ? 'delete' : 'save'}`} />}</li>\n                        <li> number {indicate && <span className={`icon ${password.search(/\\d/) === -1 ? 'delete' : 'save'}`} />}</li>\n                        <li> special character {indicate && <span className={`icon ${password.search(/[@^$!%*?=\\-_+&\\[\\]{}|\\\\:'\\,\\.\\?\\/`~\"\"\\(\\);<>]/) === -1 ? 'delete' : 'save'}`} />}</li>\n                    </ol>\n                </ul>\n            </React.Fragment>\n        )\n\n        return (\n            <div className=\"dlas-forms create-account\">\n                <h1>Finish Account Creation</h1>\n                <hr className=\"faded-line\" />\n                <div className=\"inner-grid two multi-row\" style={{ gridGap: '50px' }}>\n                    <form>\n                        <br />\n                        <div className=\"inner-grid two\">\n                            <div>\n                                <label htmlFor=\"sr-first-name\">First name</label>\n                                <input id=\"sr-first-name\" value={firstname} onChange={e => this.handleTextChange(e, \"firstname\")} type=\"text\" />\n                            </div>\n                            <div>\n                                <label htmlFor=\"sr-last-name\">Last name</label>\n                                <input id=\"sr-last-name\" value={lastname} onChange={e => this.handleTextChange(e, \"lastname\")} type=\"text\" />\n                            </div>\n                        </div>\n                        <span className=\"small-text fail\">{nameError}</span>\n                        <div>\n                            <label htmlFor=\"sr-password\">Password</label>\n                            <button onClick={this.toggleShowTooltip} type=\"button\" className=\"button info\" ref={this.infoButtonRef} > Info</button>\n                            <div className=\"info-box\" ref={this.infoRef} style={{ display: this.state.toolTip ? 'block' : 'none' }}>\n                                {passwordHelp(false)}\n                            </div>\n                            <input id=\"sr-password\" onBlur={this.checkPassword} value={password} onChange={e => this.handleTextChange(e, \"password\")} autoComplete=\"new-password\" type={showPassword ? 'text' : 'password'} />\n                            <span className=\"small-text fail\">{passwordError}</span>\n                            {this.state.showHelp && <React.Fragment><br />{passwordHelp(true)}</React.Fragment>}\n                        </div>\n                        <div>\n                            <label htmlFor=\"sr-password-confirm\">Password Confirmation</label>\n                            <input id=\"sr-password-confirm\" onBlur={this.checkPasswordConfirm} onChange={e => this.handleTextChange(e, \"passwordconfirm\")} value={passwordconfirm} type={showPassword ? 'text' : 'password'} />\n                            <span className=\"small-text fail\">{passwordConfirmError}</span>\n                        </div>\n                        <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                            <div className=\"toggle-switch\" onClick={this.toggleShowPassword}>\n                                <input id=\"sr-show-password\" checked={showPassword} type=\"checkbox\" style={{ width: \"inherit\" }} />\n                                <span className=\"slider\"></span>\n                            </div>\n                            <label htmlFor=\"sr-show-password\" className=\"checkbox-label no-background\">Show password</label>\n                        </div>\n                        <div>\n                            <br />\n                            {isCreating ?\n                                <div><span className=\"small-spinner\"></span></div>\n                                :\n                                <button onClick={this.createAccount} className=\"button\" type=\"submit\">Create Account</button>\n                            }\n                        </div>\n                        <div className=\"small-text fail\">{this.state.message}</div>\n                    </form>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { users } = state;\n        return {\n            users\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, userActionCreators), dispatch)\n        }\n    }\n)(CreateAccount)","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { userActionCreators } from '../../../stores/lis-user-store';\nimport { cancelRequest } from '../../../services/request.service';\n\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,}))$/;\n\nclass RegisterAccount extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            firstname: '',\n            lastname: '',\n            email: '',\n            password: '',\n            passwordconfirm: '',\n            showPassword: false\n        };\n\n        this.handleTextChange = this.handleTextChange.bind(this);\n        this.checkEmail = this.checkEmail.bind(this);\n        this.registerAccount = this.registerAccount.bind(this);\n    }\n\n    handleTextChange(e, key) {\n        const val = e.target.value;\n        this.setState({\n            [key]: val\n        });\n    }\n\n    checkEmail() {\n        const email = this.state.email.toLowerCase();\n\n        if (!emailRegex.test(email)) {\n            this.setState({\n                emailError: 'A valid email is required'\n            });\n            return true;\n        }\n        this.setState({\n            emailError: ''\n        });\n    }\n\n    registerAccount(e) {\n        e.preventDefault();\n        let isError = this.checkEmail()\n        if (isError) {\n            return\n        }\n\n        this.setState({\n            isCreating: true\n        });\n        const params = `?emailaddress=${encodeURIComponent(this.state.email)}`;\n        this.props.actions.registerUser(params)\n            .then(() => {\n                this.setState({\n                    isCreating: false,\n                    accountCreated: true,\n                    message: ''\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    message: err.toString(),\n                    isCreating: false\n                });\n            })\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { email, emailError, isCreating, accountCreated } = this.state;\n        if (accountCreated) {\n            return (\n                <div className=\"center\">\n                    <h2>Please check your email to complete registration</h2>\n                    <h3>Don't forget to check your spam folder</h3>\n                </div>)\n        }\n        return (\n            <div className=\"dlas-forms\">\n                <h1>Register for a Lobbyist-in-a-Box Account</h1>\n                <hr className=\"faded-line\" />\n                <div className=\"inner-grid two multi-row\" style={{ gridGap: '50px' }}>\n                    <form>\n                        <h3 htmlFor=\"sr-email\">Email</h3>\n                        <div className=\"inner-grid three-and-one\">\n                            <div>\n                                <input id=\"sr-email\" style={{ margin: \"0\" }} onBlur={this.checkEmail} value={email} onChange={e => this.handleTextChange(e, \"email\")} type=\"text\" />\n                                <span className=\"small-text fail\">{emailError}</span>\n                            </div>\n                            <div>\n                                {isCreating ?\n                                    <div><span className=\"small-spinner\"></span></div>\n                                    :\n                                    <button onClick={this.registerAccount} className=\"button\" type=\"submit\">Register Account</button>\n                                }\n                            </div>\n                        </div>\n                        <div className=\"small-text fail\" style={{ marginTop: \"10px\" }}>\n                            {this.state.message && this.state.message}\n                        </div>\n                        <div>\n                            <Link to='/login' style={{ marginTop: \"10px\", textDecoration: \"none\" }}>\n                                Already have an account? Log in.\n                            </Link>\n                        </div>\n                    </form>\n                    <div className=\"txt-blue\">\n                        <h3><b>Track up to 5 bills for free</b></h3>\n                        <p>Your new free account will allow you to track up to 5 bills in one Watchlist and set up notifications.</p>\n                        <p>Email notification triggers an email when bills are sponsored by a member of the General Assembly, referred to a House or Senate Committee or contain a specific key word(s), phrases, or Code section(s).</p>\n\n                        <h3><b>Lobbyist-in-a-Box Subscription</b></h3>\n                        <p>A subscription to Lobbyist-in-a-Box offers up to 100 Watchlists (previously called \"Profiles\") containing 300 bills each.</p>\n                        <p>The cost of this service is $400 per user for state agencies, and $600 per user for all other subscribers.  More user accounts can be added, please refer to the Subscription Information on the <a style={{ textDecoration: \"none\" }} target=\"_blank\" rel=\"noreferrer\" href=\"http://help.lis.virginia.gov/liab/index.asp\">LIS Learning Center</a> for additional options and fees, the 2-Step Registration and Payment process, and complete LIAB registration instructions.</p>\n                        <p><span className=\"bold\">Need additional information or assistance?</span> Please send an e-mail message to <a style={{ textDecoration: \"none\" }} href=\"mailto:lis@dlas.virginia.gov\">lis@dlas.virginia.gov</a>.</p>\n                        <p>For questions relating to LIAB Subscription payment procedures, please contact Virginia Interactive, LLC (VI) dba Tyler Virginia at <a style={{ textDecoration: \"none\" }} href=\"mailto:va-customerservice@tylertech.com\">va-customerservice@tylertech.com</a> or (804) 318-4133.</p>\n                    </div>\n                </div>\n            </div>)\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { users } = state;\n        return {\n            users\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, userActionCreators), dispatch)\n        }\n    }\n)(RegisterAccount)","import React from 'react';\nimport * as Fields from '../../lis-layout/components/lis-forms-component';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { userActionCreators } from '../../../stores/lis-user-store';\nimport { cancelRequest } from '../../../services/request.service';\n\nclass ForgotPassword extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            errorMessage: '',\n            isFetching: false,\n            paswordResetRequested: false,\n            email: ''\n        };\n\n        this.requestPasswordReset = this.requestPasswordReset.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n    }\n\n    requestPasswordReset(e) {\n        e.preventDefault();\n        this.setState({\n            errorMessage: '',\n            isFetching: true\n        });\n        this.props.actions.requestPasswordReset('?emailAddress=' + encodeURIComponent(this.state.email))\n            .then(() => {\n                this.setState({\n                    isFetching: false,\n                    paswordResetRequested: true\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    isFetching: false,\n                    errorMessage: err.toString()\n                });\n            })\n    }\n\n    handleChange(e) {\n        this.setState({\n            email: e.target.value\n        });\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { errorMessage, isFetching, paswordResetRequested, email } = this.state;\n        if (paswordResetRequested) {\n            return (\n                <div className=\"center\">\n                    <h2>An email has been sent to your inbox with information on how to reset your password</h2>\n                    <h3>Please check your email to complete password reset</h3>\n                    <div className=\"small-text\">Don't forget to check your spam folder</div>\n                </div>)\n        }\n        return (\n            <div className=\"dlas-forms\">\n                <h1>Request Lobbyist-in-a-Box Password Reset</h1>\n                <hr className=\"faded-line\" />\n                <form>\n                    <div>\n                        <span className=\"error-message\">{errorMessage}</span>\n                        <div className=\"inner-grid three\">\n                            <div className=\"single-row\">\n                                <Fields.TextInput\n                                    id=\"email\"\n                                    label=\"Email\"\n                                    placeholder=\"Email\"\n                                    onChange={this.handleChange}\n                                    value={email}\n                                />\n                            </div>\n                        </div>\n                        <div>\n                            {isFetching ?\n                                <div><span className=\"spinner small-spinner\"></span></div>\n                                :\n                                <button disabled={!email} onClick={this.requestPasswordReset} className=\"button\" type=\"submit\">Request password reset</button>\n                            }\n                        </div>\n                    </div>\n                </form>\n            </div>\n        );\n    }\n};\n\nexport default connect(\n    (state) => {\n        const { users } = state;\n        return {\n            users\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, userActionCreators), dispatch)\n        }\n    }\n)(ForgotPassword);\n\n\n\n\n\n\n","import React from 'react';\nimport queryString from 'query-string';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { userActionCreators } from '../../../stores/lis-user-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\nimport { Link } from 'react-router-dom';\n\nconst houseInstructions = \"Please contact the House of Delegates administrator at (804) 698-1560.\";\nconst senateInstructions = \"Please email Senate Technology at sis@senate.virginia.gov or call 804-698-7470.\";\nconst legislativeInstructions = \"Please call the DLAS help desk at 804-786-9631 or email LIS@dlas.virginia.gov.\";\n\nconst houseDomains = [\n    \"house.virginia.gov\"\n];\n\nconst senateDomains = [\n    \"senate.virginia.gov\"\n];\n\nconst legislativeDomains = [\n    \"dlas.virginia.gov\",\n    \"dls.virginia.gov\",\n    \"sfac.virginia.gov\",\n    \"hac.virginia.gov\",\n    \"vcoy.virginia.gov\",\n    \"jchc.virginia.gov\",\n    \"vscc.virginia.gov\",\n    \"dcp.virginia.gov\",\n    \"vcf.virginia.gov\",\n    \"jlarc.virginia.gov\"\n];\n\nconst calculateNumberOfCriteriaMet = (password) => {\n    let criteriaMet = 0;\n    if (password.search(/[a-z]/) > -1) { criteriaMet++; }\n    if (password.search(/[A-Z]/) > -1) { criteriaMet++; }\n    if (password.search(/\\d/) > -1) { criteriaMet++; }\n    if (password.search(/[@^$!%*?=\\-_+&\\[\\]{}|\\\\:'\\,\\.\\?\\/`~\"\"\\(\\);<>]/) > -1) { criteriaMet++; }\n\n    return criteriaMet;\n}\n\nclass ChangePassword extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            errorMessage: '',\n            isChanging: false,\n            passwordReset: false,\n            confirmPassword: '',\n            passwordChangeFinished: false,\n            password: '',\n            passwordconfirm: '',\n            currentpassword: '',\n            resettingPassword: false,\n            passwordResetError: '',\n            showPassword: false,\n            passwordError: false,\n            passwordConfirmError: false\n        };\n\n        this.changePassword = this.changePassword.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n        this.toggleShowPassword = this.toggleShowPassword.bind(this);\n        this.checkPassword = this.checkPassword.bind(this);\n        this.checkPasswordConfirm = this.checkPasswordConfirm.bind(this);\n        this.toggleShowTooltip = this.toggleShowTooltip.bind(this);\n        this.handleClickOutside = this.handleClickOutside.bind(this);\n\n        this.infoRef = React.createRef();\n        this.infoButtonRef = React.createRef();\n    }\n\n    changePassword(e) {\n        e.preventDefault();\n        let isError = false;\n        isError = this.checkPassword() || isError;\n        isError = this.checkPasswordConfirm() || isError;\n        if (isError) {\n            return\n        }\n\n        this.setState({\n            isChanging: true,\n            errorMessage: ''\n        });\n        const parsed = queryString.parse(this.props.location.search); //note this will replace all '+' signs with ' ' spaces, which we have to account for below\n        const emailaddress = parsed.emailaddress ? parsed.emailaddress.replaceAll(\" \", \"+\") : this.props.login.userProfile.email; //email address if registration or temp/expired password, userProfile prop if logged in and changing\n        const body = {\n            username: emailaddress,\n            password: this.state.currentpassword,\n            newpassword: this.state.password\n        };\n        this.props.actions.changePassword(body)\n            .then(() => {\n                this.setState({\n                    isChanging: false,\n                    passwordChangeFinished: true\n                });\n                //Login to get access token and refresh token\n                const loginObj = { userId: emailaddress, userPassword: this.state.password };\n                this.props.actions.loginUser(loginObj);\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    errorMessage: this.props.users.changePasswordError ? this.props.users.changePasswordError : err.toString(),\n                    isChanging: false\n                });\n            })\n    }\n\n    handleChange(key, val) {\n        this.setState({\n            [key]: val\n        });\n    }\n\n    toggleShowPassword() {\n        this.setState(state => ({\n            showPassword: !state.showPassword\n        }));\n    }\n\n    checkPassword() {\n        this.setState({ showHelp: false })\n        if (this.state.password.length < 10) {\n            this.setState({ passwordError: 'password must be at least 10 characters long' });\n            return true;\n        }\n        if (this.state.password.length > 256) {\n            this.setState({ passwordError: 'password must be 256 characters or fewer' });\n            return true;\n        }\n        if (this.state.password.search(/^(?:(?=.*[a-z])(?:(?=.*[A-Z])(?=.*[\\d@$!%*?=\\-_+&\\[\\]{}|\\\\:'\\,\\.\\?\\/`~\"\"\\(\\);<>])|(?=.*[@^$!%*?=\\-_+&\\[\\]{}|\\\\:'\\,\\.\\?\\/`~\"\"\\(\\);<>])(?=.*\\d))|(?=.*[@^$!%*?=\\-_+&\\[\\]{}|\\\\:'\\,\\.\\?\\/`~\"\"\\(\\);<>])(?=.*[A-Z])(?=.*\\d)).{10,256}$/) === -1) {\n            this.setState({ passwordError: 'invalid password', showHelp: true });\n            return true;\n        } else {\n            this.setState({ showHelp: false })\n        }\n        if (this.state.password === this.state.currentpassword) {\n            this.setState({ passwordError: 'new password cannot be the same as your current password' });\n            return true;\n        }\n        this.setState({\n            passwordError: ''\n        });\n    }\n\n    checkPasswordConfirm() {\n        if (this.state.password && this.state.passwordconfirm !== this.state.password) {\n            this.setState({\n                passwordConfirmError: 'passwords do not match'\n            });\n            return true;\n        }\n        this.setState({\n            passwordConfirmError: ''\n        });\n    }\n\n    toggleShowTooltip() {\n        this.setState(state => ({\n            toolTip: !state.toolTip\n        }), () => {\n            if (this.state.toolTip) {\n                document.addEventListener('mousedown', this.handleClickOutside);\n            }\n        });\n    }\n\n    handleClickOutside(event) {\n        if (this.infoRef && !this.infoRef.current.contains(event.target) && this.infoButtonRef && !this.infoButtonRef.current.contains(event.target)) {\n            document.removeEventListener('mousedown', this.handleClickOutside);\n            this.setState({ toolTip: false })\n        }\n    }\n\n    componentDidMount() {\n        if (this.props.location.pathname.includes('passwordreset')) {\n            this.setState({\n                resettingPassword: true\n            });\n            const resetHash = this.props.match.params.resethash;\n            let emailAddress;\n            if (this.props.location.search) {\n                emailAddress = queryString.parse(this.props.location.search).emailaddress;\n                if (emailAddress) { emailAddress = emailAddress.replaceAll(\" \", \"+\") }\n            }\n            this.props.actions.resetPassword({ HashedWord: resetHash, EmailAddress: emailAddress })\n                .then(() => {\n                    this.setState({\n                        resettingPassword: false\n                    });\n                    this.props.history.push('/change-password' + this.props.location.search);\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return\n                    }\n                    this.setState({\n                        passwordResetError: this.props.users.passwordResetError.Value ? this.props.users.passwordResetError.Value : err.toString()\n                    });\n                })\n        }\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { errorMessage, isChanging, passwordChangeFinished, password, passwordconfirm, currentpassword, resettingPassword, passwordResetError, showPassword, passwordError, passwordConfirmError } = this.state;\n        const passwordHasBeenResetCheckEmail = this.props.location.search && queryString.parse(this.props.location.search).emailaddress && !queryString.parse(this.props.location.search).passwordistemporaryorexpired;\n        const passwordIsTemporaryOrExpired = this.props.location.search && queryString.parse(this.props.location.search).emailaddress && queryString.parse(this.props.location.search).passwordistemporaryorexpired;\n        const emailSplit = this.props.login.userProfile.email.split(\"@\");\n\n        const passwordHelp = (indicate) => (\n            <React.Fragment>\n                <span>Your password must meet the following criteria:</span>\n                <ul>\n                    <li> Must be between 10 and 256 characters  {indicate && <span style={{ verticalAlign: 'middle' }} className={`icon ${password.length < 10 || password.length > 256 ? 'delete' : 'save'}`} />}</li>\n                    <li> Must contain at least three of the following four types of characters: {indicate && <span style={{ verticalAlign: 'middle' }} className={`icon ${calculateNumberOfCriteriaMet(password) < 3 ? 'delete' : 'save'}`} />}</li>\n                    <ol>\n                        <li> lowercase letter {indicate && <span style={{ verticalAlign: 'middle' }} className={`icon ${password.search(/[a-z]/) === -1 ? 'delete' : 'save'}`} />}</li>\n                        <li> uppercase letter {indicate && <span style={{ verticalAlign: 'middle' }} className={`icon ${password.search(/[A-Z]/) === -1 ? 'delete' : 'save'}`} />}</li>\n                        <li> number {indicate && <span style={{ verticalAlign: 'middle' }} className={`icon ${password.search(/\\d/) === -1 ? 'delete' : 'save'}`} />}</li>\n                        <li> special character {indicate && <span style={{ verticalAlign: 'middle' }} className={`icon ${password.search(/[@^$!%*?=\\-_+&\\[\\]{}|\\\\:'\\,\\.\\?\\/`~\"\"\\(\\);<>]/) === -1 ? 'delete' : 'save'}`} />}</li>\n                    </ol>\n                </ul>\n            </React.Fragment>\n        )\n\n        if (resettingPassword) {\n            if (passwordResetError) {\n                return (<div className=\"center\">\n                    <div className=\"fail\">There was a problem resetting your password</div>\n                    <div>{passwordResetError.toLowerCase().includes('information could not be found in cache') ? <Link to=\"/forgot-password\">Try again</Link> : passwordResetError}</div>\n                </div>)\n            }\n            return (<div className=\"spinner center-spinner\">Resetting Password</div>)\n        }\n        if (passwordChangeFinished) {\n            return (\n                <div className=\"center\">\n                    <h2>Your password has been changed</h2>\n                    <Link to=\"/home\">Home</Link>\n                </div>)\n        }\n        return (\n            <div className=\"dlas-forms change-password\">\n                {/* Find out if a reserved domain is present on either side of the @ in the event that the login email is formatted as user#domain@dlasva.onmicrosoft.com instead of user@domain*/}\n                {legislativeDomains.find(x => x === emailSplit[1]) || legislativeDomains.findIndex(x => emailSplit[0].includes(x)) >= 0\n                    ? <div className=\"homepage-links\"><p>{legislativeInstructions}</p> <Link to=\"/profile\">Return to Profile</Link></div>\n                    : houseDomains.find(x => x === emailSplit[1]) || houseDomains.findIndex(x => emailSplit[0].includes(x)) >= 0\n                        ? <div className=\"homepage-links\"><p>{houseInstructions}</p> <Link to=\"/profile\">Return to Profile</Link></div>\n                        : senateDomains.find(x => x === emailSplit[1]) || senateDomains.findIndex(x => emailSplit[0].includes(x)) >= 0\n                            ? <div className=\"homepage-links\"><p>{senateInstructions}</p> <Link to=\"/profile\">Return to Profile</Link></div>\n                            : <React.Fragment>\n                                <h1>New Password</h1>\n                                <hr className=\"faded-line\" />\n                                <div>\n                                    {passwordHasBeenResetCheckEmail ?\n                                        <p>Your password has been reset. Check your email for your temporary password.</p>\n                                        : passwordIsTemporaryOrExpired ?\n                                            <p>Your password is temporary or expired. Please change your password below.</p>\n                                            :\n                                            null\n                                    }\n                                </div>\n                                <div className=\"inner-grid two multi-row\" style={{ gridGap: '50px' }}>\n                                    <form>\n                                        <div>\n                                            <label htmlFor=\"sr-current-password\">{passwordHasBeenResetCheckEmail ? \"Temporary\" : \"Current\"} Password</label>\n                                            <input disabled={isChanging} id=\"sr-current-password\" value={currentpassword} onChange={e => this.handleChange(\"currentpassword\", e.target.value)} type={showPassword ? 'text' : 'password'} />\n                                        </div>\n                                        <div>\n                                            <label htmlFor=\"sr-new-password\">New Password</label>\n                                            <button onClick={this.toggleShowTooltip} type=\"button\" className=\"button info\" ref={this.infoButtonRef} > Info</button>\n                                            <div className=\"info-box\" ref={this.infoRef} style={{ display: this.state.toolTip ? 'block' : 'none' }}>\n                                                {passwordHelp(false)}\n                                            </div>\n                                            <input disabled={isChanging} id=\"sr-new-password\" autoComplete=\"false\" onBlur={this.checkPassword} value={password} onChange={e => this.handleChange(\"password\", e.target.value)} type={showPassword ? 'text' : 'password'} />\n                                            <span className=\"small-text fail\">{passwordError}</span>\n                                            {this.state.showHelp && <div style={{ fontSize: '0.8em' }}>{passwordHelp(true)}</div>}\n                                        </div>\n                                        <div>\n                                            <label htmlFor=\"sr-password-confirm\">New Password Confirmation</label>\n                                            <input disabled={isChanging} id=\"sr-password-confirm\" autoComplete=\"false\" onBlur={this.checkPasswordConfirm} onChange={e => this.handleChange(\"passwordconfirm\", e.target.value)} value={passwordconfirm} type={showPassword ? 'text' : 'password'} />\n                                            <span className=\"small-text fail\">{passwordConfirmError}</span>\n                                        </div>\n                                        <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                            <div className=\"toggle-switch\" onClick={this.toggleShowPassword}>\n                                                <input id=\"sr-show-password\" checked={showPassword} type=\"checkbox\" style={{ width: \"inherit\" }} />\n                                                <span className=\"slider\"></span>\n                                            </div>\n                                            <label htmlFor=\"sr-show-password\" className=\"checkbox-label no-background\">Show password</label>\n                                        </div>\n                                        <div>\n                                            {isChanging ?\n                                                <div><span className=\"spinner small-spinner\"></span></div>\n                                                :\n                                                <button onClick={this.changePassword} className=\"button\" type=\"submit\">Change password</button>\n                                            }\n                                        </div>\n                                        <span className=\"small-text fail\">{errorMessage}</span>\n                                    </form>\n                                </div>\n                            </React.Fragment>\n                }\n            </div>\n        );\n    }\n};\n\nexport default connect(\n    (state) => {\n        const { users, login } = state;\n        return {\n            users,\n            login\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, userActionCreators, authActionCreators), dispatch)\n        }\n    }\n)(ChangePassword);\n\n\n\n\n\n\n","import React from \"react\";\nimport { Link } from 'react-router-dom';\nimport ReactTable from \"react-table\";\nimport '../../../stylesheets/shared/react-table.css';\nimport '../../../stylesheets/lis-member-management/member-management.css';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { userActionCreators } from '../../../stores/lis-user-store';\nimport { memberActionCreators } from '../../../stores/lis-members-store';\nimport Select from 'react-select';\nimport { sessionActionCreators } from \"../../../stores/lis-session-store\";\nimport { cancelRequest } from '../../../services/request.service';\nimport moment from 'moment-timezone';\n\nclass MemberManagementGrid extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            sessionOptions: [],\n            selectedSession: '',\n            isLoaded: true,\n            searchFilter: '',\n            memberList: []\n        };\n\n        this.handleSessionChange = this.handleSessionChange.bind(this);\n        this.handleFilterChange = this.handleFilterChange.bind(this);\n        this.filterData = this.filterData.bind(this);\n        this.getData = this.getData.bind(this);\n\n    }\n\n    handleSessionChange(val) {\n        this.setState({\n            selectedSession: val\n        }, () => this.getData());\n    }\n\n    handleFilterChange(e) {\n        const val = e.target.value;\n        this.setState({\n            searchFilter: val\n        }, () => this.filterData());\n    }\n\n    filterData() {\n        const filter = this.state.searchFilter;\n        const formattedFilter = filter.toLowerCase().replace(/ /g, '');\n        let memberContacts = [...this.props.members.memberListContactData];\n        if (filter !== '') {\n            memberContacts = memberContacts.filter(contact => {\n                if (contact.MemberDisplayName && contact.MemberDisplayName.toLowerCase().includes(formattedFilter)) {\n                    return true;\n                }\n                if (contact.MemberNumber && contact.MemberNumber.toLowerCase().includes(formattedFilter)) {\n                    return true;\n                }\n                return false;\n            });\n        }\n        this.setState({\n            memberList: memberContacts.filter(member => {\n                if (this.props.login.userClaims.claims.find(x => x.RoleName === \"Admin\")) {\n                    return true;\n                } else if (member.ChamberCode === \"H\" && this.props.login.userClaims.claims.find(x => x.RoleName === \"HouseMemberEditor\") ||\n                    member.ChamberCode === \"S\" && this.props.login.userClaims.claims.find(x => x.RoleName === \"SenateMemberEditor\")) {\n                    return true;\n                }\n                return false;\n            })\n        });\n    }\n\n    getData() {\n        this.setState({\n            isLoaded: false\n        });\n        let params = 'isPublic=false&sessionID=' + this.state.selectedSession.SessionID;\n        this.props.actions.getMemberListContact(params)\n            .then(() => {\n                this.setState({\n                    isLoaded: true,\n                    checkedMembers: []\n                });\n                this.filterData();\n            });\n\n        //Get the member list so we can check for identical patron names on save on the member form\n        this.props.actions.getMemberList(params);\n    }\n\n    componentDidMount() {\n        this.props.actions.getSessionList()\n            .then(() => {\n                let sessionOptions = [...this.props.session.sessionList];\n                let selectedSession = '';\n                sessionOptions.forEach(session => {\n                    session.label = session.SessionYear + ' ' + session.DisplayName;\n                    session.value = session.SessionID;\n                    if (session.IsDefault) {\n                        selectedSession = session;\n                    }\n                });\n                this.setState({\n                    sessionOptions: sessionOptions,\n                    selectedSession: selectedSession\n                }, () => this.getData());\n            });\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { sessionOptions, selectedSession, memberList, checkedMembers, searchFilter } = this.state;\n\n        const customStyles = {\n            container: base => ({\n                ...base,\n                lineHeight: 'normal',\n            }),\n            option: (base, state) => ({\n                ...base,\n                fontSize: '0.8em',\n            }),\n            control: (base) => ({\n                ...base,\n                padding: '1px',\n                margin: 0,\n                minHeight: 0,\n                fontSize: '0.8em',\n            }),\n            dropdownIndicator: base => ({\n                ...base,\n                padding: '0px 8px'\n            })\n        }\n        return (\n            <div>\n                <h1>Member Management</h1>\n                <div className=\"toolbar user-toolbar\">\n                    <div className=\"dlas-forms\">\n                        <div>\n                            <label>Session</label>\n                            <Select\n                                options={sessionOptions}\n                                value={selectedSession}\n                                id=\"session-dropdown\"\n                                onChange={this.handleSessionChange}\n                                styles={customStyles}\n                            />\n                        </div>\n                        <div>\n                            <label>Search Member</label>\n                            <input\n                                id='member-filter'\n                                onChange={this.handleFilterChange}\n                                value={searchFilter}\n                            />\n                        </div>\n                        <div>\n                            <Link className=\"button add-wide\" to={`/member-management/${this.state.selectedSession.SessionCode}/create-member`}>Add Member</Link>\n                        </div>\n                    </div>\n                </div>\n                <ReactTable\n                    loading={!this.state.isLoaded}\n                    data={memberList}\n                    columns={[\n                        {\n                            Header: \"Member ID\",\n                            accessor: \"MemberNumber\",\n                            width: 150\n                        },\n                        {\n                            Header: \"Name\",\n                            accessor: \"MemberDisplayName\",\n                            Cell: row => {\n                                return row.original.MemberDisplayName + (row.original.ServiceEndDate && row.original.ServiceEndReason ? \" (\" + row.original.ServiceEndReason + \")\" : \"\")\n                            }\n                        },\n                        {\n                            Header: \"Member Status\",\n                            accessor: \"MemberStatus\",\n                            width: 200\n                        },\n                        {\n                            Header: \"Action\",\n                            headerClassName: \"header-action\",\n                            accessor: \"action\",\n                            className: \"action-column\",\n                            width: 50,\n                            expander: true,\n                            Expander: ({ isExpanded, original }) => {\n                                if (original.ContactInformation && original.ContactInformation.length > 0) {\n                                    return (\n                                        <button className=\"button view\">View</button>\n                                    );\n                                } else {\n                                    return (false);\n                                }\n                            }\n                        },\n                        {\n                            Header: \"\",\n                            accessor: \"edit\",\n                            headerClassName: \"all-column\",\n                            width: 40,\n                            Cell: row => {\n                                return (\n                                    <Link to={`/member-management/${this.state.selectedSession.SessionCode}/edit-member/${row.original.MemberID}`} className=\"button edit\">Edit</Link>\n                                )\n                            }\n                        }\n                    ]}\n                    defaultPageSize={10}\n                    className=\"-striped -highlight\"\n                    SubComponent={row => {\n                        return (\n                            <div>\n                                <MemberInfo member={row.original} />\n                            </div>\n                        )\n                    }}\n                />\n                <br />\n            </div>\n        );\n    }\n}\n\nconst MemberInfo = props => {\n\n    return (\n        <div className=\"flex-row space-around\">\n            {props.member.ContactInformation.map((contact, contactIndex) =>\n                <div key={contactIndex} className=\"member-contact-container\">\n                    <span className=\"member-contact-type\">{contact.ContactType}</span>\n                    <div className=\"inner-grid two\">\n                        <div>\n                            <div>\n                                <span className=\"member-contact-title\">Address:</span>\n                            </div>\n                            <div>\n                                <span>{contact.Address1}</span>\n                            </div>\n                            <div>\n                                <span>{contact.Address2}</span>\n                            </div>\n                            <div>\n                                <span>{contact.City} {contact.StateCode}, {contact.ZipCode}</span>\n                            </div>\n                        </div>\n                        {(contact.PhoneNumber || contact.EmailAddress) &&\n                            <div>\n                                <div>\n                                    <span className=\"member-contact-title\">Contact:</span>\n                                </div>\n                                <div>\n                                    <span>{contact.PhoneNumber}</span>\n                                </div>\n                                <div>\n                                    <span>{contact.EmailAddress}</span>\n                                </div>\n                            </div>\n                        }\n                    </div>\n                </div>\n            )}\n        </div>\n    );\n}\n\nexport default connect(\n    (state) => {\n        const { users, members, session, login } = state;\n        return {\n            users,\n            members,\n            session,\n            login\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, userActionCreators, memberActionCreators, sessionActionCreators), dispatch)\n        }\n    }\n)(MemberManagementGrid)","import React from 'react';\nimport * as Fields from '../../../lis-shared/lis-layout/components/lis-forms-component';\nimport '../../../stylesheets/lis-member-management/member-management.css';\nimport Select from 'react-select';\n\nconst customStyles = {\n    option: (base, state) => ({\n        ...base,\n        fontSize: '0.8em',\n    }),\n    control: (base) => ({\n        ...base,\n        padding: '1px',\n        margin: 0,\n        minHeight: 0,\n        fontSize: '0.8em',\n    }),\n    singleValue: (base, state) => {\n        return { ...base, };\n    }\n}\n\nconst ContactInformation = props => {\n    const { contactList, contactOptions } = props;\n    return (\n        <div>\n            <h3>Contact Information</h3>\n            {contactList.map((contact, contactIndex) => {\n                if (!contact.IsActive) {\n                    return (<div key={contactIndex}></div>)\n                }\n                return(<div key={contactIndex}>\n                    <div className=\"flex-row\">\n                        <div className=\"multi-row four no-margin\"/>                            \n                        <div>\n                            <button type=\"button\" onClick={() => props.removeContact(contactIndex)} className=\"button danger\">Remove Contact</button>\n                        </div>\n                    </div>\n                    <div className=\"inner-grid two\">\n                        <div>\n                            <div>\n                                <span className=\"member-contact-title\">Mailing Address</span>\n                            </div>\n                            <div className=\"multi-row three no-margin\">\n                                <div>\n                                    <label>Address Line 1</label>\n                                    <input\n                                        type=\"text\"\n                                        placeholder=\"Address Line 1\"\n                                        value={contact.Address1}\n                                        onChange={(e) => props.changeContact(contactIndex, 'Address1', e.target.value)}\n                                    />\n                                </div>\n                            </div>\n                            <div className=\"multi-row three no-margin\">\n                                <div>\n                                    <label>Address Line 2</label>\n                                    <input\n                                        type=\"text\"\n                                        placeholder=\"Address Line 2\"\n                                        value={contact.Address2}\n                                        onChange={(e) => props.changeContact(contactIndex, 'Address2', e.target.value)}\n                                    />\n                                </div>\n                            </div>\n                            <div className=\"multi-row three no-margin\">\n                                <div>\n                                    <label>City</label>\n                                    <input\n                                        type=\"text\"\n                                        placeholder=\"City\"\n                                        value={contact.City}\n                                        onChange={(e) => props.changeContact(contactIndex, 'City', e.target.value)}\n                                    />\n                                </div>\n                                <div>\n                                    <label>State</label>\n                                    <Select\n                                        styles={customStyles}\n                                        options={Fields.stateOptions}\n                                        value={Fields.stateOptions.find(option => option.label === contact.StateCode)}\n                                        onChange={(val) => props.changeContact(contactIndex, 'StateCode', val.label)}\n                                    />\n                                </div>\n                                <div>\n                                    <label>Zip Code</label>\n                                    <input\n                                        type=\"number\"\n                                        placeholder=\"Zip Code\"\n                                        value={contact.ZipCode}\n                                        onChange={(e) => props.changeContact(contactIndex, 'ZipCode', e.target.value)}\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div>\n                            <div>\n                                <span className=\"member-contact-title\">Contact</span>\n                            </div>\n                            <div className=\"multi-row three no-margin\">\n                                <div>\n                                    <label>Phone Number</label>\n                                    <input\n                                        type=\"text\"\n                                        placeholder=\"Phone Number\"\n                                        value={contact.PhoneNumber}\n                                        onChange={(e) => props.changeContact(contactIndex, 'PhoneNumber', e.target.value)}\n                                    />\n                                </div>\n                            </div>\n                            <div className=\"multi-row three no-margin\">\n                                <div>\n                                    <label>Email Address</label>\n                                    <input\n                                        type=\"text\"\n                                        placeholder=\"Email Address\"\n                                        value={contact.EmailAddress}\n                                        onChange={(e) => props.changeContact(contactIndex, 'EmailAddress', e.target.value)}\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                    <hr />\n                </div>\n            )})}\n            <button type=\"button\" className=\"button\" onClick={props.addContact}>Add Contact</button>\n        </div>\n    );\n\n}\n\nexport default ContactInformation;\n\n\n\n\n\n\n\n\n","import React from 'react';\nimport '../../../stylesheets/lis-member-management/member-management.css';\nimport Select from 'react-select';\n\nconst customStyles = {\n    option: (base, state) => ({\n        ...base,\n        fontSize: '0.8em',\n    }),\n    control: (base) => ({\n        ...base,\n        padding: '1px',\n        margin: 0,\n        minHeight: 0,\n        fontSize: '0.8em',\n    }),\n    singleValue: (base, state) => {\n        return { ...base, };\n    }\n}\n\nclass UserForm extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            username: '',\n            firstName: '',\n            lastName: '',\n            selectedDomain: '',\n        }\n        this.handleTextChange = this.handleTextChange.bind(this);\n        this.handleDomainChange = this.handleDomainChange.bind(this);\n        this.saveUser = this.saveUser.bind(this);\n    }\n\n    handleTextChange(key, val) {\n        this.setState({\n            [key]: val\n        });\n    }\n\n    handleDomainChange(val) {\n        this.setState({\n            selectedDomain: val\n        });\n    }\n\n    saveUser() {\n        // Create the request object. The actual request is made in the parent component\n        // The email address will be used as the username\n        const userObj = {\n            LoginID: this.state.username + \"@\" + this.state.selectedDomain.DomainName,\n            FirstName: this.state.firstName,\n            LastName: this.state.lastName,\n            DomainID: this.state.selectedDomain.DomainID,\n            IdentityID: this.props.personData.IdentityID,\n            IsActive: true\n        }\n        this.props.saveUser(userObj);\n    }\n\n    componentDidMount() {\n        if (this.props.personData.FirstName) {\n            this.setState({\n                firstName: this.props.personData.FirstName\n            });\n        }\n        if (this.props.personData.LastName) {\n            this.setState({\n                lastName: this.props.personData.LastName\n            });\n        }\n    }\n\n    render() {\n        const { domainOptions, isSaving } = this.props;\n        const { username, selectedDomain, firstName, lastName } = this.state;\n        return (\n            <div>\n                <h3>Connect a User</h3>\n                <form className=\"dlas-forms user-forms\">\n                    <div className=\"multi-row fifth-even no-margin\">\n                        <div>\n                            <label>Username</label>\n                            <input type=\"text\"\n                                placeholder=\"Username\"\n                                value={username}\n                                onChange={(e) => this.handleTextChange(\"username\", e.target.value)}\n                            />\n                        </div>\n                        <div>\n                            <label>Directory</label>\n                            <Select\n                                styles={customStyles}\n                                options={domainOptions}\n                                value={selectedDomain}\n                                onChange={this.handleDomainChange}\n                            />\n                        </div>\n                    </div>\n                    <div className=\"multi-row fifth-even no-margin\">\n                        <div>\n                            <label>First Name</label>\n                            <input type=\"text\"\n                                placeholder=\"First Name\"\n                                value={firstName}\n                                onChange={(e) => this.handleTextChange(\"firstName\", e.target.value)}\n                            />\n                        </div>\n                        <div>\n                            <label>Last Name</label>\n                            <input type=\"text\"\n                                placeholder=\"Last Name\"\n                                value={lastName}\n                                onChange={(e) => this.handleTextChange(\"lastName\", e.target.value)}\n                            />\n                        </div>\n                    </div>\n                </form>\n                <div className=\"button-bar\">\n                    <div>\n                        <button onClick={this.props.toggleUserCreation} disabled={isSaving} type=\"button\" className=\"button secondary\">Close</button>\n                    </div>\n                    <div className=\"align-right\">\n                        <button onClick={this.saveUser} disabled={isSaving || (!username || !selectedDomain)} type=\"button\" className=\"button\">Save & Close</button>\n                    </div>\n                </div>\n                <div>\n                    <div className=\"input-feedback\">{this.props.userError}</div>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default UserForm;\n\n\n\n\n\n\n\n\n","import React from 'react';\nimport '../../../stylesheets/lis-member-management/member-management.css';\nimport { bindActionCreators } from 'redux';\nimport { Link, Prompt } from 'react-router-dom';\nimport { connect } from 'react-redux';\nimport { userActionCreators } from '../../../stores/lis-user-store';\nimport { memberActionCreators } from '../../../stores/lis-members-store';\nimport { sessionActionCreators } from \"../../../stores/lis-session-store\";\nimport ReactTooltip from 'react-tooltip';\nimport Select from 'react-select';\nimport moment from 'moment-timezone';\nimport DatePicker from 'react-datepicker';\nimport ReactTable from \"react-table\";\nimport ContactInformation from './lis-contact-form';\nimport UserForm from './lis-user-creation';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { cancelRequest } from '../../../services/request.service';\n\nconst customStyles = {\n    option: (base, state) => ({\n        ...base,\n        fontSize: '0.8em',\n        paddingBottom: '4px !important'\n    }),\n    control: (base) => ({\n        ...base,\n        padding: '1px',\n        margin: 0,\n        minHeight: 0,\n        fontSize: '0.8em',\n    }),\n    menuList: (base) => ({\n        ...base,\n        paddingBottom: '4px !important'\n    }),\n    singleValue: (base, state) => {\n        return { ...base, };\n    }\n}\n\nclass MemberManagementForm extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            isLoaded: false,\n            isSaving: false,\n            userFieldsetIsActive: true,\n            personalFieldsetIsActive: true,\n            memberFieldsetisActive: true,\n            memberData: '',\n            personData: '',\n            userData: [],\n            chamberOptions: [\n                { label: 'House', value: 'H' },\n                { label: 'Senate', value: 'S' }\n            ],\n            districtOptions: [],\n            contactOptions: [],\n            userList: [],\n            personList: [],\n            showUserCreation: false,\n            domainOptions: [],\n            statusOptions: [],\n            showPersonCreation: true,\n            memberNumberError: false,\n            isDirty: false\n        };\n\n        this.buildListDisplayName = this.buildListDisplayName.bind(this);\n        this.toggleFieldsetCollapse = this.toggleFieldsetCollapse.bind(this);\n        this.handleMemberChange = this.handleMemberChange.bind(this);\n        this.handlePersonChange = this.handlePersonChange.bind(this);\n        this.handleContactChange = this.handleContactChange.bind(this);\n        this.selectPerson = this.selectPerson.bind(this);\n        this.createPerson = this.createPerson.bind(this);\n        this.toggleUserCreation = this.toggleUserCreation.bind(this);\n        this.togglePersonCreation = this.togglePersonCreation.bind(this);\n        this.saveUser = this.saveUser.bind(this);\n        this.selectUser = this.selectUser.bind(this);\n        this.saveForm = this.saveForm.bind(this);\n        this.getMemberData = this.getMemberData.bind(this);\n    }\n\n    buildListDisplayName(personData) {\n        let listDisplayName = '';\n        listDisplayName = personData.LastName && personData.LastName != \"\" ? listDisplayName + \" \" + personData.LastName + \",\" : listDisplayName;\n        listDisplayName = personData.FirstName && personData.FirstName != \"\" ? listDisplayName + \" \" + personData.FirstName : listDisplayName;\n        listDisplayName = personData.MiddleName && personData.MiddleName != \"\" ? listDisplayName + \" \" + personData.MiddleName : listDisplayName;\n        listDisplayName = personData.AlternateName && personData.AlternateName != \"\" ? listDisplayName + \" \" + personData.AlternateName : listDisplayName;\n        listDisplayName = personData.Suffix && personData.Suffix != \"\" ? listDisplayName + \" \" + personData.Suffix : listDisplayName;\n\n        return listDisplayName;\n    }\n\n    buildMemberDisplayName(personData) {\n        let memberDisplayName = '';\n        memberDisplayName = personData.FirstName && personData.FirstName != \"\" ? memberDisplayName + \" \" + personData.FirstName : memberDisplayName;\n        memberDisplayName = personData.MiddleName && personData.MiddleName != \"\" ? memberDisplayName + \" \" + personData.MiddleName : memberDisplayName;\n        memberDisplayName = personData.AlternateName && personData.AlternateName != \"\" ? memberDisplayName + \" \" + personData.AlternateName : memberDisplayName;\n        memberDisplayName = personData.LastName && personData.LastName != \"\" ? memberDisplayName + \" \" + personData.LastName : memberDisplayName;\n        memberDisplayName = personData.Suffix && personData.Suffix != \"\" ? memberDisplayName + \" \" + personData.Suffix : memberDisplayName;\n\n        return memberDisplayName;\n    }\n\n    buildPatronDisplayName(personObj, memberDataObject) {\n        let patronDisplayName = '';\n\n        //Set the PatronDisplayName to last name, unless the last name is not unique\n        if (this.props.members.memberList.find(x => x.ListDisplayName && x.ListDisplayName.split(\",\")[0] === personObj.LastName && (memberDataObject ? x.MemberID !== memberDataObject.MemberID : true))\n            || this.props.members.memberList.find(x => x.PatronDisplayName && x.PatronDisplayName.split(\",\")[0] === personObj.LastName && (memberDataObject ? x.MemberID !== memberDataObject.MemberID : true))) {\n            patronDisplayName = personObj.LastName + \", \" + personObj.FirstName[0] + \". \" + (personObj.MiddleName ? personObj.MiddleName[0] + \".\" : \"\")\n        } else {\n            patronDisplayName = personObj.LastName\n        }\n\n        return patronDisplayName;\n    }\n\n    toggleFieldsetCollapse(fieldset) {\n        this.setState(state => ({\n            [fieldset]: !state[fieldset]\n        }));\n    };\n\n    handleMemberChange(key, value) {\n        let memberData = { ...this.state.memberData };\n        if (key === 'MemberNumber') {\n            value = value ? value.toUpperCase() : value;\n            if (value && ['H', 'S'].includes(value[0])) {\n                memberData['ChamberCode'] = value[0];\n            } else {\n                memberData['ChamberCode'] = null;\n                memberData['DistrictID'] = null;\n            }\n        }\n\n        if ([\"ListDisplayName\", \"PatronDisplayName\", \"MemberDisplayName\"].includes(key)) {\n            memberData[\"override\"] = true;\n            memberData[\"markOverride\"] = false;\n        }\n\n        memberData[key] = value;\n        this.setState({\n            memberData: memberData,\n            isDirty: true,\n        });\n    }\n\n    handlePersonChange(key, value) {\n        let personData = { ...this.state.personData };\n        let memberData = { ...this.state.memberData };\n        personData[key] = value;\n\n        if ([\"FirstName\", \"MiddleName\", \"AlternateName\", \"LastName\", \"Suffix\"].includes(key)) {\n            if (memberData[\"override\"] === true) {\n                memberData[\"markOverride\"] = true;\n                memberData[\"namesChanged\"] = true;\n            } else {\n                memberData[\"namesChanged\"] = true;\n            }\n        }\n\n        memberData.ListDisplayName = this.buildListDisplayName(personData).trim();\n        memberData.MemberDisplayName = this.buildMemberDisplayName(personData).trim();\n\n        this.setState({\n            personData: personData,\n            memberData: memberData,\n            isDirty: true\n        });\n    }\n\n    handleContactChange(stateVar, value) {\n        this.setState({\n            [stateVar]: value,\n            isDirty: true\n        });\n    }\n\n    selectPerson(person) {\n        this.setState({\n            personData: person\n        }, () => {\n            let newMember = {};\n            if (person.FirstName && person.LastName) {\n                newMember.MemberDisplayName = this.buildMemberDisplayName(person);\n                newMember.ListDisplayName = this.buildListDisplayName(person);\n            } else {\n                newMember.MemberDisplayName = '';\n                newMember.ListDisplayName = '';\n            }\n            this.setState({\n                memberData: newMember\n            });\n        });\n    }\n\n    createPerson() {\n        // Check to make sure the required fields are filled out\n        if (!this.state.memberData.MemberNumber || !this.state.memberData.ChamberCode || !this.state.memberData.DistrictID || !this.state.memberData.PartyCode || (!this.state.personData.IdentityID && (!this.state.memberData.MemberDisplayName || !this.state.memberData.ListDisplayName))) {\n            return;\n        }\n        this.setState({\n            isSaving: true\n        }, () => {\n            const personObj = {\n                ...this.state.personData,\n            }\n            // If the person object has an IdentityID then the user has selected a person from the person list.\n            // So there is no need to create a new person\n            let createPerson = ''\n            if (personObj.IdentityID) {\n                createPerson = () => Promise.resolve();\n            } else {\n                createPerson = this.props.actions.createPerson(personObj)\n                    .then(() => {\n                        // The person has been succesfully created. Time to create the member\n                        // The response from the person creation will return an ID\n                        return Promise.resolve();\n                    }).catch(err => {\n                        if (err === 'Aborted') {\n                            return;\n                        }\n                        this.props.actions.makeToast([{ message: \"Person Creation Failure\", type: \"failure\" }]);\n                        return Promise.reject(err);\n                    });\n            }\n            Promise.all([createPerson])\n                .then(() => {\n                    const newMemberObj = {\n                        ...this.state.memberData,\n                        SessionCode: this.props.sessionCode,\n                        IdentityID: personObj.IdentityID || this.props.users.personCreate,\n                    };\n                    newMemberObj.PatronDisplayName = this.buildPatronDisplayName(personObj);\n\n                    //Make sure member number is unique\n                    if (this.props.members.memberNumbers.find(x => x.MemberNumber === this.state.memberData.MemberNumber)) {\n                        this.setState({\n                            memberNumberError: true,\n                            isSaving: false\n                        })\n                        return;\n                    }\n\n                    this.props.actions.createMember(newMemberObj)\n                        .then(() => {\n                            const member = this.props.members.memberCreate;\n                            this.setState({ isDirty: false }, () => {\n                                // If everything was succesful then send the user to the edit page for the newly created member\n                                this.props.history.push(`/member-management/${member.SessionCode}/edit-member/${member.MemberID}`)\n                            })\n                        }).catch(err => {\n                            if (err === 'Aborted') {\n                                return;\n                            }\n                            this.props.actions.makeToast([{ message: \"Member Creation Failure\", type: \"failure\" }]);\n                            this.setState({\n                                isSaving: false,\n                                memberNumberError: false\n                            });\n                        })\n                });\n        });\n    }\n\n    toggleUserCreation() {\n        this.setState(state => ({\n            showUserCreation: !state.showUserCreation\n        }));\n    }\n\n    togglePersonCreation() {\n        this.setState(state => ({\n            showPersonCreation: !state.showPersonCreation,\n            personData: ''\n        }));\n    }\n\n    saveUser(userObj) {\n        this.setState({\n            isSaving: true\n        }, () => {\n            this.props.actions.createUser(userObj)\n                .then(() => {\n                    this.props.actions.makeToast([{ message: \"User Creation Success\", type: \"success\" }]);\n                    // Add the new user to the top of the user table\n                    // The password is returned which will be used in the table\n                    let fullName = (userObj.FirstName || '') + ' ' + (userObj.LastName || '');\n                    userObj = {\n                        ...userObj,\n                        ...this.props.users.userCreate,\n                        FullName: fullName\n                    }\n                    let userData = [...this.state.userData];\n                    userData.unshift(userObj);\n                    this.setState({\n                        isSaving: false,\n                        showUserCreation: false,\n                        userData: userData\n                    });\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.props.actions.makeToast([{ message: \"User Creation Failed\", type: \"failure\" }]);\n                    this.setState({\n                        isSaving: false\n                    });\n                })\n        });\n    }\n\n    selectUser(rowIndex) {\n        const userData = [...this.state.userData];\n        userData[rowIndex].IsActive = !userData[rowIndex].IsActive;\n        this.setState({\n            userData: userData\n        });\n    }\n\n    saveForm() {\n        // Check to make sure the required fields are filled out\n        if (!this.state.memberData.MemberNumber || !this.state.memberData.ChamberCode || !this.state.memberData.DistrictID || !this.state.memberData.PartyCode || !this.state.personData.FullName) {\n            return;\n        }\n        //Make sure member number is unique        \n        if (this.props.members.memberNumbers.filter(x => x.MemberID !== this.state.memberData.MemberID).find(x => x.MemberNumber === this.state.memberData.MemberNumber)) {\n            this.setState({\n                memberNumberError: true\n            })\n            return;\n        }\n        this.setState({\n            isSaving: true,\n            memberNumberError: false\n        }, () => {\n            const { memberData, personData } = this.state;\n            let memberDataObject = { ...memberData };\n\n            //Set the PatronDisplayName to last name, unless the last name is not unique\n            //Ignore if names have been overridden by the user and the user hasn't gone back and overwritten the override\n            //Ignore if there have been no changes to the name fields\n            if ((memberData[\"override\"] && !memberData[\"markOverride\"]) || !memberData[\"namesChanged\"]) {\n                //Do nothing\n            } else {\n                memberDataObject.PatronDisplayName = this.buildPatronDisplayName(personData, memberDataObject);\n            }\n\n            memberDataObject.ChamberCode = memberDataObject.MemberNumber[0];\n\n            //Pressing the save button will save the member info, the person info, and the contact info for user, member, and person\n            const saveMember = this.props.actions.saveMember(memberDataObject)\n                .then(() => {\n                    return Promise.resolve();\n                }).catch(err => Promise.reject(err));\n            //Check to see if the person already exists before deciding to save or create the person\n            const savePerson = personData.IdentityID\n                ? this.props.actions.savePerson(personData)\n                    .then(() => {\n                        return Promise.resolve();\n                    }).catch(err => Promise.reject(err))\n                : this.props.actions.createPerson(personData)\n                    .then(() => {\n                        return Promise.resolve();\n                    }).catch(err => Promise.reject(err))\n\n            let contactArray = [];\n            let saveContact;\n            if (memberData.ContactInformation.length > 0) {\n                contactArray = [\n                    ...contactArray,\n                    ...memberData.ContactInformation\n                ];\n            }\n            if (personData && personData.ContactInformation.length > 0) {\n                contactArray = [\n                    ...contactArray,\n                    ...personData.ContactInformation\n                ];\n            }\n            if (contactArray.length === 0) {\n                saveContact = () => Promise.resolve();\n            }\n            const contactObj = { ContactInformation: contactArray }\n            saveContact = this.props.actions.saveContact(contactObj)\n                .then(() => {\n                    if (this.props.users.contactSaveError !== null) {\n                        Promise.reject(this.props.users.contactSaveError)\n                    } else {\n                        return Promise.resolve();\n                    }\n                }).catch(err => Promise.reject(err));\n\n            Promise.all([\n                saveMember,\n                savePerson,\n                saveContact\n            ])\n                .then(() => {\n                    this.props.actions.makeToast([{ message: \"Save Successful\", type: \"success\" }]);\n                    this.getMemberData(this.props.memberId);\n                    this.setState({\n                        isSaving: false,\n                        isDirty: false\n                    });\n                })\n                .catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.props.actions.makeToast([{ message: err.includes(\"Historical Member records can not be updated\") ? \"Updating historical members is prohibited.\" : \"Save Failed\", type: \"failure\" }]);\n                    this.setState({\n                        isSaving: false,\n                    });\n                });\n        });\n    }\n\n    async getMemberData(memberId) {\n        await this.props.actions.getMember(memberId + '?sessionCode=' + this.props.sessionCode, true)\n            .then(() => {\n                let memberData = { ...this.props.members.member };\n                let personData = memberData.Person.length > 0 ? { ...memberData.Person[0] } : '';\n                let userData = [];\n                if (personData) {\n                    userData = personData.UserProfile;\n\n                    if (!memberData.ListDisplayName) {\n                        memberData.ListDisplayName = this.buildListDisplayName(personData).trim();\n                    }\n                    if (!memberData.MemberDisplayName) {\n                        memberData.MemberDisplayName = this.buildMemberDisplayName(personData).trim();\n                    }\n                    if (!memberData.PatronDisplayName) {\n                        memberData.PatronDisplayName = this.buildPatronDisplayName(personData, memberData);\n                    }\n                }\n\n                this.setState({\n                    memberData: memberData,\n                    personData: personData,\n                    userData: userData\n                });\n                return Promise.resolve();\n            }).catch(err => Promise.reject(err));\n    }\n\n    componentDidMount() {\n        this.props.actions.getMemberNumbers();\n        const memberId = this.props.memberId;\n        let getMemberData = '';\n        let getPersonData = ''\n        //It will undefined if the user is creating a new member instead of editing an existing one.\n        if (memberId === undefined) {\n            getMemberData = () => Promise.resolve();\n            // If a new member is being created then a list of persons needs to be fetched to allow the user to associate\n            // the new member to an existing person\n            getPersonData = this.props.actions.getPersonList('')\n                .then(() => {\n                    this.setState({\n                        memberData: '',\n                        personData: '',\n                        userData: [],\n                        personList: this.props.users.personList,\n                        showPersonCreation: false\n                    });\n                    return Promise.resolve();\n                })\n        } else {\n            getPersonData = () => Promise.resolve();\n            getMemberData = this.getMemberData(memberId)\n        }\n        // Get list of districts for the district dropdown in member information\n        const getDistricts = this.props.actions.getDistricts()\n            .then(() => {\n                let districtOptions = [...this.props.members.districtList];\n                districtOptions.forEach(district => {\n                    district.label = `(${district.ChamberCode}) ${district.Title}`;\n                    district.value = district.DistrictID;\n                });\n                this.setState({\n                    districtOptions: districtOptions\n                });\n                return Promise.resolve();\n            });\n        const getParties = this.props.actions.getPartyCodeList()\n            .then(() => {\n                let partyOptions = [...this.props.members.partyCodeList];\n                partyOptions.forEach(party => {\n                    party.label = party.PartyCode;\n                    party.value = party.PartyCode;\n                });\n                this.setState({\n                    partyOptions: partyOptions\n                });\n                return Promise.resolve();\n            });\n        // Get the list of contact types used in the contact sections\n        const getContactTypes = this.props.actions.getContactReferences()\n            .then(() => {\n                let contactOptions = [...this.props.users.contactReferences];\n                contactOptions.forEach(type => {\n                    type.label = type.ContactType;\n                    type.value = type.ContactTypeID;\n                });\n                this.setState({\n                    contactOptions: contactOptions\n                });\n                return Promise.resolve();\n            })\n        // Get list of possible member status for the dropdown in member information\n        const getStatuses = this.props.actions.getMemberStatuses()\n            .then(() => {\n                let statusOptions = [...this.props.members.memberStatuses];\n                statusOptions.forEach(status => {\n                    status.label = status.Name;\n                    status.value = status.MemberStatusID;\n                });\n                this.setState({\n                    statusOptions: statusOptions\n                });\n                return Promise.resolve();\n            });\n\n\n        // Once all those requests are finished then show the page\n        Promise.all([\n            getMemberData,\n            getPersonData,\n            getDistricts,\n            getParties,\n            getContactTypes,\n            getStatuses\n        ])\n            .then(() => {\n                this.setState({\n                    isLoaded: true\n                });\n            })\n            .catch(err => {\n                console.log(err)\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    isLoaded: true,\n                    message: 'Error returned when retrieving the data: ' + err\n                });\n            });\n\n        //Get a list of AD directories. Used for creating a user. This does not appear on the main form so the page can be loaded before finishing this request\n        this.props.actions.getDirReferences()\n            .then(() => {\n                let dirList = [...this.props.users.dirList];\n                dirList.forEach(dir => {\n                    dir.label = dir.DomainName;\n                    dir.value = dir.DomainID;\n                });\n                this.setState({\n                    domainOptions: dirList\n                });\n                return Promise.resolve();\n            });\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n\n    render() {\n        if (!this.state.isLoaded) {\n            return (\n                <div className=\"center-spinner spinner\">Loading results...</div>\n            );\n        }\n        if (this.state.message) {\n            return (\n                <div className=\"dlas-forms\">\n                    <span>{this.state.message}</span>\n                </div>\n            );\n\n        }\n        return (\n            <div className=\"dlas-forms user-forms\">\n                <div>\n                    <Prompt\n                        when={this.state.isDirty}\n                        message={`You have unsaved changes. Are you sure you would like to leave?`}\n                    />\n                </div>\n                {this.state.showUserCreation &&\n                    <div className=\"overlay\">\n                        <div className=\"full\">\n                            <div className=\"overlay-content animated-fade-in-up\">\n                                <UserForm\n                                    toggleUserCreation={this.toggleUserCreation}\n                                    isSaving={this.state.isSaving}\n                                    domainOptions={this.state.domainOptions}\n                                    saveUser={this.saveUser}\n                                    userError={this.props.users.userCreateError}\n                                    personData={this.state.personData}\n                                />\n                            </div>\n                        </div>\n                    </div>\n                }\n                <form>\n                    <fieldset className={this.state.personalFieldsetIsActive ? 'fieldset-collapse' : 'fieldset-collapse fieldset-closed'}>\n                        <legend onClick={() => this.toggleFieldsetCollapse('personalFieldsetIsActive')}>Personal Information</legend>\n                        {this.state.showPersonCreation ?\n                            <PersonInformation\n                                person={this.state.personData}\n                                contactOptions={this.state.contactOptions}\n                                handlePersonChange={this.handlePersonChange}\n                                handleContactChange={this.handleContactChange}\n                                memberId={this.props.memberId}\n                                togglePersonCreation={this.togglePersonCreation}\n                            />\n                            :\n                            <PersonTable\n                                personList={this.state.personList}\n                                togglePersonCreation={this.togglePersonCreation}\n                                selectPerson={this.selectPerson}\n                            />\n                        }\n                    </fieldset>\n                    <fieldset className={this.state.memberFieldsetisActive ? 'fieldset-collapse' : 'fieldset-collapse fieldset-closed'}>\n                        <legend onClick={() => this.toggleFieldsetCollapse('memberFieldsetisActive')}>Member Information</legend>\n                        <MemberInformation\n                            member={this.state.memberData}\n                            chamberOptions={this.state.chamberOptions}\n                            districtOptions={this.state.districtOptions}\n                            statusOptions={this.state.statusOptions}\n                            partyOptions={this.state.partyOptions}\n                            contactOptions={this.state.contactOptions}\n                            handleMemberChange={this.handleMemberChange}\n                            handleContactChange={this.handleContactChange}\n                            memberId={this.props.memberId}\n                            memberNumberError={this.state.memberNumberError}\n                        />\n                    </fieldset>\n                    <div className=\"button-bar\">\n                        <div>\n                            <Link to=\"/member-management\" className=\"button secondary\">Close</Link>\n                        </div>\n                        <div className=\"align-right\">\n                            {!this.props.memberId ?\n                                <button disabled={this.state.isSaving} type=\"button\" onClick={this.createPerson} className=\"button\">Create</button>\n                                :\n                                <button disabled={this.state.isSaving} className=\"button\" onClick={this.saveForm} type=\"button\">Save</button>\n                            }\n\n                        </div>\n                    </div>\n                </form>\n            </div>\n        );\n    }\n};\n\n\nclass UserInformation extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            showPassword: []\n        };\n        this.toggleShowPassword = this.toggleShowPassword.bind(this);\n    }\n\n    toggleShowPassword(e, userIndex) {\n        if (e) {\n            e.stopPropagation();\n        }\n        let showPassword = this.state.showPassword;\n        showPassword[userIndex] = !showPassword[userIndex];\n        this.setState({\n            showPassword: showPassword\n        });\n    }\n\n    render() {\n        const { user, person } = this.props;\n\n        return (<div>\n            <div className=\"align-right\">\n                <button type=\"button\" onClick={this.props.toggleUserCreation} className=\"button add-wide\">Add User</button>\n            </div>\n            <ReactTable\n                data={user}\n                getTrProps={(state, rowInfo) => {\n                    let background = '';\n                    if (rowInfo) {\n                        background = rowInfo.original.IsActive ? '#89ff89' : '';\n                    }\n                    return {\n                        style: {\n                            background: background,\n                            cursor: rowInfo ? 'pointer' : 'default'\n                        },\n                        onClick: () => this.props.selectUser(rowInfo.index)\n                    }\n                }}\n                noDataText=\"No Users Found\"\n                columns={[\n                    {\n                        id: \"checkbox\",\n                        accessor: \"\",\n                        className: \"checkbox-column\",\n                        Cell: ({ original }) => {\n                            return <span\n                                className={original.IsActive ? \"icon checkmark\" : \"\"}>\n                            </span>;\n                        },\n                        sortable: false,\n                        filterable: false,\n                        width: 45\n                    },\n                    {\n                        Header: \"Login\",\n                        Cell: ({ original, index }) => {\n                            return (\n                                <div className=\"flex-row\">\n                                    <div>{original.LoginID}</div>\n                                    {original.Password &&\n                                        <div>\n                                            {this.state.showPassword[index] ?\n                                                <span style={{ fontWeight: 700 }}>{original.Password} <button type=\"button\" onClick={(e) => this.toggleShowPassword(e, index)} className=\"button small-button\">Hide</button></span>\n                                                :\n                                                <button type=\"button\" onClick={(e) => this.toggleShowPassword(e, index)} className=\"button small-button\">Show Password</button>\n                                            }\n                                        </div>\n                                    }\n                                </div>\n                            );\n                        }\n                    },\n                    {\n                        Header: \"Organization\",\n                        accessor: \"OrganizationName\",\n                        width: 300\n                    },\n                ]}\n                defaultPageSize={5}\n                className=\"-striped -highlight\"\n            />\n        </div>)\n    }\n}\n\nclass PersonTable extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            selectedPersonIndex: null,\n            search: '',\n            personList: []\n        };\n        this.handleSearchChange = this.handleSearchChange.bind(this);\n        this.selectPerson = this.selectPerson.bind(this);\n    }\n\n    handleSearchChange(e) {\n        const val = e.target.value;\n        let personList = [...this.props.personList];\n        const formattedSearch = val.toLowerCase().replace(/ /g, '');\n        let filteredPersonList = null;\n        if (formattedSearch !== '') {\n            filteredPersonList = personList.filter(person => {\n                if (person.FullName) {\n                    return person.FullName.toLowerCase().includes(formattedSearch);\n                }\n            });\n        }\n        this.setState({\n            search: val,\n            personList: filteredPersonList || personList,\n            selectedPersonIndex: null\n        });\n    }\n\n    selectPerson(personIndex) {\n        this.setState({\n            selectedPersonIndex: personIndex\n        });\n        this.props.selectPerson(this.state.personList[personIndex]);\n    }\n\n    componentDidMount() {\n        this.setState({\n            personList: this.props.personList\n        });\n    }\n\n    render() {\n        return (\n            <div>\n                <div className=\"flex-row\">\n                    <input\n                        type=\"text\"\n                        onChange={this.handleSearchChange}\n                        value={this.state.search}\n                        placeholder=\"Search\"\n                    />\n                    <button onClick={this.props.togglePersonCreation} type=\"button\" className=\"button add-wide\">Add Person</button>\n                </div>\n                {!this.state.selectedPersonIndex && this.state.selectedPersonIndex != 0 && <div className=\"input-feedback align-right\">Person is required.</div>}\n                <br />\n                <ReactTable\n                    data={this.state.personList}\n                    getTrProps={(state, rowInfo) => {\n                        return {\n                            style: {\n                                background: rowInfo && rowInfo.index === this.state.selectedPersonIndex ? '#89ff89' : '',\n                                cursor: rowInfo ? 'pointer' : 'default'\n                            },\n                            onClick: () => this.selectPerson(rowInfo.index)\n                        }\n                    }}\n                    noDataText=\"No Persons Found\"\n                    columns={[\n                        {\n                            id: \"checkbox\",\n                            accessor: \"\",\n                            className: \"checkbox-column\",\n                            Cell: ({ original, index }) => {\n                                return <span className={index === this.state.selectedPersonIndex ? \"icon checkmark\" : \"\"}></span>;\n                            },\n                            sortable: false,\n                            filterable: false,\n                            width: 45\n                        },\n                        {\n                            Header: \"Name\",\n                            accessor: \"FullName\"\n                        },\n                    ]}\n                    defaultPageSize={5}\n                    className=\"-striped -highlight\"\n                />\n            </div>\n        );\n    }\n}\n\nclass PersonInformation extends React.Component {\n\n    constructor(props) {\n        super(props);\n        this.changeContact = this.changeContact.bind(this);\n        this.addContact = this.addContact.bind(this);\n        this.removeContact = this.removeContact.bind(this);\n    }\n\n    changeContact(contactIndex, key, value) {\n        let person = { ...this.props.person };\n        person.ContactInformation[contactIndex][key] = value;\n        this.props.handleContactChange(\"personData\", person);\n    }\n\n    addContact() {\n        let person = { ...this.props.person };\n        person.ContactInformation.push({\n            OwnerID: person.IdentityID,\n            IsActive: true,\n            IsPublic: true\n        });\n        this.props.handleContactChange(\"personData\", person);\n    }\n\n    removeContact(contactIndex) {\n        let person = { ...this.props.person };\n        // If it doesn't have an ID then that means it hasn't been saved yet. So remove it from the array\n        if (!person.ContactInformation[contactIndex].ContactInformationID) {\n            person.ContactInformation.splice(contactIndex, 1)\n        } else {\n            person.ContactInformation[contactIndex].IsActive = false;\n        }\n        this.props.handleContactChange(\"personData\", person);\n    }\n\n    render() {\n        const { person, contactOptions } = this.props;\n        return (\n            <div>\n                {/* if the memberid is there then a member already exists and already associated to a person */}\n                {!this.props.memberId &&\n                    <div className=\"align-right\">\n                        <button type=\"button\" className=\"button\" onClick={this.props.togglePersonCreation}>Use Existing Person</button>\n                    </div>\n                }\n                <div className=\"multi-row sixth-even no-margin\">\n                    <div>\n                        <label>Prefix</label>\n                        <input type=\"text\"\n                            placeholder=\"Prefix\"\n                            value={person.Prefix}\n                            onChange={(e) => this.props.handlePersonChange('Prefix', e.target.value)}\n                        />\n                    </div>\n                    <div>\n                        <label>First Name</label>\n                        <input type=\"text\"\n                            placeholder=\"First Name\"\n                            value={person.FirstName}\n                            onChange={(e) => this.props.handlePersonChange('FirstName', e.target.value)}\n                        />\n                    </div>\n                    <div>\n                        <label>Middle Name</label>\n                        <input type=\"text\"\n                            placeholder=\"Middle Name\"\n                            value={person.MiddleName}\n                            onChange={(e) => this.props.handlePersonChange('MiddleName', e.target.value)}\n                        />\n                    </div>\n                    <div>\n                        <label>Nickname</label>\n                        <input type=\"text\"\n                            placeholder=\"Nickname\"\n                            value={person.AlternateName}\n                            onChange={(e) => this.props.handlePersonChange('AlternateName', e.target.value)}\n                        />\n                    </div>\n                    <div>\n                        <label>Last Name</label>\n                        <input type=\"text\"\n                            placeholder=\"Last Name\"\n                            value={person.LastName}\n                            onChange={(e) => this.props.handlePersonChange('LastName', e.target.value)}\n                        />\n                    </div>\n                    <div>\n                        <label>Suffix</label>\n                        <input type=\"text\"\n                            placeholder=\"Suffix\"\n                            value={person.Suffix}\n                            onChange={(e) => this.props.handlePersonChange('Suffix', e.target.value)}\n                        />\n                    </div>\n                </div>\n                <div>\n                    {/* Do not allow the user to create a contact for a person that hasn't been created yet */}\n                    {this.props.memberId &&\n                        <ContactInformation\n                            changeContact={this.changeContact}\n                            contactOptions={contactOptions.filter(option => option.OwnerTypeID === 1)}\n                            removeContact={this.removeContact}\n                            addContact={this.addContact}\n                            contactList={person.ContactInformation || []}\n                        />\n                    }\n                </div>\n            </div>);\n    }\n}\n\nclass MemberInformation extends React.Component {\n\n    constructor(props) {\n        super(props);\n        this.changeContact = this.changeContact.bind(this);\n        this.addContact = this.addContact.bind(this);\n        this.removeContact = this.removeContact.bind(this);\n    }\n\n    changeContact(contactIndex, key, value) {\n        let member = { ...this.props.member };\n        member.ContactInformation[contactIndex][key] = value;\n        this.props.handleContactChange(\"memberData\", member);\n    }\n\n    addContact() {\n        let member = { ...this.props.member };\n        member.ContactInformation.push({\n            OwnerID: member.MemberID,\n            IsActive: true,\n            IsPublic: true\n        });\n        this.props.handleContactChange(\"memberData\", member);\n    }\n\n    removeContact(contactIndex) {\n        let member = { ...this.props.member };\n        // If it doesn't have an ID then that means it hasn't been saved yet. So remove it from the array\n        if (!member.ContactInformation[contactIndex].ContactInformationID) {\n            member.ContactInformation.splice(contactIndex, 1)\n        } else {\n            member.ContactInformation[contactIndex].IsActive = false;\n        }\n        this.props.handleContactChange(\"memberData\", member);\n    }\n\n    render() {\n        const { member, chamberOptions, districtOptions, statusOptions, partyOptions, contactOptions, invalidGabEmail, invalidGabPhone, memberNumberError } = this.props;\n        return (\n            <div>\n                <div className=\"multi-row sixth-even no-margin\">\n                    <div>\n                        <label>Member Display Name</label>\n                        <i data-tip={`Member display name is how the member's name appears on the primary member listing page and the patronage section of a bill's detail and bill limits page.\\nThe member display name is updated automatically when the name fields above are modified, but can be overridden here.`} className=\"icon notification member-form\" />\n                        <ReactTooltip key={new Date()} />\n                        <input type=\"text\"\n                            placeholder=\"Member Display Name\"\n                            value={member.MemberDisplayName}\n                            onChange={(e) => this.props.handleMemberChange('MemberDisplayName', e.target.value)}\n                            style={member.markOverride ? { color: \"red\" } : {}} />\n                    </div>\n                    <div>\n                        <label>Member Patron Name</label>\n                        <i data-tip={`Patron display name is how the member's last name is shown on the bill versions, calendar, communication, docket, etc.\\nThe patron display name is set when the member is saved unless the value has been overridden here.`} className=\"icon notification member-form\" />\n                        <ReactTooltip key={new Date()} />\n                        <input type=\"text\"\n                            placeholder=\"Member Patron Name\"\n                            value={member.PatronDisplayName}\n                            onChange={(e) => this.props.handleMemberChange('PatronDisplayName', e.target.value)}\n                            style={member.markOverride ? { color: \"red\" } : {}}\n                        />\n                    </div>\n                    <div>\n                        <label>List Display Name</label>\n                        <i data-tip={`List display name is how the member's name appears on BDS/eFile, member and watchlist notification searching, and how my legislator voted.\\nThe list display name is updated automatically when the name fields are modified, but can be overridden here.`} className=\"icon notification member-form\" />\n                        <ReactTooltip key={new Date()} />\n                        <input type=\"text\"\n                            placeholder=\"List Display Name\"\n                            value={member.ListDisplayName}\n                            onChange={(e) => this.props.handleMemberChange('ListDisplayName', e.target.value)}\n                            style={member.markOverride ? { color: \"red\" } : {}}\n                        />\n                    </div>\n                    <div>\n                        <label>Member Number</label>\n                        <input type=\"text\"\n                            placeholder=\"Member Number\"\n                            value={member.MemberNumber}\n                            onChange={(e) => this.props.handleMemberChange('MemberNumber', e.target.value)}\n                        />\n                        {!member.MemberNumber && <div className=\"input-feedback\">Member Number is required.</div>}\n                        {memberNumberError && <div className=\"input-feedback\">Member Number is already in use.</div>}\n                    </div>\n                    <div />\n                </div>\n                <div className=\"multi-row sixth-even no-margin\">\n                    <div>\n                        <label>Party Code</label>\n                        <Select\n                            styles={customStyles}\n                            value={partyOptions.find(option => option.value === member.PartyCode)}\n                            key={member.PartyCode}\n                            options={partyOptions}\n                            onChange={(val) => this.props.handleMemberChange('PartyCode', val.value)}\n                        />\n                        {!member.PartyCode && <div className=\"input-feedback\">Party Code is required.</div>}\n                    </div>\n                    <div>\n                        <label>District</label>\n                        <Select\n                            styles={customStyles}\n                            value={districtOptions.find(option => option.value === member.DistrictID && option.ChamberCode === member.ChamberCode)}\n                            key={member.DistrictID}\n                            isDisabled={!member.ChamberCode}\n                            options={districtOptions.filter(option => option.ChamberCode === member.ChamberCode)}\n                            onChange={(val) => this.props.handleMemberChange('DistrictID', val.value)}\n                        />\n                        {!member.DistrictID && <div className=\"input-feedback\">District is required.</div>}\n                    </div>\n                    <div>\n                        <label>Voting Sequence</label>\n                        <input type=\"number\"\n                            placeholder=\"Voting Sequence\"\n                            value={member.VotingSequence}\n                            onChange={(e) => this.props.handleMemberChange('VotingSequence', e.target.value)}\n                        />\n                    </div>\n                    <div>\n                        <label>Seat Number</label>\n                        <input type=\"number\"\n                            placeholder=\"Seat Number\"\n                            value={member.SeatNumber}\n                            onChange={(e) => this.props.handleMemberChange('SeatNumber', e.target.value)}\n                        />\n                    </div>\n                    <div>\n                        <label>Status</label>\n                        <Select\n                            styles={customStyles}\n                            options={statusOptions}\n                            key={member.MemberStatusID}\n                            value={statusOptions.find(option => option.value === member.MemberStatusID)}\n                            onChange={(val) => this.props.handleMemberChange('MemberStatusID', val.value)}\n                        />\n                    </div>\n                    <div>\n                        <label htmlFor=\"is-public-button\" className=\"checkbox-label no-background\" style={{ paddingLeft: '0px' }}>Is Public?</label>\n                        <div className=\"toggle-switch\" onClick={() => this.props.handleMemberChange('IsPublic', !member.IsPublic)}>\n                            <input id=\"is-public-button\" checked={member.IsPublic} type=\"checkbox\" style={{ width: 'inherit' }} />\n                            <span className=\"slider\"></span>\n                        </div>\n                    </div>\n                </div>\n                <div className=\"multi-row sixth-even no-margin\">\n                    <div>\n                        <label>Service Start Date</label>\n                        <DatePicker\n                            selected={member.ServiceBeginDate ? moment(member.ServiceBeginDate) : null}\n                            key={member.ServiceBeginDate}\n                            onChange={(val) => this.props.handleMemberChange('ServiceBeginDate', val)}\n                            isClearable\n                        />\n                    </div>\n                    <div>\n                        <label>Service End Date</label>\n                        <DatePicker\n                            selected={member.ServiceEndDate ? moment(member.ServiceEndDate) : null}\n                            key={member.ServiceEndDate}\n                            onChange={(val) => this.props.handleMemberChange('ServiceEndDate', val)}\n                            isClearable\n                        />\n                    </div>\n                    <div>\n                        <label>Service End Reason</label>\n                        <input\n                            type=\"text\"\n                            placeholder=\"Ex. Retired\"\n                            value={member.ServiceEndReason}\n                            onChange={(e) => this.props.handleMemberChange('ServiceEndReason', e.target.value)}\n                            disabled={!member.ServiceEndDate}\n                        />\n                    </div>\n                    <div>\n                        <label>GAB Email Address</label>\n                        <input type=\"text\"\n                            placeholder=\"GAB Email Address\"\n                            value={member.GABEmailAddress}\n                            onChange={(e) => this.props.handleMemberChange('GABEmailAddress', e.target.value)}\n                        />\n                    </div>\n                    <div>\n                        <label>GAB Phone Number</label>\n                        <input type=\"text\"\n                            placeholder=\"GAB Phone Number\"\n                            value={member.GABPhoneNumber}\n                            onChange={(e) => this.props.handleMemberChange('GABPhoneNumber', e.target.value)}\n                        />\n                    </div>\n                    <div>\n                        <label>Room Number</label>\n                        <input type=\"text\"\n                            placeholder=\"Room Number\"\n                            value={member.RoomNumber}\n                            onChange={(e) => this.props.handleMemberChange('RoomNumber', e.target.value)}\n                        />\n                    </div>\n                </div>\n                <div>\n                    {/* Do not allow the user to create a contact for a member that hasn't been created yet */}\n                    {this.props.memberId &&\n                        <ContactInformation\n                            changeContact={this.changeContact}\n                            contactOptions={contactOptions.filter(option => option.OwnerTypeID === 3)}\n                            removeContact={this.removeContact}\n                            addContact={this.addContact}\n                            contactList={member.ContactInformation || []}\n                        />\n                    }\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { nav, users, members, session } = state;\n        return {\n            nav,\n            users,\n            members,\n            session\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, navActionCreators, userActionCreators, memberActionCreators, sessionActionCreators), dispatch)\n        }\n    }\n)(MemberManagementForm)\n\n\n\n\n\n\n\n\n","import React from 'react';\nimport { Route } from 'react-router';\nimport MemberManagementGrid from './lis-member-grid';\nimport MemberManagementForm from './lis-member-form';\n\nconst CreateMember = props => <div><h1>Create Member</h1><MemberManagementForm history={props.history} sessionCode={props.match.params.sessionCode} /></div>;\nconst EditMember = props => <div><h1>Edit Member</h1><MemberManagementForm history={props.history} sessionCode={props.match.params.sessionCode} memberId={props.match.params.memberid} /></div>;\n\nclass MemberManagement extends React.Component {\n\n    render() {\n        return (\n            <div>\n                <Route exact path={this.props.match.path} component={MemberManagementGrid} />\n                <Route path={`${this.props.match.path}/:sessionCode/create-member`} component={CreateMember} />\n                <Route path={`${this.props.match.path}/:sessionCode/edit-member/:memberid`} component={EditMember} />\n            </div>\n        )\n    }\n}\n\nexport default MemberManagement;","import React from \"react\";\nimport ReactTable from \"react-table\";\nimport { Link } from 'react-router-dom';\nimport '../../../stylesheets/shared/react-table.css';\nimport moment from 'moment-timezone';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { cancelRequest } from '../../../services/request.service';\n\nfunction isEmpty(obj) {\n    for (var key in obj) {\n        if (obj.hasOwnProperty(key))\n            return false;\n    }\n    return true;\n}\n\nclass SessionGridComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            defaultSession: '',\n            error: null,\n            isLoaded: false,\n            data: [],            \n            filtered: [{ id: 'all', value: 'true' }],\n            currentYear: (new Date()).getFullYear(),\n            isCurrentBiennium: true,\n            filterAll: 'true',            \n        };        \n        this.filterAll = this.filterAll.bind(this);\n        this.getSessionList = this.getSessionList.bind(this);\n    }\n\n    //When component has mounted, make the call to the list users API\n    componentDidMount() {\n        this.getSessionList();\n    }\n\n    onFilteredChange(filtered) {\n        if (filtered.length > 1 && this.state.filterAll.length) {\n            // NOTE: this removes any FILTER ALL filter\n            const filterAll = '';\n            this.setState({ filtered: filtered.filter((item) => item.id !== 'all'), filterAll })\n        }\n        else\n            this.setState({ filtered });\n    }\n\n    getSessionList() {\n        this.props.actions.getSessionList().then(() => {\n            const defaultSession = this.props.session.sessionList.find(session => session.IsDefault === true)\n            this.setState({\n                data: this.props.session.sessionList,\n                isLoaded: true,\n                defaultSession: defaultSession ? defaultSession.SessionYear + ' ' + defaultSession.DisplayName : \"\"\n            })\n        })\n    }\n\n    getTrProps = (state, rowInfo, instance) => {\n        if (rowInfo) {\n            return {\n                style: {\n                    background: rowInfo.original.IsDefault ? 'rgb(202, 225, 241)' : null,\n                }\n            }\n        }\n        return true;\n    }\n\n\n    filterAll(e) {\n        const { value } = e.target;\n        const filterAll = value;\n        const filtered = [{ id: 'all', value: filterAll }];\n        // NOTE: this completely clears any COLUMN filters\n        this.setState({ filterAll, filtered });\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { defaultSession } = this.state;\n        return (\n            <div>\n                <div className=\"header-half\">\n                    <h1>Session Management</h1>\n                    <p>Default Display Session: <span> {defaultSession}</span></p>\n                </div>\n\n                <div className=\"toolbar session-toolbar\">\n                    <div className=\"dlas-forms\">\n                        <select value={this.state.filterAll} onChange={this.filterAll}>\n                            <option value=\"true\">Current Biennium</option>\n                            <option value=\"false\">All Sessions</option>\n                        </select> \n                    </div>\n                    <div>\n                        <Link to=\"/session-management/edit-session\" className=\"button add-wide\">New Session</Link>\n                    </div>\n                </div>\n                <ReactTable\n                    filtered={this.state.filtered}\n                    resizable={false}\n                    loading={!this.state.isLoaded}\n                    defaultFilterMethod={(filter, row) => {\n                        if (filter.value === \"false\") {\n                            return true;\n                        }\n                        if (filter.value === \"true\") {\n                            return row.SessionYear === this.state.currentYear || row.SessionYear === this.state.currentYear - 1;\n                        }\n                    }}\n                    data={this.state.data}\n                    ref={r => this.reactTable = r}\n                    onFilteredChange={this.onFilteredChange.bind(this)}\n                    SubComponent={row => {\n                        return (\n                            <div className={row.original.IsDefault ? 'selected-session' : null} style={{ padding: \"10px\" }}>\n                                <ul>\n                                    <li>{row.original.Name}</li>\n                                    <li>{row.original.Year}</li>\n                                    <li>{row.original.SessionType}</li>\n                                </ul>\n                            </div>\n                        );\n                    }}\n                    columns={[\n                        {\n                            Header: \"Year\",\n                            accessor: \"SessionYear\",\n                            id: \"yearfilter\",\n                            width: 80\n                        },\n                        {\n                            Header: \"Type\",\n                            accessor: \"SessionType\",\n                            width: 85\n                        },\n                        {\n                            Header: \"Name\",\n                            accessor: \"DisplayName\",\n                            width: 180\n                        },\n                        {\n                            Header: \"Prefile Start\",\n                            Cell: ({ original }) => {\n                                if (original.SessionEvents !== undefined) {\n                                    for (var i = 0; i < original.SessionEvents.length; i++) {\n                                        //check for Session Start event type ID\n                                        if (original.SessionEvents[i].DisplayName === \"Prefile Date\") {\n                                            return moment(original.SessionEvents[i].ActualDate).format('L')\n                                        }\n                                    }\n                                    return false;\n                                } else {\n                                    return ' '\n                                }\n                            }\n                        },\n                        {\n                            Header: \"Session Start\",\n                            Cell: ({ original }) => {\n                                const sessionStartObj = original.SessionEvents && original.SessionEvents.length && original.SessionEvents.find(date => date.DisplayName === \"Session Start\");\n                                const startDate = sessionStartObj ? moment(sessionStartObj.ActualDate) : '';\n                                return moment(startDate).format(\"MM/DD/YYYY\");\n                            }\n                        },\n                        {\n                            Header: \"Bill Cutoff\",\n                            Cell: ({ original }) => {\n                                if (original.SessionEvents !== undefined) {\n                                    for (var i = 0; i < original.SessionEvents.length; i++) {\n                                        if (original.SessionEvents[i].DisplayName === \"Bill Cutoff\") {\n                                            return moment(original.SessionEvents[i].ActualDate).format('L')\n                                        }\n                                    }\n                                    return false;\n                                } else {\n                                    return ' '\n                                }\n                            }\n                        },\n                        {\n                            Header: \"Crossover\",\n                            Cell: ({ original }) => {\n                                if (original.SessionEvents !== undefined) {\n                                    for (var i = 0; i < original.SessionEvents.length; i++) {\n                                        if (original.SessionEvents[i].DisplayName === \"Crossover\") {\n                                            return moment(original.SessionEvents[i].ActualDate).format('L')\n                                        }\n                                    }\n                                    return false;\n                                } else {\n                                    return ' '\n                                }\n                            }\n                        },\n                        {\n                            Header: \"Adjournment\",\n                            Cell: ({ original }) => {\n                                if (original.SessionEvents !== undefined) {\n                                    for (var i = 0; i < original.SessionEvents.length; i++) {\n                                        if (original.SessionEvents[i].DisplayName === \"Adjournment\") {\n                                            return moment(original.SessionEvents[i].ActualDate).format('L')\n                                        }\n                                    }\n                                    return false\n                                } else {\n                                    return ' '\n                                }\n                            }\n                        },\n                        {\n                            Header: \"Reconvene\",\n                            Cell: ({ original }) => {\n                                if (original.SessionEvents !== undefined) {\n                                    for (var i = 0; i < original.SessionEvents.length; i++) {\n                                        if (original.SessionEvents[i].DisplayName === \"Reconvene\") {\n                                            return moment(original.SessionEvents[i].ActualDate).format('L')\n                                        }\n                                    }\n                                    return false;\n                                } else {\n                                    return ' '\n                                }\n                            }\n                        },\n                        {\n                            Header: \"Action\",\n                            headerClassName: \"header-action\",\n                            accessor: \"action\",\n                            className: \"action-column\",\n                            width: 50,\n                            expander: true,\n                            Expander: ({ isExpanded, ...rest }) => {\n                                return (\n                                    <button className=\"button view\">View</button>\n                                );\n                            }\n                        },\n                        {\n                            Header: \"\",\n                            accessor: \"edit\",\n                            headerClassName: \"all-column\",\n                            width: 40,\n                            Cell: row => {\n                                return (\n                                    <Link to={`/session-management/edit-session/${row.original.SessionID}`} className=\"button edit\">Edit</Link>\n                                )\n                            }\n                        },\n                        {\n                            Header: \"All\",\n                            id: 'all',\n                            headerClassName: \"all-column\",\n                            width: 0,\n                            resizable: false,\n                            sortable: false,\n                            Filter: () => { },\n                            getProps: () => {\n                                return {\n                                    style: { padding: \"0px\"}\n                                }\n                            },\n                            filterMethod: (filter, rows) => {\n                                if (filter.value === \"false\") {\n                                    return true;\n                                }\n                                if (filter.value === \"true\") {\n                                    return rows.yearfilter === this.state.currentYear || rows.yearfilter === this.state.currentYear - 1;\n                                }\n                            }\n                        }\n                    ]}\n                    defaultSorted={[\n                        {\n                            id: \"yearfilter\",\n                            desc: true\n                        }\n                    ]}\n                    defaultPageSize={10}\n                    className=\"session-table -striped -highlight\"\n                    getTrProps={this.getTrProps}\n                />\n                <br />\n\n            </div>\n        );\n    }\n}\n\nconst SessionManagementGrid = connect(\n    (state) => {\n        const { session } = state;\n        return {\n            session\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, sessionActionCreators), dispatch)\n        }\n    }\n)(SessionGridComponent)\n\nexport default SessionManagementGrid;","import React from 'react';\nimport * as Fields from '../../../lis-shared/lis-layout/components/lis-forms-component';\nimport DatePicker from 'react-datepicker';\nimport Select from 'react-select';\nimport moment from 'moment-timezone';\nimport { Link, Prompt } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { billActionCreators } from '../../../stores/lis-legislation-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport 'react-datepicker/dist/react-datepicker.css';\nimport { cancelRequest } from '../../../services/request.service';\n\nclass SessionForm extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            sessionEvents: [],\n            sessionData: '',\n            selectedSessionType: '',\n            selectedSessionEventType: '',\n            sessionEventData: [],\n            isSaving: false,\n            isDirty: false\n        };\n\n        this.handleInputChange = this.handleInputChange.bind(this);\n        this.handleEventChange = this.handleEventChange.bind(this);\n        this.handleSessionEventTypeChange = this.handleSessionEventTypeChange.bind(this);\n        this.handleCopyContinuedChange = this.handleCopyContinuedChange.bind(this);\n        this.addSessionDate = this.addSessionDate.bind(this);\n        this.saveForm = this.saveForm.bind(this);\n    }\n\n    handleInputChange(value, key) {\n        let sessionData = { ...this.state.sessionData };\n        if (key === 'SessionCode') {\n            //we allow for more than just single-digit special session # (e.g. Special Session V) despite the fact that this will never (say never) happen\n            value = value.replace(/[^0-9]/, \"\").substr(0, 6);\n            const sessionCodeSuffix = value && value.length >= 5 ? value.substr(4) : null;\n            if (sessionCodeSuffix) {\n                sessionData['SessionYear'] = value.substr(0, 4);\n                sessionData['SessionType'] = sessionCodeSuffix === '1' ? 'Regular' : 'Special';\n                sessionData['DisplayName'] = sessionData['SessionType'] + ' Session';\n                if (sessionData['SessionType'] === 'Special') {\n                    sessionData['DisplayName'] += ' ' + this.romanize(Number(sessionCodeSuffix) - 1);\n                }\n                const sessionTypeData = Fields.sessionTypeOptions.find(type => type.label === sessionData['SessionType']);\n                sessionData['SessionTypeID'] = sessionTypeData ? sessionTypeData.value : null; //null will fail but I think it's better than guessing\n            } else {\n                sessionData['DisplayName'] = null;\n                sessionData['SessionYear'] = null;\n                sessionData['SessionType'] = null;\n                sessionData['SessionTypeID'] = null;\n            }\n        }\n        sessionData[key] = value;\n        this.setState({\n            sessionData: sessionData,\n            isDirty: true\n        });\n    }\n\n    romanize(num) {\n        if (isNaN(num))\n            return NaN;\n        var digits = String(+num).split(\"\"),\n            key = [\"\", \"C\", \"CC\", \"CCC\", \"CD\", \"D\", \"DC\", \"DCC\", \"DCCC\", \"CM\",\n                \"\", \"X\", \"XX\", \"XXX\", \"XL\", \"L\", \"LX\", \"LXX\", \"LXXX\", \"XC\",\n                \"\", \"I\", \"II\", \"III\", \"IV\", \"V\", \"VI\", \"VII\", \"VIII\", \"IX\"],\n            roman = \"\",\n            i = 3;\n        while (i--)\n            roman = (key[+digits.pop() + (i * 10)] || \"\") + roman;\n        return Array(+digits.join(\"\") + 1).join(\"M\") + roman;\n    }\n\n    handleEventChange(value, index) {\n        let sessionEventData = [...this.state.sessionEventData];\n        if (value) {\n            sessionEventData[index].ActualDate = value;\n        } else {\n            // If the user clicks the 'X' button on a date then remove it from the session event list\n            sessionEventData.splice(index, 1);\n        }\n        this.setState({\n            sessionEventData: sessionEventData\n        });\n    }\n\n    handleSessionEventTypeChange(value) {\n        this.setState({\n            selectedSessionEventType: value\n        });\n    }\n\n    handleCopyContinuedChange(value) {\n        this.setState({\n            copyContinuedLegislation: value,\n            isDirty: true\n        })\n    }\n\n    addSessionDate() {\n        if (this.state.selectedSessionEventType) {\n            // Set the correct values for the new event date\n            let selectedSessionEventType = { ...this.state.selectedSessionEventType };\n            selectedSessionEventType.DisplayName = selectedSessionEventType.Name;\n            selectedSessionEventType.ActualDate = moment();\n            // Add it to the session events \n            let sessionEventData = [...this.state.sessionEventData];\n            sessionEventData.push(selectedSessionEventType);\n            this.setState({\n                sessionEventData: sessionEventData,\n                selectedSessionEventType: '',\n                isDirty: true\n            });\n        }\n\n    }\n\n    saveForm() {\n        let sessionData = this.state.sessionData;\n        let sessionEventData = this.state.sessionEventData;\n        let startDate = sessionEventData.find(date => date.DisplayName === \"Session Start\");\n        let prefileDate = sessionEventData.find(date => date.DisplayName === \"Prefile Date\");\n        let prefileDueDate = sessionEventData.find(date => date.DisplayName === \"Prefile Draft Due\");\n        // Lets do some validation\n        let error = false;\n        if (!sessionData.SessionCode || sessionData.SessionCode.length < 5) {\n            this.setState({ codeError: true });\n            error = true;\n        }\n        if (!startDate || !startDate.ActualDate) {\n            this.setState({ startDateError: true });\n            error = true;\n        } else if (!prefileDate || !prefileDate.ActualDate) {\n            this.setState({ prefileDateError: true });\n            error = true;\n        } else if (sessionData.SessionType === \"Regular\" && (!prefileDueDate || !prefileDueDate.ActualDate)) {\n            this.setState({ prefileDueDateError: true });\n            error = true;\n        }\n        if (!sessionData.DisplayName) {\n            this.setState({ displayNameError: true });\n            error = true;\n        }\n        if (!error) {\n            if ((!this.props.match.params.id || Number(this.state.initialSessionCode) !== Number(sessionData.SessionCode)) && this.state.sessionList.find(session => Number(session.SessionCode) === Number(sessionData.SessionCode))) {\n                this.props.actions.makeToast([{ message: \"Session Code Already In Use\", type: \"failure\" }]);\n                return;\n            }\n            this.setState({\n                isSaving: true\n            });\n            sessionData.SessionEvents = sessionEventData;\n            sessionData.CopyContinuedLegislation = this.state.copyContinuedLegislation ? this.state.copyContinuedLegislation.value : false;\n            let action = '';\n            if (this.props.match.params.id) {\n                action = this.props.actions.editSession(sessionData);\n            } else {\n                action = this.props.actions.createSession(sessionData);\n            }\n            action\n                .then(() => {\n                    this.setState({\n                        isSaving: false,\n                        isDirty: false\n                    }, () => {\n                        this.props.history.push('/session-management');\n                        this.props.actions.makeToast([{ message: \"Session Saved\", type: \"success\" }]);\n                        this.props.actions.reloadSessionSelector(true);\n                    })\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n                    this.setState({\n                        isSaving: false,\n                    });\n                });\n        }\n    }\n\n    componentDidMount() {\n        //Get the session events\n        this.props.actions.getSessionEventTypes()\n            .then(() => {\n                let sessionEventTypes = [...this.props.session.sessionEventTypes];\n                sessionEventTypes.forEach(event => {\n                    event.label = event.Name;\n                    event.value = event.EventTypeID;\n                })\n                this.setState({\n                    sessionEvents: sessionEventTypes,\n                    sessionEventsIsLoaded: true\n                });\n            });\n        this.props.actions.getSessionList()\n            .then(() => {\n                const sessionList = [...this.props.session.sessionList];\n                this.setState({ sessionList, sessionsAreLoaded: true })\n            })\n        if (this.props.match.params.id) {\n            // This is an existing session. Go ahead and get the data\n            this.props.actions.getSessionById(this.props.match.params.id, true)\n                .then(() => {\n                    const selectedSession = this.props.session.selectedSession\n                    const selectedSessionType = Fields.sessionTypeOptions.find(type => type.value == selectedSession.SessionTypeID);\n                    this.setState({\n                        sessionData: selectedSession,\n                        initialSessionCode: selectedSession.SessionCode,\n                        selectedSessionType: selectedSessionType || '',\n                        sessionEventData: selectedSession.SessionEvents || [],\n                        isLoaded: true\n                    });\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.setState({\n                        isLoaded: true,\n                        message: err.toString()\n                    });\n                })\n            //if session already has bills, do not allow session code change\n            this.props.actions.getSessionBills('?sessionID= ' + this.props.match.params.id)\n                .then(() => {\n                    if (this.props.bills.sessionBills && this.props.bills.sessionBills.length > 0) {\n                        this.setState({ sessionHasBills: true })\n                    }\n                    this.setState({ sessionBillsAreLoaded: true })\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.setState({\n                        sessionBillsAreLoaded: true,\n                        sessionHasBills: true //default to not allowing them to change the session code if the request fails..\n                    });\n                })\n        } else {\n            this.setState({\n                isLoaded: true,\n                sessionBillsAreLoaded: true\n            });\n        }\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { sessionData, sessionEventData, sessionEvents, selectedSessionEventType, selectedSessionType, copyContinuedLegislation } = this.state;\n        if (this.state.message) {\n            <div className=\"fail\">{this.state.message}</div>\n        }\n        const customStyles = {\n            option: (base, state) => ({\n                ...base,\n                fontSize: '0.8em',\n            }),\n            control: (base) => ({\n                ...base,\n                padding: '1px',\n                margin: 0,\n                minHeight: 0,\n                fontSize: '0.8em',\n            }),\n            singleValue: (base, state) => {\n                return { ...base, };\n            }\n        }\n        //Filter out the events that have already been added to the session\n        const filteredSessionEvents = sessionEvents.filter(event => {\n            if (sessionEventData.findIndex(eventData => eventData.EventTypeID === event.EventTypeID) < 0) {\n                return event;\n            }\n        });\n        if (this.state.isLoaded && this.state.sessionEventsIsLoaded && this.state.sessionsAreLoaded && this.state.sessionBillsAreLoaded) {\n            return (\n                <div className=\"user-forms\">\n                    <div>\n                        <Prompt\n                            when={this.state.isDirty}\n                            message={`You have unsaved changes. Are you sure you would like to leave?`}\n                        />\n                    </div>\n                    <div className=\"dlas-forms\">\n                        <form>\n                            <legend>\n                                <span>Session Setup</span>\n                                {sessionData.SessionYear && sessionData.DisplayName &&\n                                    <span style={{ float: 'right' }}>{sessionData.SessionYear + \" \" + sessionData.DisplayName}</span>\n                                }\n                            </legend>\n                            <div className=\"multi-row fifth-even no-margin\">\n                                <div>\n                                    <label className=\"label\" htmlFor=\"session-code\">Session Code</label>\n                                    <input\n                                        id=\"session-code\"\n                                        className={this.state.codeError && (!sessionData.SessionCode || sessionData.SessionCode.length < 5) ? 'input-error' : ''}\n                                        type=\"text\"\n                                        placeholder=\"Session Code\"\n                                        disabled={this.state.sessionHasBills}\n                                        value={sessionData.SessionCode || ''}\n                                        onChange={(e) => this.handleInputChange(e.target.value, 'SessionCode')}\n                                    />\n                                </div>\n\n                                {sessionEventData.map((event, eventIndex) =>\n                                    <div key={eventIndex}>\n                                        <label className=\"label\">{event.DisplayName}</label>\n                                        <DatePicker\n                                            selected={event.ActualDate ? moment(event.ActualDate) : null}\n                                            isClearable\n                                            onChange={(value) => {\n                                                this.handleEventChange(moment(value), eventIndex)\n                                            }}\n                                        />\n                                    </div>\n\n                                )}\n                            </div>\n                            <div className=\"multi-row fifth-even no-margin\">\n                                <div>\n                                    {filteredSessionEvents.length > 0 &&\n                                        <div>\n                                            <label>Add Session Date</label>\n                                            <Select\n                                                styles={customStyles}\n                                                className={(this.state.startDateError && !sessionEventData.find(date => date.DisplayName === \"Session Start\")) || (this.state.prefileDateError && !sessionEventData.find(it => it.DisplayName === \"Prefile Date\")) || (sessionData.SessionType === \"Regular\" && this.state.prefileDueDateError && !sessionEventData.find(it => it.DisplayName === \"Prefile Draft Due\")) ? 'input-error' : ''}\n                                                id=\"SessionDateTypeSelector\"\n                                                value={selectedSessionEventType}\n                                                options={filteredSessionEvents}\n                                                onChange={this.handleSessionEventTypeChange}\n                                            />\n                                            {this.state.startDateError && !sessionEventData.find(date => date.DisplayName === \"Session Start\") &&\n                                                <span className=\"input-feedback\">Please select a Session Start Date</span>\n                                            }\n                                            {this.state.prefileDateError && !sessionEventData.find(it => it.DisplayName === \"Prefile Date\") &&\n                                                <span className=\"input-feedback\">Please select a Session Prefile Date</span>\n                                            }\n                                            {sessionData.SessionType === \"Regular\" && this.state.prefileDueDateError && !sessionEventData.find(it => it.DisplayName === \"Prefile Draft Due\") &&\n                                                <span className=\"input-feedback\">Please select a Session Prefile Due Date</span>\n                                            }\n                                        </div>\n                                    }\n                                </div>\n                                <div>\n                                    {filteredSessionEvents.length > 0 &&\n                                        <div>\n                                            <br />\n                                            <button\n                                                disabled={!selectedSessionEventType}\n                                                className=\"button\"\n                                                type=\"button\"\n                                                onClick={this.addSessionDate}>\n                                                Add</button>\n                                        </div>\n                                    }\n                                </div>\n                                <div>\n                                    <label htmlFor=\"is-active-button\" className=\"checkbox-label no-background\" style={{ paddingLeft: '0px' }}>Session Active</label>\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange(!sessionData.IsActive, 'IsActive')}>\n                                        <input id=\"is-active-button\" checked={sessionData.IsActive} type=\"checkbox\" />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                </div>\n                                <div>\n                                    <label htmlFor=\"is-default-button\" className=\"checkbox-label no-background\" style={{ paddingLeft: '0px' }}>Default Display Session</label>\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange(!sessionData.IsDefault, 'IsDefault')}>\n                                        <input id=\"is-default-button\" checked={sessionData.IsDefault} type=\"checkbox\" />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                </div>\n                                <div>\n                                    <label htmlFor=\"CopyContinuedLegislation\">Copy Continued Bills</label>\n                                    <Select\n                                        styles={customStyles}\n                                        id=\"CopyContinuedLegislation\"\n                                        value={copyContinuedLegislation}\n                                        options={[\n                                            { label: \"Select...\", value: false },\n                                            { label: \"Yes\", value: true },\n                                        ]}\n                                        onChange={this.handleCopyContinuedChange}\n                                    />\n                                </div>\n                            </div>\n                            <div className=\"button-bar\">\n                                <div>\n                                </div>\n                                <div className=\"align-right\">\n                                    <Link to=\"/session-management\" className=\"button secondary\">Cancel</Link>\n                                    <button className=\"button\" type=\"button\" disabled={this.state.isSaving} onClick={this.saveForm}>Save</button>\n                                </div>\n                            </div>\n                        </form>\n                    </div>\n                </div>\n            );\n        } else {\n            return (<div className=\"center-spinner spinner\">Loading...</div>)\n        }\n    }\n};\n\nexport default connect(\n    (state) => {\n        const { session, nav, bills } = state;\n        return {\n            nav,\n            session,\n            bills\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, billActionCreators, sessionActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(SessionForm)","import React from 'react';\nimport { Route } from 'react-router';\nimport SessionManagementGrid from './lis-session-grid';\nimport SessionManagementForm from './lis-session-form';\n\n\nclass SessionManagement extends React.Component {\n\n    render() {       \n\n        return (\n            <div>\n                <Route exact path={this.props.match.path} component={SessionManagementGrid} />\n                <Route exact path={`${this.props.match.path}/edit-session`} component={SessionManagementForm} />\n                <Route exact path={`${this.props.match.path}/edit-session/:id`} component={SessionManagementForm} />\n            </div>\n        )\n    }\n}\n\nexport default SessionManagement;","import React from \"react\";\nimport ReactTable from \"react-table\";\nimport { Link } from 'react-router-dom';\nimport '../../../stylesheets/shared/react-table.css';\nimport moment from 'moment-timezone';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { cancelRequest } from '../../../services/request.service';\n\nclass CommitteeGridComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            showCreateSuccess: false,\n            showCreateFailure: false,\n            isSubcommittee: false,\n            error: null,\n            isLoaded: false,\n            disableChamberSelector: false,\n            selectedError: null,\n            filtered: [],\n            currentDate: new Date(),\n            filterChamber: '',\n            filterAll: '',\n            filterName: '',\n            committeeNameInput: '',\n            committeeNumberInput: '',\n            chamberOptions: [\n                { label: 'House', value: 'H' },\n                { label: 'Senate', value: 'S' }\n            ]\n        };\n\n        this.filterAll = this.filterAll.bind(this);\n        this.committeeNameChange = this.committeeNameChange.bind(this);\n        this.committeeNumberChange = this.committeeNumberChange.bind(this);\n        this.filterChamber = this.filterChamber.bind(this);\n        this.sendCreateDetails = this.sendCreateDetails.bind(this);\n    };\n\n    getCommittees() {\n        var params = \"PendingChange=\" + true;\n        this.props.actions.getPartnerCommittees(params).then(() => {\n            //Get rid of the tables loading screen because the data is loaded\n            this.setState({\n                isLoaded: true\n            })\n            //set the default chamber to house or senate depending on the user's role\n            let filterChamber = '';\n            let disableChamberSelector = false;\n            const scopes = this.props.login.userClaims.scopes;\n            const houseScope = scopes.find(scope => scope === \"House\");\n            const senateScope = scopes.find(scope => scope === \"Senate\");\n            //Checks to see if the user doesn't have both roles (like if they weren't admin). If they have both roles then leave the preselected chamber as all\n            if ((houseScope && !senateScope) || (!houseScope && senateScope)) {\n                //Find which role the user has\n                const scope = scopes.find(scope => scope === \"House\" || scope === \"Senate\");\n                filterChamber = this.state.chamberOptions.find(chamber => chamber.label === scope).value;\n                disableChamberSelector = true;\n            } else {\n                filterChamber = this.props.committee.committeeChamber;\n            }\n            this.setState({\n                filterChamber: filterChamber,\n                disableChamberSelector: disableChamberSelector\n            });\n        });\n    }\n\n    sendCreateDetails() {\n        var newCommittee = {\n            Name: this.state.committeeNameInput,\n            CommitteeNumber: this.state.committeeNumberInput,\n            ChamberCode: this.state.filterChamber,\n            IsPublic: 0\n        }\n        this.props.actions.createNewCommittee(newCommittee).then(() => {\n            this.setState({\n                showCreateSuccess: true,\n                showCreateFailure: false\n            });\n            setTimeout(function () {\n                this.setState({\n                    showCreateSuccess: false,\n                    showCreateFailure: false\n                });\n            }.bind(this), 5000);\n            this.getCommittees()\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            this.setState({\n                showCreateSuccess: false,\n                showCreateFailure: true\n            })\n            setTimeout(function () {\n                this.setState({\n                    showCreateSuccess: false,\n                    showCreateFailure: false\n                });\n            }.bind(this), 5000);\n            this.getCommittees()\n        })\n    }\n\n    onFilteredChange(filtered) {\n        if (filtered.length > 1 && this.state.filterAll.length) {\n            // NOTE: this removes any FILTER ALL filter\n            const filterAll = '';\n            this.setState({ filtered: filtered.filter((item) => item.id !== 'all'), filterAll })\n        }\n        else\n            this.setState({ filtered });\n    }\n\n    committeeNameChange(e) {\n        const { value } = e.target;\n        const committeeName = value;\n        // NOTE: this completely clears any COLUMN filters\n        this.setState({ committeeNameInput: committeeName });\n    }\n\n    committeeNumberChange(e) {\n        const { value } = e.target;\n        const committeeNumber = value;\n        // NOTE: this completely clears any COLUMN filters\n        this.setState({ committeeNumberInput: committeeNumber });\n    }\n\n    componentDidMount() {\n        this.getCommittees()\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    filterAll(e) {\n        const { value } = e.target;\n        const filterAll = value;\n        const filtered = [{ id: 'all', value: filterAll }];\n        // NOTE: this completely clears any COLUMN filters\n        this.setState({ filterAll, filtered });\n    }\n\n    filterChamber(e) {\n        const { value } = e.target;\n        const filterChamber = value;\n        this.setState({ filterChamber }, () => {\n            this.props.actions.toggleChamber(filterChamber);\n        });\n    }\n\n    render() {\n        const { committee } = this.props;\n        //Filter the table if the user has selected a chamber\n        const tableData = this.state.filterChamber ?\n            this.props.committee.partnerCommittees.filter(committee => committee.ChamberCode === this.state.filterChamber)\n            :\n            this.props.committee.partnerCommittees;\n        return (\n            <div>\n                <div className=\"header-half\">\n                    <h1>Committee Management</h1>\n                </div>\n                <div className=\"toolbar committee-bar\">\n                    <div className=\"dlas-forms\">\n                        {this.props.login.userClaims.claims.find(x => x.RoleName === \"Admin\") &&\n                            <div>\n                                <label>Chamber</label>\n                                <select value={this.state.filterChamber} onChange={this.filterChamber} disabled={this.state.disableChamberSelector}>\n                                    <option value=\"\">All</option>\n                                    <option value=\"S\">Senate</option>\n                                    <option value=\"H\">House</option>\n                                </select>\n                            </div>\n                        }\n                        <div>\n                            <label>Committee Name</label>\n                            <input value={this.state.filterAll} onChange={this.filterAll} />\n                        </div>\n                    </div>\n                </div>\n                {committee.partnerCommitteesError &&\n                    <p className=\"small-text message-error\">{committee.partnerCommitteesError}</p>\n                }\n                {committee.createCommitteeMessage &&\n                    <p className=\"small-text message-error\">{committee.createCommitteeMessage}</p>\n                }\n                <ReactTable\n                    filtered={this.state.filtered}\n                    resizable={false}\n                    defaultFilterMethod={(filter, row) =>\n                        String(row[filter.id]) === filter.value}\n                    defaultSorted={[\n                        {\n                            id: \"Name\"\n                        }\n                    ]}\n                    data={tableData}\n                    noDataText={committee.committeePartnerListError}\n                    loading={!this.state.isLoaded}\n                    ref={r => this.reactTable = r}\n                    onFilteredChange={this.onFilteredChange.bind(this)}\n                    columns={[\n                        {\n                            Header: \"Committee Name\",\n                            columns: [\n                                {\n                                    Header: (\n                                        <div className=\"dlas-forms\">\n                                            {!this.state.showCreateSuccess && !this.state.showCreateFailure &&\n                                                <div className=\"committee-grid-header-inputs\">\n                                                    <input id=\"insert-new-committee\" type=\"text\" value={this.state.committeeNameInput} placeholder=\"Type new committee name and committee number, click create\" onChange={this.committeeNameChange} disabled={this.state.isSubcommittee} />\n                                                    <input id=\"insert-new-committee-number\" type=\"text\" value={this.state.committeeNumberInput} placeholder=\"Committee number\" onChange={this.committeeNumberChange} />\n                                                </div>\n                                            }\n                                            {this.state.showCreateSuccess &&\n                                                <span className=\"insert-message\">Committee was created successfully!</span>\n                                            }\n                                            {this.state.showCreateFailure &&\n                                                <span className=\"insert-message fail\">Committee creation failed</span>\n                                            }\n                                        </div>\n                                    ),\n                                    headerClassName: \"header-insert\",\n                                    accessor: \"Name\",\n                                    sortable: false,\n                                    filterAll: true,\n                                    Cell: row => {\n                                        return (\n                                            <span id={'cm-namecell-' + row.index}>{row.original.Name}</span>\n                                        )\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            Header: \"Service Start Date\",\n                            columns: [\n                                {\n                                    headerClassName: \"header-insert\",\n                                    accessor: \"PendingChange\",\n                                    sortable: false,\n                                    filterAll: true,\n                                    width: 150,\n                                    Cell: row => {\n                                        if (row.original.ServiceBeginDate === '0001-01-01T00:00:00') {\n                                            return <span className=\"txt-greyed\" id={'cm-pending-' + row.index}>Pending</span>\n                                        }\n                                        else {\n                                            return <span id={'cm-pending-' + row.index}>{row.original.ServiceBeginDate ? moment(row.original.ServiceBeginDate).format('L') : ''}</span>\n                                        }\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            Header: \"Actions\",\n                            headerClassName: \"submit-action\",\n                            columns: [\n\n                                {\n                                    Header: (<span><button id=\"submit-new-committee\" onClick={this.sendCreateDetails} disabled={!this.state.filterChamber || !this.state.committeeNameInput || !this.state.committeeNumberInput} className=\"button\">Create</button></span>),\n                                    headerClassName: \"header-action\",\n                                    accessor: \"action\",\n                                    sortable: false,\n                                    className: \"action-column\",\n                                    width: 120,\n                                    Cell: row => {\n                                        return (\n                                            <div className=\"committee-action-column\">\n                                                <Link id={'cm-edit-' + row.index} to={`/committee-management/edit-committee/${row.original.CommitteeID}`} className=\"button edit\">Edit</Link>\n                                                <Link id={'cm-flag-' + row.index} to={`/docket-management/${row.original.CommitteeID}`} className=\"button paper\">Docket</Link>\n                                                {row.original.PendingChange ? <span id={'cm-flag-' + row.index} className=\"button flag\">Flag</span> : <span></span>}\n                                            </div>\n                                        )\n                                    }\n                                },\n                                {\n                                    Header: \"All\",\n                                    id: 'all',\n                                    className: \"all-column\",\n                                    headerClassName: \"all-header\",\n                                    width: 0,\n                                    resizable: false,\n                                    sortable: false,\n                                    Filter: () => { },\n                                    getProps: () => {\n                                        return {\n                                            style: { padding: \"0px\" }\n                                        }\n                                    },\n                                    filterMethod: (filter, row, column) => {\n                                        // convert to lowercase before comparing\n                                        var lowercaseRow = row.Name.toLowerCase();\n                                        var lowercaseFilter = filter.value.toLowerCase();\n                                        if (lowercaseRow.includes(lowercaseFilter)) {\n                                            return true\n                                        }\n                                    },\n                                }\n                            ]\n                        },\n                    ]}\n                    defaultPageSize={15}\n                    pageSizeOptions={[5, 10, 15, 20, 25, 50, 100]}\n                    className=\"committee-table -striped -highlight\"\n                />\n                <br />\n\n            </div>\n        );\n    }\n}\n\nconst CommitteeManagementGrid = connect(\n    (state) => {\n        const { login, committee, nav } = state;\n        return {\n            login,\n            committee,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, authActionCreators, committeeActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(CommitteeGridComponent)\n\n\nexport default CommitteeManagementGrid;","import React from 'react';\nimport moment from 'moment-timezone';\nimport * as Fields from '../../../lis-shared/lis-layout/components/lis-forms-component';\nimport { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';\n\n\n// THE REORDER FUNCTION THAT FIRES WHEN ITEM IS DROPPED\nconst reorder = (list, startIndex, endIndex) => {\n    const result = Array.from(list);\n    const [removed] = result.splice(startIndex, 1);\n\n    result.splice(endIndex, 0, removed);\n    // Reorder the Sequence value too!\n    result.forEach(function (element, index) {\n        element.Sequence = index + 1\n    });\n    return result;\n};\n\n// STYLE TO SHOW WHEN ITEM IS BEING DRAGGED\nconst getItemStyle = (isDragging, draggableStyle, pendingDeletion) => ({\n    // some basic styles to make the items look a bit nicer\n    userSelect: 'none',\n    // change background colour if dragging\n    background: isDragging ? '#34495e' : 'white',\n    color: isDragging ? 'white' : '#34495e',\n    border: pendingDeletion ? 'red' : 'none',\n    // styles we need to apply on draggables\n    ...draggableStyle,\n});\n\nconst getListStyle = isDraggingOver => ({\n    background: isDraggingOver ? '#8b9fb3' : '#666666',\n    width: '100%',\n});\n\n\nclass PersonnelDraggableComponent extends React.Component {\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            selectedPersonnel: ''\n        };\n        this.onDragEnd = this.onDragEnd.bind(this);\n        this.onInsert = this.onInsert.bind(this);\n        this.handleDropDownChange = this.handleDropDownChange.bind(this);\n    }\n\n    onInsert(staffRoleTypeID) {\n        let selectedPersonnel = this.state.selectedPersonnel\n        //Make sure that a member is selected before trying to add \n        if (selectedPersonnel.IdentityID) {\n            delete selectedPersonnel.EffectiveEndDate;\n            //set isPublic to false by default just in case the user doesn't want to publish just yet\n            selectedPersonnel.IsPublic = false;\n            //Set the correct committee ID\n            selectedPersonnel.AffiliationID = this.props.affiliation;\n            //Set the correct StaffRoleTypeID (1 = clerk, 2 = staff)\n            selectedPersonnel.StaffRoleTypeID = staffRoleTypeID\n            selectedPersonnel.Sequence = this.props.items.length + 1;\n            this.props.onPersonnelChange([...this.props.items, selectedPersonnel]);\n            this.setState({\n                selectedPersonnel: ''\n            })\n        }\n    }\n\n    onRemove(rowID) {\n        var tempArray = this.props.items\n\n        tempArray.forEach(function (element) {\n            if (element.StaffID === rowID) {\n                //the element has already been marked to be deleted. un-mark it\n                if (element.EffectiveEndDate) {\n                    delete element.EffectiveEndDate;\n                } else {\n                    element.EffectiveEndDate = moment(new Date()).format(\"YYYY-MM-DDTHH:mm:ss.SS[Z]\");\n                }\n            }\n        })\n        this.props.onPersonnelChange(tempArray)\n\n    }\n\n    handleDropDownChange = value => {\n        //this function runs again after the member is inserted. It does not have a value so the dropdown text is replaced with the word 'Select'\n        if (value) {\n            var personnel = value;\n            var personnelArray = {\n                ...personnel,\n                Sequence: this.props.items.length\n            }\n            this.setState({\n                selectedPersonnel: personnelArray\n            });\n        } else {\n            this.setState({\n                selectedPersonnel: 'Select...'\n            })\n        }\n    }\n\n    onDragEnd(result) {\n        // dropped outside the list\n        if (!result.destination) {\n            return;\n        }\n        const items = reorder(\n            this.props.items,\n            result.source.index,\n            result.destination.index\n        );\n\n        this.props.onPersonnelChange(items);\n    }\n\n\n    render() {\n        const { items, dropdownData, name } = this.props;\n        const { selectedPersonnel } = this.state;\n        const headers = ['Name', 'Phone', 'Email'];\n        const keys = ['FullName', 'PhoneNumber', 'Email']\n        return (\n            <DragDropContext onDragEnd={this.onDragEnd}>\n                <Droppable droppableId={`${name}-droppable`}>\n                    {(provided, snapshot) => (\n                        <table\n                            className=\"dnd-grid-table personnel-grid\"\n                            ref={provided.innerRef}\n                            style={getListStyle(snapshot.isDraggingOver)}\n                        >\n                            <thead className=\"dnd-grid-header\" style={getListStyle(snapshot.isDraggingOver)}>\n                                <tr>\n                                    <th scope=\"col\" id={name + '-grabber-column'}></th>\n                                    <th scope=\"col\" id={name + '-display-column'}>Display #</th>\n                                    {headers.map((item, index) => (\n                                        <th key={index} scope=\"col\" id={name + '-' + item + '-column'} >{item}</th>\n                                    ))}\n                                    <th scope=\"col\" id={name + '-actions-column'}>Actions</th>\n                                </tr>\n                            </thead>\n                            <tbody>\n                                <SelectMenu\n                                    items={items}\n                                    name={name}\n                                    dropdownData={dropdownData}\n                                    handleDropDownChange={this.handleDropDownChange}\n                                    selectedPersonnel={selectedPersonnel}\n                                    onInsert={this.onInsert.bind(this, this.props.staffRoleTypeID)}\n                                />\n\n                                {this.props.items.map((item, index) => (\n                                    <Draggable key={`${item.StaffID}-${item.Sequence}`} draggableId={`${item.StaffID}-${item.Sequence}`} index={index}>\n                                        {(provided, snapshot) => (\n                                            <tr\n                                                className={item.EffectiveEndDate ? 'pending-delete' : ''}\n                                                id={name + '-' + item.StaffID}\n                                                ref={provided.innerRef}\n                                                {...provided.draggableProps}\n                                                {...provided.dragHandleProps}\n                                                style={getItemStyle(\n                                                    snapshot.isDragging,\n                                                    provided.draggableProps.style\n                                                )}\n                                            >\n                                                <td><button id={name + '-' + item.StaffID + '-grabber-button'} className=\"button draggable\">Drag and drop</button></td>\n                                                <td id={name + '-' + item.StaffID + '-index'}>{index + 1}</td>\n\n                                                {keys.map((key, index) => (\n                                                    <td key={index} id={name + '-' + item.StaffID + '-' + key}>{item[key]}</td>\n                                                ))}\n                                                <td><button id={name + '-' + item.StaffID + '-delete-button'} type=\"button\" onClick={this.onRemove.bind(this, item.StaffID)} className={item.EffectiveEndDate ? \"button add\" : \"button remove\"}>Delete</button></td>\n                                            </tr>\n                                        )}\n                                    </Draggable>\n                                ))}\n\n                                {provided.placeholder}\n                            </tbody>\n                        </table>\n                    )}\n                </Droppable>\n            </DragDropContext>\n        );\n    }\n}\n\nfunction SelectMenu(props) {\n\n    let dropdown = [];\n    //Remove personnel from dropdown that already belong to the committee\n    props.dropdownData.forEach(function (element) {\n        let isDuplicate = false;\n        props.items.forEach(function (item) {\n            if (item.IdentityID === element.IdentityID) {\n                isDuplicate = true;\n            }\n        });\n        if (!isDuplicate) {\n            dropdown.push(element);\n        }\n    })\n\n    return (\n        <tr id={props.name + '-insert-row'} className=\"dnd-insert-row\">\n            <td></td>\n            <td></td>\n            <td><Fields.Dropdown\n                className=\"grid-selector-dropdown\"\n                classNamePrefix=\"grid-selector-dropdown\"\n                value={props.selectedPersonnel}\n                options={dropdown}\n                id={props.name + '-dropdown'}\n                onChange={props.handleDropDownChange} />\n            </td>\n            <td id={props.name + '-phone-td'}>{props.selectedPersonnel.PhoneNumber}</td>\n            <td id={props.name + '-email-td'}>{props.selectedPersonnel.Email}</td>\n            <td><button type=\"button\" id={props.name + '-insert-button'} className=\"button\" onClick={props.onInsert}>Insert</button></td>\n        </tr>\n    )\n}\n\nexport default PersonnelDraggableComponent;","import React from 'react';\nimport DatePicker from \"react-datepicker\";\nimport moment from 'moment-timezone';\nimport * as Fields from '../../../lis-shared/lis-layout/components/lis-forms-component';\nimport { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';\n\n// STYLE TO SHOW WHEN ITEM IS BEING DRAGGED\nconst getItemStyle = (isDragging, draggableStyle, pendingDeletion) => ({\n    // some basic styles to make the items look a bit nicer\n    userSelect: 'none',\n    // change background colour if dragging\n    background: isDragging ? '#34495e' : 'white',\n    color: isDragging ? 'white' : '#34495e',\n    border: pendingDeletion ? 'red' : 'none',\n    // styles we need to apply on draggables\n    ...draggableStyle,\n});\n\nconst getListStyle = isDraggingOver => ({\n    background: isDraggingOver ? '#8b9fb3' : '#666666',\n    width: '100%',\n});\n\n\nclass MembersDraggableComponent extends React.Component {\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            dropdownDataRoles: [{ value: 0, label: 'Role' }],\n            membersDropdown: [],\n            selectedMember: 'Select...',\n            selectedRole: { value: 0, label: 'Role' }\n        };\n        this.onDragEnd = this.onDragEnd.bind(this);\n        this.onInsert = this.onInsert.bind(this);\n        this.handleDropDownChange = this.handleDropDownChange.bind(this);\n        this.handleRolesDropDownChange = this.handleRolesDropDownChange.bind(this);\n        this.handleDateChange = this.handleDateChange.bind(this);\n        this.handleSeniorityChange = this.handleSeniorityChange.bind(this);\n    }\n\n    // HANDLE DATE ASSIGNED IN ADD NEW MEMBER ROW\n    handleDateChange(date) {\n        this.setState(state => ({\n            selectedMember: { ...state.selectedMember, AssignDate: moment(date) }\n        }));\n    }\n\n    // HANDLE SENIORITY CHANGE IN ADD NEW MEMBER ROW\n    handleSeniorityChange(e) {\n        let value = e.target.value;\n        this.setState(state => ({\n            selectedMember: { ...state.selectedMember, Seniority: value }\n        }));\n    }\n\n    // HANDLE MEMBER DROPDOWN CHANGE IN ADD NEW MEMBER ROW\n    handleDropDownChange = member => {\n        if (member) {\n            //The AssignDate is deleted because the subcommittee dropdown has it defined and\n            //the date is not formatted correctly for the DatePicker. Since a new date is being assigned anyway I am just going to delete this value\n            delete member.AssignDate;\n            this.setState(state => ({\n                selectedMember: {\n                    AssignDate: state.selectedMember.AssignDate,\n                    ...member,\n                    DisplaySequence: this.props.items.length,\n                }\n            }));\n        } else {\n            this.setState({\n                selectedMember: 'Select...'\n            });\n        }\n    }\n\n    // ADD THE SELECTED MEMBER TO THE GRID\n    onInsert() {\n\n        let selectedMember = this.state.selectedMember\n        //Make sure that a member is selected before trying to add \n        if (selectedMember.MemberID && this.state.selectedRole.value) {\n            delete selectedMember.RemoveDate;\n            //Add isPublic=false so duplicate entries are not created\n            selectedMember.IsPublic = false;\n            //If the user didn't set the date then assign today's date\n            if (!selectedMember.AssignDate) selectedMember.AssignDate = moment(new Date()).format(\"YYYY-MM-DDTHH:mm:ss.SS[Z]\");\n            selectedMember.DisplaySequence = this.props.items.length + 1;\n            selectedMember.CommitteeID = this.props.affiliation;\n            selectedMember.CommitteeRoleID = this.state.selectedRole.value;\n            this.props.onMemberChange([...this.props.items, selectedMember])\n            this.handleDropDownChange();\n        }\n\n    }\n\n    // REMOVE A MEMBER FROM THE GRID\n    onRemove(rowID) {\n\n        var tempArray = this.props.items\n\n        tempArray.forEach(function (element) {\n            if (element.MemberID === rowID) {\n                //the element has already been marked to be deleted. un-mark it\n                if (element.RemoveDate) {\n                    delete element.RemoveDate;\n                } else {\n                    element.RemoveDate = moment(new Date()).format(\"YYYY-MM-DDTHH:mm:ss.SS[Z]\");\n                }\n            }\n        })\n        this.props.onMemberChange(tempArray);\n    }\n\n    // FILTER DATEPICKER TO SHOW TODAY & PAST DAYS ONLY - IN ADD NEW MEMBER ROW\n    isValidTerminationDate = (date) => {\n        const day = date;\n        return day <= new Date()\n    }\n\n    // HANDLE ROLE DROPDOWN CHANGE\n    handleRolesDropDownChange = value => {\n        var role = value;\n        var selected = this.state.selectedMember;\n        this.setState({\n            selectedRole: role,\n            selectedMember: { ...selected, CommitteeRoleID: role.value }\n        })\n    }\n\n    // WHEN DRAGGED ITEM HAS BEEN PLACED\n    onDragEnd(result) {\n        if (!result.destination) {\n            return;\n        }\n        let newItems = [...this.props.items];\n        let [removed] = newItems.splice(result.source.index, 1);\n\n        newItems.splice(result.destination.index, 0, removed);\n        // Reorder the DisplaySequence value too!\n        newItems.forEach((element, index) => {\n            element.DisplaySequence = index + 1\n        });\n        this.props.onMemberChange(newItems);\n    }\n\n    // HANDLE EDITING OF ROLES INPUT (IN TABLE ROWS) - WILL NOT SET PROPS\n    handleEditRoles(memberRole, valObj) {\n        this.setState({ [memberRole]: valObj })\n    }\n\n    // HANDLE SAVING OF ROLES INPUT\n    handleSaveRoles(index, memberRole, member) {\n        const valObj = this.state[memberRole];\n        const items = this.props.items.map((item, i) => {\n            if (i === index) {\n                return { ...item, CommitteeRoleID: valObj.value, isPendingAdd: true };\n            } else {\n                return item;\n            }\n        });\n\n        this.props.onMemberChange(items);\n\n        this.toggleInput(member)\n    }\n\n    // HANDLE EDITING OF SENIORITY INPUT - WILL NOT SET PROPS\n    handleEditSeniority(memberSeniority, e) {\n        this.setState({ [memberSeniority]: e.target.value })\n    }\n\n    // HANDLE SAVING OF SENIORITY INPUT\n    handleSaveSeniority(index, memberSeniority, member) {\n        const value = this.state[memberSeniority];\n        const items = this.props.items.map((item, i) => {\n            if (i === index) {\n                return { ...item, Seniority: value, isPendingAdd: true };\n            } else {\n                return item;\n            }\n        });\n\n        this.props.onMemberChange(items);\n\n        this.toggleInput(member)\n    }\n\n    // HANDLE EDITING OF SENIORITY INPUT - WILL NOT SET PROPS\n    handleEditVotingSequence(memberVotingSequence, e) {\n        this.setState({ [memberVotingSequence]: e.target.value })\n    }\n\n    // HANDLE SAVING OF VOTE SEQUENCE INPUT\n    handleSaveVotingSequence(index, memberVotingSequence, member) {\n        const value = this.state[memberVotingSequence];\n        const items = this.props.items.map((item, i) => {\n            if (i === index) {\n                return { ...item, VotingSequence: value, isPendingAdd: true };\n            } else {\n                return item;\n            }\n        });\n\n        this.props.onMemberChange(items);\n\n        this.toggleInput(member)\n    }\n\n    // HANDLE EDITING OF ASSIGN DATE INPUT - WILL NOT SET PROPS\n    handleEditAssignDate(memberAssignDate, value) {\n        this.setState({ [memberAssignDate]: value })\n    }\n\n    // HANDLE SAVING OF ASSIGN DATE INPUT\n    handleSaveAssignDate(index, memberAssignDate, member) {\n        let memberId;\n\n        const value = this.state[memberAssignDate];\n        const items = this.props.items.map((item, i) => {\n            if (i === index) {\n                memberId = item.MemberID\n                return { ...item, AssignDate: value, isPendingAdd: true };\n            } else {\n                return item;\n            }\n        });\n\n        this.props.onMemberChange(items);\n\n        this.toggleInput(member, memberId + \"tempAssignDateValue\")\n    }\n\n    // HANDLE EDITING OF ASSIGN DATE INPUT - WILL NOT SET PROPS\n    handleEditRemoveDate(memberRemoveDate, value) {\n        this.setState({ [memberRemoveDate]: value })\n    }\n\n    // HANDLE SAVING OF ASSIGN DATE INPUT\n    handleSaveRemoveDate(index, memberRemoveDate, member) {\n        let memberId;\n\n        const value = memberRemoveDate === \"Now\" ? moment() : this.state[memberRemoveDate];\n        const items = this.props.items.map((item, i) => {\n            if (i === index) {\n                memberId = item.MemberID\n                return { ...item, RemoveDate: value, isPendingAdd: true };\n            } else {\n                return item;\n            }\n        });\n\n        this.props.onMemberChange(items);\n\n        this.toggleInput(member, memberId + \"tempRemoveDateValue\")\n    }\n\n    // SHOW INPUT OR NOT\n    toggleInput(value, tempValue, e) {\n        var stateName = value;\n\n        this.setState(prevState => ({\n            [stateName]: !prevState[stateName],            \n        }), () => {\n            //Delete the temp value from state\n            if(typeof tempValue === 'string') {                \n                this.setState({\n                    [tempValue]: undefined\n                })\n            }\n        });\n    }\n\n    // FILTER TO DISPLAY ROLE NAMES BASED ON ROLE IDS\n    getCommitteeRoleName(roleID) {\n        var result = 'Member';\n        this.props.dropdownDataRoles.forEach(function (element) {\n            if (roleID === element.value) {\n                result = element.label\n            }\n        })\n        return result;\n    }\n\n    render() {\n        const memberRoleEditStyle = {\n            gridTemplateColumns: '1fr 15px 15px',\n            gridGap: '5px',\n            backgroundColor: '#f3f5f5',\n        };\n        const { dropdownDataRoles, name, dropdownDataMembers, items } = this.props;\n        const { selectedMember } = this.state;\n\n        return (\n            <DragDropContext onDragEnd={this.onDragEnd}>\n                <Droppable droppableId=\"memberDroppable\">\n                    {(provided, snapshot) => (\n                        <table\n                            className=\"dnd-grid-table members-grid\"\n                            ref={provided.innerRef}\n                            style={getListStyle(snapshot.isDraggingOver)}\n                        >\n                            <thead className=\"dnd-grid-header\" style={getListStyle(snapshot.isDraggingOver)}>\n                                <tr>\n                                    <th scope=\"col\" id={name + '-grabber-column'}></th>\n                                    <th scope=\"col\" id={name + '-display-column'}>Display #</th>\n                                    <th scope=\"col\" id={name + '-membername-column'}>Member Name</th>\n                                    <th scope=\"col\" id={name + '-role-column'}>{this.props.isSubcommittee ? \"Subcommittee Role\" : \"Committee Role\"}</th>\n                                    <th scope=\"col\" id={name + '-party-column'}>Party</th>\n                                    <th scope=\"col\" id={name + '-seniority-column'}>Seniority</th>\n                                    <th scope=\"col\" id={name + '-voting-sequence-column'} className=\"voting-sequence-header\" onClick={this.props.sortByVotingSequence}>Voting Sequence</th>\n                                    <th scope=\"col\" id={name + '-date-column'}>Date Assigned</th>\n                                    <th scope=\"col\" id={name + '-date-column'}>Date Removed</th>\n                                    <th scope=\"col\" id={name + '-actions-column'}>Actions</th>\n                                </tr>\n                            </thead>\n                            <tbody>\n                                <SelectMenu\n                                    items={items}\n                                    name={name}\n                                    dropdownDataMembers={dropdownDataMembers}\n                                    dropdownDataRoles={dropdownDataRoles}\n                                    handleDropDownChange={this.handleDropDownChange}\n                                    handleRolesDropDownChange={this.handleRolesDropDownChange}\n                                    selectedMember={selectedMember}\n                                    handleSeniorityChange={this.handleSeniorityChange}\n                                    handleDateChange={this.handleDateChange}\n                                    isValidTerminationDate={this.isValidTerminationDate}\n                                    onInsert={this.onInsert}\n                                />\n                                {items.map((item, index) => (\n                                    <Draggable key={`${item.MemberID}-${item.DisplaySequence}`} draggableId={`${item.MemberID}-${item.DisplaySequence}`} index={index}>\n                                        {(provided, snapshot) => (\n                                            <tr\n                                                className={item.RemoveDate ? 'pending-delete' : 'nothing'}\n                                                id={name + '-' + item.MemberID}\n                                                ref={provided.innerRef}\n                                                {...provided.draggableProps}\n                                                {...provided.dragHandleProps}\n                                                style={getItemStyle(\n                                                    snapshot.isDragging,\n                                                    provided.draggableProps.style\n                                                )}\n                                            >\n                                                <td><button className=\"button draggable\">Drag and drop</button></td>\n                                                <td>{index + 1}</td>\n                                                <td>{item.MemberDisplayName}</td>\n                                                <td className={this.state[item.MemberID + 'showRoles'] ? 'td-split' : null} style={this.state[item.MemberID + 'showRoles'] ? memberRoleEditStyle : null}>\n                                                    {this.state[item.MemberID + 'showRoles'] ?\n                                                        <React.Fragment>\n                                                            <Fields.Dropdown\n                                                                options={dropdownDataRoles}\n                                                                id={name + '-dropdownRoles'}\n                                                                defaultValue={this.props.dropdownDataRoles.find(role => role.value === item.CommitteeRoleID)}\n                                                                onChange={this.handleEditRoles.bind(this, item.MemberID + 'tempRoleValue')} />\n                                                            <a\n                                                                disabled={!this.state[item.MemberID + 'tempRoleValue']}\n                                                                className=\"icon save\"\n                                                                onClick={this.handleSaveRoles.bind(this, index, item.MemberID + 'tempRoleValue', item.MemberID + 'showRoles')} ></a>\n                                                            <a\n                                                                onClick={this.toggleInput.bind(this, item.MemberID + 'showRoles')}\n                                                                className=\"icon grey-delete\"></a>\n                                                        </React.Fragment>\n                                                        :\n                                                        <div\n                                                            className={!this.state[item.MemberID + 'showRoles'] ? 'hide-input' : null}\n                                                            id={item.MemberID + 'showRoles'}\n                                                            onClick={this.toggleInput.bind(this, item.MemberID + 'showRoles')}>\n                                                            {this.getCommitteeRoleName(item.CommitteeRoleID)}\n                                                        </div>\n                                                    }\n                                                </td>\n                                                <td>{item.PartyCode}</td>\n                                                <td className={this.state[item.MemberID + 'showSeniority'] ? 'td-split' : null} style={this.state[item.MemberID + 'showSeniority'] ? memberRoleEditStyle : null}>\n                                                    {this.state[item.MemberID + 'showSeniority'] ?\n                                                        <React.Fragment>\n                                                            <input\n                                                                className=\"input-small\"\n                                                                id={item.MemberID + 'editSeniorityInput'}\n                                                                type=\"text\"\n                                                                defaultValue={item.Seniority}\n                                                                placeholder={item.Seniority}\n                                                                onChange={this.handleEditSeniority.bind(this, item.MemberID + 'tempSeniorityValue')} />\n                                                            <a\n                                                                disabled={!this.state[item.MemberID + 'tempSeniorityValue']}\n                                                                className=\"icon save\"\n                                                                onClick={this.handleSaveSeniority.bind(this, index, item.MemberID + 'tempSeniorityValue', item.MemberID + 'showSeniority')} ></a>\n                                                            <a\n                                                                onClick={this.toggleInput.bind(this, item.MemberID + 'showSeniority')}\n                                                                className=\"icon grey-delete\"></a>\n                                                        </React.Fragment>\n                                                        :\n                                                        <span\n                                                            className={!this.state[item.MemberID + 'showSeniority'] ? 'hide-input' : null}\n                                                            id={item.MemberID + 'showSeniority'}\n                                                            onClick={this.toggleInput.bind(this, item.MemberID + 'showSeniority')}>\n                                                            {!this.state[item.MemberID + 'showSeniority'] && item.Seniority > 0 ? item.Seniority : ''}\n                                                        </span>\n                                                    }\n                                                </td>\n                                                <td className={this.state[item.MemberID + 'showVotingSequence'] ? 'td-split' : null} style={this.state[item.MemberID + 'showVotingSequence'] ? memberRoleEditStyle : null}>\n                                                    {this.state[item.MemberID + 'showVotingSequence'] ?\n                                                        <React.Fragment>\n                                                            <input\n                                                                className=\"input-small\"\n                                                                id={item.MemberID + 'editVotingSequenceInput'}\n                                                                type=\"text\"\n                                                                defaultValue={item.VotingSequence}\n                                                                placeholder={item.VotingSequence}\n                                                                onChange={this.handleEditVotingSequence.bind(this, item.MemberID + 'tempVotingSequenceValue')} />\n                                                            <a\n                                                                disabled={!this.state[item.MemberID + 'tempVotingSequenceValue']}\n                                                                className=\"icon save\"\n                                                                onClick={this.handleSaveVotingSequence.bind(this, index, item.MemberID + 'tempVotingSequenceValue', item.MemberID + 'showVotingSequence')} ></a>\n                                                            <a\n                                                                onClick={this.toggleInput.bind(this, item.MemberID + 'showVotingSequence')}\n                                                                className=\"icon grey-delete\"></a>\n                                                        </React.Fragment>\n                                                        :\n                                                        <span\n                                                            className={!this.state[item.MemberID + 'showVotingSequence'] ? 'hide-input' : null}\n                                                            id={item.MemberID + 'showVotingSequence'}\n                                                            onClick={this.toggleInput.bind(this, item.MemberID + 'showVotingSequence')}>\n                                                            {!this.state[item.MemberID + 'showVotingSequence'] ? (item.VotingSequence ? item.VotingSequence : 0) : ''}\n                                                        </span>\n                                                    }\n                                                </td>\n                                                <td className={this.state[item.MemberID + 'showAssignDate'] ? 'td-split' : null} style={this.state[item.MemberID + 'showAssignDate'] ? memberRoleEditStyle : null}>\n                                                    {this.state[item.MemberID + 'showAssignDate'] ?\n                                                        <React.Fragment>\n                                                            <DatePicker\n                                                                id={item.MemberID + 'editAssignDateInput'}\n                                                                className=\"datepicker-filter\"\n                                                                value={this.state[item.MemberID + 'tempAssignDateValue'] ? moment(this.state[item.MemberID + 'tempAssignDateValue']).format(\"L\") : moment(item.AssignDate).format(\"L\")}\n                                                                onChange={this.handleEditAssignDate.bind(this, item.MemberID + 'tempAssignDateValue')} />\n                                                            <a\n                                                                disabled={!this.state[item.MemberID + 'tempAssignDateValue']}\n                                                                className=\"icon save\"\n                                                                onClick={!this.state[item.MemberID + 'tempAssignDateValue'] ? this.toggleInput.bind(this, item.MemberID + 'showAssignDate', item.MemberID + 'tempAssignDateValue') : this.handleSaveAssignDate.bind(this, index, item.MemberID + 'tempAssignDateValue', item.MemberID + 'showAssignDate')}\n                                                            >\n                                                            </a>\n                                                            <a\n                                                                onClick={this.toggleInput.bind(this, item.MemberID + 'showAssignDate', item.MemberID + 'tempAssignDateValue')}\n                                                                className=\"icon grey-delete\"></a>\n                                                        </React.Fragment>\n                                                        :                                                        \n                                                        <span\n                                                            className={!this.state[item.MemberID + 'showAssignDate'] ? 'hide-input' : null}\n                                                            id={item.MemberID + 'showAssignDate'}\n                                                            onClick={this.toggleInput.bind(this, item.MemberID + 'showAssignDate')}>\n                                                            {!this.state[item.MemberID + 'showAssignDate'] ? (item.AssignDate ? moment(item.AssignDate).format('L') : \"\") : ''}\n                                                        </span>\n                                                    }\n                                                </td>\n                                                <td className={this.state[item.MemberID + 'showRemoveDate'] ? 'td-split' : null} style={this.state[item.MemberID + 'showRemoveDate'] ? memberRoleEditStyle : null}>\n                                                    {this.state[item.MemberID + 'showRemoveDate'] ?\n                                                        <React.Fragment>\n                                                            <DatePicker\n                                                                id={item.MemberID + 'editRemoveDateInput'}\n                                                                className=\"datepicker-filter\"\n                                                                value={this.state[item.MemberID + 'tempRemoveDateValue'] ? moment(this.state[item.MemberID + 'tempRemoveDateValue']).format(\"L\") : moment(item.RemoveDate).format(\"L\")}\n                                                                onChange={this.handleEditRemoveDate.bind(this, item.MemberID + 'tempRemoveDateValue')} \n                                                                maxDate={moment()}\n                                                                />\n                                                            <a\n                                                                disabled={!this.state[item.MemberID + 'tempRemoveDateValue']}\n                                                                className=\"icon save\"\n                                                                onClick={!this.state[item.MemberID + 'tempRemoveDateValue'] ? this.handleSaveRemoveDate.bind(this, index, \"Now\", item.MemberID + 'showRemoveDate') : this.handleSaveRemoveDate.bind(this, index, item.MemberID + 'tempRemoveDateValue', item.MemberID + 'showRemoveDate')}\n                                                            >\n                                                            </a>\n                                                            <a\n                                                                onClick={this.toggleInput.bind(this, item.MemberID + 'showRemoveDate', item.MemberID + 'tempRemoveDateValue')}\n                                                                className=\"icon grey-delete\"></a>\n                                                        </React.Fragment>\n                                                        :                                                        \n                                                        <span\n                                                            className={!this.state[item.MemberID + 'showRemoveDate'] ? 'hide-input' : null}\n                                                            id={item.MemberID + 'showRemoveDate'}\n                                                            onClick={this.toggleInput.bind(this, item.MemberID + 'showRemoveDate')}>\n                                                            {!this.state[item.MemberID + 'tempRemoveDateValue'] ? (item.RemoveDate ? moment(item.RemoveDate).format('L') : \"\") : ''}\n                                                        </span>\n                                                    }\n                                                </td>\n                                                <td>{item.RemoveDate ? <button type=\"button\" onClick={this.onRemove.bind(this, item.MemberID)} className=\"button add\">Delete</button> : \"\"}</td>\n                                            </tr>\n                                        )}\n                                    </Draggable>\n                                ))}\n\n                                {provided.placeholder}\n                            </tbody>\n                        </table>\n                    )}\n                </Droppable>\n            </DragDropContext>\n        );\n    }\n}\n\n\nfunction SelectMenu(props) {\n\n    var dropdown = [];\n\n    props.dropdownDataMembers.forEach(function (element) {\n        let isDuplicate = false;\n        props.items.forEach(function (item) {\n            if (item.MemberID === element.MemberID) {\n                isDuplicate = true;\n            }\n        });\n        if (!isDuplicate) {\n            dropdown.push(element);\n        }\n    })\n\n    return (\n        <tr id={props.name + '-insert-row'} className=\"dnd-insert-row\">\n            <td></td>\n            <td></td>\n            <td><Fields.Dropdown className=\"grid-selector-dropdown\" classNamePrefix=\"grid-selector-dropdown\" value={props.selectedMember} options={dropdown} id={props.name + '-dropdownMembers'} onChange={props.handleDropDownChange} /></td>\n            <td><Fields.Dropdown className=\"grid-selector-dropdown\" classNamePrefix=\"grid-selector-dropdown\" options={props.dropdownDataRoles} id={props.name + '-dropdownRoles'} onChange={props.handleRolesDropDownChange} /></td>\n            <td>{props.selectedMember.PartyCode}</td>\n            <td><input id=\"seniorityInput\" type=\"text\" className=\"dnd-field\" value={props.selectedMember.Seniority} onChange={props.handleSeniorityChange} /></td>\n            <td><input id=\"votingSequenceInput\" type=\"text\" className=\"dnd-field\" value={props.selectedMember.VotingSequence} onChange={props.handleEditVotingSequence} /></td>\n            <td>\n                <DatePicker\n                    id=\"dateAssignedInput\"\n                    className=\"dnd-field\"\n                    selected={props.selectedMember.AssignDate}\n                    onChange={props.handleDateChange}\n                    popperPlacement=\"top-start\"\n                    autoComplete=\"off\"\n                    filterDate={props.isValidTerminationDate}\n                    placeholderText=\"Date Assigned\"\n\n                />\n            </td>\n            <td></td>\n            <td><button type=\"button\" id={props.name + '-insert-button'} className=\"button\" onClick={props.onInsert}>Insert</button></td>\n        </tr>\n    )\n}\nexport default MembersDraggableComponent;","import React from \"react\";\nimport ReactTable from \"react-table\";\nimport { Link } from 'react-router-dom';\nimport '../../../stylesheets/shared/react-table.css';\nimport moment from 'moment-timezone';\n\n\nclass SubcommitteeManagementGrid extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            error: null,\n            selected: {},\n            selectedError: null,\n            currentDate: new Date(),\n            subcommitteeData: [],\n            showCreateSuccess: false,\n            subcommitteeNameInput: '',\n            subcommitteeNumberInput: '',\n            calculatedFullCommitteeNumber: ''\n\n        };\n        this.subcommitteeNameChange = this.subcommitteeNameChange.bind(this);\n        this.subcommitteeNumberChange = this.subcommitteeNumberChange.bind(this);\n        this.calculateFullCommitteeNumber = this.calculateFullCommitteeNumber.bind(this);\n        this.sendSubcommitteeCreateDetails = this.sendSubcommitteeCreateDetails.bind(this);\n\n    };\n\n    subcommitteeNameChange(e) {\n        const { value } = e.target;\n        const subcommitteeName = value;\n        this.setState({ subcommitteeNameInput: subcommitteeName });\n    }\n\n    subcommitteeNumberChange(e) {\n        let { value } = e.target;\n        if (value.length < 4) {\n            value = value ? parseInt(value) : '';\n            const subcommitteeNumber = value;\n            const calculatedFullCommitteeNumber = this.calculateFullCommitteeNumber(subcommitteeNumber);\n            this.setState({ subcommitteeNumberInput: subcommitteeNumber, calculatedFullCommitteeNumber });\n        }\n    }\n\n    calculateFullCommitteeNumber(number) {\n        if (!number) { return '' }\n        let calculatedFullCommitteeNumber = this.props.parentCommitteeNumber;\n        calculatedFullCommitteeNumber += String(number).padStart(3, '0');\n        return calculatedFullCommitteeNumber;\n    }\n\n    sendSubcommitteeCreateDetails() {\n        if (!Number.isInteger(this.state.subcommitteeNumberInput) || this.state.subcommitteeNumberInput < 1 || this.state.subcommitteeNumberInput > 999) {\n            this.setState({ error: 'Subcommittee number must be between 1 and 999' });\n            return;\n        } else {\n            this.setState({ error: null })\n        }\n        let params = {\n            Name: this.state.subcommitteeNameInput,\n            CommitteeNumber: this.state.calculatedFullCommitteeNumber,\n        }\n        this.props.createSubcommittee(params);\n    }\n\n    render() {\n        return (\n            <div>\n                <ReactTable\n                    resizable={false}\n                    data={this.props.subcommitteeData}\n                    ref={r => this.reactTable = r}\n                    noDataText={this.props.subcommitteeMessage}\n                    loading={!this.props.isLoaded}\n                    columns={[\n                        {\n                            Header: \"Subcommittee Name\",\n                            columns: [\n\n                                {\n                                    Header: (\n                                        <div className=\"dlas-forms\">\n                                            {!this.state.showCreateSuccess && !this.state.showCreateFailure &&\n                                                <div className=\"committee-grid-header-inputs subcommittee\">\n                                                    <div><input id=\"insert-new-committee\" type=\"text\" value={this.state.subcommitteeNameChange} placeholder=\"Type new subcommittee name and subcommittee number, click create\" onChange={this.subcommitteeNameChange} /></div>\n                                                    <div>\n                                                        <input id=\"insert-new-committee-number\" type=\"number\" min={1} max={999} value={this.state.subcommitteeNumberInput.toString()} placeholder=\"Subcommittee number\" onChange={this.subcommitteeNumberChange} />\n                                                        {this.state.calculatedFullCommitteeNumber && <span className=\"subcommittee-number\">({this.state.calculatedFullCommitteeNumber})</span>}\n                                                        {this.state.error && <div className=\"input-feedback\">{this.state.error}</div>}\n                                                    </div>\n                                                </div>\n                                            }\n                                            {this.props.showCreateSuccess &&\n                                                <span className=\"insert-message\">Subcommittee was created successfully!</span>\n                                            }\n                                            {this.props.showCreateFailure &&\n                                                <span className=\"insert-message fail\">Subcommittee creation failed</span>\n                                            }\n                                        </div>\n                                    ),\n                                    headerClassName: \"header-insert\",\n                                    accessor: \"Name\",\n                                    sortable: false,\n                                    filterAll: true,\n                                    Cell: row => {\n                                        return (\n                                            <span id={'cm-namecell-' + row.index}>{row.original.Name}</span>\n                                        )\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            Header: \"Service Start Date\",\n                            columns: [\n                                {\n                                    headerClassName: \"header-insert\",\n                                    accessor: \"PendingChange\",\n                                    sortable: false,\n                                    filterAll: true,\n                                    width: 150,\n                                    Cell: row => {\n                                        if (row.original.ServiceBeginDate === '0001-01-01T00:00:00') {\n                                            return <span className=\"txt-greyed\" id={'cm-pending-' + row.index}>Pending</span>\n                                        }\n                                        else {\n                                            return <span id={'cm-pending-' + row.index}>{row.original.ServiceBeginDate ? moment(row.original.ServiceBeginDate).format('L') : ''}</span>\n                                        }\n\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            Header: \"Actions\",\n                            headerClassName: \"submit-action\",\n                            columns: [\n\n                                {\n                                    Header: (<span><button type=\"button\" id=\"submit-new-committee\" disabled={!this.state.subcommitteeNameInput || !this.state.subcommitteeNumberInput} onClick={this.sendSubcommitteeCreateDetails} className=\"button\">Create</button></span>),\n                                    headerClassName: \"header-action\",\n                                    accessor: \"action\",\n                                    sortable: false,\n                                    className: \"action-column\",\n                                    width: 50,\n                                    Cell: row => {\n                                        return (\n                                            <Link id={'cm-edit-' + row.index} to={`/committee-management/edit-subcommittee/${this.props.parentCommitteeID}/${row.original.CommitteeID}/`} className=\"button edit\">Edit</Link>\n                                        )\n                                    }\n                                },\n                                {\n                                    Header: \"\",\n                                    headerClassName: \"flag-header\",\n                                    accessor: \"PendingChange\",\n                                    width: 40,\n                                    Cell: row => {\n                                        if (row.original.PendingChange) {\n                                            return <span id={'cm-flag-' + row.index} className=\"button flag\">Flag</span>\n                                        } else {\n                                            return <span></span>\n                                        }\n                                    }\n                                }\n                            ]\n                        },\n                    ]}\n                    defaultSorted={[\n                        {\n                            id: \"Name\",\n                            desc: false\n                        }\n                    ]}\n                    showPagination={true}\n                    defaultPageSize={10}\n                    className=\"subcommittee-table -striped -highlight\"\n                />\n            </div>\n        );\n    }\n}\n\n\nexport default SubcommitteeManagementGrid;","import { partnerRequest, publicRequest } from '../services/request.service'\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst personnelListRequest = 'PERSONNEL_LIST_REQUEST';\nconst personnelListSuccess = 'PERSONNEL_LIST_SUCCESS';\nconst personnelListFailure = 'PERSONNEL_LIST_FAILURE';\n\nconst roleTypesRequest = 'ROLE_TYPES_REQUEST';\nconst roleTypesSuccess = 'ROLE_TYPES_SUCCESS';\nconst roleTypesFailure = 'ROLE_TYPES_FAILURE';\n\nconst personnelReferencesRequest = 'PERSONNEL_REFERENCES_REQUEST';\nconst personnelReferencesSuccess = 'PERSONNEL_REFERENCES_SUCCESS';\nconst personnelReferencesFailure = 'PERSONNEL_REFERENCES_FAILURE';\n\nconst personnelSaveRequest = 'PERSONNEL_SAVE_REQUEST';\nconst personnelSaveSuccess = 'PERSONNEL_SAVE_SUCCESS';\nconst personnelSaveFailure = 'PERSONNEL_SAVE_FAILURE';\n\n\nconst initialState = {\n    personnelStaffList: [],\n    personnelClerkList: [],\n    personnelOtherList: [],\n    personnelStaffReferences: [],\n    personnelClerkReferences: [],\n    personnelErrorSave: '',\n    receivePersonnelSave: '',\n    personnelStaffSave: '',\n    personnelClerkSave: '',\n    roleTypes: []\n};\n\nexport const personnelActionCreators = {\n    // GET PERSONNEL REFERENCES FOR COMM MGMT DROPDOWNS\n    requestPersonnelReferences: () => ({\n        type: personnelReferencesRequest,\n        personnelReferences: [],\n        isFetching: true\n    }),\n\n    receivePersonnelReferences: (clerkReferences, staffReferences, message) => ({\n        type: personnelReferencesSuccess,\n        isFetching: false,\n        personnelStaffReferences: staffReferences,\n        personnelClerkReferences: clerkReferences,\n        message\n    }),\n\n    personnelReferencesError: (message) => ({\n        type: personnelReferencesFailure,\n        isFetching: false,\n        personnelStaffReferences: [],\n        personnelClerkReferences: [],\n        message\n    }),\n\n    getPersonnelReferences: (params) => {\n        return dispatch => {\n            dispatch(personnelActionCreators.requestPersonnelReferences());\n\n            return publicRequest((API_URL || process.env.REACT_APP_PERSONNEL_API_URL) + '/Personnel/api/GetReferencesAsync?', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(personnelActionCreators.personnelReferencesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        let personnelReferences = result[1];\n                        var personnelClerkReferences = [];\n                        var personnelStaffReferences = [];\n\n                        // STAFF = 2\n                        // CLERK = 1\n                        // FILTER OUT DUPLICATES----\n                        for (var i = 0; i < personnelReferences.Personnels.length; i++) {\n                            var personnelObj = { ...personnelReferences.Personnels[i], value: personnelReferences.Personnels[i].StaffID, label: personnelReferences.Personnels[i].FullName }\n\n                            if (personnelReferences.Personnels[i].StaffRoleTypeID === 2) {\n                                var isDuplicate = false;\n                                personnelStaffReferences.forEach(element => {\n                                    if (element.IdentityID === personnelObj.IdentityID) {\n                                        isDuplicate = true;\n                                    }\n                                });\n                                if (!isDuplicate) {\n                                    personnelStaffReferences.push(personnelObj)\n                                }\n                            } else {\n                                var isOtherDuplicate = false;\n                                personnelClerkReferences.forEach(element => {\n                                    if (element.IdentityID === personnelObj.IdentityID) {\n                                        isOtherDuplicate = true;\n                                    }\n                                })\n                                if (!isOtherDuplicate) {\n                                    personnelClerkReferences.push(personnelObj);\n                                }\n                            }\n                        }\n                        dispatch(personnelActionCreators.receivePersonnelReferences(personnelClerkReferences, personnelStaffReferences))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(personnelActionCreators.personnelReferencesError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n\n    // GET PERSONNEL STAFF AND CLERKS FOR COMM MGMT FORM GRID\n    requestPersonnelList: () => ({\n        type: personnelListRequest,\n        personnelList: [],\n        isFetching: true\n    }),\n\n    receivePersonnelList: (clerkList, staffList, otherList, message) => ({\n        type: personnelListSuccess,\n        isFetching: false,\n        personnelStaffList: staffList,\n        personnelClerkList: clerkList,\n        personnelOtherList: otherList,\n        message\n    }),\n\n    personnelListError: (message) => ({\n        type: personnelListFailure,\n        isFetching: false,\n        personnelList: [],\n        message\n    }),\n\n    getPersonnelList: (params, isPublic) => {\n\n        return dispatch => {\n            dispatch(personnelActionCreators.requestPersonnelList());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            let request = '';\n            if (isPublic) {\n                request = publicRequest((API_URL || process.env.REACT_APP_PERSONNEL_API_URL) + '/Personnel/api/getPersonnelListAsync?', 'GET', headers, '', params);\n            } else {\n                request = partnerRequest((API_URL || process.env.REACT_APP_PERSONNEL_API_URL) + '/Personnel/api/getPartnerPersonnelListAsync?', 'GET', headers, '', params);\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(personnelActionCreators.personnelListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        let personnelList = result[1]\n                        const personnelClerkList = personnelList.Personnels.filter(personnel => personnel.StaffRoleTypeID === 1)\n                        const personnelStaffList = personnelList.Personnels.filter(personnel => personnel.StaffRoleTypeID === 2)\n                        const personnelOtherList = personnelList.Personnels.filter(personnel => personnel.StaffRoleTypeID !== 1 && personnel.StaffRoleTypeID !== 2)\n                        dispatch(personnelActionCreators.receivePersonnelList(personnelClerkList, personnelStaffList, personnelOtherList))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(personnelActionCreators.receivePersonnelList([], []))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    // GET PERSONNEL STAFF AND CLERKS FOR COMM MGMT FORM GRID\n    requestRoleTypes: () => ({\n        type: roleTypesRequest,\n        roleTypes: [],\n        isFetching: true\n    }),\n\n    receiveRoleTypes: (roleTypes, message) => ({\n        type: roleTypesSuccess,\n        isFetching: false,\n        roleTypes: roleTypes,\n        message\n    }),\n\n    roleTypesError: (message) => ({\n        type: roleTypesFailure,\n        isFetching: false,\n        roleTypes: [],\n        message\n    }),\n\n    getRoleTypes: (params) => {\n\n        return dispatch => {\n            dispatch(personnelActionCreators.requestRoleTypes());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_PERSONNEL_API_URL) + '/Personnel/api/GetStaffRoleTypesAsync', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(personnelActionCreators.roleTypesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(personnelActionCreators.receiveRoleTypes(result[1].StaffRoleTypes))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(personnelActionCreators.receiveRoleTypes([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    requestPersonnelSave: () => ({\n        type: personnelSaveRequest,\n        isFetching: true\n    }),\n\n    receivePersonnelSave: (personnelClerkSave, personnelStaffSave) => ({\n        type: personnelSaveSuccess,\n        isFetching: false,\n        personnelClerkSave: personnelClerkSave,\n        personnelStaffSave: personnelStaffSave\n    }),\n\n    personnelErrorSave: (message) => ({\n        type: personnelSaveFailure,\n        isFetching: false,\n        personnelErrorSave: message\n    }),\n\n    savePersonnel: (body) => {\n\n        return dispatch => {\n            dispatch(personnelActionCreators.requestPersonnelSave());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_PERSONNEL_API_URL) + '/Personnel/api/SavePersonnelAsync/', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(personnelActionCreators.personnelErrorSave(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        const personnelList = result[1]\n                        const personnelClerkList = personnelList.filter(personnel => personnel.StaffRoleTypeID === 1)\n                        const personnelStaffList = personnelList.filter(personnel => personnel.StaffRoleTypeID === 2)\n                        dispatch(personnelActionCreators.receivePersonnelSave(personnelClerkList, personnelStaffList))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(personnelActionCreators.receivePersonnelSave([], []))\n                        throw 'No personnel found'\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    }\n};\n\n\nexport const reducer = (state, action) => {\n\n    state = state || initialState;\n\n    switch (action.type) {\n        case personnelReferencesRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            })\n        case personnelReferencesSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                personnelStaffReferences: action.personnelStaffReferences,\n                personnelClerkReferences: action.personnelClerkReferences,\n                message: ''\n            })\n        case personnelReferencesFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                message: action.message\n            })\n        case personnelListRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            })\n        case personnelListSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                personnelStaffList: action.personnelStaffList,\n                personnelClerkList: action.personnelClerkList,\n                personnelOtherList: action.personnelOtherList,\n                message: ''\n            })\n        case personnelListFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                message: action.message\n            })\n        case roleTypesRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            })\n        case roleTypesSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                roleTypes: action.roleTypes,\n                message: ''\n            })\n        case roleTypesFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                message: action.message\n            })            \n        case personnelSaveRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            })\n        case personnelSaveSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                personnelStaffSave: action.personnelStaffSave,\n                personnelClerkSave: action.personnelClerkSave,\n                personnelErrorSave: ''\n            })\n        case personnelSaveFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                personnelErrorSave: action.personnelErrorSave\n            })\n        default:\n            return state\n    }\n};","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport '../../../stylesheets/lis-public-view/public-view.css';\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\nimport { memberActionCreators } from '../../../stores/lis-members-store';\nimport { personnelActionCreators } from '../../../stores/lis-personnel-store';\n\nfunction SubCommitteesList(props) {\n    const listCommittees = props.committees.map(committee => {\n        let key = Math.random().toString();\n        return (\n            <div key={key} className=\"inner-grid two\" >\n                <div>\n                    <Link to=\"/committee-details\">{committee.Name}</Link>\n                </div>\n                <div>\n                    {committee.PendingChange && <p>Not Published</p>}\n                </div>\n            </div>\n            )\n    })\n    return (\n        <React.Fragment>\n            {listCommittees}\n        </React.Fragment>\n    )\n}\n\nfunction MemberListComponent(props) {\n    let key = '';\n    const names = props.members.map(member => {\n        //If the member is to be removed on the next save then don't show them in the preview\n        if (!member.EffectiveEndDate) {\n            key = Math.random().toString();\n            //Add the role label to the display, unless the role is 'Member' to keep things less redundant\n            let role = props.roles.find(role => role.value === member.CommitteeRoleID)\n            if (role && role.label !== 'Member') {\n                return (\n                    <div key={key} className=\"inner-grid two\">\n                        <div>\n                            <p><b>{role.label}</b>: {member.MemberDisplayName} </p>\n                        </div>\n                        <div>\n                            <p>{member.Seniority}</p>\n                        </div>\n                    </div>\n                )\n            } else {\n                return (\n                    <div key={key} className=\"inner-grid two\">\n                        <div>\n                            <p>{member.MemberDisplayName}</p>\n                        </div>\n                        <div>\n                            <p>{member.Seniority}</p>\n                        </div>\n                    </div>\n                )\n            }\n        }\n    });\n    return (\n        <React.Fragment>\n            {names}\n        </React.Fragment>\n    );\n}\n\nfunction PersonnelListComponent(props) {\n    let key = '';\n    //Creates the list of names\n    const names = props.personnel.map(personnel => {\n        key = Math.random().toString();\n        return (\n            <div key={key} className=\"inner-grid two\">\n                <div>\n                    <p>{personnel.FullName}</p>\n                </div>\n                <div>\n                    <p>{personnel.PhoneNumber}</p>\n                </div>\n            </div>)\n    });\n    return (\n        <React.Fragment>\n            {names}\n        </React.Fragment>\n    );\n}\n\nclass CommitteeDetailsComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            roles: [],\n        };\n    }\n\n    render() {\n        const { committeeData, clerkList, staffList, memberList, subcommitteesList } = this.props;\n\n        return (\n            <div className=\"partner-details\">\n                <div>\n                    <h3>{committeeData.Name}</h3>\n                </div>\n                <div className=\"details-section inner-grid three\">\n                    <div className=\"details-category\">\n                        <h4>COMMITTEE INFORMATION</h4>\n                    </div>\n                    <div className=\"span-two\">\n                        <div className=\"inner-grid two\">\n                            <div>\n                                <p>Abbreviation:</p>\n                            </div>\n                            <div>\n                                <p>{committeeData.Abbreviation}</p>\n                            </div>\n                        </div>\n                        <div className=\"inner-grid two\">\n                            <div>\n                                <p>Committee Number:</p>\n                            </div>\n                            <div>\n                                <p>{committeeData.CommitteeNumber}</p>\n                            </div>\n                        </div>\n                        <div className=\"inner-grid two\">\n                            <div>\n                                <p>Chamber:</p>\n                            </div>\n                            <div>\n                                <p>{(committeeData.ChamberCode === 'S') ? 'Senate' : 'House'}</p>\n                            </div>\n                        </div>\n                        <div className=\"inner-grid two\">\n                            <div>\n                                <p>Description:</p>\n                            </div>\n                            <div>\n                                <p>{committeeData.Description}</p>\n                            </div>\n                        </div>\n                        <div className=\"inner-grid two\">\n                            <div>\n                                <p>Meeting Notes:</p>\n                            </div>\n                            <div>\n                                <p>{committeeData.MeetingNote}</p>\n                            </div>\n                        </div>\n                        <div className=\"inner-grid two\">\n                            <div>\n                                <p>Twitter Handle:</p>\n                            </div>\n                            <div>\n                                <p>{committeeData.TwitterHandle}</p>\n                            </div>\n                        </div>\n                        <div className=\"inner-grid two\">\n                            <div>\n                                <p>Twitter Email:</p>\n                            </div>\n                            <div>\n                                <p>{committeeData.TwitterEmail}</p>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n                <div className=\"details-section inner-grid three\">\n                    <div className=\"details-category\">\n                        <h4>CLERK INFORMATION</h4>\n                    </div>\n                    {clerkList === undefined || clerkList.length === 0 ? (\n                        <div className=\"span-two\"><p>N/A</p></div>\n                    ) : (\n                        <div className=\"span-two\"><PersonnelListComponent personnel={clerkList} /></div>\n                    )}\n                </div>\n                <div className=\"details-section inner-grid three\">\n                    <div className=\"details-category\">\n                        <h4>STAFF INFORMATION</h4>\n                    </div>\n                    {staffList === undefined || staffList.length === 0 ? (\n                    <div className=\"span-two\"><p>N/A</p></div>\n                    ) : (\n                        <div className=\"span-two\"><PersonnelListComponent personnel={staffList} /></div>\n                    )}\n                </div>\n                <div className=\"details-section inner-grid three\">\n                    <div className=\"details-category\">\n                        <h4>Member Information</h4>\n                    </div>\n                    {memberList === undefined || memberList.length === 0 ? (\n                        <div className=\"span-two\"><p>{this.props.members.membersByCommitteeError}</p></div>\n                    ) : (\n                        <div className=\"span-two\"><MemberListComponent members={memberList} roles={this.props.memberRoles} /></div>\n                    )}\n                </div>\n                {subcommitteesList !== undefined && subcommitteesList.length > 0 &&\n                    <div className=\"details-section inner-grid three\">\n                        <div>\n                            <h4>Subcommittees</h4>\n                        </div>\n                        {subcommitteesList === undefined || subcommitteesList.length === 0 ? (\n                            <div className=\"span-two\"><p>{this.props.committee.partnerCommitteeListError}</p></div>\n                        ) : (\n                                <div className=\"span-two\"><SubCommitteesList committees={subcommitteesList} /></div>\n                            )}\n                    </div>\n                }\n                </div>\n        )\n    }\n}\n\nconst PartnerCommitteeDetails = connect(\n    (state) => {\n        const { committee, members, personnel } = state;\n        return {\n            committee,\n            members,\n            personnel\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, committeeActionCreators, memberActionCreators, personnelActionCreators), dispatch)\n        }\n    }\n)(CommitteeDetailsComponent)\n\nexport default PartnerCommitteeDetails;\n","import React from 'react';\nimport { Prompt } from 'react-router';\nimport ReactToPrint from 'react-to-print';\nimport * as Fields from '../../../lis-shared/lis-layout/components/lis-forms-component';\nimport DatePicker from 'react-datepicker';\nimport PersonnelDraggableComponent from './lis-committee-personnel-dnd';\nimport MembersDraggableComponent from './lis-committee-members-dnd';\nimport SubcommitteeManagementGrid from './lis-subcommittee-grid';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\nimport { personnelActionCreators } from '../../../stores/lis-personnel-store';\nimport { memberActionCreators } from '../../../stores/lis-members-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport CommitteeDetailsComponent from './lis-partner-committee-details';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport * as moment from 'moment-timezone';\n\nclass NewCommitteeFormComponent extends React.Component {\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            infoFieldsetIsActive: true, // SET FIELDSET SECTIONS TO BE VISIBLE ON LOAD (OR NOT)\n            clerkFieldsetIsActive: true,\n            staffFieldsetIsActive: true,\n            membershipFieldsetIsActive: true,\n            subcommFieldsetIsActive: true,\n            isSaving: false,\n            selectedCommittee: {},\n            members: [],\n            clerks: [],\n            staff: [],\n            personnelReferences: [],\n            committeeMemberRoles: [],\n            committeeMemberNames: [],\n            subcommitteeIsLoaded: false,\n            subcommitteeData: [],\n            showPreview: false,\n            ascending: false,\n            isFormDirty: false\n        };\n        this.createSubcommittee = this.createSubcommittee.bind(this);\n        this.togglePreview = this.togglePreview.bind(this);\n        this.getSubcommittees = this.getSubcommittees.bind(this);\n        this.handleSave = this.handleSave.bind(this);\n        this.handleMemberChange = this.handleMemberChange.bind(this);\n        this.handleClerkChange = this.handleClerkChange.bind(this);\n        this.handleStaffChange = this.handleStaffChange.bind(this);\n        this.handleDateChange = this.handleDateChange.bind(this);\n        this.sortByVotingSequence = this.sortByVotingSequence.bind(this);\n        this.handleClose = this.handleClose.bind(this);\n    }\n\n    togglePreview() {\n        this.setState(state => ({\n            showPreview: !state.showPreview\n        }));\n    }\n\n    // TOGGLE FIELDSET VISIBILITY\n    toggleFieldsetCollapse(isActive) {\n        this.setState(state => ({\n            [isActive]: !state[isActive]\n        }));\n    };\n\n    // CALLBACK FOR CREATING NEW SUBCOMMITTEE\n    createSubcommittee(params) {\n        params = {\n            ...params,\n            ChamberCode: this.state.selectedCommittee.ChamberCode,\n            ParentCommitteeID: this.props.match.params.committeeid,\n            IsPublic: 0\n        };\n        this.props.actions.createNewCommittee(params).then(() => {\n            this.setState({\n                showCreateSuccess: true\n            });\n            setTimeout(function () {\n                this.setState({ showCreateSuccess: false });\n            }.bind(this), 5000);\n            this.getSubcommittees();\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            this.setState({ showCreateFailure: true });\n            setTimeout(function () {\n                this.setState({ showCreateFailure: false });\n            }.bind(this), 5000);\n        })\n    }\n\n    getSubcommittees() {\n        if (!this.props.match.params.subcommitteeid) {\n            var params = 'parentCommitteeID=' + this.props.match.params.committeeid + '&isPublic=false';\n            this.props.actions.getPartnerCommitteeList(params).then(() => {\n                this.setState({\n                    subcommitteeData: this.props.committee.partnerCommitteeList,\n                    subcommitteeMessage: this.props.committee.partnerCommitteeListError,\n                    subcommitteeIsLoaded: true\n                })\n            });\n        }\n\n    }\n\n    handleMemberChange(members) {\n        this.setState({\n            members: members,\n            isFormDirty: true\n        })\n    }\n\n    handleClerkChange(clerks) {\n        this.setState({\n            clerks: clerks,\n            isFormDirty: true\n        })\n    }\n\n    handleStaffChange(staff) {\n        this.setState({\n            staff: staff,\n            isFormDirty: true\n        })\n    }\n\n    handleDateChange(val, serviceEndDate) {\n        let selectedCommittee = { ...this.state.selectedCommittee };\n        if (serviceEndDate) {\n            selectedCommittee.ServiceEndDate = moment(val);\n        } else {\n            selectedCommittee.ServiceBeginDate = moment(val);\n        }\n        this.setState({\n            selectedCommittee: selectedCommittee,\n            isFormDirty: true\n        });\n    }\n\n    handleChange(key, value) {\n        if (this.state.selectedCommittee[key] !== undefined || key === 'AgendaURL') {\n            let selectedCommittee = { ...this.state.selectedCommittee };\n            selectedCommittee[key] = value;\n            this.setState({\n                selectedCommittee: selectedCommittee,\n                isFormDirty: true\n            });\n        }\n    }\n\n    handleSave(publish) {\n        //Turn off save/publish button\n        this.setState({ isSaving: true });\n        //Check to see that the committee has a name.\n        if (!this.state.selectedCommittee.Name) {\n            this.setState({\n                committeeNameMissing: true\n            });\n            return;\n        }\n        let members = [...this.state.members];\n        //Combine the personnel list back together so we do not have to make an extra request\n        let personnelList = [...this.state.clerks, ...this.state.staff];\n        let selectedCommittee = { ...this.state.selectedCommittee };\n        personnelList.forEach(personnel => personnel.AffiliationID = selectedCommittee.CommitteeID);\n        selectedCommittee.IsPublic = publish;\n        if (publish) {\n            members.forEach(member => { member.IsPublic = true })\n            personnelList.forEach(personnel => { personnel.IsPublic = true })\n        }\n        const memberObject = { MemberList: members }\n        const personnelObject = { Personnels: personnelList };\n        //Save committee details\n        const saveCommittee = this.props.actions.saveCommittee(selectedCommittee)\n            .then(() => {\n                if (this.props.committee.saveCommitteeError) {\n                    return Promise.reject(this.props.committee.saveCommitteeError);\n                } else {\n                    const commData = this.props.committee.savedCommittee\n                    this.setState({\n                        selectedCommittee: {\n                            ...commData,\n                            TwitterHandle: commData.TwitterHandle ? commData.TwitterHandle : '',\n                            TwitterEmail: commData.TwitterEmail ? commData.TwitterEmail : '',\n                            Description: commData.Description ? commData.Description : '',\n                            MeetingNote: commData.MeetingNote ? commData.MeetingNote : '',\n                            Abbreviation: commData.Abbreviation ? commData.Abbreviation : '',\n                            ServiceEndDate: commData.ServiceEndDate ? commData.ServiceEndDate : null\n                        }\n                    });\n                    return Promise.resolve();\n                }\n            });\n        //Save personnel to committee\n        const savePersonnel = personnelObject.Personnels.length > 0 ? this.props.actions.savePersonnel(personnelObject)\n            .then(() => {\n                if (this.props.personnel.personnelErrorSave) {\n                    return Promise.reject(this.props.personnel.personnelErrorSave);\n                } else {\n                    this.setState({\n                        clerks: this.props.personnel.personnelClerkSave,\n                        staff: this.props.personnel.personnelStaffSave\n                    });\n                    return Promise.resolve();\n                }\n            })\n            : Promise.resolve(true);\n        //Save members to committee\n        const saveMember = memberObject.MemberList.length > 0 ? this.props.actions.saveMemberCommittee(memberObject)\n            .then(() => {\n                if (this.props.members.memberCommitteeSaveError) {\n                    return Promise.reject(this.props.members.memberCommitteeSaveError);\n                } else {\n                    this.setState({\n                        members: this.props.members.memberCommitteeSave\n                    });\n                    return Promise.resolve();\n                }\n            })\n            : Promise.resolve(true);\n\n        //Save the data then grab the new list of personnel and members and update the view. This is done because if the user wants to save again they need updated mod dates\n        Promise.all([\n            saveMember,\n            savePersonnel,\n            saveCommittee\n        ])\n            //Will only run if the 3 promises above resolve\n            .then(() => {\n                this.props.actions.makeToast([{ message: \"Committee Saved\", type: \"success\" }])\n                this.setState({ isSaving: false, saved: true, isFormDirty: false }, () => {\n                    if (publish === true) {\n                        this.props.history.push(\"/committee-management\");\n                    }\n                });\n            })\n            .catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                //Part or all of the save has failed so send a mean red bar to the user\n                this.props.actions.makeToast([{ message: \"Committee Save Failed\", type: \"failure\" }])\n                this.setState({ isSaving: false });\n            });\n    }\n\n    sortByVotingSequence() {\n        let members = [...this.state.members];\n        if (this.state.ascending) {\n            members.sort((a, b) => b.VotingSequence - a.VotingSequence);\n        } else {\n            members.sort((a, b) => a.VotingSequence - b.VotingSequence);\n        }\n\n        this.setState({\n            members: members,\n            ascending: !this.state.ascending\n        })\n    }\n\n    handleClose() {\n        this.props.history.goBack();\n    }\n\n    componentDidMount() {\n        const committeeId = this.props.match.params.subcommitteeid ? this.props.match.params.subcommitteeid : this.props.match.params.committeeid\n        const committeeParams = committeeId + '?isPublic=0';\n        this.props.actions.getPartnerCommitteeById(committeeParams)\n            .then(() => {\n                // Checking to see if keys exist and setting initial value if not\n                // otherwise react throws an error in the form fields\n                const commData = this.props.committee.partnerCommitteeByIdData\n                this.setState({\n                    selectedCommittee: {\n                        ...this.props.committee.partnerCommitteeByIdData,\n                        TwitterHandle: commData.TwitterHandle ? commData.TwitterHandle : '',\n                        TwitterEmail: commData.TwitterEmail ? commData.TwitterEmail : '',\n                        Description: commData.Description ? commData.Description : '',\n                        MeetingNote: commData.MeetingNote ? commData.MeetingNote : '',\n                        Abbreviation: commData.Abbreviation ? commData.Abbreviation : '',\n                        ServiceEndDate: commData.ServiceEndDate ? commData.ServiceEndDate : null\n                    },\n                    committeeLoaded: true\n                })\n                return commData\n            })\n            .then((commData) => {\n                // GET MEMBER ROLES FOR THE MEMBERSHIP DROPDOWN\n                this.props.actions.getCommitteeMemberRoles().then(() => {\n                    this.setState({\n                        committeeMemberRoles: commData.ChamberCode === 'H' ? this.props.members.committeeHouseRoles : this.props.members.committeeSenateRoles\n                    })\n                })\n                const chamberCode = 'chamberCode=' + commData.ChamberCode;\n\n                //Get members list and set it to the committeeMemberNames key\n                const organizeMembers = members => {\n                    if (members) {\n                        members.forEach(member => {\n                            member.label = member.MemberDisplayName;\n                            member.value = member.MemberID;\n                        });\n                        this.setState({\n                            committeeMemberNames: members\n                        })\n                    }\n                }\n\n                //Get the session list so the default session ID can be found\n                this.props.actions.getSessionList()\n                    .then(() => {\n                        let defaultSession = null;\n                        this.props.session.sessionList.forEach(session => {\n                            if (session.IsDefault) {\n                                defaultSession = '&sessionID=' + session.SessionID;\n                            }\n                        });\n                        //Get list of current members of committee\n                        this.props.actions.getMembersByCommittee(`isPublic=false&CommitteeID=${committeeId}${defaultSession}`, true)\n                            .then(() => {\n                                // Set the DisplaySequence to the correct order. It should be linear.\n                                let members = [...this.props.members.membersByCommittee];\n                                members.forEach((member, index) => member.DisplaySequence = index + 1)\n                                this.setState({\n                                    members: members,\n                                    membersLoaded: true\n                                });\n                            });\n                        if (this.props.match.params.subcommitteeid) {\n                            //Since this is a subcommittee get the name of the parent committee and put it in the form\n                            this.props.actions.getPartnerCommitteeById(`${this.props.match.params.committeeid}?IsPublic=0`).then(() => {\n                                const parentCommData = this.props.committee.partnerCommitteeByIdData;\n                                this.setState({\n                                    parentCommitteeName: parentCommData.Name\n                                });\n                            });\n                            //Also only include the list of members in the parent committee for the member list\n                            this.props.actions.getMembersByCommittee(`isPublic=false&CommitteeID=${this.props.match.params.committeeid}${defaultSession}`, true)\n                                .then(() => organizeMembers(this.props.members.membersByCommittee));\n                        } else {\n                            //If this is not a subcommittee then get the full member list\n                            this.props.actions.getMemberList(chamberCode + defaultSession)\n                                .then(() => organizeMembers(this.props.members.memberList));\n                        }\n                    })\n\n\n                // Get personnel list for staff and clerk dropdowns\n                this.props.actions.getPersonnelReferences('')\n                    .then(() => {\n                        const filteredStaffAndClerkReferences = this.props.personnel.personnelStaffReferences.concat(this.props.personnel.personnelClerkReferences).filter(personnel => personnel.OrganizationName && personnel.OrganizationName.toLowerCase() === (chamberCode === \"H\" ? \"house\" : \"senate\"))\n                        this.setState({\n                            personnelReferences: filteredStaffAndClerkReferences\n                        });\n                    });\n\n\n            });\n\n        // GET STAFF AND CLERK PERSONNEL BY COMMITTEE ID\n        const personnelParams = 'affiliationID=' + committeeId + '&isPublic=false';\n        this.props.actions.getPersonnelList(personnelParams)\n            .then(() => {\n                // Set the Sequence to the correct order. It should be linear.\n                let clerks = [];\n                let staff = [];\n                this.props.personnel.personnelClerkList.forEach((clerk, index) => clerks.push({ ...clerk, Sequence: index + 1 }));\n                this.props.personnel.personnelStaffList.forEach((staf, index) => staff.push({ ...staf, Sequence: index + 1 }));\n                this.setState({\n                    clerks: clerks,\n                    staff: staff,\n                    personnelLoaded: true\n                })\n            });\n        this.getSubcommittees();\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const {\n            Abbreviation,\n            ChamberCode,\n            CommitteeID,\n            CommitteeNumber,\n            Description,\n            ServiceBeginDate,\n            ServiceEndDate,\n            MeetingNote,\n            Name,\n            TwitterHandle,\n            TwitterEmail,\n            CommitteeFiles,\n            AgendaURL\n        } = this.state.selectedCommittee;\n\n        const { isSaving, committeeLoaded, personnelLoaded, membersLoaded, saved, isFormDirty } = this.state;\n\n        let filterStartDate = (date) => {\n            let result = true;            \n            if (moment(ServiceEndDate).isBefore(date, \"days\")) {\n                result = false;\n            }\n            return result;\n        }\n\n        let filterEndDate = (date) => {\n            let result = true;\n            if (date >= new Date()) {\n                result = false;\n            }\n            if (moment(ServiceBeginDate).isAfter(date, \"days\")) {\n                result = false;\n            }\n            return result;\n        }\n\n        if (!committeeLoaded || !personnelLoaded || !membersLoaded) {\n            return (<div>\n                <div className=\"center-spinner spinner\"></div>\n            </div>)\n        }\n        if (this.state.showPreview) {\n            return (\n                <div>\n                    <div className=\"flex-row\">\n                        <h2>Committee Management Review</h2>\n                        <ReactToPrint\n                            trigger={() => <a type=\"button\" className=\"button print\"> Print</a>}\n                            content={() => this.componentRef}\n                            pageStyle={\"break-inside: avoid\"}\n                        />\n                    </div>\n                    <div ref={el => (this.componentRef = el)}>\n                        <CommitteeDetailsComponent\n                            committeeData={this.state.selectedCommittee}\n                            clerkList={this.state.clerks}\n                            staffList={this.state.staff}\n                            memberList={this.state.members}\n                            memberRoles={this.state.committeeMemberRoles}\n                            subcommitteesList={this.state.subcommitteeData}\n                        />\n                    </div>\n                    <div className=\"button-bar\">\n                        <div></div>\n                        <div className=\"align-right\">\n                            <button onClick={this.togglePreview} className=\"button secondary\">Edit</button>\n                            <button\n                                onClick={() => this.handleSave(true)}\n                                disabled={isSaving || !saved}\n                                className=\"button\">Publish\n                            </button>\n                        </div>\n                    </div>\n                </div>)\n        } else {\n            return (\n                <React.Fragment>\n                    <div>\n                        <Prompt\n                            when={isFormDirty === true}\n                            message={`You have unsaved changes. Are you sure you would like to leave?`}\n                        />\n                    </div>\n                    <h1>{this.props.match.params.subcommitteeid ? 'Edit Subcommittee' : 'Edit Committee'} </h1>\n                    <div className=\"user-forms\" style={{ paddingBottom: this.props.match.params.subcommitteeid ? \"150px\" : \"75px\" }}>\n                        <div className=\"dlas-forms\">\n                            <form>\n                                <fieldset className={this.state.infoFieldsetIsActive ? 'fieldset-collapse fieldset-open' : 'fieldset-collapse fieldset-closed'} >\n                                    <legend onClick={this.toggleFieldsetCollapse.bind(this, 'infoFieldsetIsActive')}>{!this.props.match.params.subcommitteeid ? 'Committee Information' : 'Subcommittee Information'}</legend>\n                                    <div className={!this.props.match.params.subcommitteeid ? 'multi-row sixth-40-1 no-margin' : 'multi-row sixth-20-1 no-margin'}>\n                                        {this.props.match.params.subcommitteeid &&\n                                            <div>\n                                                <Fields.TextInput\n                                                    id=\"Name\"\n                                                    label=\"SubCommittee Name\"\n                                                    type=\"text\"\n                                                    placeholder=\"SubCommittee Name\"\n                                                    value={Name}\n                                                    onChange={(val) => this.handleChange(\"Name\", val.target.value)}\n                                                    onBlur={(val) => {\n                                                        if (!val.target.value) {\n                                                            this.setState({ committeeNameMissing: true });\n                                                        } else {\n                                                            this.setState({ committeeNameMissing: false });\n                                                        }\n                                                    }}\n                                                />\n                                                {this.state.committeeNameMissing && <div className=\"input-feedback\">Committee Name is required</div>}\n                                            </div>\n                                        }\n                                        <div>\n                                            <Fields.TextInput\n                                                id=\"Name\"\n                                                label=\"Committee Name\"\n                                                type=\"text\"\n                                                placeholder=\"Committee Name\"\n                                                value={this.props.match.params.subcommitteeid ? this.state.parentCommitteeName : Name}\n                                                onChange={(val) => this.handleChange(\"Name\", val.target.value)}\n                                                disabled={this.props.match.params.subcommitteeid}\n                                                onBlur={(val) => {\n                                                    if (!val.target.value) {\n                                                        this.setState({ committeeNameMissing: true });\n                                                    } else {\n                                                        this.setState({ committeeNameMissing: false });\n                                                    }\n                                                }}\n                                            />\n                                            {this.state.committeeNameMissing && !this.props.match.params.subcommitteeid && <div className=\"input-feedback\">Committee Name is required</div>}\n                                        </div>\n\n                                        <div>\n                                            <Fields.TextInput\n                                                id=\"Abbreviation\"\n                                                label=\"Abbreviation\"\n                                                type=\"text\"\n                                                placeholder=\"ABRV\"\n                                                value={Abbreviation}\n                                                onChange={(val) => this.handleChange(\"Abbreviation\", val.target.value)}\n                                            />\n                                        </div>\n                                        <div>\n                                            <label>Committee #</label>\n                                            <input type=\"text\" id=\"CommitteeNumber\" value={CommitteeNumber} disabled />\n                                        </div>\n                                        <div>\n                                            <label>Chamber</label>\n                                            <input type=\"text\" id=\"ChamberCode\" value={ChamberCode} disabled />\n                                        </div>\n                                        <div>\n                                            <label>Service Start Date</label>\n                                            <DatePicker\n                                                selected={ServiceBeginDate ? moment(ServiceBeginDate) : null}\n                                                onChange={(val) => this.handleDateChange(val, false)}\n                                                popperPlacement=\"top-start\"\n                                                placeholderText=\"Never\"\n                                                isClearable\n                                                filterDate={filterStartDate}\n                                            />\n                                        </div>\n                                        <div>\n                                            <label>Service End Date</label>\n                                            <DatePicker\n                                                selected={ServiceEndDate ? moment(ServiceEndDate) : null}\n                                                onChange={(val) => this.handleDateChange(val, true)}\n                                                popperPlacement=\"top-start\"\n                                                placeholderText=\"Never\"\n                                                isClearable\n                                                filterDate={filterEndDate}\n                                            />\n                                        </div>\n                                    </div>\n                                    <div className=\"single-row no-margin\">\n                                        <div>\n                                            <Fields.TextInput\n                                                id=\"MeetingNote\"\n                                                label=\"Meeting Notes\"\n                                                type=\"text\"\n                                                placeholder=\"Meeting Notes\"\n                                                value={MeetingNote}\n                                                onChange={(val) => this.handleChange(\"MeetingNote\", val.target.value)}\n                                            />\n                                        </div>\n                                    </div>\n                                        <div className=\"single-row no-margin\">\n                                            <div>\n                                                <Fields.TextInput\n                                                    id=\"AgendaURL\"\n                                                    label=\"Agenda URL\"\n                                                    type=\"text\"\n                                                    placeholder=\"Agenda URL\"\n                                                    value={AgendaURL}\n                                                    onChange={(val) => this.handleChange(\"AgendaURL\", val.target.value)}\n                                                />\n                                            </div>\n                                        </div>\n                                </fieldset>\n                                <fieldset className={this.state.clerkFieldsetIsActive ? 'fieldset-collapse fieldset-open' : 'fieldset-collapse fieldset-closed'}>\n                                    <legend onClick={this.toggleFieldsetCollapse.bind(this, 'clerkFieldsetIsActive')}>{!this.props.match.params.subcommitteeid ? 'Committee Clerk' : 'Subcommittee Clerk'}</legend>\n                                    <div className=\"draggable-grid comm-mgmt-clerk\">\n                                        <div>\n                                            <PersonnelDraggableComponent\n                                                onPersonnelChange={this.handleClerkChange}\n                                                items={this.state.clerks}\n                                                name=\"ClerkGrid\"\n                                                affiliation={this.props.match.params.subcommitteeid ? this.props.match.params.committeeid : this.props.match.params.committeeid}\n                                                dropdownData={this.state.personnelReferences}\n                                                staffRoleTypeID={1}\n                                            />\n                                        </div>\n                                    </div>\n                                </fieldset>\n                                <fieldset className={this.state.staffFieldsetIsActive ? 'fieldset-collapse fieldset-open' : 'fieldset-collapse fieldset-closed'}>\n                                    <legend onClick={this.toggleFieldsetCollapse.bind(this, 'staffFieldsetIsActive')}>{!this.props.match.params.subcommitteeid ? 'Committee Staff' : 'Subcommittee Staff'}</legend>\n                                    <div className=\"draggable-grid comm-mgmt-staff\">\n                                        <div>\n                                            <PersonnelDraggableComponent\n                                                onPersonnelChange={this.handleStaffChange}\n                                                items={this.state.staff}\n                                                name=\"StaffGrid\"\n                                                affiliation={this.props.match.params.subcommitteeid ? this.props.match.params.subcommitteeid : this.props.match.params.committeeid}\n                                                dropdownData={this.state.personnelReferences}\n                                                staffRoleTypeID={2}\n                                            />\n                                        </div>\n                                    </div>\n                                </fieldset>\n                                <fieldset className={this.state.membershipFieldsetIsActive ? 'fieldset-collapse fieldset-open' : 'fieldset-collapse fieldset-closed'}>\n                                    <legend onClick={this.toggleFieldsetCollapse.bind(this, 'membershipFieldsetIsActive')}>{!this.props.match.params.subcommitteeid ? 'Committee Membership' : 'Subcommittee Membership'}</legend>\n                                    <div className=\"draggable-grid comm-mgmt-staff\">\n                                        <div>\n                                            <MembersDraggableComponent\n                                                name=\"MembersGrid\"\n                                                affiliation={this.props.match.params.subcommitteeid ? this.props.match.params.subcommitteeid : this.props.match.params.committeeid}\n                                                dropdownDataRoles={this.state.committeeMemberRoles}\n                                                dropdownDataMembers={this.state.committeeMemberNames}\n                                                onMemberChange={this.handleMemberChange}\n                                                items={this.state.members}\n                                                isSubcommittee={this.props.match.params.subcommitteeid ? true : false}\n                                                sortByVotingSequence={this.sortByVotingSequence}\n                                                ascending={this.state.ascending}\n                                            />\n                                        </div>\n                                    </div>\n                                </fieldset>\n                                {!this.props.match.params.subcommitteeid &&\n                                    <fieldset className={this.state.subcommFieldsetIsActive ? 'fieldset-collapse fieldset-open' : 'fieldset-collapse fieldset-closed'}>\n                                        <legend onClick={this.toggleFieldsetCollapse.bind(this, 'subcommFieldsetIsActive')}>Subcommittee</legend>\n                                        <SubcommitteeManagementGrid\n                                            showCreateSuccess={this.state.showCreateSuccess}\n                                            showCreateFailure={this.state.showCreateFailure}\n                                            parentCommitteeID={CommitteeID}\n                                            parentCommitteeNumber={CommitteeNumber}\n                                            subcommitteeData={this.state.subcommitteeData}\n                                            isLoaded={this.state.subcommitteeIsLoaded}\n                                            subcommitteeMessage={this.state.subcommitteeMessage}\n                                            createSubcommittee={this.createSubcommittee}\n                                        />\n                                    </fieldset>\n                                }\n                                <div className=\"button-bar floating-button-bar\" style={{ paddingBottom: \"15px\", paddingRight: \"15px\" }}>\n                                    <button className=\"button secondary\" type=\"button\" onClick={() => this.handleClose()} style={{ width: \"100px\" }}>Close</button>\n                                    <div className=\"align-right\">\n                                        <button className=\"button\" onClick={() => this.handleSave(false)} type=\"button\" disabled={isSaving}>Save</button>\n                                        <button className=\"button\" type=\"button\" disabled={isSaving || !saved} onClick={this.togglePreview}>Preview</button>\n                                    </div>\n                                </div>\n                            </form>\n                        </div>\n                    </div>\n                </React.Fragment>\n            );\n        }\n    }\n};\n\nexport default connect(\n    (state) => {\n        const { session, committee, personnel, members, nav } = state;\n        return {\n            session,\n            committee,\n            personnel,\n            members,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, sessionActionCreators, committeeActionCreators, personnelActionCreators, memberActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(NewCommitteeFormComponent)\n\n\n\n\n\n\n\n\n","import React from 'react';\nimport { Route } from 'react-router';\nimport CommitteeManagementGrid from './lis-committee-grid';\nimport CommitteeManagementForm from './lis-committee-form'; \n\n\nclass CommitteeManagement extends React.Component {\n    render() {\n        return (\n            <div>\n                <Route exact path={this.props.match.path} component={CommitteeManagementGrid} />\n                <Route path={`${this.props.match.path}/edit-committee/:committeeid`} component={CommitteeManagementForm} />\n                <Route path={`${this.props.match.path}/edit-subcommittee/:committeeid/:subcommitteeid`} component={CommitteeManagementForm} />\n            </div>\n        )\n    }\n}\n\nexport default CommitteeManagement;","const emptyCache = (cache) => {\n    if ('caches' in window) {\n        caches.keys().then((names) => {\n            names.forEach(name => {\n                caches.delete(name);\n            })\n        });\n        window.location.reload(true);\n    }\n}\n\nexport default emptyCache","import { partnerRequest, publicRequest } from '../services/request.service'\nimport emptyCache from '../services/emptyCache';\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst getReferencesSuccess = \"GET_REFERENCES_SUCCESS\";\nconst getReferencesFailure = \"GET_REFERENCES_FAILURE\";\n\nconst getCalendarListSuccess = \"GET_CALENDAR_LIST_SUCCESS\";\nconst getCalendarListFailure = \"GET_CALENDAR_LIST_FAILURE\";\n\nconst createCalendarSuccess = \"CREATE_CALENDAR_SUCCESS\";\nconst createCalendarFailure = \"CREATE_CALENDAR_FAILURE\";\n\nconst saveCalendarSuccess = \"SAVE_CALENDAR_SUCCESS\";\nconst saveCalendarFailure = \"SAVE_CALENDAR_FAILURE\";\n\nconst saveCalendarFileSuccess = \"SAVE_CALENDAR_FILE_SUCCESS\";\nconst saveCalendarFileFailure = \"SAVE_CALENDAR_FILE_FAILURE\";\n\nconst getCalendarSuccess = \"GET_CALENDAR_SUCCESS\";\nconst getCalendarFailure = \"GET_CALENDAR_FAILURE\"\n\nconst getDocketListSuccess = \"GET_DOCKET_LIST_SUCCESS\";\nconst getDocketListFailure = \"GET_DOCKET_LIST_FAILURE\";\n\nconst createDocketSuccess = \"CREATE_DOCKET_SUCCESS\";\nconst createDocketFailure = \"CREATE_DOCKET_FAILURE\";\n\nconst saveDocketSuccess = \"SAVE_DOCKET_SUCCESS\";\nconst saveDocketFailure = \"SAVE_DOCKET_FAILURE\";\n\nconst docketByIdRequest = \"GET_DOCKET_BY_ID_REQUEST\";\nconst docketByIdSuccess = \"GET_DOCKET_BY_ID_SUCCESS\";\nconst docketByIdFailure = \"GET_DOCKET_BY_ID_FAILURE\";\n\nconst patronListDocketByIdRequest = \"GET_PATRON_LIST_DOCKET_BY_ID_REQUEST\";\nconst patronListDocketByIdSuccess = \"GET_PATRON_LIST_DOCKET_BY_ID_SUCCESS\";\nconst patronListDocketByIdFailure = \"GET_PATRON_LIST_DOCKET_BY_ID_FAILURE\";\n\nconst getCalendarCategoriesReferencesSuccess = \"GET_CALENDAR_CATEGORIES_REFERENCES_SUCCESS\";\nconst getCalendarCategoriesReferencesFailure = \"GET_CALENDAR_CATEGORIES_REFERENCES_FAILURE\";\n\nconst getCalendarAssignmentsSuccess = \"GET_CALENDAR_MAPPINGS_SUCCESS\";\nconst getCalendarAssignmentsFailure = \"GET_CALENDAR_MAPPINGS_FAILURE\";\n\nconst getAdminCalendarAssignmentsSuccess = \"GET_ADMIN_CALENDAR_MAPPINGS_SUCCESS\";\nconst getAdminCalendarAssignmentsFailure = \"GET_ADMIN_CALENDAR_MAPPINGS_FAILURE\";\n\nconst saveCalendarAssignmentSuccess = \"SAVE_CALENDAR_MAPPING_SUCCESS\";\nconst saveCalendarAssignmentFailure = \"SAVE_CALENDAR_MAPPING_FAILURE\";\n\nconst saveCalendarCurrentItemSuccess = \"SAVE_CALENDAR_CURRENT_ITEM_SUCCESS\";\nconst saveCalendarCurrentItemFailure = \"SAVE_CALENDAR_CURRENT_ITEM_FAILURE\";\n\nconst replacePdfRequest = \"REPLACE_PDF_REQUEST\";\n\nconst sendDocketHtmlRequest = \"SEND_HTML_REQUEST\";\n\nconst sendCalendarHtmlRequest = \"SEND_HTML_REQUEST\";\n\nconst initialState = {\n    references: [],\n    getReferencesError: '',\n    docketList: [],\n    getDocketListError: '',\n    calendarList: [],\n    calendarListError: '',\n    calendarCreate: '',\n    calendarCreateError: '',\n    calendarSave: '',\n    calendarSaveError: '',\n    calendarFileSave: '',\n    calendarFileSaveError: '',\n    calendarGet: '',\n    calendarGetError: '',\n    calendarCategoriesReferences: [],\n    calendarCategoriesReferencesError: '',\n    docketByIdData: '',\n    docketSave: '',\n    docketSaveError: '',\n    replacePdfResponse: '',\n    replacePdfError: '',\n    patronListDocketByIdData: '',\n    sendDocketHtmlError: '',\n    sendCalendarHtmlError: '',\n    sendDocketHtmlResponse: '',\n    sendCalendarHtmlResponse: '',\n    calendarAssignments: [],\n    getCalendarAssignmentsError: '',\n    adminCalendarAssignments: [],\n    getAdminCalendarAssignmentsError: '',\n    calendarAssignmentSave: [],\n    saveCalendarAssignmentsError: ''\n};\n\nexport const calendarActionCreators = {\n\n    // GET CALENDAR BY ID FOR DOCKET MANAGEMENT (W/ PARTNER AUTH)\n    requestDocketById: () => ({\n        type: docketByIdRequest,\n        isFetching: true\n    }),\n\n    receiveDocketById: responseObj => ({\n        type: docketByIdSuccess,\n        isFetching: false,\n        docketByIdData: responseObj\n    }),\n\n    docketByIdError: message => ({\n        type: docketByIdFailure,\n        isFetching: false,\n        message\n    }),\n\n    getDocketById: (params, partner) => {\n        return dispatch => {\n            dispatch(calendarActionCreators.requestDocketById());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            let request = '';\n            if (partner) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/GetPartnerDocketsByIdAsync', 'GET', headers, '', params)\n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/GetDocketsByIdAsync', 'GET', headers, '', params)\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(calendarActionCreators.docketByIdError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(calendarActionCreators.receiveDocketById(result[1].Dockets[0]))\n                        return result[1].Dockets[0];\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(calendarActionCreators.docketByIdError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    requestPatronListDocketById: () => ({\n        type: patronListDocketByIdRequest,\n        isFetching: true\n    }),\n\n    receivePatronListDocketById: responseObj => ({\n        type: patronListDocketByIdSuccess,\n        isFetching: false,\n        patronListDocketByIdData: responseObj\n    }),\n\n    patronListDocketByIdError: message => ({\n        type: patronListDocketByIdFailure,\n        isFetching: false,\n        message\n    }),\n\n    getPatronListDocketById: (params) => {\n        return dispatch => {\n            dispatch(calendarActionCreators.requestPatronListDocketById());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n\n            return partnerRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/GetCalendarPatronListAsync', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(calendarActionCreators.patronListDocketByIdError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(calendarActionCreators.receivePatronListDocketById(result[1].ListItems[0]))\n                        return result.ListItems;\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(calendarActionCreators.patronListDocketByIdError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveReferences: (responseObj) => ({\n        type: getReferencesSuccess,\n        references: responseObj\n    }),\n\n    getReferencesError: error => ({\n        type: getReferencesFailure,\n        getReferencesError: error\n    }),\n\n    getReferences: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/GetCalendarActionsReferenceAsync', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(calendarActionCreators.getReferencesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(calendarActionCreators.receiveReferences(result[1].CalendarActions))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(calendarActionCreators.receiveReferences([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveDocketList: (responseObj) => ({\n        type: getDocketListSuccess,\n        docketList: responseObj\n    }),\n\n    getDocketListError: error => ({\n        type: getDocketListFailure,\n        getDocketListError: error\n    }),\n\n    getDocketList: (params, partner) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            let request = '';\n            if (partner) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/GetDocketPartnerListAsync', 'GET', headers, '', params)\n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/GetDocketListAsync', 'GET', headers, '', params)\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(calendarActionCreators.getDocketListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(calendarActionCreators.receiveDocketList(result[1].Dockets))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(calendarActionCreators.receiveDocketList([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveDocketCreate: (responseObj) => ({\n        type: createDocketSuccess,\n        docketCreate: responseObj\n    }),\n\n    createDocketError: error => ({\n        type: createDocketFailure,\n        createDocketError: error\n    }),\n\n    createDocket: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/CreateDocketsAsync', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(calendarActionCreators.createDocketError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(calendarActionCreators.receiveDocketCreate(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(calendarActionCreators.createDocketError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveDocketSave: (responseObj) => ({\n        type: saveDocketSuccess,\n        docketSave: responseObj\n    }),\n\n    docketSaveError: error => ({\n        type: saveDocketFailure,\n        docketSaveError: error\n    }),\n\n    saveDocket: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/SaveDocketsAsync', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(calendarActionCreators.docketSaveError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        //If the response is an ID then the docket was deleted\n                        if (parseInt(result[1])) {\n                            dispatch(calendarActionCreators.receiveDocketSave(result[1]))\n                        } else {\n                            // Dispatch the success action                \n                            dispatch(calendarActionCreators.receiveDocketSave(result[1].Dockets[0] || result[1].HouseAgendas[0]))\n                        }\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(calendarActionCreators.docketSaveError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveCalendarCategoriesReferences: (responseObj, includeChairmansReportCategories) => ({\n        type: getCalendarCategoriesReferencesSuccess,\n        calendarCategoriesReferences: includeChairmansReportCategories ? responseObj.CalendarCategoryTypes : responseObj.CalendarCategoryTypes.filter(cc => cc.CategoryType !== 'Chairmans Report')\n    }),\n\n    getCalendarCategoriesReferencesError: error => ({\n        type: getCalendarCategoriesReferencesFailure,\n        getCalendarCategoriesReferencesError: error\n    }),\n\n    getCalendarCategoriesReferences: (params = '', includeChairmansReportCategories = false) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/GetCalendarCategoryTypesReferenceAsync', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(calendarActionCreators.getCalendarCategoriesReferencesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(calendarActionCreators.receiveCalendarCategoriesReferences(result[1], includeChairmansReportCategories))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(calendarActionCreators.getCalendarCategoriesReferencesError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveCalendarAssignments: (responseObj) => ({\n        type: getCalendarAssignmentsSuccess,\n        calendarAssignments: responseObj.CalendarAssignments\n    }),\n\n    getCalendarAssignmentsError: error => ({\n        type: getCalendarAssignmentsFailure,\n        getCalendarAssignmentsError: error\n    }),\n\n    getCalendarAssignments: () => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/GetCalendarAssignmentAsync', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(calendarActionCreators.getCalendarAssignmentsError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(calendarActionCreators.receiveCalendarAssignments(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(calendarActionCreators.getCalendarAssignmentsError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveAdminCalendarAssignments: (responseObj) => ({\n        type: getAdminCalendarAssignmentsSuccess,\n        adminCalendarAssignments: responseObj.CalendarAssignments\n    }),\n\n    getAdminCalendarAssignmentsError: error => ({\n        type: getAdminCalendarAssignmentsFailure,\n        getAdminCalendarAssignmentsError: error\n    }),\n\n    getAdminCalendarAssignments: () => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/GetAdminCalendarAssignmentAsync', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(calendarActionCreators.getAdminCalendarAssignmentsError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(calendarActionCreators.receiveAdminCalendarAssignments(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(calendarActionCreators.getAdminCalendarAssignmentsError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveCalendarAssignmentSave: (responseObj) => ({\n        type: saveCalendarAssignmentSuccess,\n        calendarAssignmentSave: responseObj\n    }),\n\n    saveCalendarAssignmentError: error => ({\n        type: saveCalendarAssignmentFailure,\n        saveCalendarAssignmentsError: error\n    }),\n\n    saveCalendarAssignment: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/SaveCalendarAssignmentAsync', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(calendarActionCreators.saveCalendarAssignmentError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(calendarActionCreators.receiveCalendarAssignmentSave(JSON.parse(result[1].Message)))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(calendarActionCreators.saveCalendarAssignmentError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveCalendarList: (responseObj) => ({\n        type: getCalendarListSuccess,\n        calendarList: responseObj,\n\n    }),\n\n    calendarListError: error => ({\n        type: getCalendarListFailure,\n        calendarListError: error\n    }),\n\n    getCalendarList: (params, partner) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            let request = '';\n            if (partner) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/GetCalendarPartnerListAsync', 'GET', headers, '', params);\n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/GetCalendarListAsync', 'GET', headers, '', params);\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(calendarActionCreators.calendarListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(calendarActionCreators.receiveCalendarList(result[1].Calendars))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(calendarActionCreators.receiveCalendarList([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveCalendarCreate: (responseObj) => ({\n        type: createCalendarSuccess,\n        calendarCreate: responseObj,\n    }),\n\n    createCalendarError: error => ({\n        type: createCalendarFailure,\n        calendarCreateError: error\n    }),\n\n    createCalendar: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/CreateCalendarAsync', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(calendarActionCreators.createCalendarError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        const createCalendarResponse = JSON.parse(result[1].Message);\n                        dispatch(calendarActionCreators.receiveCalendarCreate(createCalendarResponse[0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(calendarActionCreators.createCalendarError('No Content'))\n                        return Promise.reject('No Content')\n                    } else {\n                        dispatch(calendarActionCreators.createCalendarError('fail'));\n                        return Promise.reject('fail');\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveCalendarSave: (responseObj) => ({\n        type: saveCalendarSuccess,\n        calendarSave: responseObj\n    }),\n\n    calendarSaveError: error => ({\n        type: saveCalendarFailure,\n        calendarSaveError: error\n    }),\n\n    saveCalendar: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/SaveCalendarAsync', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(calendarActionCreators.calendarSaveError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        try {\n                            const saveCalendarResponse = JSON.parse(result[1].Message);\n                            dispatch(calendarActionCreators.receiveCalendarSave(saveCalendarResponse[0]));\n                        } catch {\n                            // Message does not contain json. \n                            dispatch(calendarActionCreators.receiveCalendarSave(result[1].Message));\n                        }\n                        // The calendar save can go fine but the failure message can contain information about the minutes save failing\n                        if (result[1].FailureMessage) {\n                            return result[1].FailureMessage;\n                        }\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(calendarActionCreators.calendarSaveError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveCalendarFileSave: (responseObj) => ({\n        type: saveCalendarFileSuccess,\n        calendarFileSave: responseObj\n    }),\n\n    calendarFileSaveError: error => ({\n        type: saveCalendarFileFailure,\n        calendarFileSaveError: error\n    }),\n\n    saveCalendarFile: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_CALENDAR_FILE_API_URL) + '/CalendarFileGeneration/api/ProcessCalendarFileAsync', 'GET', headers, '', params, true)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(calendarActionCreators.calendarFileSaveError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(calendarActionCreators.receiveCalendarFileSave(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(calendarActionCreators.calendarFileSaveError('No Content'))\n                        return Promise.reject('No Content')\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveCalendarById: responseObj => ({\n        type: getCalendarSuccess,\n        calendarGet: responseObj\n    }),\n\n    calendarGetError: message => ({\n        type: getCalendarFailure,\n        calendarGetError: message\n    }),\n\n    getCalendarById: (params, partner) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            let request = '';\n            if (partner) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/GetPartnerCalendarsByIdAsync', 'GET', headers, '', params)\n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/GetCalendarsByIdAsync', 'GET', headers, '', params)\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(calendarActionCreators.calendarGetError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(calendarActionCreators.receiveCalendarById(result[1].Calendars[0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(calendarActionCreators.calendarGetError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveCalendarCurrentItem: responseObj => ({\n        type: saveCalendarCurrentItemSuccess,\n        calendarCurrentItem: responseObj\n    }),\n\n    calendarCurrentItemError: message => ({\n        type: saveCalendarCurrentItemFailure,\n        calendarCurrentItemError: message\n    }),\n\n    saveCalendarCurrentItem: body => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/api/SaveCalendarCurrentItemAsync', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(calendarActionCreators.calendarCurrentItemError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        try {\n                            const response = JSON.parse(result[1].Message);\n                            dispatch(calendarActionCreators.receiveCalendarCurrentItem(response[0]))\n                        } catch {\n                            dispatch(calendarActionCreators.calendarCurrentItemError('Response malformed: ' + result[1]))\n                            return Promise.reject('Response malformed: ' + result[1])\n                        }\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(calendarActionCreators.calendarCurrentItemError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    replacePdf: (params, body) => {\n        return dispatch => {\n            const headers = {\n                'cache-control': 'no-cache'\n            }\n            let formData = new FormData();\n            formData.append('replacementPdfFile', body);\n            return partnerRequest((API_URL || process.env.REACT_APP_CALENDAR_FILE_API_URL) + '/CalendarFileGeneration/api/UploadReplacementCalendarFileAsync', 'POST', headers, formData, params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch({\n                            type: replacePdfRequest,\n                            replacePdfError: result[1]\n                        });\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch({\n                            type: replacePdfRequest,\n                            replacePdfResponse: result[1]\n                        });\n                        emptyCache();\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch({\n                            type: replacePdfRequest,\n                            replacePdfError: \"No Content\"\n                        });\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    sendDocketHtml: (body) => {\n        return dispatch => {\n            const headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n\n            return partnerRequest(\"https://apps.dlas.virginia.gov/senatevote/api/savedocketasync\", 'POST', headers, body, '')\n                .then(result => {\n                    dispatch({\n                        type: sendDocketHtmlRequest,\n                        sendDocketHtmlResponse: result\n                    });\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    sendCalendarHtml: (body) => {\n        return dispatch => {\n            const headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n\n            return partnerRequest(\"https://apps.dlas.virginia.gov/SenateVote/api/saveCalendarAsync\", 'POST', headers, body, '')\n                .then(result => {\n                    dispatch({\n                        type: sendCalendarHtmlRequest,\n                        sendCalendarHtmlResponse: result\n                    });\n                }).catch(err => Promise.reject(err))\n        }\n    }\n};\n\nexport const reducer = (state, action) => {\n    state = state || initialState;\n\n    switch (action.type) {\n        case docketByIdRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case docketByIdSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                docketByIdData: action.docketByIdData,\n                errorMessage: ''\n            });\n        case docketByIdFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.errorMessage\n            });\n        case patronListDocketByIdRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case patronListDocketByIdSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                patronListDocketByIdData: action.patronListDocketByIdData,\n                errorMessage: ''\n            });\n        case patronListDocketByIdFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.errorMessage\n            });\n        case getReferencesFailure:\n            return Object.assign({}, state, {\n                getReferencesError: action.getReferencesError\n            });\n        case getReferencesSuccess:\n            return Object.assign({}, state, {\n                references: action.references,\n                getReferencesError: ''\n            });\n        case getDocketListFailure:\n            return Object.assign({}, state, {\n                getDocketListError: action.getDocketListError\n            });\n        case getDocketListSuccess:\n            return Object.assign({}, state, {\n                docketList: action.docketList,\n                getDocketListError: ''\n            });\n        case createDocketFailure:\n            return Object.assign({}, state, {\n                docketCreateError: action.docketCreateError\n            });\n        case createDocketSuccess:\n            return Object.assign({}, state, {\n                docketCreate: action.docketCreate,\n                docketCreateError: ''\n            });\n        case saveDocketFailure:\n            return Object.assign({}, state, {\n                docketSaveError: action.docketSaveError\n            });\n        case saveDocketSuccess:\n            return Object.assign({}, state, {\n                docketSave: action.docketSave,\n                docketSaveError: ''\n            });\n        case getCalendarCategoriesReferencesFailure:\n            return Object.assign({}, state, {\n                getCalendarCategoriesReferencesError: action.getCalendarCategoriesReferencesError\n            });\n        case getCalendarCategoriesReferencesSuccess:\n            return Object.assign({}, state, {\n                calendarCategoriesReferences: action.calendarCategoriesReferences,\n                getCalendarCategoriesReferencesError: ''\n            });\n        case getCalendarAssignmentsFailure:\n            return Object.assign({}, state, {\n                getCalendarAssignmentsError: action.getCalendarAssignmentsError\n            });\n        case getCalendarAssignmentsSuccess:\n            return Object.assign({}, state, {\n                calendarAssignments: action.calendarAssignments,\n                getCalendarAssignmentsError: ''\n            });\n        case getAdminCalendarAssignmentsFailure:\n            return Object.assign({}, state, {\n                getAdminCalendarAssignmentsError: action.getAdminCalendarAssignmentsError\n            });\n        case getAdminCalendarAssignmentsSuccess:\n            return Object.assign({}, state, {\n                adminCalendarAssignments: action.adminCalendarAssignments,\n                getAdminCalendarAssignmentsError: ''\n            });\n        case saveCalendarAssignmentFailure:\n            return Object.assign({}, state, {\n                saveCalendarAssignmentsError: action.saveCalendarAssignmentsError\n            });\n        case saveCalendarAssignmentSuccess:\n            return Object.assign({}, state, {\n                calendarAssignmentSave: action.calendarAssignmentSave,\n                saveCalendarAssignmentsError: ''\n            });\n        case getCalendarListFailure:\n            return Object.assign({}, state, {\n                calendarListError: action.calendarListError\n            });\n        case getCalendarListSuccess:\n            return Object.assign({}, state, {\n                calendarList: action.calendarList,\n                calendarListError: ''\n            });\n        case createCalendarFailure:\n            return Object.assign({}, state, {\n                calendarCreateError: action.calendarCreateError\n            });\n        case createCalendarSuccess:\n            return Object.assign({}, state, {\n                calendarCreate: action.calendarCreate,\n                calendarCreateError: ''\n            });\n        case saveCalendarFailure:\n            return Object.assign({}, state, {\n                calendarSaveError: action.calendarSaveError\n            });\n        case saveCalendarSuccess:\n            return Object.assign({}, state, {\n                calendarSave: action.calendarSave,\n                calendarSaveError: ''\n            });\n        case saveCalendarFileFailure:\n            return Object.assign({}, state, {\n                calendarFileSaveError: action.calendarFileSaveError\n            });\n        case saveCalendarFileSuccess:\n            return Object.assign({}, state, {\n                calendarFileSave: action.calendarFileSave,\n                calendarFileSaveError: ''\n            });\n        case getCalendarFailure:\n            return Object.assign({}, state, {\n                calendarGetError: action.calendarGetError\n            });\n        case getCalendarSuccess:\n            return Object.assign({}, state, {\n                calendarGet: action.calendarGet,\n                calendarGetError: ''\n            });\n        case saveCalendarCurrentItemFailure:\n            return Object.assign({}, state, {\n                calendarCurrentItemError: action.calendarCurrentItemError\n            });\n        case saveCalendarCurrentItemSuccess:\n            return Object.assign({}, state, {\n                calendarCurrentItem: action.calendarCurrentItem,\n                calendarCurrentItemError: ''\n            });\n        case replacePdfRequest:\n            return Object.assign({}, state, {\n                replacePdfResponse: action.replacePdfResponse || state.replacePdfResponse,\n                replacePdfError: action.replacePdfError || ''\n            });\n        default:\n            return state;\n    }\n};\n","import { partnerRequest, publicRequest } from '../services/request.service'\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst scheduleListSuccess = 'SCHEDULE_LIST_SUCCESS';\nconst scheduleListFailure = 'SCHEDULE_LIST_FAILURE';\n\nconst scheduleTypeListSuccess = 'SCHEDULE_TYPE_LIST_SUCCESS';\nconst scheduleTypeListFailure = 'SCHEDULE_TYPE_LIST_FAILURE';\n\nconst scheduleGetSuccess = 'SCHEDULE_GET_SUCCESS';\nconst scheduleGetFailure = 'SCHEDULE_GET_FAILURE';\n\nconst scheduleSaveSuccess = 'SCHEDULE_SAVE_SUCCESS';\nconst scheduleSaveFailure = 'SCHEDULE_SAVE_FAILURE';\n\nconst scheduleCreateSuccess = 'SCHEDULE_CREATE_SUCCESS';\nconst scheduleCreateFailure = 'SCHEDULE_CREATE_FAILURE';\n\nconst meetingsCalendarPreviewSuccess = \"MEETINGS_CALENDAR_PREVIEW_SUCCESS\";\nconst meetingsCalendarPreviewFailure = \"MEETINGS_CALENDAR_PREVIEW_FAILURE\";\n\nconst getMeetingRoomReferencesSuccess = \"GET_MEETING_ROOM_REFERENCES_SUCCESS\";\nconst getMeetingRoomReferencesFailure = \"GET_MEETING_ROOM_REFERENCES_FAILURE\";\n\nconst subcommitteeMembersRequest = \"GET_SUBCOMMITTEE_MEMBERS_REQUEST\";\nconst subcommitteeMembersSuccess = \"GET_SUBCOMMITTEE_MEMBERS_SUCCESS\";\nconst subcommitteeMembersFailure = \"GET_SUBCOMMITTEE_MEMBERS_FAILURE\";\n\nconst uploadMeetingPdfSuccess = \"UPLOAD_MEETING_PDF_SUCCESS\";\nconst uploadMeetingPdfFailure = \"UPLOAD_MEETING_PDF_FAILURE\";\n\nconst initialState = {\n    scheduleList: [],\n    schedule: {},\n    scheduleListError: '',\n    scheduleTypeListError: '',\n    scheduleGetError: '',\n    scheduleSaveError: '',\n    scheduleCreateError: '',\n    meetingRoomReferences: [],\n    meetingRoomReferencesError: '',\n    meetingsCalendarPreview: '',\n    meetingsCalendarPreviewError: '',\n    subcommitteeMembers: '',\n    uploadMeetingPdf: '',\n    uploadMeetingPdfError: ''\n};\n\nexport const scheduleActionCreators = {\n\n    receiveScheduleList: (content) => ({\n        type: scheduleListSuccess,\n        scheduleList: content\n    }),\n\n    scheduleListError: (message) => ({\n        type: scheduleListFailure,\n        scheduleListError: message\n    }),\n\n    getScheduleList: (params, parter) => {\n        return dispatch => {\n            let request = \"\";\n            if (parter) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_SCHEDULE_API_URL) + '/Schedule/api/GetPartnerScheduleListAsync?', 'GET', '', '', params)\n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_SCHEDULE_API_URL) + '/Schedule/api/GetScheduleListAsync?', 'GET', '', '', params)\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(scheduleActionCreators.scheduleListError(result[1]));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(scheduleActionCreators.receiveScheduleList(result[1].Schedules));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(scheduleActionCreators.receiveScheduleList([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveScheduleTypeList: (content) => ({\n        type: scheduleTypeListSuccess,\n        scheduleTypeList: content\n    }),\n\n    scheduleTypeListError: (message) => ({\n        type: scheduleTypeListFailure,\n        scheduleTypeListError: message\n    }),\n\n    getScheduleTypeList: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_SCHEDULE_API_URL) + '/Schedule/api/GetScheduleTypesReferenceAsync?', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(scheduleActionCreators.scheduleTypeListError(result[1]));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(scheduleActionCreators.receiveScheduleTypeList(result[1].ScheduleTypes));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(scheduleActionCreators.receiveScheduleTypeList([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveSchedule: (content) => ({\n        type: scheduleGetSuccess,\n        schedule: content\n    }),\n\n    scheduleError: (message) => ({\n        type: scheduleGetFailure,\n        scheduleGetError: message\n    }),\n\n    getSchedule: (params) => {\n        return dispatch => {\n\n            return partnerRequest((API_URL || process.env.REACT_APP_SCHEDULE_API_URL) + '/Schedule/api/GetPartnerSchedulebyIdAsync?', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(scheduleActionCreators.scheduleError(result[1]));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(scheduleActionCreators.receiveSchedule(result[1].Schedules[0]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(scheduleActionCreators.receiveSchedule([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveScheduleSave: (message) => ({\n        type: scheduleSaveSuccess,\n        scheduleSave: message\n    }),\n\n    scheduleSaveError: (message) => ({\n        type: scheduleSaveFailure,\n        scheduleSaveError: message\n    }),\n\n    saveSchedule: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_SCHEDULE_API_URL) + '/Schedule/api/SaveScheduleAsync/', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(scheduleActionCreators.scheduleSaveError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(scheduleActionCreators.receiveScheduleSave(result[1]))\n                        return Promise.resolve(result[1])\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(scheduleActionCreators.receiveScheduleSave(\"\"))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveScheduleCreate: (message) => ({\n        type: scheduleCreateSuccess,\n        scheduleCreate: message\n    }),\n\n    scheduleCreateError: (message) => ({\n        type: scheduleCreateFailure,\n        scheduleCreateError: message\n    }),\n\n    createSchedule: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_SCHEDULE_API_URL) + '/Schedule/api/CreateScheduleAsync/', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(scheduleActionCreators.scheduleCreateError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(scheduleActionCreators.receiveScheduleCreate(result[1]))\n                        return Promise.resolve(result[1])\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(scheduleActionCreators.scheduleCreateError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveMeetingRoomReferences: (responseObj) => ({\n        type: getMeetingRoomReferencesSuccess,\n        meetingRoomReferences: responseObj\n    }),\n\n    getMeetingRoomReferencesError: error => ({\n        type: getMeetingRoomReferencesFailure,\n        getMeetingRoomReferencesError: error\n    }),\n\n    getMeetingRoomReferences: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_SCHEDULE_API_URL) + '/Schedule/api/GetMeetingRoomsReferenceAsync', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(scheduleActionCreators.getMeetingRoomReferencesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(scheduleActionCreators.receiveMeetingRoomReferences(result[1].MeetingRooms))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(scheduleActionCreators.getMeetingRoomReferencesError('No Content'))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveMeetingsCalendarPreview: (responseObj) => ({\n        type: meetingsCalendarPreviewSuccess,\n        meetingsCalendarPreview: responseObj\n    }),\n\n    getMeetingsCalendarPreviewError: error => ({\n        type: meetingsCalendarPreviewFailure,\n        getMeetingsCalendarPreviewError: error\n    }),\n\n    getMeetingsCalendarPreview: (params) => {\n        return dispatch => {\n            let config = {\n                method: 'GET',\n                headers: {\n                    \"Content-Type\": \"application/json; charset=utf-8\",\n                    \"authorization\": \"Bearer \" + localStorage.getItem('LIS_ID_TOKEN'),\n                    \"WebAPIKey\": process.env.REACT_APP_API_KEY\n                },\n            }\n\n            let url = (API_URL || process.env.REACT_APP_LEGISLATION_FILE_GEN_API_URL) + '/Schedule/api/PreviewSchedulePDF' + params;\n\n            return fetch(url, config)\n                .then(result => {\n                    if (result) {\n                        dispatch(scheduleActionCreators.receiveMeetingsCalendarPreview(result))\n                    } else if (!result) {\n                        dispatch(scheduleActionCreators.getMeetingsCalendarPreviewError('No Content'))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    requestSubcommitteeMembers: () => ({\n        type: subcommitteeMembersRequest,\n        isFetching: true\n    }),\n\n    receiveSubcommitteeMembers: (responseObj) => ({\n        type: subcommitteeMembersSuccess,\n        isFetching: false,\n        subcommitteeMembers: responseObj\n    }),\n\n    subcommitteeMembersError: message => ({\n        type: subcommitteeMembersFailure,\n        isFetching: false,\n        subcommitteeMembersError: message\n    }),\n\n    getSubcommitteeMembers: (params) => {\n        return dispatch => {\n            dispatch(scheduleActionCreators.requestSubcommitteeMembers());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n\n            return partnerRequest(API_URL + '/Schedule/api/GetPartnerScheduleSubcommitteeMemberListAsync', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(scheduleActionCreators.subcommitteeMembersError(result))\n                        return Promise.reject(result)\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(scheduleActionCreators.receiveSubcommitteeMembers(\"\"))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    } else if (result[1]) {\n                        // Dispatch the success action\n                        dispatch(scheduleActionCreators.receiveSubcommitteeMembers(result[1].SubcomitteeMembers))\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveUploadMeetingPdf: (responseObj) => ({\n        type: uploadMeetingPdfSuccess,\n        isFetching: false,\n        uploadMeetingPdf: responseObj\n    }),\n\n    uploadMeetingPdfError: message => ({\n        type: uploadMeetingPdfFailure,\n        isFetching: false,\n        uploadMeetingPdfError: message\n    }),\n\n    uploadMeetingPdf: (params, file) => {\n        return dispatch => {\n            let headers = {\n                'cache-control': 'no-cache'\n            }\n            let formData = new FormData();\n            formData.append('pdfFile', file);\n            return partnerRequest(API_URL + '/Schedule/api/UploadScheduleFileAsync', 'POST', headers, formData, params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(scheduleActionCreators.uploadMeetingPdfError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(scheduleActionCreators.receiveUploadMeetingPdf([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    } else if (result[1]) {\n                        // Dispatch the success action\n                        dispatch(scheduleActionCreators.receiveUploadMeetingPdf(result[1]))\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    }\n};\n\nexport const reducer = (state, action) => {\n\n    state = state || initialState;\n    switch (action.type) {\n        case scheduleListSuccess:\n            return Object.assign({}, state, {\n                scheduleList: action.scheduleList,\n                scheduleListError: ''\n            })\n        case scheduleListFailure:\n            return Object.assign({}, state, {\n                scheduleListError: action.scheduleListError\n            })\n        case scheduleTypeListSuccess:\n            return Object.assign({}, state, {\n                scheduleTypeList: action.scheduleTypeList,\n                scheduleTypeListError: ''\n            })\n        case scheduleTypeListFailure:\n            return Object.assign({}, state, {\n                scheduleTypeListError: action.scheduleTypeListError\n            })\n        case scheduleGetSuccess:\n            return Object.assign({}, state, {\n                schedule: action.schedule,\n                scheduleGetError: ''\n            })\n        case scheduleGetFailure:\n            return Object.assign({}, state, {\n                scheduleGetError: action.scheduleGetError\n            })\n        case scheduleSaveSuccess:\n            return Object.assign({}, state, {\n                scheduleSaveSuccess: action.scheduleSave,\n                scheduleSaveError: ''\n            })\n        case scheduleSaveFailure:\n            return Object.assign({}, state, {\n                scheduleSaveError: action.scheduleSaveError\n            })\n        case scheduleCreateSuccess:\n            return Object.assign({}, state, {\n                scheduleCreateSuccess: action.scheduleCreate,\n                scheduleCreateError: ''\n            })\n        case scheduleCreateFailure:\n            return Object.assign({}, state, {\n                scheduleCreateError: action.scheduleCreateError\n            })\n        case meetingsCalendarPreviewSuccess:\n            return Object.assign({}, state, {\n                meetingsCalendarPreview: action.meetingsCalendarPreview,\n                meetingsCalendarPreviewError: ''\n            });\n        case meetingsCalendarPreviewFailure:\n            return Object.assign({}, state, {\n                meetingsCalendarPreviewError: action.meetingsCalendarPreviewError\n            });\n        case getMeetingRoomReferencesFailure:\n            return Object.assign({}, state, {\n                getMeetingRoomReferencesError: action.getMeetingRoomReferencesError\n            });\n        case getMeetingRoomReferencesSuccess:\n            return Object.assign({}, state, {\n                meetingRoomReferences: action.meetingRoomReferences,\n                getMeetingRoomReferencesError: ''\n            });\n        case subcommitteeMembersRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case subcommitteeMembersSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                subcommitteeMembers: action.subcommitteeMembers,\n                errorMessage: ''\n            });\n        case subcommitteeMembersFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.message\n            });\n        case uploadMeetingPdfSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                uploadMeetingPdf: action.uploadMeetingPdf,\n                uploadMeetingPdfError: ''\n            });\n        case uploadMeetingPdfFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                uploadMeetingPdfError: action.uploadMeetingPdfError\n            });\n        default:\n            return state\n    }\n};","import React from 'react';\nimport ReactTable from \"react-table\";\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport * as Fields from '../../../lis-shared/lis-layout/components/lis-forms-component';\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { calendarActionCreators } from '../../../stores/lis-calendar-store';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\nimport { connect } from 'react-redux';\nimport moment from 'moment-timezone';\nimport DatePicker from \"react-datepicker\";\nimport { cancelRequest } from '../../../services/request.service';\nimport { scheduleActionCreators } from '../../../stores/lis-schedule-store';\n\nclass DocketGrid extends React.Component {\n    constructor(props) {\n        super(props)\n        this.state = {\n            isLoaded: false,\n            sessionOptions: [],\n            committeeOptions: [],\n            subcommitteeOptions: [],\n            docketList: [],\n            docketDate: moment().utc().startOf('day').hour(16).minute(30),\n            showCreateSuccess: false,\n            createFailureMessage: '',\n            isAdding: false,\n            showDeleteModal: false,\n            docketToDeleteIndex: \"\"\n        }\n\n        this.getCommittees = this.getCommittees.bind(this);\n        this.getSubcommittees = this.getSubcommittees.bind(this);\n        this.getDockets = this.getDockets.bind(this);\n        this.createDocket = this.createDocket.bind(this);\n        this.deleteDocket = this.deleteDocket.bind(this);\n        this.checkDeleteDocket = this.checkDeleteDocket.bind(this);\n        this.cancelDeleteDocket = this.cancelDeleteDocket.bind(this);\n\n        this.handleDateChange = this.handleDateChange.bind(this);\n        this.handleSessionSelectChange = this.handleSessionSelectChange.bind(this);\n        this.handleCommitteeSelectChange = this.handleCommitteeSelectChange.bind(this);\n        this.handleSubcommitteeSelectChange = this.handleSubcommitteeSelectChange.bind(this);\n    }\n\n    handleSessionSelectChange(value) {\n        //The session selectors value has been changed. Remove the committee and subcommittee selections as their dropdown options are going to change\n        const newState = {\n            selectedSession: value,\n            selectedCommittee: '',\n            selectedSubcommittee: ''\n        };\n        this.props.handleDropdownChange(newState, () => {\n            this.props.history.push(`/docket-management`);\n            //Get the new list of committees that belong to the selected session\n            this.getCommittees(value);\n        });\n        this.setState({\n            docketList: []\n        });\n    }\n\n    handleCommitteeSelectChange(value) {\n        //A committee has been selected. Remove the selected subcommittee because the sucommittee dropdown options are going to change\n        const newState = {\n            selectedCommittee: value,\n            selectedSubcommittee: ''\n        };\n        this.props.handleDropdownChange(newState, () => {\n            this.props.history.push(`/docket-management/${value.CommitteeID}`);\n            //Get the new list of available subcommittees\n            this.getSubcommittees(value.CommitteeID);\n            //Get the dockets for the committee to be displayed in the grid\n            this.getDockets();\n        });\n    }\n\n    handleSubcommitteeSelectChange(value) {\n        const newState = {\n            selectedSubcommittee: value || ''\n        };\n        this.props.handleDropdownChange(newState, () => {\n            this.getDockets();\n        });\n    }\n\n    handleDateChange(value) {\n        if (value) {\n            //Default docket/schedule to 4:30pm\n            value.utc().startOf('day').hour(16).minute(30);\n        }\n        //Used when inserting a new docket\n        this.setState({\n            docketDate: value\n        });\n    }\n\n    createDocket() {\n        if (this.props.selectedSession && this.props.selectedCommittee) {\n            this.setState({\n                isAdding: true\n            }, () => {\n                const committeeId = this.props.selectedSubcommittee ? this.props.selectedSubcommittee.CommitteeID : this.props.selectedCommittee.CommitteeID;\n                let createDocketObj = {\n                    Dockets: [{\n                        DocketDate: this.state.docketDate,\n                        IsPublic: false,\n                        DocketType: \"Committee\",\n                        DocketTypeID: 2,\n                        ChamberCode: this.props.selectedCommittee.ChamberCode,\n                        CommitteeID: committeeId,\n                        SessionID: this.props.selectedSession.SessionID,\n                        VoteRoomID: 1,\n                        Schedules: [\n                            {\n                                ScheduleDate: this.state.docketDate,\n                                ScheduleTypeID: 6\n                            }\n                        ]\n                    }]\n                };\n                this.props.actions.createDocket(createDocketObj)\n                    .then(() => {\n                        this.setState({ showCreateSuccess: true });\n                        this.getDockets(committeeId)\n                        setTimeout(() => {\n                            this.setState({\n                                showCreateSuccess: false,\n                                isAdding: false,\n                                createFailureMessage: ''\n                            })\n                        }, 3000);\n                    }).catch(err => {\n                        if (err === 'Aborted') {\n                            return;\n                        }\n                        this.setState({\n                            createFailureMessage: this.props.calendar.docketCreateError\n                        });\n                        setTimeout(() => {\n                            this.setState({\n                                showCreateSuccess: false,\n                                isAdding: false,\n                                createFailureMessage: ''\n                            })\n                        }, 3000);\n                    });\n            });\n        } else {\n            this.setState({\n                createFailureMessage: \"Please select a committee\"\n            });\n            setTimeout(() => {\n                this.setState({\n                    createFailureMessage: '',\n                });\n            }, 3000);\n        }\n    }\n\n    deleteDocket(rowIndex) {\n        this.setState({\n            docketBeingDeleted: rowIndex\n        });\n        // Get docket to be deleted\n        this.props.actions.getDocketById('?docketId=' + this.state.docketList[rowIndex].DocketID, true)\n            .then(() => {\n                let docketData = this.props.calendar.docketByIdData;\n                docketData.DocketCategories.forEach(x => x.DocketItems.forEach(y => y.IsActive = false));\n                docketData.DeletionDate = moment();\n\n                docketData.Schedules.forEach(x => x.DeletionDate = moment());\n                let params = {\n                    Schedules: docketData.Schedules\n                };\n                this.props.actions.saveSchedule(params)\n\n                return this.props.actions.saveDocket({ Dockets: [docketData] })\n            }).then(() => {\n                this.setState({\n                    showDeleteSuccess: true,\n                    docketBeingDeleted: -1,\n                    showDeleteModal: false,\n                    docketToDeleteIndex: \"\"\n                });\n                this.getDockets();\n                setTimeout(() => {\n                    this.setState({\n                        showDeleteSuccess: false\n                    })\n                }, 3000);\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    docketBeingDeleted: -1,\n                    deleteFailureMessage: 'Docket failed to be deleted',\n                    showDeleteModal: false,\n                    docketToDeleteIndex: \"\"\n                });\n                console.log(err)\n                setTimeout(() => {\n                    this.setState({\n                        deleteFailureMessage: '',\n                    });\n                }, 3000);\n            });\n    }\n\n    checkDeleteDocket(docketIndex) {\n        this.setState({\n            showDeleteModal: true,\n            docketToDeleteIndex: docketIndex\n        })\n    }\n\n    cancelDeleteDocket() {\n        this.setState({\n            showDeleteModal: false,\n            docketToDeleteIndex: \"\"\n        })\n    }\n\n    componentDidMount() {\n        let selectedSession = this.props.selectedSession;\n        this.props.actions.getSessionList().then(() => {\n            //Format data for dropdown\n            const sessionList = [...this.props.session.sessionList];\n            sessionList.forEach(session => {\n                session.value = session.SessionID;\n                session.label = session.SessionYear + ' ' + session.DisplayName;\n                // Select default session if one is not already selected\n                if (session.IsDefault && !selectedSession) {\n                    selectedSession = session;\n                }\n            });\n            this.setState({\n                sessionOptions: sessionList.reverse()\n            });\n            const newState = {\n                selectedSession: selectedSession,\n            }\n            this.props.handleDropdownChange(newState, () => {\n                //Checks to see if the committeeId is in the url, if so then get the subcommittees for that committee if one has not already been selected\n                let committeeId = parseInt(this.props.match.params.committeeid, 10);\n                if (this.props.selectedCommittee) {\n                    this.getCommittees(selectedSession, this.props.selectedCommittee.CommitteeID);\n                    this.getSubcommittees(this.props.selectedCommittee.CommitteeID);\n                } else if (!isNaN(committeeId)) {\n                    this.getCommittees(selectedSession, committeeId);\n                    this.getSubcommittees(committeeId);\n                } else {\n                    this.getCommittees(selectedSession)\n                }\n            });\n        });\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    getCommittees(session, committeeId) {\n        //Get the committee list based off the session data\n        this.props.actions.getCommitteeList('sessionID=' + session.SessionID)\n            .then(() => {\n                // If the user is a senate user then only show the senate committees\n                // If the user is a house user then only show the house committees\n                // If the user is both then show all committees\n                let committees = [...this.props.committee.committeeList]\n                let filteredCommittees = [];\n                committees.forEach(committee => {\n                    if (committee.ChamberCode === 'S') {\n                        committee.label = committee.Name;\n                        committee.value = committee.CommitteeID;\n                        if (committee.CommitteeID === committeeId) {\n                            this.getSubcommittees(committeeId);\n                            this.props.handleDropdownChange({ selectedCommittee: committee }, () => {\n                                // Don't want to get the dockets for the parent committee if a subcommittee is selected.\n                                if (!this.props.selectedSubcommittee) {\n                                    this.getDockets();\n                                }\n                            })\n                        }\n                        filteredCommittees.push(committee);\n                    }\n                });\n\n                this.setState({\n                    committeeOptions: filteredCommittees,\n                    isLoaded: true\n                });\n            });\n    }\n\n    getSubcommittees(committeeId) {\n        let listParams = 'sessionID=' + this.props.selectedSession.SessionID + '&parentCommitteeID=' + committeeId\n        this.props.actions.getCommitteeList(listParams)\n            .then(() => {\n                let committees = [...this.props.committee.committeeList]\n                committees.forEach(committee => {\n                    committee.label = committee.Name;\n                    committee.value = committee.CommitteeID;\n                    if (this.props.selectedSubcommittee.CommitteeID === committee.CommitteeID) {\n                        this.getDockets();\n                    }\n                });\n                this.setState({\n                    subcommitteeOptions: committees\n                });\n            });\n    }\n\n    getDockets() {\n        const { selectedSession, selectedCommittee, selectedSubcommittee } = this.props;\n        this.setState({\n            isLoaded: false\n        });\n        //Get the dockets\n        let committeeId = selectedSubcommittee ? selectedSubcommittee.CommitteeID : selectedCommittee.CommitteeID;\n        const docketParams = \"?sessionID=\" + selectedSession.SessionID + \"&chamberCode=\" + selectedCommittee.ChamberCode + \"&committeeID=\" + committeeId + \"&isPublic=false\";\n        //The second parameter lets the store know to use the partner request instead of the public\n        this.props.actions.getDocketList(docketParams, true)\n            .then(() => {\n                this.setState({\n                    isLoaded: true,\n                    docketList: this.props.calendar.docketList\n                });\n            });\n    }\n\n    render() {\n        return (\n            <div>\n                {this.state.showDeleteModal &&\n                    <div className='schedule-modal'>\n                        <div className='schedule-modal-content'>\n                            <div className='grid-wrapper two'>\n                                <div className='inner-grid eight-one-and-one'>\n                                    <span>Are you sure you want to delete docket {moment(this.state.docketList[this.state.docketToDeleteIndex].DocketDate).format(\"MM/DD/YYYY\") + (this.state.docketList[this.state.docketToDeleteIndex].DocketNumber > 1 ? \" (\" + this.state.docketList[this.state.docketToDeleteIndex].DocketNumber + \")\" : \"\")}?</span>\n                                    {this.state.docketBeingDeleted === this.state.docketToDeleteIndex\n                                        ? <div className=\"small-spinner\"></div>\n                                        : <button className='button primary' onClick={() => this.deleteDocket(this.state.docketToDeleteIndex)}>Yes</button>\n                                    }\n                                    <button className='button secondary' onClick={() => this.cancelDeleteDocket()}>No</button>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                }\n                <div className=\"header-half\">\n                    <h1>Docket Management</h1>\n                </div>\n\n                <div className=\"toolbar inner-grid four\">\n                    <div>\n                        <Fields.Dropdown\n                            value={this.props.selectedSession}\n                            options={this.state.sessionOptions}\n                            id=\"sessionDropdown\"\n                            onChange={this.handleSessionSelectChange}\n                        />\n                    </div>\n                    <div>\n                        <Fields.Dropdown\n                            value={this.props.selectedCommittee}\n                            placeholder=\"Committee\"\n                            options={this.state.committeeOptions}\n                            id=\"committeeDropdown\"\n                            onChange={this.handleCommitteeSelectChange}\n                        />\n                    </div>\n                    <div>\n                        <Fields.Dropdown\n                            value={this.props.selectedSubcommittee}\n                            placeholder=\"Subcommittee?\"\n                            options={this.state.subcommitteeOptions}\n                            id=\"subcommitteeDropdown\"\n                            isClearable\n                            onChange={this.handleSubcommitteeSelectChange}\n                        />\n                    </div>\n                </div>\n                <ReactTable\n                    resizable={false}\n                    data={this.state.docketList}\n                    loading={!this.state.isLoaded}\n                    ref={r => this.reactTable = r}\n                    columns={[\n                        {\n                            Header: 'Dockets',\n                            width: 'auto',\n                            sortable: false,\n                            filterable: false,\n                            columns: [\n                                {\n                                    headerClassName: \"docket-datepicker-container\",\n                                    accessor: \"DocketDate\",\n                                    sortable: false,\n                                    Header: (\n                                        <div className=\"dlas-forms datepicker-container\">\n                                            {!this.state.showCreateSuccess && !this.state.createFailureMessage && !this.state.showDeleteSuccess && !this.state.deleteFailureMessage &&\n                                                <DatePicker\n                                                    className=\"dnd-field\"\n                                                    selected={this.state.docketDate}\n                                                    onChange={this.handleDateChange}\n                                                    placeholderText=\"Docket Date\"\n                                                />\n                                            }\n                                            {this.state.showCreateSuccess &&\n                                                <span className=\"insert-message\">Docket was created successfully!</span>\n                                            }\n                                            {this.state.createFailureMessage &&\n                                                <span className=\"insert-message fail\">{this.state.createFailureMessage}</span>\n                                            }\n                                            {this.state.showDeleteSuccess &&\n                                                <span className=\"insert-message\">Docket was deleted successfully!</span>\n                                            }\n                                            {this.state.deleteFailureMessage &&\n                                                <span className=\"insert-message fail\">{this.state.deleteFailureMessage}</span>\n                                            }\n                                        </div>\n                                    ),\n\n                                    Cell: ({ original }) => {\n                                        return <span>{moment(original.DocketDate).format(\"MM/DD/YYYY\")}{original.DocketNumber > 1 ? ` (${original.DocketNumber})` : ''}</span>\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            Header: 'Actions',\n                            headerClassName: \"submit-action\",\n                            sortable: false,\n                            filterable: false,\n                            columns: [\n                                {\n                                    Header: () => {\n                                        return <span><button className=\"button\" onClick={this.createDocket} disabled={this.state.isAdding}>Create</button></span>\n                                    },\n                                    headerClassName: \"header-action\",\n                                    accessor: \"action\",\n                                    sortable: false,\n                                    className: \"action-column\",\n                                    width: 90,\n                                    Cell: row => {\n                                        if (this.state.docketBeingDeleted === row.index) {\n                                            return (\n                                                <div className=\"small-spinner\"></div>\n                                            )\n                                        }\n                                        return (\n                                            <div className=\"committee-action-column-two\">\n                                                <Link to={`/docket-management/${row.original.CommitteeID}/edit-docket/${row.original.DocketID}`} className=\"icon edit\"></Link>\n                                                {row.original.IsPublic\n                                                    ? <Link target=\"_blank\" to={`/session-details/${row.original.SessionCode}/committee-information/${this.props.selectedSubcommittee ? this.props.selectedSubcommittee.CommitteeNumber : this.props.selectedCommittee.CommitteeNumber}/dockets/${row.original.DocketID}`} className=\"icon book\"></Link>\n                                                    : <span onClick={() => this.checkDeleteDocket(row.index)} className=\"icon delete\"></span>\n                                                }\n                                            </div>\n                                        );\n                                    }\n                                }\n                            ]\n                        }\n                    ]}\n                    defaultPageSize={15}\n                    pageSizeOptions={[5, 10, 15, 20, 25, 50, 100]}\n                    className=\"committee-table -striped -highlight\"\n                />\n                <br />\n\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { committee, session, calendar, login } = state;\n        return {\n            committee,\n            session,\n            calendar,\n            login\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, committeeActionCreators, sessionActionCreators, calendarActionCreators, authActionCreators, scheduleActionCreators), dispatch)\n        }\n    }\n)(DocketGrid)","import React from \"react\";\nimport { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';\nimport Select from \"react-select\";\nimport { Link } from 'react-router-dom';\n\nconst getItemStyle = (isDragging, draggableStyle, pendingDeletion) => ({\n    userSelect: 'none',\n    background: isDragging ? '#34495e' : 'white',\n    color: isDragging ? 'white' : '#34495e',\n    border: pendingDeletion ? 'red' : 'none',\n    ...draggableStyle\n});\n\nconst getListStyle = isDraggingOver => ({\n    background: isDraggingOver ? '#8b9fb3' : '#666666',\n    width: '100%'\n});\n\nclass CommitteeBillsGrid extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            lastCheckedBills: [],\n            showAuxBillForm: false,\n            auxBill: \"\",\n            savingAuxBill: false\n        }\n\n        this.toggleRow = this.toggleRow.bind(this);\n        this.toggleBill = this.toggleBill.bind(this);\n        this.toggleBillBulk = this.toggleBillBulk.bind(this);\n        this.onDragEnd = this.onDragEnd.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n        this.toggleEdit = this.toggleEdit.bind(this);\n        this.saveChange = this.saveChange.bind(this);\n        this.toggleAuxBillAdd = this.toggleAuxBillAdd.bind(this);\n        this.addAuxBill = this.addAuxBill.bind(this);\n        this.setAuxBill = this.setAuxBill.bind(this);\n    }\n\n    toggleRow(LegislationID, categorySequence, e) {\n        //the categories array is split up in the view into non-legislative and active/inactive sections.\n        //So to find the correct array item to update the category's and item's Sequence property is used\n        let categories = [...this.props.categories];\n        const catIndex = categories.findIndex(category => category.Sequence === categorySequence);\n        let items = categories[catIndex].DocketItems;\n        let itemIndex = items.findIndex(bill => bill.LegislationID === LegislationID);\n\n        let lastCheckedBills = this.state.lastCheckedBills;\n        let lastCheckedBill = lastCheckedBills[categorySequence];\n        if (e.nativeEvent.shiftKey && !isNaN(lastCheckedBill) && lastCheckedBill !== -1) {\n            for (let i = 0; i < Math.abs(itemIndex - lastCheckedBill); i++) {\n                const index = lastCheckedBill + i * (itemIndex - lastCheckedBill) / Math.abs(itemIndex - lastCheckedBill);\n                items[index].checked = true;\n            }\n        } else {\n            lastCheckedBill = itemIndex;\n        }\n\n        items[itemIndex].checked = !items[itemIndex].checked;\n        this.props.updateDocket(categories);\n\n        lastCheckedBills[categorySequence] = lastCheckedBill;\n        this.setState({\n            lastCheckedBills: lastCheckedBills\n        });\n    }\n\n    toggleBill(legislationID, categorySequence) {\n        let categories = [...this.props.categories];\n        const catIndex = categories.findIndex(category => category.Sequence === categorySequence);\n        let items = categories[catIndex].DocketItems;\n        const itemIndex = items.findIndex(bill => bill.LegislationID === legislationID);\n\n        //Check the IsActive before setting it to see if we're going from inactive to active.\n        //If so then assign the sequence as the last sequence in the category.\n        //Otherwise remove the sequence and resequence existing included items from 1\n        if (items[itemIndex].IsActive) {\n            items[itemIndex].Sequence = null;\n            items[itemIndex].IsActive = false;\n            let sequence = 1;\n            for (let i = 0; i < items.length; i++) {\n                if (items[i].IsActive === true) {\n                    items[i].Sequence = sequence;\n                    sequence = sequence + 1;\n                }\n            }\n        } else {\n            items[itemIndex].IsActive = true;\n            //insert the newly included bill alphabetically\n            const nextHighestActiveLegislationNumber = items.filter(i => i.IsActive && i.Sequence).find(i => i.LegislationNumber.substr(0, 2).localeCompare(items[itemIndex].LegislationNumber.substr(0, 2)) === 1 || (i.LegislationNumber.substr(0, 2).localeCompare(items[itemIndex].LegislationNumber.substr(0, 2)) === 0 && i.LegislationKey > items[itemIndex].LegislationKey));\n            if (nextHighestActiveLegislationNumber) {\n                const sequence = nextHighestActiveLegislationNumber.Sequence\n                items.filter(i => i.IsActive && i.Sequence >= nextHighestActiveLegislationNumber.Sequence).forEach(i => i.Sequence++)\n                items[itemIndex].Sequence = sequence;\n            } else {\n                const currentSequences = items.filter(i => i.Sequence).map(i => { return i.Sequence; });\n                if (currentSequences.length) {\n                    items[itemIndex].Sequence = (Math.max.apply(Math, currentSequences) + 1) || 1;\n                } else {\n                    items[itemIndex].Sequence = 1;\n                }\n            }\n        }\n\n        items[itemIndex].checked = false;\n        //Must resort on the Sequence to prevent the index-based reordering in onDragEnd from breaking after bills are included or unincluded\n        items.sort((a, b) => (a.Sequence != null ? a.Sequence : Infinity) - (b.Sequence != null ? b.Sequence : Infinity))\n\n        this.props.updateDocket(categories);\n    }\n\n    toggleBillBulk(activate) {\n        let categories = [...this.props.categories];\n        categories.forEach(category => {\n            category.DocketItems.forEach(bill => {\n                if (bill.checked) {\n                    bill.IsActive = activate;\n                    bill.checked = false;\n\n                    if (activate) {\n                        //insert the newly included bill alphabetically\n                        const nextHighestActiveLegislationNumber = category.DocketItems.filter(i => i.IsActive && i.Sequence).find(i => i.LegislationNumber.substr(0, 2).localeCompare(bill.LegislationNumber.substr(0, 2)) === 1 || (i.LegislationNumber.substr(0, 2).localeCompare(bill.LegislationNumber.substr(0, 2)) === 0 && i.LegislationKey > bill.LegislationKey));\n                        if (nextHighestActiveLegislationNumber) {\n                            const sequence = nextHighestActiveLegislationNumber.Sequence\n                            category.DocketItems.filter(i => i.IsActive && i.Sequence >= nextHighestActiveLegislationNumber.Sequence).forEach(i => i.Sequence++)\n                            bill.Sequence = sequence;\n                        } else {\n                            const currentSequences = category.DocketItems.filter(i => i.Sequence).map(i => { return i.Sequence; });\n                            if (currentSequences.length) {\n                                bill.Sequence = (Math.max.apply(Math, currentSequences) + 1) || 1;\n                            } else {\n                                bill.Sequence = 1;\n                            }\n                        }\n                    } else {\n                        bill.Sequence = null;\n                        let sequence = 1;\n                        for (let i = 0; i < category.DocketItems.length; i++) {\n                            if (category.DocketItems[i].IsActive === true) {\n                                category.DocketItems[i].Sequence = sequence;\n                                sequence = sequence + 1;\n                            }\n                        }\n                    }\n                }\n            });\n\n            //Must resort on the Sequence to prevent the index-based reordering in onDragEnd from breaking after bills are included or unincluded\n            category.DocketItems.sort((a, b) => (a.Sequence != null ? a.Sequence : Infinity) - (b.Sequence != null ? b.Sequence : Infinity))\n        });\n\n        this.props.updateDocket(categories);\n    }\n\n    onDragEnd(result, categorySequence) {\n        // dropped outside the list\n        if (!result.destination) {\n            return;\n        }\n        // Only active bills can be dragged\n        let categories = [...this.props.categories];\n        const catIndex = categories.findIndex(category => category.Sequence === categorySequence);\n        let items = categories[catIndex].DocketItems;\n        items.sort((a, b) => (a.Sequence != null ? a.Sequence : Infinity) - (b.Sequence != null ? b.Sequence : Infinity))\n        let [removed] = items.splice(result.source.index, 1);\n        items.splice(result.destination.index, 0, removed);\n\n        // Reorder the Sequence value too because the sequence value is used to show what order the preview is in\n        items.forEach(function (element, index) {\n            if (element.IsActive) {\n                element.Sequence = index + 1;\n            }\n        });\n\n        //Send the new values up to the parent to be set in the parent's state\n        this.props.updateDocket(categories);\n    }\n\n    toggleEdit(categorySequence, legislationID) {\n        let categories = [...this.props.categories];\n        const catIndex = categories.findIndex(category => category.Sequence === categorySequence);\n        let items = categories[catIndex].DocketItems;\n        const itemIndex = items.findIndex(bill => bill.LegislationID === legislationID);\n        //This key is used to tell the DOM whether to display an input or a span\n        items[itemIndex].isEditing = !items[itemIndex].isEditing;\n        //Create a key called newDescription that will hold the text that  the user types in\n        items[itemIndex].newDescription = items[itemIndex].Description;\n        this.props.updateDocket(categories);\n    }\n\n    handleChange(categorySequence, legislationID, e) {\n        let categories = [...this.props.categories];\n        const catIndex = categories.findIndex(category => category.Sequence === categorySequence);\n        let items = categories[catIndex].DocketItems;\n        const itemIndex = items.findIndex(bill => bill.LegislationID === legislationID);\n        items[itemIndex].newDescription = e.target.value;\n        this.props.updateDocket(categories);\n    }\n\n    saveChange(categorySequence, legislationID) {\n        //Turn input back into span\n        let categories = [...this.props.categories];\n        const catIndex = categories.findIndex(category => category.Sequence === categorySequence);\n        let items = categories[catIndex].DocketItems;\n        const itemIndex = items.findIndex(bill => bill.LegislationID === legislationID);\n        items[itemIndex].isEditing = false;\n        // since the user saved changes they probably want to add it to the docket\n        items[itemIndex].IsActive = true;\n        //Set description to the text that the user has typed in. If new description is null then set it to the current description\n        items[itemIndex].Description = items[itemIndex].newDescription;\n        this.props.updateDocket(categories);\n    }\n\n    toggleAuxBillAdd() {\n        this.setState({\n            showAuxBillForm: !this.state.showAuxBillForm,\n            auxBill: ''\n        })\n    }\n\n    setAuxBill(value) {\n        this.setState({\n            auxBill: value\n        })\n    }\n\n    addAuxBill() {\n        this.setState({\n            savingAuxBill: true\n        }, () => {\n            this.props.getBill(this.state.auxBill.LegislationID, this.state.auxBill.LegislationKey);\n\n            this.setState({\n                savingAuxBill: false,\n                auxBill: '',\n                showAuxBillForm: false\n            })\n        })\n    }\n\n    render() {\n        const notesCategories = this.props.categories.filter(category => !category.IsLegislationCategory);\n        const categories = this.props.categories.filter(category => category.IsLegislationCategory);\n        const docketBills = categories.flatMap(c => c.DocketItems.map(d => d.LegislationNumber));\n        return (\n            <div className=\"drag-container\">\n                <div className=\"inner-grid three-and-two\" style={{ gap: '50px' }}>\n                    <div>\n                        <button type=\"button\" className=\"button m-right\" onClick={() => this.toggleBillBulk(false)} >Remove from Docket</button>\n                        <button type=\"button\" className=\"button m-right\" onClick={() => this.toggleBillBulk(true)} >Add to Docket</button>\n                        <div style={{ display: 'inline-block' }}>\n                            <label htmlFor=\"allActive\">Select All Active</label>\n                            <input type=\"checkbox\" name=\"allActive\" checked={this.props.selectAllActive} onChange={() => this.props.toggleAllActive(true)} />\n                            <label htmlFor=\"allInActive\">Select All Inactive</label>\n                            <input type=\"checkbox\" name=\"allInActive\" checked={this.props.selectAllInactive} onChange={() => this.props.toggleAllActive(false)} />\n                        </div>\n                    </div>\n                    {this.state.showAuxBillForm\n                        ?\n                        <div style={{ display: \"grid\", gridTemplateRows: \"1fr 1fr\", marginTop: \"6px\" }}>\n                            <div className=\"inner-grid\" style={{ gridTemplateColumns: \"25px 1fr\" }}>\n                                <a className=\"icon delete\" onClick={this.toggleAuxBillAdd} />\n                                <span style={{ fontSize: \"14px\" }}>This form may be used to add any bill in the session to this docket. Use with caution.</span>\n                            </div>\n                            <div className=\"inner-grid\" style={{ gridTemplateColumns: \"1fr 150px\" }}>\n                                <Select\n                                    options={this.props.sessionBills.filter(bill => !docketBills.includes(bill.LegislationNumber))}\n                                    onChange={this.setAuxBill}\n                                    isSearchable={true}\n                                />\n                                <button type=\"button\" className=\"button\" onClick={this.addAuxBill} disabled={this.state.savingAuxBill}>Add Bill to List</button>\n                            </div>\n                        </div>\n                        :\n                        <a className=\"icon warning\" onClick={this.toggleAuxBillAdd} style={{ marginTop: \"6px\" }} />\n                    }\n                </div>\n                {notesCategories.map((category, categoryIndex) => {\n                    const dataActive = category.DocketItems.filter(note => note.IsActive);\n                    const dataInactive = category.DocketItems.filter(note => !note.IsActive);\n                    return (<DragDropContext key={categoryIndex} onDragEnd={(result) => this.onDragEnd(result, category.Sequence)}>\n                        <Droppable droppableId=\"droppable1\">\n                            {(provided, snapshot) => (\n                                <table\n                                    className=\"dnd-grid-table margin dockets-agenda-notes-grid\"\n                                    ref={provided.innerRef}\n\n                                >\n                                    <thead className=\"dnd-grid-header\" style={getListStyle(snapshot.isDraggingOver)}>\n                                        <tr>\n                                            <th scope=\"col\" id={'-grabber-column'}></th>\n                                            <th scope=\"col\" id={'-display-column'}></th>\n                                            <th scope=\"col\" id={'-sequence-column'}>\n                                            </th>\n                                            <th scope=\"col\" id={'-bill-column'}>Notes</th>\n                                            <th scope=\"col\">Status</th>\n                                            <th scope=\"col\" id={'-actions-column'}>Action</th>\n                                        </tr>\n                                    </thead>\n                                    <tbody>\n                                        {dataActive.map((item, index) => (\n                                            <Draggable key={index} draggableId={\"notes\" + index} index={index}>\n                                                {(provided, snapshot) => (\n                                                    <tr\n                                                        ref={provided.innerRef}\n                                                        {...provided.draggableProps}\n                                                        {...provided.dragHandleProps}\n                                                        className={item.IsActive ? 'selected' : 'not-selected'}\n                                                        style={getItemStyle(\n                                                            snapshot.isDragging,\n                                                            provided.draggableProps.style\n                                                        )}>\n                                                        <td><button id={item.LegislationNumber + '-grabber-button'} className=\"button draggable\">Drag and drop</button></td>\n                                                        <td>{index + 1}</td>\n                                                        <td>\n                                                            <input\n                                                                type=\"checkbox\"\n                                                                className=\"checkbox\"\n                                                                checked={item.checked || ''}\n                                                                onChange={(e) => this.toggleRow(item.LegislationID, category.Sequence, e)} />\n                                                        </td>\n                                                        <td>\n                                                            {item.isEditing ?\n                                                                <div style={{ width: '100%' }}>\n                                                                    <div className=\"bill-grid-actions\">\n                                                                        <button onClick={() => this.saveChange(category.Sequence, item.LegislationID)} type=\"button\" className=\"icon save float-right\"></button>\n                                                                        <button onClick={() => this.toggleEdit(category.Sequence, item.LegislationID)} type=\"button\" className=\"icon delete float-right\"></button>\n                                                                    </div>\n                                                                    <div>\n                                                                        <textarea value={item.newDescription || item.Description} style={{ resize: 'vertical', width: '75%' }} cols=\"2\" onChange={(e) => this.handleChange(category.Sequence, item.LegislationID, e)}></textarea>\n                                                                    </div>\n                                                                </div>\n                                                                :\n                                                                <div style={{ width: '100%' }}>\n                                                                    <span>{item.Description || item.LegislationDescription}</span>\n                                                                    <button onClick={() => this.toggleEdit(category.Sequence, item.LegislationID)} type=\"button\" className=\"icon edit float-right\"></button>\n                                                                </div>\n                                                            }\n                                                        </td>\n                                                        <td>\n                                                            <span className=\"message-success\">Included</span>\n                                                        </td>\n                                                        <td>\n                                                            <div onClick={() => this.toggleBill(item.LegislationID, category.Sequence)} className=\"toggle-switch\">\n                                                                <input id=\"sr-status-change\" checked={item.IsActive} type=\"checkbox\" />\n                                                                <span className=\"slider\"></span>\n                                                            </div>\n                                                        </td>\n                                                    </tr>\n                                                )}\n                                            </Draggable>\n                                        ))}\n                                        {provided.placeholder}\n                                        {dataInactive.map((item, index) => (\n                                            <tr key={index} className=\"tr-inactive\">\n                                                <td></td>\n                                                <td>{/* index + 1 */}</td>\n                                                <td>\n                                                    <input\n                                                        type=\"checkbox\"\n                                                        className=\"checkbox\"\n                                                        checked={item.checked || ''}\n                                                        onChange={(e) => this.toggleRow(item.LegislationID, category.Sequence, e)} />\n                                                </td>\n                                                <td>\n                                                    {item.isEditing ?\n                                                        <div style={{ width: '100%' }}>\n                                                            <div className=\"bill-grid-actions\">\n                                                                <button onClick={() => this.saveChange(category.Sequence, item.LegislationID)} type=\"button\" className=\"icon save float-right\"></button>\n                                                                <button onClick={() => this.toggleEdit(category.Sequence, item.LegislationID)} type=\"button\" className=\"icon delete float-right\"></button>\n                                                            </div>\n                                                            <div>\n                                                                <textarea value={item.newDescription || item.Description} style={{ resize: 'vertical', width: '75%' }} cols=\"2\" onChange={(e) => this.handleChange(category.Sequence, item.LegislationID, e)}></textarea>\n                                                            </div>\n                                                        </div>\n                                                        :\n                                                        <div style={{ width: '100%' }}>\n                                                            <span>{item.Description || item.LegislationDescription}</span>\n                                                            <button onClick={() => this.toggleEdit(category.Sequence, item.LegislationID)} type=\"button\" className=\"icon edit float-right\"></button>\n                                                        </div>\n                                                    }\n                                                </td>\n                                                <td>\n                                                    <span>Not Included</span>\n                                                </td>\n                                                <td>\n                                                    <div onClick={() => this.toggleBill(item.LegislationID, category.Sequence)} className=\"toggle-switch\">\n                                                        <input id=\"sr-status-change\" checked={item.IsActive} type=\"checkbox\" />\n                                                        <span className=\"slider\"></span>\n                                                    </div>\n                                                </td>\n                                            </tr>\n                                        ))}\n                                    </tbody>\n                                </table>\n                            )}\n                        </Droppable>\n                    </DragDropContext>)\n                })}\n\n                {categories.map((category, categoryIndex) => {\n                    const dataActive = category.DocketItems.filter(bill => bill.IsActive);\n                    const dataInactive = category.DocketItems.filter(bill => !bill.IsActive);\n                    return (<DragDropContext key={categoryIndex} onDragEnd={(result) => this.onDragEnd(result, category.Sequence)}>\n                        <Droppable droppableId=\"droppable\">\n                            {(provided, snapshot) => (\n                                <table\n                                    className=\"dnd-grid-table margin dockets-agenda-grid\"\n                                    ref={provided.innerRef}\n\n                                >\n                                    <thead className=\"dnd-grid-header\" style={getListStyle(snapshot.isDraggingOver)}>\n                                        <tr>\n                                            <th scope=\"col\" id={'-grabber-column'}></th>\n                                            <th scope=\"col\" id={'-display-column'}></th>\n                                            <th scope=\"col\" id={'-sequence-column'}>\n                                            </th>\n                                            <th scope=\"col\" id={'-bill-column'}>Bill #</th>\n                                            <th scope=\"col\" id={'-patron-column'}>Patron</th>\n                                            <th scope=\"col\" id={'-caption-column'}>Caption</th>\n                                            <th scope=\"col\">Status</th>\n                                            <th scope=\"col\" id={'-actions-column'}>Action</th>\n                                        </tr>\n                                    </thead>\n                                    <tbody>\n                                        {dataActive.map((item, index) => (\n                                            <Draggable key={index} draggableId={\"bills\" + index} index={index}>\n                                                {(provided, snapshot) => (\n                                                    <tr\n                                                        ref={provided.innerRef}\n                                                        {...provided.draggableProps}\n                                                        {...provided.dragHandleProps}\n                                                        className={item.IsActive ? 'selected' : 'not-selected'}\n                                                        style={getItemStyle(\n                                                            snapshot.isDragging,\n                                                            provided.draggableProps.style\n                                                        )}>\n                                                        <td><button id={item.LegislationNumber + '-grabber-button'} className=\"button draggable\">Drag and drop</button></td>\n                                                        <td>{index + 1}</td>\n                                                        <td>\n                                                            <input\n                                                                type=\"checkbox\"\n                                                                className=\"checkbox\"\n                                                                checked={item.checked || ''}\n                                                                onChange={(e) => this.toggleRow(item.LegislationID, category.Sequence, e)} />\n                                                        </td>\n                                                        <td>\n                                                            <Link to={`/bill-details/${this.props.sessionCode}/${item.LegislationNumber}`} target=\"_blank\" rel=\"noreferrer\">{item.LegislationNumber}</Link>\n                                                        </td>\n                                                        <td>\n                                                            {item.Patrons[0] && item.Patrons[0].PatronDisplayName}\n                                                        </td>\n                                                        <td>\n                                                            {item.LegislationDescription}\n                                                        </td>\n                                                        <td>\n                                                            <span className=\"message-success\">Included</span>\n                                                        </td>\n                                                        <td>\n                                                            <div onClick={() => this.toggleBill(item.LegislationID, category.Sequence)} className=\"toggle-switch\">\n                                                                <input id=\"sr-status-change\" checked={item.IsActive} type=\"checkbox\" />\n                                                                <span className=\"slider\"></span>\n                                                            </div>\n                                                        </td>\n                                                    </tr>\n                                                )}\n                                            </Draggable>\n                                        ))}\n                                        {provided.placeholder}\n                                        {dataInactive.map((item, index) => (\n                                            <tr key={index} className=\"tr-inactive\">\n                                                <td></td>\n                                                <td>{/* index + 1 */}</td>\n                                                <td>\n                                                    <input\n                                                        type=\"checkbox\"\n                                                        className=\"checkbox\"\n                                                        checked={item.checked || ''}\n                                                        onChange={(e) => this.toggleRow(item.LegislationID, category.Sequence, e)} />\n                                                </td>\n                                                <td className=\"new-container\">\n                                                    <Link to={`/bill-details/${this.props.sessionCode}/${item.LegislationNumber}`} target=\"_blank\" rel=\"noreferrer\" style={{ color: 'inherit' }}>{item.LegislationNumber}</Link>\n                                                    {!item.DocketItemID && !item.HouseAgendaItemID &&\n                                                        <span className=\"corner-new\">NEW</span>\n                                                    }\n                                                </td>\n                                                <td>\n                                                    {item.Patrons[0] && item.Patrons[0].PatronDisplayName}\n                                                </td>\n                                                <td>\n                                                    {item.LegislationDescription}\n                                                </td>\n                                                <td>\n                                                    <span>Not Included</span>\n                                                </td>\n                                                <td>\n                                                    <div onClick={() => this.toggleBill(item.LegislationID, category.Sequence)} className=\"toggle-switch\">\n                                                        <input id=\"sr-status-change\" checked={item.IsActive} type=\"checkbox\" />\n                                                        <span className=\"slider\"></span>\n                                                    </div>\n                                                </td>\n                                            </tr>\n                                        ))}\n                                    </tbody>\n                                </table>\n                            )}\n                        </Droppable>\n                    </DragDropContext>)\n                })}\n            </div>\n        );\n    }\n}\n\nexport default CommitteeBillsGrid;","import React from 'react';\nimport renderHTML from 'react-render-html';\nimport moment from 'moment-timezone';\nimport { Link } from 'react-router-dom';\n\n\nconst Docket = props => {\n    const patronList = props.docket.Patrons.map((patron, index) => {\n        return (<React.Fragment key={patron.MemberID}>{patron.PatronDisplayName}{index !== props.docket.Patrons.length - 1 && \", \"}</React.Fragment>)\n    });\n    return (\n        <div>\n            <div className=\"details-header parent-li\" style={{ display: \"inline-flex\" }}>\n                <h4 className=\"bilnum\"><Link to={`/bill-details/${props.data.SessionCode}/${props.docket.LegislationNumber}`} target=\"_blank\" rel=\"noreferrer\">{props.docket.LegislationNumber}</Link>{!props.hideCaption && \" - \" + props.docket.LegislationDescription}</h4>\n            </div>\n            <div className=\"list-desc\">\n                <div className=\"bold\">\n                    {!props.hidePatron &&\n                        patronList.length > 1\n                        ? <p className=\"patalt\">Patrons: {patronList}</p>\n                        : !props.hidePatron && <p className=\"patalt\">Patron: {patronList}</p>\n                    }\n                </div>\n                <div style={{ marginBottom: '10px' }}>\n                    {!props.hideSummary &&\n                        <React.Fragment>\n                            {props.docket.Summary ? renderHTML(props.docket.Summary) : ''}\n                        </React.Fragment>\n                    }\n                </div>\n                <div>\n                    {!props.hideTitle &&\n                        <p>{props.docket.DraftTitle ? renderHTML(props.docket.DraftTitle) : ''}</p>\n                    }\n                </div>\n                <div>\n                    {!props.hideLDNumber &&\n                        <p className=\"ldrt\">{props.docket.LDNumber}</p>\n                    }\n                </div>\n            </div>\n        </div>\n    )\n}\n\nclass DocketDetailsComponent extends React.Component {\n    render() {\n        const { data, session } = this.props;\n        const categories = data.DocketCategories || data.HouseAgendaCategories;\n        const clerks = data.Staff.filter(obj => obj.StaffRoleTypeID === 1);\n        const staff = data.Staff.filter(obj => obj.StaffRoleTypeID === 2);\n        const committeeHeader = (data.ChamberCode === \"S\" ? \"Senate\" : \"House\") + \" Committee \" + (data.ParentCommitteeName\n            ? data.ParentCommitteeName === \"Judiciary\"\n                ? \"on the \" + data.ParentCommitteeName\n                : data.ParentCommitteeName === \"Courts of Justice\"\n                    ? \"for \" + data.ParentCommitteeName\n                    : \"on \" + data.ParentCommitteeName\n            : data.CommitteeName === \"Judiciary\"\n                ? \"on the \" + data.CommitteeName\n                : data.CommitteeName === \"Courts of Justice\"\n                    ? \"for \" + data.CommitteeName\n                    : \"on \" + data.CommitteeName\n        );\n        const subcommitteeHeader = data.ParentCommitteeName && \"Subcommittee on \" + data.CommitteeName;\n        const sessionHeader = session.SessionYear + \" \" + session.DisplayName;\n        const memberNames = data.CommitteeMember.map((member, index) => {\n            //Display Co-chair instead of Chair if there is more than one chairman on the committee\n            return (<React.Fragment key={member.MemberID}>\n                {data.CommitteeMember.length === 1 ? \"Chair: \" : \"Co-Chair: \"} {member.MemberDisplayName}{index !== data.CommitteeMember.length - 1 && \", \"}\n            </React.Fragment>);\n        });\n        const clerkNames = clerks.map((clerk, index) => {\n            //Display Co-chair instead of Chair if there is more than one chairman on the committee\n            return (<React.Fragment key={clerk.StaffID}>\n                {clerk.FullName}{index !== clerks.length - 1 && \", \"}\n            </React.Fragment>);\n        });\n        const staffNames = staff.map((staf, index) => {\n            //Display Co-chair instead of Chair if there is more than one chairman on the committee\n            return (<React.Fragment key={staf.StaffID}>\n                {staf.FullName}{index !== staff.length - 1 && \", \"}\n            </React.Fragment>);\n        });\n        return (\n            <div className=\"bill-theme public-details inner-grid docket-details-wrapper\">\n                <div>\n                    <h2>{sessionHeader}</h2>\n                </div>\n                <hr />\n                <div>\n                    <div className=\"details-header parent-li\">\n                        <h3 className=\"center\">{committeeHeader}</h3>\n                    </div>\n                    {subcommitteeHeader &&\n                        <div className=\"details-header parent-li\">\n                            <h3 className=\"center\">{subcommitteeHeader}</h3>\n                        </div>\n                    }\n                    <div className=\"list-desc\">\n                        <p>{memberNames}</p>\n                        <br />\n                        {!this.props.hideClerk &&\n                            <p className=\"i0\">{clerks.length === 1 ? \"Clerk: \" : \"Clerks: \"} {clerkNames}</p>\n                        }\n                        {!this.props.hideStaff && staffNames.length > 0 &&\n                            <p className=\"i0\">Staff: {staffNames}</p>\n                        }\n                        {data.Schedules.map((schedule, scheduleIndex) =>\n                            <React.Fragment key={scheduleIndex}>\n                                <p className=\"i0\">Date of Meeting: {moment(data.DocketDate).format(\"MM/DD/YYYY\")}</p>\n                                {schedule.ScheduleTime && <p className=\"i0\">{\"Time: \" + schedule.ScheduleTime}</p>}\n                                <p className=\"i0\">Room: {schedule.RoomDescription ? schedule.RoomDescription : \"None\"}</p>\n                                <p className=\"i0\" style={{ whiteSpace: 'pre-wrap' }}>Comments: {schedule.Comments ? schedule.Comments : \"None\"}</p>\n                            </React.Fragment>\n                        )}\n                    </div>\n                </div>\n                {categories.map((category, categoryIndex) => {\n                    let items = category.DocketItems || category.HouseAgendaItems;\n                    items = items.filter(item => item.IsActive);\n                    if (category.IsLegislationCategory) {\n                        return (\n                            <div key={categoryIndex}>\n                                {items.length > 0 && items.map(item => <Docket key={item.LegislationID} docket={item} {...this.props} />)}\n                            </div>\n                        );\n                    } else {\n                        return (\n                            <div>\n                                {items.length > 0 &&\n                                    <React.Fragment>\n                                        <div className=\"details-header parent-li\">\n                                            <h4>Notes</h4>\n                                        </div>\n                                        {items.map((item, index) =>\n                                            <div key={index}>\n                                                <div className=\"list-desc\">\n                                                    <div>\n                                                        <p>{item.Description}</p>\n                                                    </div>\n                                                </div>\n                                            </div>\n                                        )}\n                                    </React.Fragment>\n                                }\n                            </div>);\n                    }\n                })}\n            </div>\n        )\n    }\n}\n\nexport default DocketDetailsComponent;\n","import React from 'react';\nimport moment from 'moment-timezone';\nimport ReactToPrint from 'react-to-print';\n\nclass DocketPatronList extends React.Component {\n    constructor(props) {\n        super(props);\n    }\n\n    render() {\n        return (\n            <div>\n                <ReactToPrint\n                    trigger={() => <span><button style={{ float: \"right\" }} type=\"button\" className=\"button print\">Print</button></span>}\n                    content={() => this.componentRef}\n                    pageStyle={\"break-inside: avoid\"}\n                />\n                <div style={{ paddingBottom: \"40px\" }} ref={el => (this.componentRef = el)}>\n                    <h3>{this.props.patronListDocketData.CommitteeName}</h3>\n                    <p>{moment(this.props.patronListDocketData.CalendarDate).format(\"MMMM Do YYYY\")}</p>\n                    {this.props.patronListDocketData.IsPublic ? <p>Published</p> : <p className=\"dirty\">Not Published</p>}\n                    <hr />\n                    {this.props.patronListDocketData && this.props.patronListDocketData.Patrons.map((patron, i) => {\n                        return (\n                            <div style={{ marginTop: \"20px\", marginBottom: \"20px\" }} key={i}>\n                                <span>\n                                    {patron.PatronDisplayName} -\n                                    {patron.Legislation && patron.Legislation.map((item, j) => {\n                                        return (\n                                            <span> {j < patron.Legislation.length - 1 ? item.LegislationNumber + \", \" : item.LegislationNumber}</span>\n                                        )\n                                    })}\n                                </span>\n                            </div>\n                        )\n                    })}\n                </div>\n                <div className=\"button-bar floating-button-bar\" style={{ paddingBottom: \"15px\", paddingRight: \"15px\" }}>\n                    <button onClick={() => this.props.togglePatronList()} className=\"button\" type=\"button\" style={{ width: \"175px\" }}>Return to Docket Form</button>\n                    <div />\n                </div>\n            </div>\n        )\n    }\n}\n\nexport default DocketPatronList;","import React from 'react';\nimport * as Fields from '../../../lis-shared/lis-layout/components/lis-forms-component';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport ReactToPrint from \"react-to-print\";\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\nimport { calendarActionCreators } from '../../../stores/lis-calendar-store';\nimport CommitteeBillsGrid from './lis-committee-bills-grid';\nimport DocketDetailsComponent from '../../../lis-shared/lis-dockets/lis-docket-details'\nimport DocketPatronList from './lis-docket-patron-list';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { scheduleActionCreators } from '../../../stores/lis-schedule-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport moment from 'moment-timezone';\nimport DatePicker from 'react-datepicker';\nimport { billActionCreators } from '../../../stores/lis-legislation-store';\nimport { Prompt } from 'react-router';\n\nconst PUBLISH_DOCKET = true;\nconst UNPUBLISH_DOCKET = false;\nconst SAVE_DOCKET = false;\n\nconst TIME_REGEX = /[0-9]:[0-9]{2}\\s[AP]M/i;\n\nclass DocketFormComponent extends React.Component {\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            isLoaded: false,\n            data: '',\n            categories: [],\n            selectAllActive: false,\n            selectAllInactive: false,\n            showPreview: false,\n            isSaving: false,\n            pendingSave: false,\n            committeeClerk: [],\n            committeeStaff: [],\n            committeeLeadership: '',\n            meetingRoomsList: [],\n            selectedSession: '',\n            hideClerk: false,\n            hideStaff: false,\n            hidePatron: false,\n            hideSummary: false,\n            hideTitle: false,\n            hideLDNumber: false,\n            hideCaption: false,\n            showPatronList: false,\n            patronListDocketByIdData: '',\n            sessionBills: [],\n            isDirty: false\n        };\n        this.togglePreview = this.togglePreview.bind(this);\n        this.updateDocket = this.updateDocket.bind(this);\n        this.toggleAllActive = this.toggleAllActive.bind(this);\n        this.handleSequenceChange = this.handleSequenceChange.bind(this);\n        this.saveDocket = this.saveDocket.bind(this);\n        this.handleMeetingRoomChange = this.handleMeetingRoomChange.bind(this);\n        this.toggleDocketSection = this.toggleDocketSection.bind(this);\n        this.downloadWordFile = this.downloadWordFile.bind(this);\n        this.togglePatronList = this.togglePatronList.bind(this);\n        this.getBill = this.getBill.bind(this);\n        this.handleCommentHeight = this.handleCommentHeight.bind(this);\n    }\n\n    componentDidMount() {\n        var id = this.props.match.params.docketid;\n        var docketBillParams = '?docketId=' + id;\n        this.props.actions.getDocketById(docketBillParams, true)\n            .then(() => {\n                this.props.actions.getCommitteeList(\"includeSubcommittees=true&effectiveDate=\" + this.props.session.sessionList.find(x => x.SessionID === this.props.calendar.docketByIdData.SessionID).SessionEvents.find(x => x.EventTypeID === 1).ActualDate)\n                this.getDocketBills(this.props.calendar.docketByIdData);\n                if (this.props.calendar.docketByIdData.CalendarDisplay) {\n                    for (let i = 0; i < this.props.calendar.docketByIdData.CalendarDisplay.length; i++) {\n                        switch (this.props.calendar.docketByIdData.CalendarDisplay[i].DisplayColumn) {\n                            case (\"Staffs Name\"):\n                                this.setState({\n                                    hideClerk: !this.props.calendar.docketByIdData.CalendarDisplay[i].IsDisplayed\n                                });\n                                break;\n                            case (\"Clerk Name\"):\n                                this.setState({\n                                    hideStaff: !this.props.calendar.docketByIdData.CalendarDisplay[i].IsDisplayed\n                                });\n                                break;\n                            case (\"Chief Patron\"):\n                                this.setState({\n                                    hidePatron: !this.props.calendar.docketByIdData.CalendarDisplay[i].IsDisplayed\n                                });\n                                break;\n                            case (\"Summary\"):\n                                this.setState({\n                                    hideSummary: !this.props.calendar.docketByIdData.CalendarDisplay[i].IsDisplayed\n                                });\n                                break;\n                            case (\"Title\"):\n                                this.setState({\n                                    hideTitle: !this.props.calendar.docketByIdData.CalendarDisplay[i].IsDisplayed\n                                });\n                                break;\n                            case (\"LD Number\"):\n                                this.setState({\n                                    hideLDNumber: !this.props.calendar.docketByIdData.CalendarDisplay[i].IsDisplayed\n                                });\n                                break;\n                            case (\"Caption\"):\n                                this.setState({\n                                    hideCaption: !this.props.calendar.docketByIdData.CalendarDisplay[i].IsDisplayed\n                                });\n                                break;\n                            default:\n                                break;\n                        }\n                    }\n                }\n\n                this.props.actions.getBillNumbers('?sessionID=' + this.props.calendar.docketByIdData.SessionID).then(() => {\n                    let billNumbers = this.props.bills.billNumbers;\n                    billNumbers.forEach(bill => {\n                        bill.label = bill.LegislationNumber;\n                        bill.value = bill.LegislationNumber;\n                    })\n                    this.setState({\n                        sessionBills: billNumbers\n                    });\n                })\n\n                this.props.actions.getCalendarCategoriesReferences();\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    message: 'Failed to retrieve data'\n                });\n            });\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    togglePreview() {\n        this.setState(state => ({\n            showPreview: !state.showPreview\n        }), () => {\n            if (this.state.showPreview) {\n                window.scrollTo({\n                    top: 0,\n                    left: 0,\n                });\n            }\n        });\n    }\n\n    // GET MEETING ROOMS REFERENCES\n    getMeetingRoomsReferences(chamberCode) {\n        var params = '?chamberCode=' + chamberCode;\n\n        this.props.actions.getMeetingRoomReferences(params).then(() => {\n            const meetingRoomsList = Array.from(this.props.schedule.meetingRoomReferences, obj => {\n                const rObj = {\n                    ...obj,\n                    value: obj.VoteRoomID,\n                    label: obj.Description + ' ' + (obj.RoomNumber || '')\n                };\n                return rObj;\n            });\n            this.setState({\n                meetingRoomsList: meetingRoomsList,\n            });\n        })\n    }\n\n    // GET BILLS FOR DOCKET GRID\n    getDocketBills(data) {\n        const categories = data.DocketCategories;\n\n        //This will be used to tell if any bills have already been saved to the docket. If they have then enable the preview button.\n        //If not then grey out the preview button until a save has been performed\n        let noSavedItems = true;\n        let billList = [];\n        categories.forEach(category => {\n            billList = category.DocketItems;\n            billList.forEach(element => {\n                //Item has a docket ID so this means that a bill has been previously saved to this docket\n                if (element.DocketItemID) {\n                    noSavedItems = false;\n                }\n            });\n        });\n\n\n        // Set Clerk & Staff\n        let committeeClerk = [];\n        let committeeStaff = [];\n\n\n        if (data.Staff) {\n            committeeClerk = data.Staff.filter(clerk => clerk.StaffRoleTypeID === 1);\n            committeeStaff = data.Staff.filter(staff => staff.StaffRoleTypeID === 2);\n        }\n\n        // Set Committee Leadership\n        let committeeLeadership = '';\n\n        if (data.CommitteeMember) {\n            data.CommitteeMember.forEach((element, i) => {\n                var memberDelimiter = data.CommitteeMember.length === 1 || i + 1 !== data.CommitteeMember.length ? '' : ', ';\n                committeeLeadership = committeeLeadership + memberDelimiter + element.Title + ': ' + element.MemberDisplayName;\n            });\n        }\n\n        this.setState({\n            pendingSave: noSavedItems,\n            committeeLeadership: committeeLeadership,\n            committeeClerk: committeeClerk,\n            committeeStaff: committeeStaff,\n            data: data,\n            isLoaded: true\n        }, () => {\n            this.getMeetingRoomsReferences(data.ChamberCode)\n            this.props.actions.getSessionById(data.SessionID)\n                .then(() =>\n                    this.setState({ selectedSession: this.props.session.selectedSession })\n                );\n            this.state.data.Schedules.forEach((schedule, i) => {\n                this.handleCommentHeight(i)\n            })\n        });\n\n        //Get the calendar category types. This is used to create a blank notes category\n        this.props.actions.getCalendarCategoriesReferences()\n            .then(() => {\n                // Find out of there is a notes category already saved to the docket. If there isn't then add a default one.\n                // Notes categories should be the only non-legislative category\n                let notesCategories = categories.filter(category => !category.IsLegislationCategory);\n                if (notesCategories.length === 0) {\n                    // Using the Senate Docket Notes category for notes\n                    let notesCategory = this.props.calendar.calendarCategoriesReferences.find(calCategory => calCategory.CategoryCode === \"CSNOT\");\n                    if (notesCategory) {\n                        notesCategory.Sequence = 1;\n                        notesCategory.DocketItems = [\n                            {\n                                Description: '',\n                                Sequence: 1,\n                            }\n                        ];\n                        categories.unshift(notesCategory);\n                    }\n                }\n                // Set the categorys' Sequence to sequential order\n                categories.forEach((cat, catIndex) => {\n                    cat.Sequence = catIndex + 1;\n                    cat.DocketItems.forEach((item, itemIndex) => {\n                        if (item.IsActive) {\n                            item.Sequence = itemIndex + 1;\n                        } else {\n                            item.Sequence = null;\n                        }\n                    });\n                });\n                this.setState({\n                    categories: categories\n                });\n            });\n    }\n\n    handleSequenceChange(categories) {\n        this.setState({\n            categories: categories,\n            isDirty: true\n        });\n    }\n\n    handleInputChange(index, value, key) {\n        let data = { ...this.state.data };\n        data.Schedules[index][key] = value;\n        this.setState({\n            data: data,\n            isDirty: true\n        }, () => {\n            if (key === 'Comments') { this.handleCommentHeight(index); }\n        });\n    }\n\n    convertTime24to12(time24Hr) {\n        if (!time24Hr) return null;\n        let [hours, minutes] = time24Hr.split(':');\n        let modifier = 'AM';\n\n        if (hours === '00') {\n            hours = '12';\n        } else if (parseInt(hours, 10) >= 12) {\n            hours = hours === '12' ? hours : parseInt(hours, 10) - 12;\n            modifier = 'PM';\n        }\n\n        return `${parseInt(hours)}:${minutes} ${modifier}`;\n    }\n\n    handleMeetingRoomChange = (index, value) => {\n        let data = { ...this.state.data };\n        data.Schedules[index].VoteRoomID = value.VoteRoomID;\n        data.Schedules[index].RoomDescription = value.Description;\n        this.setState({\n            selectedMeetingRoom: value,\n            isDirty: true\n        });\n    }\n\n    updateDocket(categories) {\n        this.setState({\n            categories: categories,\n            pendingSave: true,\n            isDirty: true\n        });\n    }\n\n    toggleAllActive(active) {\n        let checked = false;\n        if (active) {\n            checked = !this.state.selectAllActive\n            this.setState({\n                selectAllActive: checked\n            });\n        } else {\n            checked = !this.state.selectAllInactive\n            this.setState({\n                selectAllInactive: checked\n            });\n        }\n        let categories = [...this.state.categories];\n        categories.forEach(category => {\n            let items = category.DocketItems;\n            items.forEach(bill => {\n                if (bill.IsActive === active || (active === false && !bill.IsActive)) {\n                    bill.checked = checked\n                }\n            });\n        });\n        this.updateDocket(categories);\n    }\n\n    saveDocket(publishFlag) {\n        let data = { ...this.state.data };\n        let unpublishing = false;\n        if (publishFlag === PUBLISH_DOCKET) {\n            //This function was initiated by the publish button so go ahead and publish the docket\n            data.IsPublic = PUBLISH_DOCKET;\n            // Set the schedule to public as well\n            data.Schedules.forEach(schedule => schedule.IsPublic = PUBLISH_DOCKET);\n        } else if (this.state.data.IsPublic) {\n            //The docket is already published, unpublish the docket\n            data.IsPublic = UNPUBLISH_DOCKET;\n            unpublishing = true;\n            //Unpublish the schedule as well\n            data.Schedules.forEach(schedule => schedule.IsPublic = UNPUBLISH_DOCKET);\n        } else {\n            //This function was initiated by the save button so do not publish the docket\n            data.IsPublic = SAVE_DOCKET;\n        }\n\n        //These parts are not needed when saving and will cause the save to fail\n        delete data.Staff;\n        delete data.CommitteeMember;\n        delete data.DocketFiles\n\n        let categories = [...this.state.categories];\n        categories.forEach(category => {\n            category.hasNotes = false;\n            let items = category.DocketItems;\n            items.forEach((item, index) => {\n                // set IsActive to false instead of just 'null'\n                if (!item.IsActive) {\n                    item.IsActive = false;\n                } else {\n                    //Fix the Sequence attribute to match what is displayed on the screen\n                    item.Sequence = index + 1;\n                }\n                //Only add the notes category to the save if it has any content\n                if (!category.IsLegislationCategory) {\n                    if (item.Description.replace(/\\s/g, '')) {\n                        category.hasNotes = true;\n                    }\n                }\n            });\n        });\n        //Filter out the notes categories that do not have any notes\n        categories = categories.filter(category => {\n            if (category.IsLegislationCategory || category.hasNotes) {\n                return category;\n            }\n        });\n        data.DocketCategories = categories;\n        //Disable the save button and the form while it is saving\n        this.setState({ isSaving: true }, () => {\n            this.props.actions.saveDocket({ Dockets: [data] })\n                .then(() => {\n                    if (this.state.showPreview || data.IsPublic) {\n                        let content = this.componentRef.innerHTML.replace(/\\\\\"/g, '');\n                        this.props.actions.sendDocketHtml({ CommitteeNumber: this.props.committee.committeeList.find(x => x.CommitteeID === data.CommitteeID).CommitteeNumber, DocketDate: data.DocketDate, DocketNumber: data.DocketNumber, ContentHTML: content });\n                    }\n                    if (publishFlag) {\n                        this.setState({\n                            isDirty: false\n                        }, () => {\n                            this.props.history.push('/docket-management');\n                            this.props.actions.makeToast([{ message: \"Publish Success\", type: \"success\" }])\n                        })\n                    } else {\n                        const docketSave = this.props.calendar.docketSave;\n                        //Add back a blank notes category if it is missing\n                        let notesCategories = docketSave.DocketCategories.filter(category => !category.IsLegislationCategory);\n                        if (notesCategories.length === 0) {\n                            // Using the Senate Docket Notes category for notes\n                            let notesCategory = this.props.calendar.calendarCategoriesReferences.find(calCategory => calCategory.CategoryCode === \"CSNOT\");\n                            if (notesCategory) {\n                                notesCategory.Sequence = 1;\n                                notesCategory.DocketItems = [\n                                    {\n                                        Description: '',\n                                        Sequence: 1,\n                                    }\n                                ];\n                                docketSave.DocketCategories.unshift(notesCategory);\n                            }\n                        }\n                        this.setState({\n                            data: docketSave,\n                            categories: docketSave.DocketCategories,\n                            pendingSave: false,\n                            isSaving: false,\n                            isDirty: false\n                        }, () => {\n                            if (unpublishing) {\n                                this.props.actions.makeToast([{ message: \"Unpublish Success\", type: \"success\" }])\n                            } else {\n                                this.props.actions.makeToast([{ message: \"Save Success\", type: \"success\" }])\n                            }\n                            this.state.data.Schedules.forEach((schedule, i) => {\n                                this.handleCommentHeight(i);\n                            })\n                        });\n                    }\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.setState({ isSaving: false });\n                    this.props.actions.makeToast([{ message: (this.props.calendar.docketSaveError.includes(\"Meeting Started\") ? \"Cannot Unpublish Docket After Meeting Has Started\" : \"Save Failed\"), type: \"failure\" }])\n                    console.log(err)\n                });\n        });\n\n    }\n\n    toggleDocketSection(section) {\n        let data = { ...this.state.data };\n\n        this.setState(state => ({\n            [section]: !state[section]\n        }), () => {\n            //If the section has already been toggled then just modify the column\n            //Otherwise insert the column and set it to what the column was just toggled to\n            switch (section) {\n                case (\"hideStaff\"):\n                    if (data.CalendarDisplay.find(x => x.DisplayColumn === \"Staffs Name\")) {\n                        data.CalendarDisplay.find(x => x.DisplayColumn === \"Staffs Name\").IsDisplayed = !this.state[section];\n                    } else {\n                        data.CalendarDisplay.push({\n                            DisplayColumn: \"Staffs Name\",\n                            IsDisplayed: !this.state[section]\n                        });\n                    }\n                    break;\n                case (\"hideClerk\"):\n                    if (data.CalendarDisplay.find(x => x.DisplayColumn === \"Clerk Name\")) {\n                        data.CalendarDisplay.find(x => x.DisplayColumn === \"Clerk Name\").IsDisplayed = !this.state[section];\n                    } else {\n                        data.CalendarDisplay.push({\n                            DisplayColumn: \"Clerk Name\",\n                            IsDisplayed: !this.state[section]\n                        });\n                    }\n                    break;\n                case (\"hidePatron\"):\n                    if (data.CalendarDisplay.find(x => x.DisplayColumn === \"Chief Patron\")) {\n                        data.CalendarDisplay.find(x => x.DisplayColumn === \"Chief Patron\").IsDisplayed = !this.state[section];\n                    } else {\n                        data.CalendarDisplay.push({\n                            DisplayColumn: \"Chief Patron\",\n                            IsDisplayed: !this.state[section]\n                        });\n                    }\n                    break;\n                case (\"hideSummary\"):\n                    if (data.CalendarDisplay.find(x => x.DisplayColumn === \"Summary\")) {\n                        data.CalendarDisplay.find(x => x.DisplayColumn === \"Summary\").IsDisplayed = !this.state[section];\n                    } else {\n                        data.CalendarDisplay.push({\n                            DisplayColumn: \"Summary\",\n                            IsDisplayed: !this.state[section]\n                        });\n                    }\n                    break;\n                case (\"hideTitle\"):\n                    if (data.CalendarDisplay.find(x => x.DisplayColumn === \"Title\")) {\n                        data.CalendarDisplay.find(x => x.DisplayColumn === \"Title\").IsDisplayed = !this.state[section];\n                    } else {\n                        data.CalendarDisplay.push({\n                            DisplayColumn: \"Title\",\n                            IsDisplayed: !this.state[section]\n                        });\n                    }\n                    break;\n                case (\"hideLDNumber\"):\n                    if (data.CalendarDisplay.find(x => x.DisplayColumn === \"LD Number\")) {\n                        data.CalendarDisplay.find(x => x.DisplayColumn === \"LD Number\").IsDisplayed = !this.state[section];\n                    } else {\n                        data.CalendarDisplay.push({\n                            DisplayColumn: \"LD Number\",\n                            IsDisplayed: !this.state[section]\n                        });\n                    }\n                    break;\n                case (\"hideCaption\"):\n                    if (data.CalendarDisplay.find(x => x.DisplayColumn === \"Caption\")) {\n                        data.CalendarDisplay.find(x => x.DisplayColumn === \"Caption\").IsDisplayed = !this.state[section];\n                    } else {\n                        data.CalendarDisplay.push({\n                            DisplayColumn: \"Caption\",\n                            IsDisplayed: !this.state[section]\n                        });\n                    }\n                    break;\n                default:\n                    break;\n            }\n            this.setState({\n                data: data,\n                isDirty: true\n            })\n        });\n    }\n\n    downloadWordFile() {\n        const html = `<html>\n            <head><meta charset=\"UTF-8\"></head>\n            <body>${this.componentRef.innerHTML}</body>\n        </html>`;\n        const filename = `${this.state.data.CommitteeName} Docket ${this.state.data.DocketDate}.doc`;\n\n        let downloadLink = document.createElement('a');\n        downloadLink.setAttribute('href', 'data:application/octet-stream;charset=utf-8,' + encodeURIComponent(html));\n        downloadLink.setAttribute('download', filename);\n\n        downloadLink.style.display = 'none';\n        document.body.appendChild(downloadLink);\n        downloadLink.click();\n\n        document.body.removeChild(downloadLink);\n    }\n\n    togglePatronList() {\n        //Have to pull the list fresh every time we view the patron list in case there was a save\n        if (this.state.showPatronList === false) {\n            this.props.actions.getPatronListDocketById(\"?calendarID=\" + this.props.match.params.docketid)\n                .then(() => {\n                    this.setState({\n                        showPatronList: true\n                    })\n                })\n        } else {\n            this.setState({\n                showPatronList: false\n            })\n        }\n    }\n\n    getBill(legislationID, legislationKey) {\n        this.props.actions.getBill(legislationID)\n            .then(() => {\n                let categories = [...this.state.categories];\n                let bill = {\n                    LegislationDescription: this.props.bills.bill.Description,\n                    LegislationID: this.props.bills.bill.LegislationID,\n                    LegislationKey: legislationKey,\n                    LegislationNumber: this.props.bills.bill.LegislationNumber,\n                    Patrons: this.props.bills.bill.Patrons,\n                    Summary: this.props.bills.bill.SummaryVersion,\n                    IsActive: true\n                };\n\n                //If we don't already have the senate general category in this docket then add it and push the bill to it. \n                //Otherwise push the new bill to the category.\n                if (!categories.find(x => x.CategoryCode === \"CSGEN\")) {\n                    let category = this.props.calendar.calendarCategoriesReferences.find(x => x.CategoryCode === \"CSGEN\");\n                    //Set new category's Sequence to be the current max sequence value +1\n                    category.Sequence = Math.max.apply(Math, categories.map((c) => { return c.Sequence; })) + 1;\n                    bill.Sequence = 1;\n                    category.DocketItems = [bill];\n                    categories.push(category);\n                } else {\n                    let index = categories.findIndex(x => x.CategoryCode === \"CSGEN\");\n                    //insert the newly included bill alphabetically\n                    const nextHighestActiveLegislationNumber = categories[index].DocketItems.filter(i => i.IsActive && i.Sequence).find(i => i.LegislationNumber.substr(0, 2).localeCompare(bill.LegislationNumber.substr(0, 2)) === 1 || (i.LegislationNumber.substr(0, 2).localeCompare(bill.LegislationNumber.substr(0, 2)) === 0 && i.LegislationKey > bill.LegislationKey));\n                    if (nextHighestActiveLegislationNumber) {\n                        const sequence = nextHighestActiveLegislationNumber.Sequence\n                        categories[index].DocketItems.filter(i => i.IsActive && i.Sequence >= nextHighestActiveLegislationNumber.Sequence).forEach(i => i.Sequence++)\n                        bill.Sequence = sequence;\n                    } else {\n                        const currentSequences = categories[index].DocketItems.filter(i => i.Sequence).map(i => { return i.Sequence; });\n                        if (currentSequences.length) {\n                            bill.Sequence = (Math.max.apply(Math, currentSequences) + 1) || 1;\n                        } else {\n                            bill.Sequence = 1;\n                        }\n                    }\n                    categories[index].DocketItems.push(bill);\n                    categories[index].DocketItems.sort((a, b) => (a.Sequence != null ? a.Sequence : Infinity) - (b.Sequence != null ? b.Sequence : Infinity))\n                }\n\n                this.setState({\n                    categories: categories\n                })\n            })\n    }\n\n    handleCommentHeight(index) {\n        let data = { ...this.state.data };\n        if (data.Schedules[index] && data.Schedules[index].Comments) {\n            const height = Math.round(data.Schedules[index].Comments.length / 120) * 20 + 40;\n            data.Schedules[index].commentHeight = height.toString() + 'px';\n            this.setState({\n                data\n            })\n        }\n    }\n\n    render() {\n        const { committeeName, committeeDate, message, data } = this.state;\n        if (message) {\n            return (\n                <div className=\"dlas-forms\">\n                    <span>{message}</span>\n                </div>\n            );\n        } else {\n            if (this.state.showPreview) {\n                return (\n                    <div>\n                        <div>\n                            <Prompt\n                                when={this.state.isDirty}\n                                message={`You have unsaved changes. Are you sure you would like to leave?`}\n                            />\n                        </div>\n                        <div className=\"flex-row\">\n                            <div className=\"advanced-search dlas-forms\">\n                                <h2>Docket Preview</h2>\n                                <div className=\"checkbox-container\">\n                                    <div className=\"inner-grid two\">\n                                        <div className=\"checkbox\">\n                                            <label><input type=\"checkbox\" onChange={() => this.toggleDocketSection('hideStaff')} checked={!this.state.hideStaff} /> Staff name</label>\n                                        </div>\n                                        <div className=\"checkbox\">\n                                            <label><input type=\"checkbox\" onChange={() => this.toggleDocketSection('hideClerk')} checked={!this.state.hideClerk} /> Clerk name</label>\n                                        </div>\n                                    </div>\n                                    <hr className=\"faded-line\" />\n                                    <div className=\"inner-grid two\">\n                                        <div className=\"checkbox\">\n                                            <label><input type=\"checkbox\" onChange={() => this.toggleDocketSection('hideTitle')} checked={!this.state.hideTitle} /> Title</label>\n                                        </div>\n                                        <div className=\"checkbox\">\n                                            <label><input type=\"checkbox\" onChange={() => this.toggleDocketSection('hideSummary')} checked={!this.state.hideSummary} /> Summary</label>\n                                        </div>\n                                    </div>\n                                    <hr className=\"faded-line\" />\n                                    <div className=\"inner-grid two\">\n                                        <div className=\"checkbox\">\n                                            <label><input type=\"checkbox\" onChange={() => this.toggleDocketSection('hidePatron')} checked={!this.state.hidePatron} /> Chief Patron</label>\n                                        </div>\n                                        <div className=\"checkbox\">\n                                            <label><input type=\"checkbox\" onChange={() => this.toggleDocketSection('hideLDNumber')} checked={!this.state.hideLDNumber} /> LD Number</label>\n                                        </div>\n                                    </div>\n                                    <hr className=\"faded-line\" />\n                                    <div className=\"inner-grid two\">\n                                        <div className=\"checkbox\">\n                                            <label><input type=\"checkbox\" onChange={() => this.toggleDocketSection('hideCaption')} checked={!this.state.hideCaption} /> Caption</label>\n                                        </div>\n                                        <div />\n                                    </div>\n                                </div>\n                            </div>\n                            <div className=\"inline-list\">\n                                <button type=\"button\" onClick={this.downloadWordFile} className=\"button-link with-icon\"><span className=\"icon word\"></span> View in Word</button>\n                                <ReactToPrint\n                                    trigger={() => <button type=\"button\" className=\"button-link with-icon\"><span className=\"icon print\"></span> Print</button>}\n                                    content={() => this.componentRef}\n                                    pageStyle={\"break-inside: avoid\"}\n                                />\n                            </div>\n                        </div>\n                        <div ref={el => (this.componentRef = el)}>\n                            <DocketDetailsComponent\n                                data={this.state.data}\n                                dockets={this.state.categories}\n                                session={this.state.selectedSession}\n                                selectedMeetingRoom={this.state.selectedMeetingRoom}\n                                toggleDocketSection={this.toggleDocketSection}\n                                hideClerk={this.state.hideClerk}\n                                hideStaff={this.state.hideStaff}\n                                hidePatron={this.state.hidePatron}\n                                hideSummary={this.state.hideSummary}\n                                hideTitle={this.state.hideTitle}\n                                hideLDNumber={this.state.hideLDNumber}\n                                hideCaption={this.state.hideCaption}\n                            />\n                        </div>\n                        <div className=\"button-bar\">\n                            <div></div>\n                            <div className=\"align-right\">\n                                <button onClick={this.togglePreview} className=\"button secondary\">Edit</button>\n                                <button onClick={() => this.saveDocket(PUBLISH_DOCKET)} type=\"button\" disabled={this.state.isSaving || this.state.disablePublish} className=\"button\">Publish</button>\n                            </div>\n                        </div>\n                    </div>\n                );\n            } else if (this.state.showPatronList) {\n                return (\n                    <DocketPatronList\n                        patronListDocketData={this.props.calendar.patronListDocketByIdData}\n                        togglePatronList={this.togglePatronList}\n                    />\n                )\n            } else {\n                const convertTime12to24 = (time12h) => {\n                    if (!time12h) return '';\n                    const [time, modifier] = time12h.split(' ');\n\n                    let [hours, minutes] = time.split(':');\n\n                    if (hours === '12') {\n                        hours = '00';\n                    }\n\n                    if (modifier === 'PM') {\n                        hours = parseInt(hours, 10) + 12;\n                    } else {\n                        hours = hours.padStart(2, '0');\n                    }\n\n                    return `${hours}:${minutes}`;\n                }\n                return (\n                    <React.Fragment>\n                        <div>\n                            <Prompt\n                                when={this.state.isDirty}\n                                message={`You have unsaved changes. Are you sure you would like to leave?`}\n                            />\n                        </div>\n                        <h1>{committeeName} {committeeDate}</h1>\n                        <div className=\"user-forms\" style={{ paddingBottom: \"45px\" }}>\n                            {!this.state.isLoaded &&\n                                <div className=\"center-spinner spinner\">Loading results...</div>\n                            }\n                            {this.state.isLoaded &&\n                                <div className=\"dlas-forms\">\n                                    <span className=\"error-message\">{message}</span>\n                                    <form>\n                                        <fieldset className=\"fieldset-collapse fieldset-open\">\n                                            <legend>Docket Information for <strong>{data.CommitteeName}</strong> on <strong>{moment(data.DocketDate).format('MM/DD/YYYY')}</strong></legend>\n                                            <div className=\"multi-row eight-and-one no-margin\">\n                                                <div>\n                                                    <div className=\"multi-row third no-margin\">\n                                                        <div>\n                                                            <Fields.TextInput\n                                                                id=\"leadership\"\n                                                                label=\"Committee Leadership\"\n                                                                type=\"text\"\n                                                                placeholder=\"Committee Leadership\"\n                                                                value={this.state.committeeLeadership}\n                                                                disabled\n                                                            />\n                                                        </div>\n                                                        <div>\n                                                            <Fields.TextInput\n                                                                id=\"clerk\"\n                                                                label=\"Committee Clerk\"\n                                                                type=\"text\"\n                                                                placeholder=\"Committee Clerk\"\n                                                                value={this.state.committeeClerk.map(clerk => clerk.FullName).join(', ')}\n                                                                disabled\n                                                            />\n                                                        </div>\n                                                        <div>\n                                                            <Fields.TextInput\n                                                                id=\"staff\"\n                                                                label=\"Committee Staff\"\n                                                                type=\"text\"\n                                                                placeholder=\"Committee Staff\"\n                                                                value={this.state.committeeStaff.map(staff => staff.FullName).join(', ')}\n                                                                disabled\n                                                            />\n                                                        </div>\n                                                    </div>\n                                                    {data.Schedules.map((schedule, index) =>\n                                                        <React.Fragment key={index}>\n                                                            <div className=\"multi-row one-and-three no-margin\" style={{ margin: 'initial', width: '60%' }}>\n                                                                <div>\n                                                                    <label for=\"meetingTime\">Meeting Time</label>\n                                                                    {TIME_REGEX.test(schedule.ScheduleTime) && <div className='icon clock' title=\"Correct Time Format\"/>}\n                                                                    <div>\n                                                                        <input\n                                                                            id=\"meetingTime\"\n                                                                            value={schedule.ScheduleTime}\n                                                                            style={{ maxHeight: '32px', fontFamily: 'arial' }}\n                                                                            onChange={(e) => this.handleInputChange(index, e ? e.target.value : e, 'ScheduleTime')}\n                                                                        />\n                                                                    </div>\n                                                                </div>\n                                                                <div>\n                                                                    <label>Meeting Room</label>\n                                                                    <Fields.Dropdown\n                                                                        value={this.state.meetingRoomsList.find(room => room.VoteRoomID === schedule.VoteRoomID)}\n                                                                        placeholder=\"Meeting Room\"\n                                                                        options={this.state.meetingRoomsList}\n                                                                        id=\"meetingRoomsDropdown\"\n                                                                        onChange={(value) => this.handleMeetingRoomChange(index, value)}\n                                                                    />\n                                                                </div>\n                                                            </div>\n                                                            <div className=\"single-row no-margin\">\n                                                                <div>\n                                                                    <Fields.TextArea\n                                                                        id=\"comments\"\n                                                                        label=\"Comments\"\n                                                                        type=\"text\"\n                                                                        placeholder=\"Comments\"\n                                                                        value={schedule.Comments}\n                                                                        style={{ height: schedule.commentHeight || '40px' }}\n                                                                        onChange={(e) => this.handleInputChange(index, e.target.value, 'Comments')}\n                                                                    />\n                                                                </div>\n                                                            </div>\n                                                        </React.Fragment>\n                                                    )}\n\n                                                </div>\n                                                <div>\n                                                    {this.state.data.IsPublic && <button type=\"button\" onClick={this.downloadWordFile} className=\"button-link with-icon\" style={{ marginLeft: \"15px\" }}><span className=\"icon word\"></span> View in Word</button>}\n                                                    <div className=\"published-status\">\n                                                        {this.state.data.IsPublic ? <span>Published</span> : <span className=\"dirty\">Not Published</span>}\n                                                    </div>\n                                                </div>\n                                            </div>\n                                            <CommitteeBillsGrid\n                                                categories={this.state.categories}\n                                                updateDocket={this.updateDocket}\n                                                handleSequenceChange={this.handleSequenceChange}\n                                                toggleAllActive={this.toggleAllActive}\n                                                chamberCode={this.state.data.ChamberCode}\n                                                sessionCode={this.state.data.SessionCode}\n                                                sessionBills={this.state.sessionBills}\n                                                getBill={this.getBill}\n                                            />\n                                        </fieldset>\n                                        <div className=\"button-bar floating-button-bar\" style={{ paddingBottom: \"15px\", paddingRight: \"15px\" }}>\n                                            <button onClick={this.togglePatronList} className=\"button\" type=\"button\" style={{ width: \"150px\" }}>Show Patron List</button>\n                                            <div className=\"align-right\">\n                                                <button disabled={this.state.isSaving} type=\"button\" onClick={() => this.saveDocket(SAVE_DOCKET)} className=\"button\">{this.state.isSaving ? \"Saving...\" : this.state.data.IsPublic ? \"Unpublish\" : \"Save\"}</button>\n                                                <button disabled={this.state.pendingSave} onClick={this.togglePreview} className=\"button\" type=\"button\">Preview</button>\n                                            </div>\n                                        </div>\n                                    </form>\n                                    {this.state.data.IsPublic &&\n                                        <div ref={el => (this.componentRef = el)} style={{ display: \"none\" }}>\n                                            <DocketDetailsComponent\n                                                data={this.state.data}\n                                                dockets={this.state.categories}\n                                                session={this.state.selectedSession}\n                                                selectedMeetingRoom={this.state.selectedMeetingRoom}\n                                                toggleDocketSection={this.toggleDocketSection}\n                                                hideClerk={this.state.hideClerk}\n                                                hideStaff={this.state.hideStaff}\n                                                hidePatron={this.state.hidePatron}\n                                                hideSummary={this.state.hideSummary}\n                                                hideTitle={this.state.hideTitle}\n                                                hideLDNumber={this.state.hideLDNumber}\n                                                hideCaption={this.state.hideCaption}\n                                            />\n                                        </div>\n                                    }\n                                </div>\n                            }\n                        </div>\n                    </React.Fragment>\n                );\n            }\n        }\n    }\n};\n\nconst DocketManagementForm = connect(\n    (state) => {\n        const { committee, calendar, session, nav, schedule, bills } = state;\n        return {\n            committee,\n            calendar,\n            session,\n            nav,\n            schedule,\n            bills\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, billActionCreators, calendarActionCreators, committeeActionCreators, sessionActionCreators, navActionCreators, scheduleActionCreators), dispatch)\n        }\n    }\n)(DocketFormComponent)\n\nexport default DocketManagementForm;\n\n\n\n\n\n\n\n\n","import React from 'react';\nimport { Route } from 'react-router';\nimport DocketGrid from './lis-docket-grid';\nimport DocketForm from './lis-docket-form';\n\nclass DocketManagement extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            selectedSession: '',\n            selectedCommittee: '',\n            selectedSubcommittee: ''\n        };\n        this.handleDropdownChange = this.handleDropdownChange.bind(this);\n    }\n\n    handleDropdownChange(newState, callback) {\n        this.setState({\n            ...newState\n        }, () => callback());\n    }\n\n    render() {\n        return (\n            <div>\n                <Route exact path={[\"/docket-management\", \"/docket-management/:committeeid\"]} render={props => <DocketGrid\n                    {...props}\n                    selectedSession={this.state.selectedSession}\n                    selectedCommittee={this.state.selectedCommittee}\n                    selectedSubcommittee={this.state.selectedSubcommittee}\n                    handleDropdownChange={this.handleDropdownChange}\n                />} />\n                <Route path={`${this.props.match.path}/:committeeid/edit-docket/:docketid`} component={DocketForm} />\n            </div>\n        )\n    }\n}\n\nexport default DocketManagement;","import React from 'react';\nimport ReactTable from \"react-table\";\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport * as Fields from '../../../lis-shared/lis-layout/components/lis-forms-component';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { calendarActionCreators } from '../../../stores/lis-calendar-store';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\nimport { connect } from 'react-redux';\nimport moment from 'moment-timezone';\nimport DatePicker from \"react-datepicker\";\nimport { cancelRequest } from '../../../services/request.service';\n\nclass CalendarGrid extends React.Component {\n    constructor(props) {\n        super(props);\n        let nextBusinessDay;\n        if (moment().day() === 5 || moment().day() === 6) { // friday or saturday, show monday\n            nextBusinessDay = moment().add(8 - moment().day(), 'days')\n        } else { // other days, show next day\n            nextBusinessDay = moment().add(1, 'days')\n        }\n        this.state = {\n            isLoaded: true,\n            selectedSession: '',\n            sessionOptions: [],\n            selectedChamber: '',\n            chamberOptions: [\n                { label: \"House\", value: \"H\" },\n                { label: \"Senate\", value: \"S\" }\n            ],\n            calendarDate: nextBusinessDay,\n            calendarList: [],\n            showCreateSuccess: false,\n            createFailureMessage: '',\n            isAdding: false,\n            calendarToBeDeleted: 0,\n            calendarBeingDeleted: -1,\n            showDeleteWarning: false\n        }\n\n        this.getCalendars = this.getCalendars.bind(this);\n        this.createCalendar = this.createCalendar.bind(this);\n\n        this.handleDateChange = this.handleDateChange.bind(this);\n        this.handleSessionSelectChange = this.handleSessionSelectChange.bind(this);\n        this.handleChamberChange = this.handleChamberChange.bind(this);\n        this.deleteCalendar = this.deleteCalendar.bind(this);\n        this.toggleDeleteCalendar = this.toggleDeleteCalendar.bind(this);\n    }\n\n    handleSessionSelectChange(value) {\n        //The session selectors value has been changed. \n        this.props.handleDropdownChange('selectedSession', value, () => this.getCalendars());\n    }\n\n    handleChamberChange(value) {\n        //The chamber selectors value has been changed. \n        this.props.handleDropdownChange('selectedChamber', value, () => this.getCalendars());\n    }\n\n    handleDateChange(value) {\n        //Used when inserting a new calendar\n        this.setState({\n            calendarDate: moment(value)\n        });\n    }\n\n    createCalendar() {\n        if (this.props.selectedSession && this.props.selectedChamber) {\n            this.setState({\n                isAdding: true\n            }, () => {\n                //See if there are any other calendars with the selected date\n                const calendarWithSameDate = this.state.calendarList.filter(calendar => moment(this.state.calendarDate).isSame(moment(calendar.CalendarDate), 'day'));\n                let calendarNumber = calendarWithSameDate.length + 1;\n                let createCalendarObj = {\n                    Calendars: [{\n                        CalendarDate: this.state.calendarDate.format(\"MM/DD/YYYY\"),\n                        IsPublic: false,\n                        CalendarType: \"Chamber\",\n                        Comments: '',\n                        Description: 'Calendar',\n                        CalendarTypeID: 1,\n                        SessionID: this.props.selectedSession.SessionID,\n                        VoteRoomID: 1,\n                        ChamberCode: this.props.selectedChamber.value,\n                        CalendarNumber: calendarNumber\n                    }]\n                };\n                this.props.actions.createCalendar(createCalendarObj)\n                    .then(() => {\n                        this.setState({\n                            showCreateSuccess: true,\n                            createFailureMessage: ''\n                        });\n                        this.getCalendars()\n                        setTimeout(() => {\n                            this.setState({\n                                showCreateSuccess: false,\n                                createFailureMessage: '',\n                                isAdding: false\n                            })\n                        }, 3000);\n                    }).catch(err => {\n                        if (err === 'Aborted') {\n                            return;\n                        }\n                        this.setState({\n                            showCreateSuccess: false,\n                            createFailureMessage: 'Calendar Creation Failed',\n                        });\n                        this.getCalendars()\n                        setTimeout(() => {\n                            this.setState({\n                                showCreateSuccess: false,\n                                createFailureMessage: '',\n                                isAdding: false\n                            })\n                        }, 3000);\n                    });\n            });\n        } else {\n            this.setState({\n                createFailureMessage: \"Please select a session and chamber\"\n            });\n            setTimeout(() => {\n                this.setState({\n                    createFailureMessage: '',\n                });\n            }, 3000);\n        }\n    }\n\n    toggleDeleteCalendar(rowIndex) {\n        this.setState({\n            calendarToBeDeleted: rowIndex,\n            showDeleteWarning: !this.state.showDeleteWarning\n        })\n    }\n\n    deleteCalendar(rowIndex) {\n        this.setState({\n            calendarBeingDeleted: rowIndex\n        });\n        // Before being able to delete the calendar we need to get the mod dates. So get the calendar\n        this.props.actions.getCalendarById('?calendarId=' + this.state.calendarList[rowIndex].CalendarID, true)\n            .then(() => {\n                let calendarData = this.props.calendar.calendarGet;\n                // Now that we have the calendar data add a deletion date then save it\n                calendarData.DeletionDate = moment();\n                return this.props.actions.saveCalendar({ Calendars: [calendarData] })\n            }).then(() => {\n                this.setState({\n                    showDeleteSuccess: true,\n                    calendarBeingDeleted: -1,\n                    showDeleteWarning: false\n                });\n                this.getCalendars();\n                setTimeout(() => {\n                    this.setState({\n                        showDeleteSuccess: false\n                    })\n                }, 3000);\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    calendarBeingDeleted: -1,\n                    deleteFailureMessage: 'Calendar failed to be deleted'\n                });\n                console.log(err)\n                setTimeout(() => {\n                    this.setState({\n                        deleteFailureMessage: '',\n                    });\n                }, 3000);\n            });\n    }\n\n    componentDidMount() {\n        this.props.actions.getSessionShallowList('isActive=true').then(() => {\n            if (this.props.session.sessionShallowList !== undefined) {\n                let selectedSession = this.props.selectedSession;\n                let selectedChamber = this.props.selectedChamber;\n                //Format data for dropdown\n                let sessionList = [...this.props.session.sessionShallowList];\n                sessionList.forEach(session => {\n                    session.label = session.SessionYear + ' ' + session.DisplayName;\n                    session.value = session.SessionID;\n                    if (session.IsDefault && !selectedSession) {\n                        selectedSession = session;\n                    }\n                });\n                //set the default chamber to house or senate depending on the user's role\n                let disableChamberSelector = false;\n\n                if (!this.props.login.userClaims.claims.find(x => x.RoleName === \"Admin\")) {\n                    //Find if the user is a house calendar editor, if so select house, otherwise select senate, and disable the chamber selector\n                    selectedChamber = this.props.login.userClaims.claims.find(x => x.RoleName === \"HouseCalendarEditor\") ? this.state.chamberOptions.find(chamber => chamber.label === \"House\") : this.state.chamberOptions.find(chamber => chamber.label === \"Senate\");\n                    disableChamberSelector = true;\n                }\n                this.setState({\n                    sessionOptions: sessionList,\n                    disableChamberSelector: disableChamberSelector\n                });\n                this.props.handleDropdownChange('selectedSession', selectedSession, () => {\n                    this.props.handleDropdownChange('selectedChamber', selectedChamber, () => this.getCalendars());\n                });\n\n            }\n        });\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    getCalendars() {\n        const { selectedSession, selectedChamber } = this.props;\n        if (selectedSession && selectedChamber) {\n            this.setState({\n                isLoaded: false\n            });\n            //Get the calendars\n            const calendarParams = \"?isPublic=false&sessionID=\" + selectedSession.SessionID + '&chamberCode=' + selectedChamber.value;\n            //The second parameter lets the store know to use the partner request instead of the public\n            this.props.actions.getCalendarList(calendarParams, true)\n                .then(() => {\n                    this.setState({\n                        isLoaded: true,\n                        calendarList: this.props.calendar.calendarList\n                    });\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return\n                    }\n                    this.setState({\n                        calendarListError: err.toString()\n                    });\n                });\n        }\n    }\n\n    render() {\n        return (\n            <div>\n                {this.state.showDeleteWarning &&\n                    <div className='schedule-modal'>\n                        <div style={{ height: \"120px\" }} className='schedule-modal-content'>\n                            <p>Are you sure you would like to delete this calendar?</p>\n                            <div>\n                                <button style={{ float: \"right\" }} type=\"button\" className='button danger' onClick={() => this.deleteCalendar(this.state.calendarToBeDeleted)}>Delete</button>\n                                <button style={{ float: \"right\", marginRight: \"10px\" }} type=\"button\" className='button secondary' onClick={() => this.toggleDeleteCalendar(0)}>Cancel</button>\n                            </div>\n                        </div>\n                    </div>\n                }\n                <div className=\"header-half\">\n                    <h1>Calendar Management</h1>\n                    {this.props.login.userClaims.claims.find(c => c.RoleName === \"Admin\") &&\n                        <div className=\"flex-row flex-vertical-center flex-end\">\n                            <a className=\"icon settings\" href=\"/configurations-management/calendar\" />\n                        </div>\n                    }\n                </div>\n                <p className=\"small-text message-error\">{this.state.calendarListError}</p>\n                <div className=\"toolbar inner-grid four\">\n                    <div>\n                        <Fields.Dropdown\n                            value={this.props.selectedChamber}\n                            options={this.state.chamberOptions}\n                            onChange={this.handleChamberChange}\n                            isDisabled={this.state.disableChamberSelector}\n                        />\n                    </div>\n                    <div>\n                        <Fields.Dropdown\n                            value={this.props.selectedSession}\n                            options={this.state.sessionOptions}\n                            id=\"sessionDropdown\"\n                            onChange={this.handleSessionSelectChange}\n                        />\n                    </div>\n                </div>\n                <ReactTable\n                    resizable={false}\n                    data={this.state.calendarList}\n                    loading={!this.state.isLoaded}\n                    ref={r => this.reactTable = r}\n                    columns={[\n                        {\n                            Header: 'Calendars',\n                            width: 240,\n                            sortable: false,\n                            filterable: false,\n                            columns: [\n                                {\n                                    headerClassName: \"calendar-datepicker-container\",\n                                    accessor: \"CalendarDate\",\n                                    width: 240,\n                                    sortable: false,\n                                    Header: (\n                                        <div className=\"dlas-forms datepicker-container\">\n                                            {!this.state.showCreateSuccess && !this.state.createFailureMessage && !this.state.showDeleteSuccess && !this.state.deleteFailureMessage &&\n                                                <DatePicker\n                                                    className=\"dnd-field\"\n                                                    selected={this.state.calendarDate}\n                                                    onChange={this.handleDateChange}\n                                                    placeholderText=\"Calendar Date\"\n                                                />\n                                            }\n                                            {this.state.showCreateSuccess &&\n                                                <span className=\"insert-message\">Calendar was created successfully!</span>\n                                            }\n                                            {this.state.createFailureMessage &&\n                                                <span className=\"insert-message fail\">{this.state.createFailureMessage}</span>\n                                            }\n                                            {this.state.showDeleteSuccess &&\n                                                <span className=\"insert-message\">Calendar was deleted successfully!</span>\n                                            }\n                                            {this.state.deleteFailureMessage &&\n                                                <span className=\"insert-message fail\">{this.state.deleteFailureMessage}</span>\n                                            }\n                                        </div>\n                                    ),\n\n                                    Cell: row => {\n                                        return <span>{moment(row.value).format(\"MM/DD/YYYY\")} {row.original.CalendarNumber > 1 && <React.Fragment>(Supp. {row.original.CalendarNumber - 1})</React.Fragment>}</span>\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            Header: 'Comments',\n                            width: 'auto',\n                            sortable: false,\n                            filterable: false,\n                            columns: [\n                                {\n                                    headerClassName: \"docket-datepicker-container\",\n                                    accessor: \"Comments\",\n                                    sortable: false,\n                                    Header: (false),\n                                    Cell: row => {\n                                        return <span>{row.value}</span>\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            Header: 'Actions',\n                            headerClassName: \"submit-action\",\n                            sortable: false,\n                            filterable: false,\n                            columns: [\n                                {\n                                    Header: () => {\n                                        return <span><button className=\"button\" onClick={this.createCalendar} disabled={this.state.isAdding}>Create</button></span>\n                                    },\n                                    headerClassName: \"header-action\",\n                                    accessor: \"action\",\n                                    sortable: false,\n                                    className: \"action-column\",\n                                    width: 90,\n                                    Cell: row => {\n                                        if (this.state.calendarBeingDeleted === row.index) {\n                                            return (\n                                                <div className=\"small-spinner\"></div>\n                                            )\n                                        }\n                                        return (\n                                            <div className=\"committee-action-column-two\">\n                                                <Link to={`/calendar-management/edit-calendar/${row.original.CalendarID}`} className=\"icon edit\"></Link>\n                                                {row.original.IsPublic ?\n                                                    <Link target=\"_blank\" to={`/session-details/${this.props.selectedSession.SessionCode}/calendar/${row.original.ReferenceNumber}`} className=\"icon book\"></Link>\n                                                    :\n                                                    <span onClick={() => this.toggleDeleteCalendar(row.index)} className=\"icon delete\"></span>}\n                                            </div>\n                                        );\n                                    }\n                                }\n                            ]\n                        }\n                    ]}\n                    defaultPageSize={15}\n                    pageSizeOptions={[5, 10, 15, 20, 25, 50, 100]}\n                    className=\"committee-table -striped -highlight\"\n                />\n                <br />\n\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { session, calendar, login } = state;\n        return {\n            session,\n            calendar,\n            login\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, sessionActionCreators, calendarActionCreators, authActionCreators), dispatch)\n        }\n    }\n)(CalendarGrid)","import React from 'react';\nimport Popout from '../lis-layout/components/lis-popout-component';\nimport tinymce from 'tinymce/tinymce';\nimport 'tinymce/themes/silver/theme';\nimport 'tinymce/icons/default'\nimport 'tinymce/plugins/paste/plugin';\nimport 'tinymce/plugins/link/plugin';\nimport 'tinymce/plugins/save/plugin';\nimport 'tinymce/plugins/lists/plugin';\nimport 'tinymce/plugins/code/plugin';\nimport 'tinymce/plugins/preview/plugin';\nimport 'tinymce/plugins/searchreplace/plugin';\nimport 'tinymce/plugins/pagebreak/plugin';\nimport 'tinymce/plugins/table/plugin';\nimport '../../stylesheets/tinymce/oxide/skin.min.css';\nimport { Editor } from '@tinymce/tinymce-react';\nimport { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';\n\nconst newAgendaItemText = '<p><strong>&#xFEFF;</strong></p>';\n\nconst getItemStyle = (isDragging, draggableStyle, isActive) => ({\n    // some basic styles to make the items look a bit nicer\n    display: 'flex',\n    userSelect: 'none',\n    marginBottom: '20px',\n    // change background colour if dragging\n    background: isDragging ? '#34495e' : !isActive ? '#f3f3f3' : 'white',\n    color: isDragging ? 'white' : '#34495e',\n    borderRight: '1px solid #e0e0e0',\n    borderTop: '1px solid #e0e0e0',\n    borderLeft: '1px solid #e0e0e0',\n    borderBottom: '1px solid #e0e0e0',\n    color: isActive ? '' : '#8b8b8b',\n    // styles we need to apply on draggables\n    ...draggableStyle,\n});\n\nclass AgendaItemsComponent extends React.Component {\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            agendaItemContent: []\n        }\n\n        this.handleEditorChange = this.handleEditorChange.bind(this);\n        this.togglePortal = this.togglePortal.bind(this);\n        this.saveAgendaItems = this.saveAgendaItems.bind(this);\n        this.close = this.close.bind(this);\n        this.addNote = this.addNote.bind(this);\n        this.toggleCustomNote = this.toggleCustomNote.bind(this);\n    }\n\n    addNote() {\n        let agendaItems = [...this.props.agenda.AgendaItems].sort((a, b) => (a.DraftText ? 1 : b.DraftText ? -1 : 0) || (a.DisplaySequence && b.DisplaySequence && a.DisplaySequence < b.DisplaySequence) || a.Sequence < b.Sequence);\n        //insert the new note at the last index excluding amendments (keep amendments last)\n        let index = agendaItems.findIndex(a => a.DraftText);\n        if (index !== -1) {\n            //there is at least one amendment, increase its display sequence because the new note will be in its previous sequence/indexc\n            agendaItems.forEach((item, idx) => {\n                if (idx >= index) {\n                    item.DisplaySequence++;\n                }\n            })\n        }\n\n        const newAgendaItem = {\n            Description: newAgendaItemText,\n            IsActive: true,\n            Sequence: (index + 1) || agendaItems.length + 1,\n            DisplaySequence: (index + 1) || agendaItems.length + 1,\n            AgendaId: agendaItems && agendaItems[0] ? agendaItems[0].AgendaId : null\n        }\n        agendaItems.splice(index !== -1 ? index : agendaItems.length + 1, 0, newAgendaItem);\n        let agendaItemContent = [...this.state.agendaItemContent];\n        agendaItemContent.splice(index !== -1 ? index : agendaItems.length + 1, 0, newAgendaItem.Description);\n        this.props.updateAgendaItems(agendaItems, this.props.categoryIndex, this.props.agendaIndex);\n        this.setState({\n            agendaItemContent: agendaItemContent\n        });\n    }\n\n    handleEditorChange(content, itemIndex) {\n        let agendaItemContent = [...this.state.agendaItemContent];\n        agendaItemContent[itemIndex] = content;\n        this.setState({\n            agendaItemContent: agendaItemContent\n        });\n    }\n\n    togglePortal(state) {\n        this.setState({\n            showPortal: !state\n        }, () => {\n            if (!this.state.showPortal) {\n                this.props.toggleAgendaItemEditor(-1)\n            }\n        });\n    }\n\n    saveAgendaItems() {\n        let agendaItems = [...this.props.agenda.AgendaItems];\n        agendaItems.forEach((item, i) => {\n            if (item.DraftText) {\n                item.DraftText = this.state.agendaItemContent[i];\n            } else if (item.CalendarDescription) {\n                item.CalendarDescription = this.state.agendaItemContent[i];\n            } else {\n                item.Description = this.state.agendaItemContent[i];\n            }\n            item.Sequence = item.DisplaySequence;\n        });\n        this.props.updateAgendaItems(agendaItems, this.props.categoryIndex, this.props.agendaIndex);\n        this.props.toggleAgendaItemEditor(-1);\n    }\n\n    close() {\n        let agendaItems = [...this.props.agenda.AgendaItems].sort((a, b) => (a.DraftText ? 1 : b.DraftText ? -1 : 0) || (a.DisplaySequence && b.DisplaySequence && a.DisplaySequence < b.DisplaySequence) || a.Sequence < b.Sequence);\n        //filter out newly added items since they are cancelling, and undo re-sequencing\n        agendaItems = agendaItems.filter((item) => {\n            if (!item.Description || item.Description === newAgendaItemText) {\n                return false;\n            } else {\n                return true;\n            }\n        })\n        agendaItems.forEach(item => {\n            item.IsActive = item.OrigIsActive;\n            item.DisplaySequence = null;\n        });\n        const sortedAgendaItems = agendaItems.sort((a, b) => a.Sequence - b.Sequence);\n        this.props.updateAgendaItems(sortedAgendaItems, this.props.categoryIndex, this.props.agendaIndex);\n        this.props.toggleAgendaItemEditor(-1)\n    }\n\n    componentDidMount() {\n        let agendaItems = [...this.props.agenda.AgendaItems].sort((a, b) => (a.DraftText ? 1 : b.DraftText ? -1 : 0) || (a.DisplaySequence && b.DisplaySequence && a.DisplaySequence < b.DisplaySequence) || a.Sequence < b.Sequence);\n        let agendaItemContent = [];\n        this.props.updateAgendaItems(agendaItems, this.props.categoryIndex, this.props.agendaIndex);\n        agendaItems.forEach((item, idx) => {\n            item.DisplaySequence = idx + 1;\n            item.OrigIsActive = item.IsActive;\n            agendaItemContent.push(item.DraftText || item.CalendarDescription || item.Description);\n        });\n        this.setState({\n            agendaItemContent: agendaItemContent\n        });\n    }\n\n    componentDidUpdate(prevProps) {\n        if (this.props.agenda.AgendaItems !== prevProps.agenda.AgendaItems) {\n            let agendaItemContent = [];\n            this.props.agenda.AgendaItems.sort((a, b) => (a.DraftText ? 1 : b.DraftText ? -1 : 0) || (a.DisplaySequence && b.DisplaySequence && a.DisplaySequence < b.DisplaySequence) || a.Sequence < b.Sequence).forEach(item => {\n                agendaItemContent.push(item.DraftText || item.CalendarDescription || item.Description);\n            });\n            this.setState({\n                agendaItemContent: agendaItemContent\n            });\n        }\n    }\n\n    onDragEnd(result) {\n        if (!result.destination) {\n            return;\n        }\n        let newAgendaItemContent = [];\n        let agendaItemContent = [...this.state.agendaItemContent];\n        let agendaItems = [...this.props.agenda.AgendaItems].sort((a, b) => (a.DraftText ? 1 : b.DraftText ? -1 : 0) || (a.DisplaySequence && b.DisplaySequence && a.DisplaySequence < b.DisplaySequence) || a.Sequence < b.Sequence);\n        if (agendaItems.find(a => a.DraftText) && result.destination.index >= agendaItems.findIndex(a => a.DraftText)) {\n            alert(\"You cannot reposition amendments.\");\n            return;\n        }\n        let [removedItemContent] = agendaItemContent.splice(result.source.index, 1);\n        let [removedItem] = agendaItems.splice(result.source.index, 1);\n        agendaItemContent.splice(result.destination.index, 0, removedItemContent);\n        agendaItems.splice(result.destination.index, 0, removedItem);\n        //Ensure amendments are still last, and reorder the Sequence value too!\n        agendaItems.sort((a, b) => (a.DraftText ? 1 : b.DraftText ? -1 : 0) || (a.DisplaySequence && b.DisplaySequence && a.DisplaySequence < b.DisplaySequence) || a.Sequence < b.Sequence)\n        agendaItems.forEach((element, index) => {\n            element.DisplaySequence = index + 1;\n            newAgendaItemContent.push(agendaItemContent[index]);\n        });\n        this.props.updateAgendaItems(agendaItems, this.props.categoryIndex, this.props.agendaIndex);\n        this.setState({ agendaItemContent: newAgendaItemContent });\n    }\n\n    toggleCustomNote(index) {\n        if (index > -1) {\n            let agendaItems = [...this.props.agenda.AgendaItems].sort((a, b) => (a.DraftText ? 1 : b.DraftText ? -1 : 0) || (a.DisplaySequence && b.DisplaySequence && a.DisplaySequence < b.DisplaySequence) || a.Sequence < b.Sequence);\n            agendaItems[index].IsActive = !agendaItems[index].IsActive;\n\n            this.props.updateAgendaItems(agendaItems, this.props.categoryIndex, this.props.agendaIndex);\n\n            const tinyMceEditor = document.querySelector('iframe#' + agendaItems[index].tinyMceId + '_ifr');\n            if (tinyMceEditor) {\n                const tinyMceHtmlElem = tinyMceEditor.contentWindow.document.querySelector('html');\n                const tinyMceHeaderElem = document.getElementById(agendaItems[index].tinyMceId).parentElement.querySelector('.tox-toolbar__primary');\n                if (tinyMceHtmlElem && tinyMceHeaderElem) {\n                    tinyMceHtmlElem.style.background = agendaItems[index].IsActive ? 'white' : '#f3f3f3';\n                    tinyMceHeaderElem.style.background = agendaItems[index].IsActive ? 'white' : '#f3f3f3';\n                }\n            }\n        }\n    }\n\n    setTinyMceIds(tinymceId, index) {\n        if (index > -1) {\n            let agendaItems = [...this.props.agenda.AgendaItems].sort((a, b) => (a.DraftText ? 1 : b.DraftText ? -1 : 0) || (a.DisplaySequence && b.DisplaySequence && a.DisplaySequence < b.DisplaySequence) || a.Sequence < b.Sequence);\n            agendaItems[index].tinyMceId = tinymceId;\n            this.props.updateAgendaItems(agendaItems, this.props.categoryIndex, this.props.agendaIndex);\n            const tinyMceHeaderElem = document.getElementById(agendaItems[index].tinyMceId).parentElement.querySelector('.tox-toolbar__primary');\n            if (tinyMceHeaderElem) {\n                tinyMceHeaderElem.style.background = agendaItems[index].IsActive ? 'white' : '#f3f3f3';\n            }\n        }\n    }\n\n    render() {\n        const editors =\n            <DragDropContext onDragEnd={result => this.onDragEnd(result)}>\n                <Droppable droppableId=\"droppable\">\n                    {(provided, _snapshot) => (\n                        <div ref={provided.innerRef}>\n                            {[...this.props.agenda.AgendaItems].sort((a, b) => (a.DraftText ? 1 : b.DraftText ? -1 : 0) || (a.DisplaySequence && b.DisplaySequence && a.DisplaySequence < b.DisplaySequence) || a.Sequence < b.Sequence).map((item, itemIndex) => {\n                                if (this.state.agendaItemContent[itemIndex] || this.state.agendaItemContent[itemIndex] === \"\") {\n                                    //Have to defer the render until there's actually conent to check\n                                    //this.state.agendaItemContent[itemIndex] was coming through undefined on the first pass and we can't re-render with the new height\n                                    let height = this.state.agendaItemContent[itemIndex].length <= 100 ? 80 : 180\n                                    return (\n                                        <Draggable isDragDisabled={Boolean(item.DraftText)} key={`${item.AgendaItemId}-${itemIndex}`} draggableId={`${item.AgendaItemId}-${itemIndex}`} index={itemIndex}>\n                                            {(provided, snapshot) => (\n                                                <div ref={provided.innerRef}\n                                                    {...provided.draggableProps}\n                                                    {...provided.dragHandleProps}\n                                                    style={getItemStyle(\n                                                        snapshot.isDragging,\n                                                        provided.draggableProps.style,\n                                                        item.IsActive\n                                                    )}\n                                                >\n                                                    {!item.DraftText && <div style={{ margin: 'auto' }}><button className=\"button draggable\">Drag and drop</button></div>}\n                                                    <div style={{ width: item.DraftText ? '100%' : '97%' }}>\n                                                        <Editor\n                                                            value={this.state.agendaItemContent[itemIndex] || ''}\n                                                            disabled={!item.IsActive || item.DraftText}\n                                                            onInit={(e) => this.setTinyMceIds(e.target.id, itemIndex)}\n                                                            init={{\n                                                                browser_spellcheck: true,\n                                                                height: height,\n                                                                menubar: false,\n                                                                statusbar: false,\n                                                                plugins: 'lists searchreplace',\n                                                                toolbar: 'undo redo | bold italic strikethrough | alignleft aligncenter alignright',\n                                                                skin: false,\n                                                                valid_children: '+body[style]',\n                                                                content_css: false,\n                                                                content_style: (item.IsActive ? '' : 'html { background: #f3f3f3}') + 'table { border-collapse: collapse; border: 1px solid #FFFFFF }' + 'td { padding: 12px 0px }',\n                                                            }}\n                                                            onEditorChange={content => this.handleEditorChange(content, itemIndex)}\n                                                        />\n                                                    </div>\n                                                    <div style={{ width: '3%', margin: 'auto', textAlign: 'center' }}>\n                                                        <button className={`icon ${item.IsActive ? 'delete' : 'add'}`} onClick={() => this.toggleCustomNote(itemIndex)} />\n                                                    </div>\n                                                </div>\n                                            )}\n                                        </Draggable>\n                                    )\n                                }\n                            })\n                            }\n                        </div>\n                    )}\n                </Droppable>\n            </DragDropContext>;\n        const buttons =\n            <React.Fragment>\n                <button type=\"button\" onClick={this.addNote} className=\"button\" style={!this.props.agenda.AgendaItems.length ? { marginTop: '20px' } : {}} >Add Note</button>\n                <div className=\"flex-row\">\n                    <br />\n                    <div className=\"inline-list\">\n                        <button type=\"button\" onClick={this.close} className=\"button secondary\">Cancel</button>\n                        <button type=\"button\" onClick={this.saveAgendaItems} className=\"button\">Finish</button>\n                    </div>\n                </div>\n            </React.Fragment>\n        return (<div>\n            {this.state.showPortal ?\n                <Popout togglePortal={this.togglePortal} windowTitle={`${this.props.agenda.LegislationNumber} ${this.props.agenda.LegislationDescription}`}>\n                    {editors}\n                    {buttons}\n                </Popout>\n                :\n                <div onClick={() => this.props.toggleAgendaItemEditor(-1)} className=\"overlay\">\n                    <div className=\"full\">\n                        <div onClick={e => e.stopPropagation()} className=\"dlas-forms user-forms advanced-search overlay-content animated-fade-in-up\">\n                            <div className=\"background-blue inline-list flex-row flex-vertical-center\">\n                                <span className=\"icon popout\" onClick={() => this.togglePortal(this.state.showPortal)}></span>\n                                <span className=\"txt-white\">{this.props.agenda.LegislationNumber} {this.props.agenda.LegislationDescription}</span>\n                            </div>\n                            {editors}\n                            {buttons}\n                        </div>\n                    </div>\n                </div>}\n        </div>);\n    }\n}\n\nexport default AgendaItemsComponent;\n","import React from \"react\";\nimport { LargeListSelect } from '../../../lis-shared/lis-layout/components/lis-forms-component';\nimport Select from 'react-select';\nimport ReactTooltip from 'react-tooltip';\nimport { Link } from 'react-router-dom';\nimport renderHTML from 'react-render-html';\nimport AgendaItemsComponent from '../../../lis-shared/lis-calendar/lis-agenda-items';\nimport moment from 'moment-timezone';\nimport { Editor } from '@tinymce/tinymce-react';\n\nconst isNotHidden = (agenda, category, committeeList) => (!agenda.CommitteeID && !agenda.IsHidden) || (agenda.IsActive && !agenda.IsHidden) || (committeeList.find(x => x.value == agenda.CommitteeID) && category.CalendarCategoryTypeID === 66) /* Bills or Resolutions Rereferred */\n\nconst NUMERIC_SORT_CATEGORIES = [2, 3, 4, 26, 27, 5, 41, 6, 7, 28, 29, 30, 31, 32, 57, 33, 35, 45, 9, 10, 8, 11, 13, 37, 38, 44, 46, 22];\n\nconst sortAgendas = (a, b, calendarChamber) => {\n    return !a.IsActive && b.IsActive\n        ? 1\n        : a.IsActive && !b.IsActive\n            ? -1\n            : (!a.Ranking || a.Ranking === \"\") && b.Ranking\n                ? -1\n                : (a.Ranking && a.Ranking !== \"\") && (!b.Ranking || b.Ranking === \"\")\n                    ? 1\n                    : a.Ranking > b.Ranking\n                        ? 1\n                        : a.Ranking < b.Ranking\n                            ? -1\n                            : moment(a.CalendarDate).isAfter(b.CalendarDate, \"day\")\n                                ? 1\n                                : moment(b.CalendarDate).isAfter(a.CalendarDate, \"day\")\n                                    ? -1\n                                    : moment(a.CandidateDate).isAfter(b.CandidateDate, \"day\")\n                                        ? 1\n                                        : moment(b.CandidateDate).isAfter(a.CandidateDate, \"day\")\n                                            ? -1\n                                            : a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) !== 0 ?\n                                                a.LegislationNumber[0].localeCompare(calendarChamber) !== 0\n                                                    ? -1 : 1\n                                                : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) > 0\n                                                    ? 1\n                                                    : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) < 0\n                                                        ? -1\n                                                        : a.LegislationKey > b.LegislationKey\n                                                            ? 1\n                                                            : -1\n}\n\nconst sortAgendasNumerically = (a, b, calendarChamber) => {\n    return !a.IsActive && b.IsActive\n        ? 1\n        : a.IsActive && !b.IsActive\n            ? -1\n            : (!a.Ranking || a.Ranking === \"\") && (b.Ranking && b.Ranking !== \"\")\n                ? -1\n                : (a.Ranking && a.Ranking !== \"\") && (!b.Ranking || b.Ranking === \"\")\n                    ? 1\n                    : a.Ranking > b.Ranking\n                        ? 1\n                        : a.Ranking < b.Ranking\n                            ? -1\n                            : a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) !== 0 ?\n                                a.LegislationNumber[0].localeCompare(calendarChamber) !== 0\n                                    ? -1 : 1\n                                : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) > 0\n                                    ? 1\n                                    : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) < 0\n                                        ? -1\n                                        : a.LegislationKey > b.LegislationKey\n                                            ? 1\n                                            : -1\n}\n\nconst sortInactiveAgendas = (a, b, calendarChamber) => {\n    return (!a.Ranking || a.Ranking === \"\") && (b.Ranking && b.Ranking !== \"\")\n        ? -1\n        : (a.Ranking && a.Ranking !== \"\") && (!b.Ranking || b.Ranking === \"\")\n            ? 1\n            : a.Ranking > b.Ranking\n                ? 1\n                : a.Ranking < b.Ranking\n                    ? -1\n                    : moment(a.CalendarDate).isAfter(b.CalendarDate, \"day\")\n                        ? 1\n                        : moment(b.CalendarDate).isAfter(a.CalendarDate, \"day\")\n                            ? -1\n                            : moment(a.CandidateDate).isAfter(b.CandidateDate, \"day\")\n                                ? 1\n                                : moment(b.CandidateDate).isAfter(a.CandidateDate, \"day\")\n                                    ? -1\n                                    : a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) !== 0 ?\n                                        a.LegislationNumber[0].localeCompare(calendarChamber) !== 0\n                                            ? -1 : 1\n                                        : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) > 0\n                                            ? 1\n                                            : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) < 0\n                                                ? -1\n                                                : a.LegislationKey > b.LegislationKey\n                                                    ? 1\n                                                    : -1\n}\n\nconst sortInactiveAgendasNumerically = (a, b, calendarChamber) => {\n    return (!a.Ranking || a.Ranking === \"\") && (b.Ranking && b.Ranking !== \"\")\n        ? -1\n        : (a.Ranking && a.Ranking !== \"\") && (!b.Ranking || b.Ranking === \"\")\n            ? 1\n            : a.Ranking > b.Ranking\n                ? 1\n                : a.Ranking < b.Ranking\n                    ? -1\n                    : a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) !== 0 ?\n                        a.LegislationNumber[0].localeCompare(calendarChamber) !== 0\n                            ? -1 : 1\n                        : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) > 0\n                            ? 1\n                            : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) < 0\n                                ? -1\n                                : a.LegislationKey > b.LegislationKey\n                                    ? 1\n                                    : -1\n}\n\nconst findLastByIsActiveThenCalendarDateThenCandidateDateThenLegChamberTypeKey = (a, b, calendarChamber, ignoreCalendarDate, ignoreCandidateDate) => (\n    a.IsActive && findLastByCalendarDateThenCandidateDateThenLegChamberTypeKey(a, b, calendarChamber, ignoreCalendarDate, ignoreCandidateDate)\n)\n\nconst findLastByCalendarDateThenCandidateDateThenLegChamberTypeKey = (a, b, calendarChamber, ignoreCalendarDate, ignoreCandidateDate) => (\n    (((ignoreCalendarDate || (a.CalendarDate && b.CalendarDate && moment(a.CalendarDate).isSame(b.CalendarDate, \"day\"))) && findLastByLegChamberTypeKey(a, b, calendarChamber)) ||\n        (!ignoreCalendarDate && a.CalendarDate && b.CalendarDate && moment(a.CalendarDate).isBefore(b.CalendarDate, \"day\"))) ||\n    (((ignoreCandidateDate || (a.CandidateDate && b.CandidateDate && moment(a.CandidateDate).isSame(b.CandidateDate, \"day\"))) && findLastByLegChamberTypeKey(a, b, calendarChamber)) ||\n        (!ignoreCandidateDate && a.CandidateDate && b.CandidateDate && moment(a.CandidateDate).isBefore(b.CandidateDate, \"day\"))) ||\n    ((ignoreCalendarDate || (!a.CalendarDate && !b.CalendarDate)) && (ignoreCandidateDate || (!a.CandidateDate && !b.CandidateDate)) &&\n        findLastByLegChamberTypeKey(a, b, calendarChamber))\n    || (!ignoreCalendarDate && !b.CalendarDate && a.CandidateDate)\n    || !ignoreCandidateDate && !b.CandidateDate && a.CandidateDate\n)\n\nconst findLastByLegChamberTypeKey = (a, b, calendarChamber) => (\n    (a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) === (calendarChamber === \"H\" ? 1 : -1)) ||\n    (a.LegislationNumber && a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) === 0 && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) === -1) ||\n    (a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) === 0 && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) === 0 && a.LegislationKey && a.LegislationKey < parseInt(b.LegislationKey))\n)\n\nconst getItemStyle = (isDragging, draggableStyle, isActive) => ({\n    // some basic styles to make the items look a bit nicer\n    userSelect: 'none',\n    // change background colour if dragging\n    background: isDragging ? '#34495e' : 'white',\n    color: isDragging ? 'white' : '#34495e',\n    border: 'none',\n    borderLeft: '1px solid #e0e0e0',\n    borderBottom: '1px solid #e0e0e0',\n    color: isActive ? '' : '#8b8b8b',\n    // styles we need to apply on draggables\n    ...draggableStyle,\n});\n\nclass BillsGrid extends React.Component {\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            selectAllActive: false,\n            selectAllInactive: false,\n            showAgendaItemEditor: -1,\n            showAgendaItemEditorCategoryIndex: -1,\n            lastCheckedBills: []\n        };\n        this.handleAgendaSort = this.handleAgendaSort.bind(this);\n        this.toggleSelectAll = this.toggleSelectAll.bind(this);\n        this.toggleRow = this.toggleRow.bind(this);\n        this.toggleBill = this.toggleBill.bind(this);\n        this.showAgendaItems = this.showAgendaItems.bind(this);\n        this.toggleEdit = this.toggleEdit.bind(this);\n        this.toggleEditCategoryDescription = this.toggleEditCategoryDescription.bind(this);\n        this.saveChange = this.saveChange.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n        this.onDragEnd = this.onDragEnd.bind(this);\n        this.toggleAgendaItemEditor = this.toggleAgendaItemEditor.bind(this);\n        this.expandTitle = this.expandTitle.bind(this);\n        this.getCategoryBills = this.getCategoryBills.bind(this);\n        this.setDescription = this.setDescription.bind(this);\n        this.setBillsInConferenceCategoryDescription = this.setBillsInConferenceCategoryDescription.bind(this);\n        this.categoryDescriptionIsEdited = this.categoryDescriptionIsEdited.bind(this);\n        this.changeCommitteeDropdown = this.changeCommitteeDropdown.bind(this);\n        this.changeDateDropdown = this.changeDateDropdown.bind(this);\n        this.addBill = this.addBill.bind(this);\n        this.toggleShowAmendments = this.toggleShowAmendments.bind(this);\n        this.setRanking = this.setRanking.bind(this);\n        this.handleDescriptionChange = this.handleDescriptionChange.bind(this);\n        this.selectAllCommending = this.selectAllCommending.bind(this);\n        this.selectAllMemorial = this.selectAllMemorial.bind(this);\n    }\n\n    toggleSelectAll(categoryIndex) {\n        let organizedBills = [...this.props.organizedBills];\n        const opposite = !organizedBills.filter(c => !c.DeletionDate)[categoryIndex].selectAll;\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].selectAll = opposite\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.forEach(leg => { if (isNotHidden(leg, organizedBills.filter(c => !c.DeletionDate)[categoryIndex], this.props.committeeList)) leg.checked = opposite });\n        this.props.updateAgenda(organizedBills);\n\n        let lastCheckedBills = this.state.lastCheckedBills;\n        lastCheckedBills[categoryIndex] = -1;\n        this.setState({\n            lastCheckedBills: lastCheckedBills\n        });\n    }\n\n    toggleRow(categoryIndex, itemIndex, e) {\n        let organizedBills = [...this.props.organizedBills];\n        let lastCheckedBills = this.state.lastCheckedBills;\n        let lastCheckedBill = lastCheckedBills[categoryIndex];\n        if (e.nativeEvent.shiftKey && !isNaN(lastCheckedBill) && lastCheckedBill !== -1) {\n            organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.forEach(agenda => agenda.checked = false);\n            for (let i = 0; i < Math.abs(itemIndex - lastCheckedBill); i++) {\n                const index = lastCheckedBill + i * (itemIndex - lastCheckedBill) / Math.abs(itemIndex - lastCheckedBill);\n                organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas[index].checked = true;\n            }\n        } else {\n            lastCheckedBill = itemIndex;\n        }\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas[itemIndex].checked = !organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas[itemIndex].checked;\n        this.props.updateAgenda(organizedBills);\n\n        lastCheckedBills[categoryIndex] = lastCheckedBill;\n        this.setState({\n            lastCheckedBills: lastCheckedBills\n        });\n    }\n\n    categoryDescriptionIsEdited(categoryAsDisplayed, associatedReferenceCategory) {\n        if (this.props.chamberCode === 'H' && categoryAsDisplayed.CategoryCode === \"SENBRC\" || categoryAsDisplayed.CategoryCode === \"HOUBRC\") {\n            return !(\n                [\"House Bill in Conference\", \"Senate Bill in Conference\",\n                    \"House Bills in Conference\", \"Senate Bills in Conference\",\n                    \"House Joint Resolution in Conference\", \"Senate Joint Resolution in Conference\",\n                    \"House Joint Resolutions in Conference\", \"Senate Joint Resolutions in Conference\",\n                    \"House Bill and Joint Resolution in Conference\", \"Senate Bill and Joint Resolution in Conference\",\n                    \"House Bills and Joint Resolution in Conference\", \"Senate Bills and Joint Resolution in Conference\",\n                    \"House Bill and Joint Resolutions in Conference\", \"Senate Bill and Joint Resolutions in Conference\",\n                    \"House Bills and Joint Resolutions in Conference\", \"Senate Bills and Joint Resolutions in Conference\",\n                ].includes(categoryAsDisplayed.Description))\n        } else {\n            if (associatedReferenceCategory && associatedReferenceCategory.Description !== categoryAsDisplayed.Description && associatedReferenceCategory.PluralDescription !== categoryAsDisplayed.Description) {\n                return true;\n            } else {\n                return false;\n            }\n        }\n    }\n\n    setDescription(organizedBills, categoryIndex) {\n        let updatedOrganizedBills = [...organizedBills];\n\n        if (categoryIndex) {\n            //if it's been edited, leave it at that\n            const associatedReferenceCategory = this.props.calendarCategories.find(x => x.CalendarCategoryTypeID === updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryTypeID);\n            if (this.categoryDescriptionIsEdited(updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex], associatedReferenceCategory)) {\n                //leave it alone\n            } else {\n                //otherwise, set description based on singular/plural reference description\n                if (this.props.chamberCode === 'H' && updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].CategoryCode === \"SENBRC\" || updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].CategoryCode === \"HOUBRC\") {\n                    updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].Description = this.setBillsInConferenceCategoryDescription(updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex]);\n                } else {\n                    if (associatedReferenceCategory) {\n                        if (updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.filter(x => x.IsActive).length > 1) {\n                            updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].Description = this.props.calendarCategories.find(x => x.CalendarCategoryTypeID === updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryTypeID).PluralDescription;\n                        } else {\n                            updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].Description = this.props.calendarCategories.find(x => x.CalendarCategoryTypeID === updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryTypeID).Description;\n                        }\n                    }\n                }\n            }\n        } else {\n            //iterate through all\n            updatedOrganizedBills.forEach((cat, index) => {\n                //if it's been edited, leave it at that\n                const associatedReferenceCategory = this.props.calendarCategories.find(x => x.CalendarCategoryTypeID === updatedOrganizedBills[index].CalendarCategoryTypeID)\n                if (this.categoryDescriptionIsEdited(cat, associatedReferenceCategory)) {\n                    return;\n                }\n\n                //otherwise, set description based on singular/plural reference description\n                if (this.props.chamberCode === 'H' && cat.CategoryCode === \"SENBRC\" || cat.CategoryCode === \"HOUBRC\") {\n                    updatedOrganizedBills[index].Description = this.setBillsInConferenceCategoryDescription(cat);\n                } else {\n                    if (associatedReferenceCategory) { //calendarCategories prop only contains same chamber categories, so could cause an NRE if iterating over an opposite-chamber category\n                        if (updatedOrganizedBills[index].Agendas.filter(x => x.IsActive).length > 1) {\n                            updatedOrganizedBills[index].Description = associatedReferenceCategory.PluralDescription;\n                        } else {\n                            updatedOrganizedBills[index].Description = associatedReferenceCategory.Description;\n                        }\n                    }\n                }\n            })\n        }\n\n        return updatedOrganizedBills;\n    }\n\n    setBillsInConferenceCategoryDescription(category) {\n        let existingDescription = category.Description;\n        let newTypeAndPluralityLanguage;\n        let newDescription;\n\n        //get all legislations in this category\n        const categoryLegislations = category.Agendas;\n        if (categoryLegislations) {\n            //filter to only the active legislations\n            const activeCategoryLegislations = categoryLegislations.filter(cl => cl.IsActive);\n            if (!activeCategoryLegislations.length) {\n                //not any active legislations - should only say 'bill'\n                newTypeAndPluralityLanguage = 'Bill';\n            } else {\n                const numResolutions = activeCategoryLegislations.filter(acl => acl.LegislationNumber[1] !== \"B\").length;\n                const numBills = activeCategoryLegislations.filter(acl => acl.LegislationNumber[1] === \"B\").length;\n                if (numResolutions > 0 && numBills > 0) {\n                    //At least one bill and at least one resolution\n                    newTypeAndPluralityLanguage = (numBills > 1 ? 'Bills' : 'Bill') + ' and Joint ';\n                    newTypeAndPluralityLanguage += numResolutions > 1 ? 'Resolutions' : 'Resolution';\n                } else if (numResolutions > 0 && numBills === 0) {\n                    //at least one resolution and no bills\n                    newTypeAndPluralityLanguage = numResolutions > 1 ? 'Joint Resolutions' : 'Joint Resolution';\n                } else if (numResolutions === 0 && numBills > 0) {\n                    //at least one bill and no resolutions\n                    newTypeAndPluralityLanguage = numBills > 1 ? 'Bills' : 'Bill';\n                }\n            }\n            newDescription = existingDescription.replace(/\\b(Bill and Joint Resolution|Bills and Joint Resolution|Bills and Joint Resolutions|Bill and Joint Resolutions|Bill|Bills|Joint Resolution|Joint Resolutions)\\b/, newTypeAndPluralityLanguage);\n        }\n\n        return newDescription;\n    }\n\n    handleAgendaSort(agendas, categoryTypeId) {\n        let unrankedAgendas = [];\n        let rankedAgendas = [];\n        let inactiveAgendas = [];\n        let rankings = [];\n\n        if (agendas) {\n            agendas.forEach((agenda) => {\n                if (!agenda.Ranking && agenda.IsActive) {\n                    unrankedAgendas.push(agenda);\n                } else if (agenda.IsActive) {\n                    rankedAgendas.push(agenda);\n                    rankings.push(agenda.Ranking);\n                } else {\n                    inactiveAgendas.push(agenda)\n                }\n            })\n\n            rankings.sort((a, b) => a - b);\n\n            let gaps = [];\n            for (let i = 1; i < rankings.length; i++) {\n                gaps.push(rankings[i] - rankings[i - 1]);\n            }\n\n            console.log(agendas, categoryTypeId)\n\n\n            if (NUMERIC_SORT_CATEGORIES.includes(categoryTypeId)) {\n                rankedAgendas.sort((a, b) => sortAgendasNumerically(a, b, this.props.chamberCode));\n            } else {\n                rankedAgendas.sort((a, b) => sortAgendas(a, b, this.props.chamberCode));\n            }\n            if (NUMERIC_SORT_CATEGORIES.includes(categoryTypeId)) {\n                unrankedAgendas.sort((a, b) => sortAgendasNumerically(a, b, this.props.chamberCode));\n            } else {\n                unrankedAgendas.sort((a, b) => sortAgendas(a, b, this.props.chamberCode));\n            }\n            if (NUMERIC_SORT_CATEGORIES.includes(categoryTypeId)) {\n                inactiveAgendas.sort((a, b) => sortInactiveAgendasNumerically(a, b, this.props.chamberCode));\n            } else {\n                inactiveAgendas.sort((a, b) => sortInactiveAgendas(a, b, this.props.chamberCode));\n            }\n\n            //If there are multiple ranks with a gap larger than 1 place all unranked agendas between them\n            if (new Set(rankings).size > 1 && Math.max(...gaps) > 1) {\n                let insertPoint = gaps.findIndex(x => x === Math.max(...gaps)) + 1\n\n                for (let i = 0; i < unrankedAgendas.length; i++) {\n                    rankedAgendas.splice(insertPoint, 0, unrankedAgendas[i]);\n                    insertPoint++;\n                }\n\n                return rankedAgendas.concat(inactiveAgendas);\n            } else {\n                //If the largest rank is greated than 50 put all unranked agendas above the ranked agendas, otherwise put them all at the bottom\n                if (Math.max(...rankings) >= 50) {\n                    return unrankedAgendas.concat(rankedAgendas).concat(inactiveAgendas);\n                } else {\n                    return rankedAgendas.concat(unrankedAgendas).concat(inactiveAgendas);\n\n                }\n            }\n        } else {\n            return agendas;\n        }\n    }\n\n    toggleBill(categoryIndex, itemIndex) {\n        let organizedBills = [...this.props.organizedBills];\n        let agenda = organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas[itemIndex]\n        agenda.IsActive = !agenda.IsActive;\n        agenda.checked = false;\n        if (agenda.pending === false) {\n            delete agenda.pending;\n        }\n\n        organizedBills = this.setDescription(organizedBills, categoryIndex);\n        organizedBills[categoryIndex].Agendas = this.handleAgendaSort(organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas, organizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryTypeID)\n\n        //check for this bill being a duplicate in other categories\n        const isDuplicate = organizedBills.filter(cc => cc.CalendarCategoryTypeID !== organizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryTypeID && cc.Agendas.find(a => a.LegislationNumber === agenda.LegislationNumber))\n        if (isDuplicate.length) {\n            isDuplicate.forEach(duplicateCategory => {\n                duplicateCategory.Agendas.filter(a => a.LegislationNumber === agenda.LegislationNumber).forEach(duplicateAgenda => {\n                    duplicateAgenda.IsActive = false;\n                    duplicateAgenda.Ranking = null;\n                })\n                const duplicateCategoryIndex = organizedBills.findIndex(cc => cc.CalendarCategoryTypeID === duplicateCategory.CalendarCategoryTypeID);\n                organizedBills = this.setDescription(organizedBills, duplicateCategoryIndex);\n                const response = this.handleAgendaSort(organizedBills[duplicateCategoryIndex].Agendas, organizedBills[duplicateCategoryIndex].CalendarCategoryTypeID)\n                organizedBills[duplicateCategoryIndex].Agendas = response;\n            })\n        }\n\n        this.props.updateAgenda(organizedBills, true);\n    }\n\n    toggleBillBulk(activate, categoryIndex) {\n        let organizedBills = [...this.props.organizedBills];\n\n        const legNumbersToBeIncluded = activate ? organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.filter(a => a.checked).flatMap(a => a.LegislationNumber) : [];\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.forEach(leg => {\n            if (leg.checked) {\n                leg.IsActive = activate;\n            }\n\n            if (leg.pending === false) {\n                delete leg.pending;\n            }\n\n            leg.checked = false;\n        });\n\n        organizedBills = this.setDescription(organizedBills, categoryIndex);\n        organizedBills[categoryIndex].Agendas = this.handleAgendaSort(organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas, organizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryTypeID)\n\n        //check for this bill being a duplicate in other categories\n        const isDuplicate = organizedBills.filter(cc => cc.CalendarCategoryTypeID !== organizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryTypeID && cc.Agendas.find(a => legNumbersToBeIncluded.includes(a.LegislationNumber)))\n        if (isDuplicate.length) {\n            isDuplicate.forEach(duplicateCategory => {\n                duplicateCategory.Agendas.filter(a => legNumbersToBeIncluded.includes(a.LegislationNumber)).forEach(duplicateAgenda => {\n                    duplicateAgenda.IsActive = false;\n                    duplicateAgenda.Ranking = null;\n                })\n                const duplicateCategoryIndex = organizedBills.findIndex(cc => cc.CalendarCategoryTypeID === duplicateCategory.CalendarCategoryTypeID);\n                organizedBills = this.setDescription(organizedBills, duplicateCategoryIndex);\n                organizedBills[duplicateCategoryIndex].Agendas.sort((a, b) => NUMERIC_SORT_CATEGORIES.includes(organizedBills[duplicateCategoryIndex].CalendarCategoryTypeID) ? sortAgendasNumerically(a, b, this.props.chamberCode) : sortAgendas(a, b, this.props.chamberCode));\n            })\n        }\n\n        this.props.updateAgenda(organizedBills, true);\n    }\n\n    moveTo(topOrBottom, categoryIndex) {\n        let organizedBills = [...this.props.organizedBills];\n\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.forEach(leg => {\n            if (leg.checked && leg.IsActive) {\n                leg.Ranking = topOrBottom === \"top\" ? 1 : 99\n            }\n        });\n\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.filter(a => a.checked).forEach(agenda => {\n            agenda.checked = false;\n        });\n\n        organizedBills = this.setDescription(organizedBills, categoryIndex);\n\n        const result = this.handleAgendaSort(organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas, organizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryTypeID)\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas = result;\n        this.props.updateAgenda(organizedBills, true);\n    }\n\n    switchCategory(categoryIndex) {\n        let organizedBills = [...this.props.organizedBills];\n\n        //uncheck the ones that are already in this category so that they don't get resequenced\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.forEach(a => a.checked = false);\n\n        let categoriesWithCheckedBills = organizedBills.filter(c => !c.DeletionDate && c.IsLegislationCategory && c.Agendas.find(a => a.checked));\n        categoriesWithCheckedBills.forEach(cat => {\n            cat.Agendas.filter(a => a.checked).forEach(checkedAgenda => {\n                checkedAgenda.Ranking = 0; //will get set later in toggleBillBulk\n                if (organizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryID) {\n                    checkedAgenda.CalendarCategoryID = organizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryID;\n                } else {\n                    delete checkedAgenda.CalendarCategoryID;\n                }\n                organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.push(checkedAgenda);\n                const existingCategoryAgendaIndex = cat.Agendas.findIndex(a => a.LegislationNumber === checkedAgenda.LegislationNumber);\n                if (existingCategoryAgendaIndex > -1) { //remove the bill from the old category; always should be found\n                    cat.Agendas.splice(existingCategoryAgendaIndex, 1);\n                }\n            })\n        })\n\n        this.toggleBillBulk(true, categoryIndex);\n    }\n\n    showAgendaItems(categoryIndex, agendaIndex) {\n        let organizedBills = [...this.props.organizedBills].filter(c => !c.DeletionDate);\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].showAgendaItems = !organizedBills[categoryIndex].Agendas[agendaIndex].showAgendaItems;\n        this.props.updateAgenda(organizedBills);\n    }\n\n    toggleEdit(categoryIndex, agendaIndex) {\n        let categories = [...this.props.organizedBills];\n        //This key is used to tell the DOM whether to display an input or a span\n        categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].isEditing = !categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].isEditing;\n        //Create a key called newDescription that will hold the text that  the user types in\n        categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].newDescription = categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].Description;\n        this.props.updateAgenda(categories);\n    }\n\n    handleChange(categoryIndex, agendaIndex, value, title) {\n        let categories = [...this.props.organizedBills];\n        if (title) {\n            categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].LegislationTitle = value;\n        } else {\n            categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].newDescription = value;\n        }\n\n        this.props.updateAgenda(categories);\n    }\n\n    saveChange(categoryIndex, agendaIndex) {\n        //Turn input back into span\n        let categories = [...this.props.organizedBills];\n        categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].isEditing = false;\n        //Set description to the text that the user has typed in. If new description is null then set it to the current description\n        categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].Description = categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].newDescription;\n        this.props.updateAgenda(categories, true);\n    }\n\n    expandTitle(categoryIndex, agendaIndex) {\n        let categories = [...this.props.organizedBills];\n        categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].expandTitle = !categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].expandTitle ? true : false;\n\n        this.props.updateAgenda(categories, this.props.pendingSave);\n    }\n\n    onDragEnd(result, categoryIndex) {\n\n    }\n\n    toggleAgendaItemEditor(agendaIndex, categoryIndex) {\n        if (!categoryIndex || ([...this.props.organizedBills].filter(c => !c.DeletionDate).length && [...this.props.organizedBills].filter(c => !c.DeletionDate)[categoryIndex])) {\n            this.setState({\n                showAgendaItemEditor: agendaIndex,\n                showAgendaItemEditorCategoryIndex: Number.isInteger(categoryIndex) ? categoryIndex : -1\n            });\n        }\n    }\n\n    getCategoryBills(category) {\n        const associatedCategory = this.props.calendarCategories.find(c => c.CalendarCategoryTypeID === category.CalendarCategoryTypeID);\n        if (associatedCategory) {\n            return this.props.billList.filter(b => (b.ChamberCode === associatedCategory.LegislationChamberCode || !associatedCategory.LegislationChamberCode) && (b.LegislationTypeCode === associatedCategory.LegislationTypeCode || !associatedCategory.LegislationTypeCode))\n        } else { return this.props.billList }\n    }\n\n    toggleShowAmendments(categoryIndex) {\n        let organizedBills = [...this.props.organizedBills];\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].showAmendments = !organizedBills[categoryIndex].showAmendments;\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.forEach(agenda => {\n            agenda.AgendaItems.forEach(item => {\n                if (item.LDNumber) {\n                    item.IsActive = organizedBills[categoryIndex].showAmendments;\n                }\n            })\n        });\n        this.props.updateAgenda(organizedBills);\n    }\n\n    setRanking(categoryIndex, agendaIndex, ranking) {\n        let organizedBills = [...this.props.organizedBills];\n        if (parseInt(ranking)) {\n            organizedBills[categoryIndex].Agendas[agendaIndex].Ranking = parseInt(ranking);\n        } else if (ranking === \"\") {\n            organizedBills[categoryIndex].Agendas[agendaIndex].Ranking = \"\";\n        }\n        this.props.updateAgenda(organizedBills);\n    }\n\n    changeCommitteeDropdown(value) {\n        this.props.changeCommitteeDropdown(value, () => {\n            let organizedBills = [...this.props.organizedBills];\n            organizedBills = this.setDescription(organizedBills);\n            this.props.updateAgenda(organizedBills, true);\n        });\n    }\n\n    changeDateDropdown(value) {\n        this.props.changeDateDropdown(value, () => {\n            let organizedBills = [...this.props.organizedBills];\n            organizedBills = this.setDescription(organizedBills);\n            this.props.updateAgenda(organizedBills, true);\n        });\n    }\n\n    addBill(categoryIndex) {\n        this.props.addBill(categoryIndex, () => {\n            let organizedBills = [...this.props.organizedBills];\n            organizedBills = this.setDescription(organizedBills);\n            this.props.updateAgenda(organizedBills, true);\n        });\n    }\n\n    toggleEditCategoryDescription(categoryIndex, save) {\n        const categories = [...this.props.organizedBills];\n        let category = categories.filter(c => !c.DeletionDate)[categoryIndex];\n        category.editing = !category.editing;\n        if (save) {\n            category.Description = category.tempDescription;\n        } else {\n            category.tempDescription = this.categoryDescription(category);\n        }\n        this.props.updateAgenda(categories, save);\n    }\n\n    handleDescriptionChange(categoryIndex, val) {\n        let organizedBills = [...this.props.organizedBills];\n        organizedBills[categoryIndex].tempDescription = val;\n        this.props.updateAgenda(organizedBills);\n    }\n\n    categoryDescription = category => {\n        //if it's been edited, leave it at that\n        const associatedReferenceCategory = this.props.calendarCategories.find(x => x.CalendarCategoryTypeID === category.CalendarCategoryTypeID);\n        if (associatedReferenceCategory && associatedReferenceCategory.Description !== category.Description && associatedReferenceCategory.PluralDescription !== category.Description) {\n            return category.Description;\n        }\n\n        //otherwise, use singular or plural reference description\n        if (this.props.chamberCode === 'H' && category.CategoryCode === \"HOUBRC\" || category.CategoryCode === \"SENBRC\") {\n            return category.Description;\n        } else if (category.Agendas.filter(a => a.IsActive).length > 1 && category.PluralDescription) {\n            return category.PluralDescription;\n        } else {\n            return category.Description;\n        }\n    }\n\n    selectAllCommending(categoryIndex) {\n        let organizedBills = [...this.props.organizedBills];\n        const opposite = !organizedBills.filter(c => !c.DeletionDate)[categoryIndex].selectAllCommending;\n        organizedBills[categoryIndex].selectAllCommending = opposite;\n        organizedBills[categoryIndex].Agendas.forEach(x => { if (x.LegislationClassID === 3) { x.checked = opposite } })\n        this.props.updateAgenda(organizedBills);\n    }\n\n    selectAllMemorial(categoryIndex) {\n        let organizedBills = [...this.props.organizedBills];\n        const opposite = !organizedBills.filter(c => !c.DeletionDate)[categoryIndex].selectAllMemorial;\n        organizedBills[categoryIndex].selectAllMemorial = opposite\n        organizedBills[categoryIndex].Agendas.forEach(x => { if (x.LegislationClassID === 2) { x.checked = opposite } })\n        this.props.updateAgenda(organizedBills);\n    }\n\n    render() {\n        //Filter out the categories that have already been added to the calendar\n        const calendarCategoryOptions = this.props.calendarCategories.filter(category => {\n            if (this.props.organizedBills.findIndex(cat => !cat.DeletionDate && cat.CalendarCategoryTypeID === category.CalendarCategoryTypeID) < 0) {\n                return category;\n            }\n        });\n        // The button will read 'Add' if the bill is not already part of a category. The button will read 'Move' if it is already part of a category.\n        const billButtonText = index => {\n            let billExists = false;\n            if (this.props.selectedBill[index]) {\n                this.props.organizedBills.some(category => {\n                    if (category.Agendas.findIndex(bill => bill.LegislationID === this.props.selectedBill[index].LegislationID) >= 0) {\n                        billExists = true;\n                        return true;\n                    }\n                });\n                if (billExists) {\n                    return (\"Move\");\n                }\n            }\n            return (\"Add\");\n        }\n\n        return (\n            <div className=\"drag-container\">\n                {this.state.showAgendaItemEditor !== -1 &&\n                    <AgendaItemsComponent\n                        toggleAgendaItemEditor={this.toggleAgendaItemEditor}\n                        agenda={this.props.organizedBills.filter(c => !c.DeletionDate)[this.state.showAgendaItemEditorCategoryIndex].Agendas[this.state.showAgendaItemEditor]}\n                        categoryIndex={this.state.showAgendaItemEditorCategoryIndex}\n                        agendaIndex={this.state.showAgendaItemEditor}\n                        updateAgendaItems={this.props.updateAgendaItems}\n                    />\n                }\n                <div className=\"inner-grid two\">\n                    <React.Fragment>\n                        <span>Use these two selectors to view candidate bills reported out of committee.</span>\n                        <div />\n                        <div className=\"inner-grid two\">\n                            <div>\n                                <label>Committee Reported Out</label>\n                                <Select\n                                    classNamePrefix=\"grid-selector-dropdown\"\n                                    value={this.props.selectedCommittee}\n                                    onChange={this.changeCommitteeDropdown}\n                                    options={this.props.committeeList.sort((a, b) => a.label > b.label)}\n                                    styles={{ menu: provided => ({ ...provided, zIndex: this.props.organizedBills.length + 1 }) }}\n                                    isSearchable\n                                    isClearable\n                                />\n                            </div>\n                            <div>\n                                <label>Date Reported Out</label>\n                                <Select\n                                    classNamePrefix=\"grid-selector-dropdown\"\n                                    value={this.props.selectedDate}\n                                    onChange={this.changeDateDropdown}\n                                    options={this.props.dateList.sort((a, b) => a.label > b.label)}\n                                    styles={{ menu: provided => ({ ...provided, zIndex: this.props.organizedBills.length + 1 }) }}\n                                    isSearchable\n                                    isClearable\n                                />\n                            </div>\n                        </div>\n                    </React.Fragment>\n                    <div className=\"inner-grid eight-and-one\">\n                        <div>\n                            <label>Category</label>\n                            <Select\n                                classNamePrefix=\"grid-selector-dropdown\"\n                                options={calendarCategoryOptions}\n                                value={this.props.selectedCategory}\n                                onChange={this.props.changeCategoryDropdown}\n                                styles={{ menu: provided => ({ ...provided, textAlign: 'right', whiteSpace: 'nowrap', right: '0', width: 'auto', zIndex: this.props.organizedBills.length + 1 }) }}\n                            />\n                        </div>\n                        <button disabled={!this.props.selectedCategory} type=\"button\" className=\"button primary\" style={{ marginTop: \"24px\", height: \"36px\" }} onClick={this.props.addCategory}>Add Category</button>\n                    </div>\n                </div>\n                <div style={{ display: 'flex', gap: '25px' }}>\n                    <button className=\"button-link\" onClick={() => this.props.toggleHideAllCategories(this.props.hideCategories.filter(c => c).length !== this.props.organizedBills.length)}>{this.props.hideCategories.filter(c => c).length !== this.props.organizedBills.length ? \"Collapse All Categories\" : \"Expand All Categories\"}</button>\n                    <button className=\"button-link\" onClick={() => this.props.toggleHideAllNonIncludedBills()}>{this.props.hideAllNonIncludedBills ? \"Show All Legislation\" : \"Hide Non-Included Legislation\"}</button>\n                </div>\n                <div style={{ marginTop: 15 }}>\n                    <div className=\"bill-grid communications-category-grid calendar-category-grid\">\n                        <div className=\"bill-grid-header\">\n                            <span>Seq.</span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span></span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>Bill #</span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>Committee/Date Reported</span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>{this.props.showTitles ? \"Title\" : \"Caption\"}</span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>Status</span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>Action</span>\n                        </div>\n                    </div>\n                    {this.props.organizedBills.filter(c => !c.DeletionDate).map((category, categoryIndex) =>\n                        <form key={categoryIndex}>\n                            <div style={{ position: 'sticky', top: '0px', zIndex: this.props.organizedBills.filter(c => !c.DeletionDate).length - categoryIndex }}>\n                                <div className={`calendar-category-grid calendar-category-grid-header${category.Agendas && category.Agendas.length ? '' : ' deletable'}`}>\n                                    <div>\n                                        <button onClick={() => this.props.toggleHideCategory(categoryIndex)} type=\"button\" className={`${this.props.hideCategories[categoryIndex] ? \"arrow-down\" : \"arrow-up\"}`}></button>\n                                    </div>\n                                    <div>\n                                        <input\n                                            type=\"checkbox\"\n                                            className=\"checkbox\"\n                                            checked={category.selectAll || ''}\n                                            onChange={() => this.toggleSelectAll(categoryIndex)}\n                                        />\n                                    </div>\n                                    <div>\n                                        <span>\n                                            {category.editing ?\n                                                <React.Fragment>\n                                                    <textarea\n                                                        className={`category-description-${categoryIndex}`}\n                                                        style={{ width: '90%', fontSize: '0.9em' }}\n                                                        type=\"text\"\n                                                        onChange={(e) => this.handleDescriptionChange(categoryIndex, e.target.value)}\n                                                        value={category.tempDescription}\n                                                    />\n                                                    <a className=\"icon save\" style={{ marginLeft: '7px' }} onClick={() => this.toggleEditCategoryDescription(categoryIndex, true)} />\n                                                    <a className=\"icon delete\" style={{ marginLeft: '7px' }} onClick={() => this.toggleEditCategoryDescription(categoryIndex)} />\n                                                </React.Fragment>\n                                                :\n                                                <React.Fragment>\n                                                    <b>{category.DisplayType ? `${this.categoryDescription(category)} - ${category.CategoryType} ` : this.categoryDescription(category)}</b>\n                                                    <a className=\"icon edit\" style={{ marginLeft: '7px' }} onClick={() => this.toggleEditCategoryDescription(categoryIndex)} />\n                                                </React.Fragment>\n                                            }\n                                        </span>\n                                        {category.CalendarCategoryTypeID === 38 &&\n                                            <div style={{ display: \"inline-flex\" }}>\n                                                <button type=\"button\" class=\"button small-button\" style={{ marginRight: \"10px\" }} onClick={() => this.selectAllCommending(categoryIndex)}>Select All Commending</button>\n                                                <button type=\"button\" class=\"button small-button\" onClick={() => this.selectAllMemorial(categoryIndex)}>Select All Memorial</button>\n                                            </div>\n                                        }\n                                    </div>\n                                    <div>\n                                        {!category.Agendas || !category.Agendas.length ? <button onClick={() => this.props.deleteCategory(category)} className=\"icon delete\" type=\"button\" />\n                                            :\n                                            this.props.userRoles.find(x => x === \"SenateCalendarEditor\") && [98, 102].includes(category.CalendarCategoryTypeID) &&\n                                            <React.Fragment>\n                                                <label style={{ margin: \"0 5px 0 0\" }}>Show w/ Amendments</label>\n                                                <div className=\"bill-grid-actions\">\n                                                    <div onClick={() => this.toggleShowAmendments(categoryIndex)} className=\"toggle-switch\">\n                                                        <input id=\"sr-status-change\" checked={category.showAmendments} type=\"checkbox\" />\n                                                        <span className=\"slider\"></span>\n                                                    </div>\n                                                </div>\n                                            </React.Fragment>\n                                        }\n                                    </div>\n                                    <div className=\"flex-row\" style={{ gap: '10px' }}>\n                                        {\n                                            category.IsLegislationCategory && this.props.organizedBills.find(cat => !cat.DeletionDate && cat.CalendarCategoryTypeID !== category.CalendarCategoryTypeID && cat.IsLegislationCategory && cat.Agendas.find(agenda => agenda.checked)) ?\n                                                <button type=\"button\" className=\"button small-button\" onClick={() => this.switchCategory(categoryIndex)}>Move to Category</button>\n                                                : !category.IsLegislationCategory && category.Agendas.length && category.Agendas.find(a => a.checked) &&\n                                                <React.Fragment>\n                                                    <div>\n                                                        <button type=\"button\" className=\"button small-button\" onClick={() => this.toggleBillBulk(false, categoryIndex)}>Exclude Selected</button>\n                                                    </div>\n                                                    <div>\n                                                        <button type=\"button\" className=\"button small-button\" onClick={() => this.toggleBillBulk(true, categoryIndex)}>Include Selected</button>\n                                                    </div>\n                                                </React.Fragment>\n                                        }\n                                    </div>\n                                    <div>\n                                        {!this.props.pendingSave && <button type=\"button\" className=\"button small-button\" onClick={() => this.props.toggleCalendarPreview(categoryIndex)} >Preview</button>}\n                                    </div>\n                                    <div>\n                                        {!this.props.pendingSave && category.CalendarCategoryTypeID != 131 && <button type=\"button\" className=\"button small-button\" onClick={() => this.props.togglePortal(this.props.showPortal, category)}>PDF Preview </button>}\n                                    </div>\n                                </div>\n                                {!this.props.hideCategories[categoryIndex] && category.IsLegislationCategory &&\n                                    <div className=\"bill-grid communications-category-grid calendar-category-grid\">\n                                        <div></div>\n                                        <div></div>\n                                        <div>\n                                            <LargeListSelect\n                                                className=\"grid-selector-dropdown\"\n                                                classNamePrefix=\"grid-selector-dropdown\"\n                                                options={this.getCategoryBills(category)}\n                                                onChange={(value) => this.props.changeBillDropdown(categoryIndex, value)}\n                                                value={this.props.selectedBill[categoryIndex]}\n                                                filterOption={(bill, inputValue) => {\n                                                    if (category.Agendas.findIndex(agenda => agenda.LegislationID === bill.value) < 0) {\n                                                        return bill.label.toLowerCase().includes(inputValue.toLowerCase());\n                                                    } else { return false; }\n                                                }}\n                                            />\n                                        </div>\n                                        <div className=\"center\">\n                                            <button\n                                                className=\"button\"\n                                                type=\"button\"\n                                                disabled={!this.props.selectedBill[categoryIndex]}\n                                                onClick={() => this.addBill(categoryIndex)}>\n                                                {billButtonText(categoryIndex)}\n                                            </button>\n                                        </div>\n                                        <div className=\"flex-row four space-around\" style={{ display: 'flex', alignItems: 'center' }}>\n                                            {category.Agendas.length && category.Agendas.find(a => a.checked) ?\n                                                <React.Fragment>\n                                                    <div>\n                                                        <span>Checked Legislation:</span>\n                                                    </div>\n                                                    <div>\n                                                        <button type=\"button\" className=\"button small-button\" onClick={() => this.toggleBillBulk(false, categoryIndex)}>Exclude</button>\n                                                    </div>\n                                                    <div>\n                                                        <button type=\"button\" className=\"button small-button\" onClick={() => this.toggleBillBulk(true, categoryIndex)}>Include</button>\n                                                    </div>\n                                                    <div>\n                                                        <button type=\"button\" className=\"button small-button\" onClick={() => this.moveTo('top', categoryIndex)}>Move to Top</button>\n                                                    </div>\n                                                    <div>\n                                                        <button type=\"button\" className=\"button small-button\" onClick={() => this.moveTo('bottom', categoryIndex)}>Move to Bottom</button>\n                                                    </div>\n                                                </React.Fragment>\n                                                : null\n                                            }\n                                        </div>\n                                    </div>\n                                }\n                            </div>\n                            {!this.props.hideCategories[categoryIndex] &&\n                                <div>\n                                    {category.Agendas.map((item, itemIndex) => {\n                                        if (this.props.hideAllNonIncludedBills && !item.IsActive) { return; }\n                                        const showNewIndicator = category.CategoryCode != \"Order\" && category.CalendarCategoryID && !item.AgendaID;\n                                        return (\n                                            <React.Fragment key={`${item.AgendaID}-${itemIndex}`}>\n                                                {isNotHidden(item, category, this.props.committeeList) ?\n                                                    <div className=\"bill-grid communications-category-grid calendar-category-grid\"\n                                                        style={getItemStyle(\n                                                            false,\n                                                            false,\n                                                            item.IsActive\n                                                        )}\n                                                    >\n                                                        <div className=\"dlas-forms\" style={{ padding: \"5px\" }}><input type=\"input\" value={item.Ranking ? item.Ranking : \"\"} onChange={(e) => this.setRanking(categoryIndex, itemIndex, e.target.value)} /></div>\n                                                        <div>\n                                                            <input\n                                                                type=\"checkbox\"\n                                                                className=\"checkbox\"\n                                                                checked={item.checked || ''}\n                                                                onChange={e => this.toggleRow(categoryIndex, itemIndex, e)} />\n                                                        </div>\n                                                        <div className=\"new-container\">\n                                                            {this.props.organizedBills.find(c => c.CalendarCategoryTypeID !== category.CalendarCategoryTypeID && c.Agendas.find(a => a.LegislationNumber === item.LegislationNumber)) &&\n                                                                <React.Fragment>\n                                                                    <i data-tip=\"This legislation exists in multiple categories.\" className={`icon notification calendar-authoring${showNewIndicator ? ' new' : ''}`} />\n                                                                </React.Fragment>\n                                                            }\n                                                            <Link to={`/bill-details/${this.props.sessionCode}/${item.LegislationNumber}`} target=\"_blank\" rel=\"noreferrer\" style={!item.IsActive ? { color: 'inherit' } : {}}> {item.LegislationNumber}</Link>\n                                                            {showNewIndicator && <span className='corner-new'>NEW</span>}\n                                                        </div>\n                                                        <div>\n                                                            <span>{this.props.fullCommitteeList.find(x => x.CommitteeID === item.CommitteeID) ? this.props.fullCommitteeList.find(x => x.CommitteeID === item.CommitteeID).Abbreviation + \" - \" + moment(item.CandidateDate).format(\"MM/DD/YYYY\") : category.CategoryCode != \"Order\" && item.CandidateDate && moment(item.CandidateDate).format(\"MM/DD/YYYY\")}</span>\n                                                        </div>\n                                                        <div>\n                                                            <div className=\"flex-row\" style={{ display: 'flex' }}>\n                                                                <div className=\"flex-row flex-vertical-center\" style={{ width: \"100%\", display: \"inline-flex\" }}>\n                                                                    {item.isEditing\n                                                                        ? category.Description !== \"Order of Business\"\n                                                                            ? <Editor\n                                                                                init={{\n                                                                                    inline: true,\n                                                                                    toolbar: false,\n                                                                                    menubar: false\n                                                                                }}\n                                                                                onEditorChange={(content) => this.handleChange(categoryIndex, itemIndex, content, item.LegislationTitle != null)}\n                                                                                value={item.LegislationTitle ? item.LegislationTitle : item.newDescription}\n                                                                            />\n                                                                            : <textarea\n                                                                                onChange={(e) => this.handleChange(categoryIndex, itemIndex, e.target.value, item.LegislationTitle != null)}\n                                                                                value={item.LegislationTitle ? item.LegislationTitle : item.newDescription}\n                                                                            />\n                                                                        :\n                                                                        <React.Fragment>\n                                                                            <span className={this.props.organizedBills && this.props.organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas[itemIndex].expandTitle ? \"calendar-leg-title-wrapper expanded\" : \"calendar-leg-title-wrapper\"}>{item.Description === \"Call to Order\" ? \"Call to Order - \" + this.props.calendarTime : renderHTML(!this.props.showTitles && item.LegislationDescription ? item.LegislationDescription : !this.props.showTitles && item.Description ? item.Description : this.props.showTitles && item.LegislationTitle ? item.LegislationTitle : item.Description ? item.Description : \"\")}</span>\n                                                                            {!this.props.showTitles && item.LegislationDescription && item.LegislationDescription.length > 75\n                                                                                ? <a onClick={() => this.expandTitle(categoryIndex, itemIndex)} style={{ cursor: \"pointer\" }}>...</a>\n                                                                                : !this.props.showTitles && item.Description && item.Description.length > 75\n                                                                                    ? <a onClick={() => this.expandTitle(categoryIndex, itemIndex)} style={{ cursor: \"pointer\" }}>...</a>\n                                                                                    : this.props.showTitles && item.LegislationTitle && item.LegislationTitle.length > 75\n                                                                                        ? <a onClick={() => this.expandTitle(categoryIndex, itemIndex)} style={{ cursor: \"pointer\" }}>...</a>\n                                                                                        : item.Description && item.Description.length > 75\n                                                                                            ? <a onClick={() => this.expandTitle(categoryIndex, itemIndex)} style={{ cursor: \"pointer\" }}>...</a>\n                                                                                            : null}\n                                                                        </React.Fragment>\n                                                                    }\n                                                                </div>\n                                                                <React.Fragment>\n                                                                    <div className=\"bill-grid-actions\">\n                                                                        {item.isEditing\n                                                                            ?\n                                                                            <div className=\"bill-grid-actions\" style={{ display: \"inline-flex\" }}>\n                                                                                <button onClick={() => this.saveChange(categoryIndex, itemIndex)} type=\"button\" className=\"icon save float-right\"></button>\n                                                                                <button onClick={() => this.toggleEdit(categoryIndex, itemIndex)} type=\"button\" className=\"icon delete float-right\"></button>\n                                                                            </div>\n                                                                            :\n                                                                            <div className=\"bill-grid-actions\">\n                                                                                {/*Allow edit if it is not the call to order item, the item IsActive, and we are viewing titles OR it is the invocation, pledge, or reading of the journal*/}\n                                                                                {item.Description !== \"Call to Order\" && item.IsActive && (this.props.showTitles || [2, 3, 4, 6, 7, 8].includes(item.CalendarCategoryTemplateID)) &&\n                                                                                    <button onClick={() => this.toggleEdit(categoryIndex, itemIndex)} type=\"button\" className=\"icon edit float-right\"></button>\n                                                                                }\n                                                                            </div>\n                                                                        }\n                                                                        {category.CategoryCode !== \"Order\" && <button onClick={() => this.showAgendaItems(categoryIndex, itemIndex)} className={item.showAgendaItems ? 'arrow-up' : 'arrow-down'} type=\"button\"></button>}\n                                                                    </div>\n                                                                </React.Fragment>\n                                                            </div>\n                                                            {item.showAgendaItems &&\n                                                                <div>\n                                                                    <button type=\"button\" onClick={() => this.toggleAgendaItemEditor(itemIndex, categoryIndex)} className=\"button-link\">Edit Notes</button>\n                                                                    {/* If an item has an LdNumber it's assumed to be an amendment */}\n                                                                    {item.AgendaItems.filter(item => item.Description && item.IsActive && (!item.LDNumber ? true : category.showAmendments || ![98, 102].includes(category.CalendarCategoryTypeID) ? true : false)).map((item, itemIndex) =>\n                                                                        <div key={itemIndex} className=\"programmatic-notes\">\n                                                                            {renderHTML(item.DraftText || item.CalendarDescription || item.Description)}\n                                                                        </div>\n                                                                    )}\n                                                                </div>\n                                                            }\n                                                        </div>\n                                                        <div>\n                                                            <span className={item.IsActive ? \"message-success\" : \"\"}>{item.IsActive ? 'Included' : 'Not Included'}</span>\n                                                        </div>\n                                                        <div className=\"bill-grid-actions\">\n                                                            <div onClick={() => this.toggleBill(categoryIndex, itemIndex)} className=\"toggle-switch\">\n                                                                <input id=\"sr-status-change\" checked={item.IsActive} type=\"checkbox\" />\n                                                                <span className=\"slider\"></span>\n                                                            </div>\n                                                        </div>\n                                                    </div>\n                                                    :\n                                                    null\n                                                }\n                                            </React.Fragment>\n                                        )\n                                    }\n                                    )}\n                                </div>\n                            }\n                        </form>\n                    )}\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default BillsGrid;","export const generateCsv = (columns, rows) => {\n    let doc = \"\";\n    let newLine = \"\\r\\n\";\n\n    doc = columns.join(\",\");\n    doc = doc + newLine;\n\n    for (let i = 0; i < rows.length; i++) {\n        columns.forEach(column => {\n            let col = column.replace(/ /g, \"\");\n            if (rows[i][col] != undefined) {\n                let rowText = rows[i][col].toString().replace(/(\\r\\n|\\n|\\r)/gm, \"\");\n                if (!rowText.startsWith(\"=HYPERLINK(\"))\n                    rowText = rowText.replaceAll('\"', \"'\");\n                rowText = `\\\"${rowText}\\\"`;\n                doc = doc + rowText + \",\";\n            } else {\n                doc = doc + \" \" + \",\";\n            }\n        });\n\n        doc = doc + newLine\n    }\n    return doc\n}","import { publicRequest, partnerRequest } from '../services/request.service'\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst voteLinkRequest = \"GET_VOTE_LINK_REQUEST\";\nconst voteLinkSuccess = \"GET_VOTE_LINK_SUCCESS\";\nconst voteLinkFailure = \"GET_VOTE_LINK_FAILURE\";\n\nconst voteDetailsRequest = \"GET_VOTE_DETAILS_REQUEST\";\nconst voteDetailsSuccess = \"GET_VOTE_DETAILS_SUCCESS\";\nconst voteDetailsFailure = \"GET_VOTE_DETAILS_FAILURE\";\n\nconst voteActionListRequest = \"GET_VOTE_ACTION_LIST_REQUEST\";\nconst voteActionListSuccess = \"GET_VOTE_ACTION_LIST_SUCCESS\";\nconst voteActionListFailure = \"GET_VOTE_ACTION_LIST_FAILURE\";\n\nconst voteListSuccess = \"GET_VOTE_LIST_SUCCESS\";\nconst voteListFailure = \"GET_VOTE_LIST_FAILURE\";\n\nconst voteTypesSuccess = \"GET_VOTE_TYPE_SUCCESS\";\nconst voteTypesFailure = \"GET_VOTE_TYPE_FAILURE\";\n\nconst voteSaveSuccess = \"GET_VOTE_SAVE_SUCCESS\";\nconst voteSaveFailure = \"GET_VOTE_SAVE_FAILURE\";\n\nconst voteSaveBulkSuccess = \"GET_VOTE_SAVE_BULK_SUCCESS\";\nconst voteSaveBulkFailure = \"GET_VOTE_SAVE_BULK_FAILURE\";\n\nconst voteFileSuccess = \"GET_VOTE_FILE_GEN_SUCCESS\";\nconst voteFileFailure = \"GET_VOTE_FILE_GEN_FAILURE\";\n\nconst voteSaveMotionSuccess = \"SAVE_VOTE_MOTION_SUCCESS\";\nconst voteSaveMotionFailure = \"SAVE_VOTE_MOTION_FAILURE\";\n\nconst initialState = {\n    voteLinkResponse: [],\n    voteLinkError: '',\n    voteDetailsResponse: [],\n    voteDetailsError: '',\n    voteList: [],\n    voteListError: '',\n    voteTypes: [],\n    voteTypesError: '',\n    voteSave: [],\n    voteSaveError: '',\n    voteSaveBulk: '',\n    voteSaveBulkError: '',\n    voteFile: '',\n    voteFileError: '',\n    voteSaveMotion: '',\n    voteSaveMotionError: '',\n};\n\nexport const voteActionCreators = {\n    // GET VOTE DETAILS\n    requestVoteDetails: () => ({\n        type: voteDetailsRequest,\n        isFetching: true\n    }),\n\n    receiveVoteDetails: (response) => ({\n        type: voteDetailsSuccess,\n        isFetching: false,\n        voteDetailsResponse: response\n    }),\n\n    voteDetailsError: message => ({\n        type: voteDetailsFailure,\n        isFetching: false,\n        voteDetailsError: message\n    }),\n\n    getVoteDetails: (params, partner) => {\n        return dispatch => {\n            dispatch(voteActionCreators.requestVoteDetails());\n\n            let request = '';\n            if (partner) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_VOTE_API_URL) + '/Vote/api/GetPartnerVoteByIdAsync/', 'GET', '', '', params)\n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_VOTE_API_URL) + '/Vote/api/GetVoteByIdAsync/', 'GET', '', '', params);\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(voteActionCreators.voteDetailsError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(voteActionCreators.receiveVoteDetails(result[1].Votes))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(voteActionCreators.voteDetailsError('No Vote Data'))\n                        return Promise.reject('No Vote Data')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    // VOTE LINKS CALL\n    requestVoteLink: () => ({\n        type: voteLinkRequest,\n        isFetching: true\n    }),\n\n    receiveVoteLink: (response) => ({\n        type: voteLinkSuccess,\n        isFetching: false,\n        voteLinkResponse: response\n    }),\n\n    voteLinkError: message => ({\n        type: voteLinkFailure,\n        isFetching: false,\n        voteLinkError: message\n    }),\n\n    getVoteLink: (params) => {\n        return dispatch => {\n            dispatch(voteActionCreators.requestVoteLink());\n\n            return publicRequest((API_URL || process.env.REACT_APP_VOTE_API_URL) + '/Vote/api/GetVoteLinksAsync/', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(voteActionCreators.voteLinkError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(voteActionCreators.receiveVoteLink(result[1].VoteLinks))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(voteActionCreators.receiveVoteLink([]))\n                        return Promise.reject('No Content')\n                    }\n                }).catch(err => console.log(err))\n        }\n    },\n\n    // VOTE ACTION LIST CALL\n    requestVoteActionList: () => ({\n        type: voteActionListRequest,\n        isFetching: true\n    }),\n\n    receiveVoteActionList: (response) => ({\n        type: voteActionListSuccess,\n        isFetching: false,\n        voteActionList: response\n    }),\n\n    voteActionListError: message => ({\n        type: voteActionListFailure,\n        isFetching: false,\n        voteActionListError: message\n    }),\n\n    getVoteActionList: (params) => {\n        return dispatch => {\n            dispatch(voteActionCreators.requestVoteActionList());\n\n            return partnerRequest((API_URL || process.env.REACT_APP_VOTE_API_URL) + '/Vote/api/GetVoteActionListAsync/', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(voteActionCreators.voteActionListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(voteActionCreators.receiveVoteActionList(result[1].VoteActions))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(voteActionCreators.receiveVoteActionList([]))\n                        return Promise.reject('No Content')\n                    }\n                }).catch(err => console.log(err))\n        }\n    },\n\n    receiveVoteList: (response) => ({\n        type: voteListSuccess,\n        voteList: response\n    }),\n\n    voteListError: message => ({\n        type: voteListFailure,\n        voteListError: message\n    }),\n\n    getVoteList: (params) => {\n        return dispatch => {\n            return partnerRequest((API_URL || process.env.REACT_APP_VOTE_API_URL) + '/Vote/api/GetPartnerVoteListAsync/', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(voteActionCreators.voteListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(voteActionCreators.receiveVoteList(result[1].ShallowVotes))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(voteActionCreators.receiveVoteList([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveVoteTypes: (response) => ({\n        type: voteTypesSuccess,\n        voteTypes: response\n    }),\n\n    voteTypesError: message => ({\n        type: voteTypesFailure,\n        voteTypesError: message\n    }),\n\n    getVoteTypes: () => {\n        return dispatch => {\n\n            return publicRequest((API_URL || process.env.REACT_APP_VOTE_API_URL) + '/Vote/api/GetVoteTypeReferencesAsync/', 'GET', '', '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(voteActionCreators.voteTypesError(result[1]));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(voteActionCreators.receiveVoteTypes(result[1].VoteTypes));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(voteActionCreators.voteTypesError('No Content'));\n                        return Promise.reject('No Content');\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveVoteSave: (response) => ({\n        type: voteSaveSuccess,\n        voteSave: response\n    }),\n\n    voteSaveError: message => ({\n        type: voteSaveFailure,\n        voteSaveError: message\n    }),\n\n    saveVote: (body) => {\n        return dispatch => {\n\n            return partnerRequest((API_URL || process.env.REACT_APP_VOTE_API_URL) + '/Vote/api/SaveVoteAsync/', 'POST', '', body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(voteActionCreators.voteSaveError(result[1]));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(voteActionCreators.receiveVoteSave(result[1]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(voteActionCreators.voteSaveError('No Content'));\n                        return Promise.reject('No Content');\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveVoteSaveBulk: (response) => ({\n        type: voteSaveBulkSuccess,\n        voteSaveBulk: response\n    }),\n\n    voteSaveBulkError: message => ({\n        type: voteSaveBulkFailure,\n        voteSaveBulkError: message\n    }),\n\n    saveVoteBulk: (body) => {\n        return dispatch => {\n\n            return partnerRequest((API_URL || process.env.REACT_APP_VOTE_API_URL) + '/Vote/api/PublishVotesAsync/', 'PUT', '', body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(voteActionCreators.voteSaveBulkError(result[1]));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(voteActionCreators.receiveVoteSaveBulk(result[1]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(voteActionCreators.voteSaveBulkError('No Content'));\n                        return Promise.reject('No Content');\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveVoteFile: (response) => ({\n        type: voteFileSuccess,\n        voteFile: response\n    }),\n\n    voteFileError: message => ({\n        type: voteFileFailure,\n        voteFileError: message\n    }),\n\n    voteFileGen: (params) => {\n        return dispatch => {\n            return partnerRequest((API_URL || process.env.REACT_APP_VOTE_FILE_GEN_URL) + '/VoteFileGeneration/api/ProcessTallySheetFileAsync/', 'POST', '', '', params, true)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(voteActionCreators.voteFileError(result[1]));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(voteActionCreators.receiveVoteFile(result[1]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(voteActionCreators.voteFileError('No Content'));\n                        return Promise.reject('No Content');\n                    }\n                }).catch(err => console.log(err))\n        }\n    },\n\n    receiveVoteSaveMotion: (response) => ({\n        type: voteSaveMotionSuccess,\n        voteSaveMotion: response\n    }),\n\n    voteSaveMotionError: message => ({\n        type: voteSaveMotionFailure,\n        voteSaveMotionError: message\n    }),\n\n    saveVoteMotion: (body) => {\n        return dispatch => {\n            return partnerRequest((API_URL || process.env.REACT_APP_VOTE_API_URL) + '/Vote/api/VoteMotionSaveAsync/', 'POST', '', body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(voteActionCreators.voteSaveMotionError(result[1]));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(voteActionCreators.receiveVoteSaveMotion(result[1]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(voteActionCreators.voteSaveMotionError('No Content'));\n                        return Promise.reject('No Content');\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n};\n\nexport const reducer = (state, action) => {\n    state = state || initialState;\n\n    switch (action.type) {\n        case voteDetailsRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case voteDetailsSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                voteDetailsResponse: action.voteDetailsResponse,\n                voteDetailsError: ''\n            });\n        case voteDetailsFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                voteDetailsError: action.voteDetailsError\n            });\n        case voteLinkRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case voteLinkSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                voteLinkResponse: action.voteLinkResponse,\n                voteLinkError: ''\n            });\n        case voteLinkFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                voteLinkError: action.voteLinkError\n            });\n        case voteActionListRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case voteActionListSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                voteActionList: action.voteActionList,\n                voteActionListError: ''\n            });\n        case voteActionListFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                voteActionListError: action.voteActionListError\n            });\n        case voteListSuccess:\n            return Object.assign({}, state, {\n                voteList: action.voteList,\n                voteListError: ''\n            });\n        case voteListFailure:\n            return Object.assign({}, state, {\n                voteListError: action.voteListError\n            });\n        case voteTypesSuccess:\n            return Object.assign({}, state, {\n                voteTypes: action.voteTypes,\n                voteTypesError: ''\n            });\n        case voteTypesFailure:\n            return Object.assign({}, state, {\n                voteTypesError: action.voteTypesError\n            });\n        case voteSaveSuccess:\n            return Object.assign({}, state, {\n                voteSave: action.voteSave,\n                voteSaveError: ''\n            });\n        case voteSaveFailure:\n            return Object.assign({}, state, {\n                voteSaveError: action.voteSaveError\n            });\n        case voteSaveSuccess:\n            return Object.assign({}, state, {\n                voteSaveBulk: action.voteSaveBulk,\n                voteSaveBulkError: ''\n            });\n        case voteSaveFailure:\n            return Object.assign({}, state, {\n                voteSaveBulkError: action.voteSaveBulkError\n            });\n        case voteFileSuccess:\n            return Object.assign({}, state, {\n                voteFile: action.voteFile,\n                voteFileError: ''\n            });\n        case voteFileFailure:\n            return Object.assign({}, state, {\n                voteFileError: action.voteFileError\n            });\n        case voteSaveMotionSuccess:\n            return Object.assign({}, state, {\n                voteSaveMotion: action.voteSaveMotion,\n                voteSaveMotionError: ''\n            });\n        case voteSaveMotionFailure:\n            return Object.assign({}, state, {\n                voteSaveMotionError: action.voteSaveMotionError\n            });\n        default:\n            return state;\n    }\n};\n","import { partnerRequest, publicRequest } from '../services/request.service';\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst patronListRequest = \"GET_PATRON_LIST_REQUEST\";\nconst patronListSuccess = \"GET_PATRON_LIST_SUCCESS\";\nconst patronListFailure = \"GET_PATRON_LIST_FAILURE\";\n\nconst patronRolesSuccess = \"GET_PATRON_ROLES_SUCCESS\"\nconst patronRolesFailure = \"GET_PATRON_ROLES_FAILURE\"\n\nconst patronTypesSuccess = \"GET_PATRON_TYPES_SUCCESS\";\nconst patronTypesFailure = \"GET_PATRON_TYPES_FAILURE\";\n\nconst patronSaveSuccess = \"PATRON_SAVE_SUCCESS\";\nconst patronSaveFailure = \"PATRON_SAVE_FAILURE\";\nconst patronSaveRequest = \"PATRON_SAVE_REQUEST\";\n\nconst initialState = {\n    senatePatronsList: [],\n    housePatronsList: [],\n    chiefPatronsList: [],\n    patronList: [],\n    patronRoles: [],\n    patronRolesError: '',\n    patronTypes: [],\n    patronTypesError: '',\n    patronSaveList: [],\n    patronSaveError: ''\n};\n\nexport const patronActionCreators = {\n    requestPatronList: () => ({\n        type: patronListRequest,\n        isFetching: true\n    }),\n\n    receivePatronList: (housePatrons, senatePatrons, chiefPatrons, patronList) => ({\n        type: patronListSuccess,\n        isFetching: false,\n        senatePatronsList: senatePatrons,\n        housePatronsList: housePatrons,\n        chiefPatronsList: chiefPatrons,\n        patronList: patronList\n    }),\n\n    patronListError: message => ({\n        type: patronListFailure,\n        isFetching: false,\n        message\n    }),\n\n    getPatronList: (params) => {\n        return dispatch => {\n            dispatch(patronActionCreators.requestPatronList());\n\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_PATRON_SERVICE) + '/LegislationPatron/api/GetLegislationPatronsByIdAsync/', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(patronActionCreators.patronsListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        let patrons = result[1];\n                        var housePatrons = [];\n                        var senatePatrons = [];\n                        var chiefPatrons = [];\n                        let patronList = [];\n                        for (var i = 0; i < patrons.Patrons.length; i++) {\n                            if (patrons.Patrons[i].ChamberCode === 'H' && patrons.Patrons[i].DisplayName !== \"(Chief Patron)\") {\n                                housePatrons.push(patrons.Patrons[i])\n                            }\n                            if (patrons.Patrons[i].ChamberCode === 'S' && patrons.Patrons[i].DisplayName !== \"(Chief Patron)\") {\n                                senatePatrons.push(patrons.Patrons[i])\n                            }\n                            if (patrons.Patrons[i].DisplayName === \"(Chief Patron)\") {\n                                chiefPatrons.push(patrons.Patrons[i])\n                            }\n                            patronList.push(patrons.Patrons[i])\n                        }\n\n                        dispatch(patronActionCreators.receivePatronList(housePatrons, senatePatrons, chiefPatrons, patronList))\n                    } else if (result[0] === NO_CONTENT) {\n                        var housePatrons = [];\n                        var senatePatrons = [];\n                        var chiefPatrons = [];\n                        let patronList = [];\n                        dispatch(patronActionCreators.receivePatronList(housePatrons, senatePatrons, chiefPatrons, patronList))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receivePatronRoles: responseObj => ({\n        type: patronRolesSuccess,\n        patronRoles: responseObj\n    }),\n\n    patronRolesError: message => ({\n        type: patronRolesFailure,\n        patronRolesError: message\n    }),\n\n    getPatronRoles: () => {\n        return dispatch => {\n\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_PATRON_SERVICE) + '/LegislationPatron/api/getPatronRoleTypeListAsync/', 'GET', '', '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(patronActionCreators.patronRolesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(patronActionCreators.receivePatronRoles(result[1].PatronRolesList))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(patronActionCreators.patronRolesError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receivePatronTypes: responseObj => ({\n        type: patronTypesSuccess,\n        patronTypes: responseObj\n    }),\n\n    patronTypesError: message => ({\n        type: patronTypesFailure,\n        patronTypesError: message\n    }),\n\n    getPatronTypes: (params) => {\n        return dispatch => {\n\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_PATRON_SERVICE) + '/LegislationPatron/api/GetMemberPatronTypeListAsync/', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(patronActionCreators.patronTypesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(patronActionCreators.receivePatronTypes(result[1].MemberPatronTypes))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(patronActionCreators.patronTypesError([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    requestPatronSave: () => ({\n        type: patronSaveRequest,\n        isFetching: true\n    }),\n\n    receivePatronSave: responseObj => ({\n        type: patronSaveSuccess,\n        isFetching: false,\n        patronSaveList: responseObj\n    }),\n\n    patronSaveError: message => ({\n        type: patronSaveFailure,\n        isFetching: false,\n        patronSaveError: message\n    }),\n\n    savePatrons: (body) => {\n        return dispatch => {\n            dispatch(patronActionCreators.requestPatronSave());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            };\n\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_PATRON_SERVICE) + '/LegislationPatron/api/SaveLegislationPatronAsync/', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(patronActionCreators.patronSaveError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(patronActionCreators.receivePatronSave(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(patronActionCreators.patronSaveError([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    }\n};\n\nexport const reducer = (state, action) => {\n    state = state || initialState;\n\n    switch (action.type) {\n        case patronListRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case patronListSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                senatePatronsList: action.senatePatronsList,\n                housePatronsList: action.housePatronsList,\n                chiefPatronsList: action.chiefPatronsList,\n                patronList: action.patronList\n            });\n        case patronListFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.message\n            });\n        case patronRolesSuccess:\n            return Object.assign({}, state, {\n                patronRoles: action.patronRoles,\n                patronRolesError: ''\n            });\n        case patronRolesFailure:\n            return Object.assign({}, state, {\n                patronRolesError: action.patronRolesError\n            });\n        case patronTypesSuccess:\n            return Object.assign({}, state, {\n                patronTypes: action.patronTypes,\n                patronTypesError: ''\n            });\n        case patronTypesFailure:\n            return Object.assign({}, state, {\n                patronTypesError: action.patronTypesError\n            });\n        case patronSaveSuccess:\n            return Object.assign({}, state, {\n                patronSave: action.patronSave,\n                patronSaveList: action.patronSaveList,\n                patronTypesError: ''\n            });\n        case patronSaveFailure:\n            return Object.assign({}, state, {\n                patronSaveError: action.patronSaveError\n            });\n\n        default:\n            return state;\n    }\n};\n","import React, { useState } from 'react';\nimport { Link, withRouter } from 'react-router-dom';\nimport renderHTML from 'react-render-html';\nimport ReactTooltip from 'react-tooltip';\n\nconst VERSION_AUTHOR = \"LegislationText\";\n\nfunction VersionData(props) {\n    const [showText, toggleText] = useState(false);\n    let impactFileUrls = [];\n    let pdfLink = '';\n\n    if (props.ImpactFile && props.ImpactFile.length > 0) {\n        for (let i = 0; i < props.ImpactFile.length; i++) {\n            impactFileUrls.push({\n                url: props.ImpactFile[i].FileURL,\n                description: props.ImpactFile[i].Description ? props.ImpactFile[i].Description.substr(0, props.ImpactFile[i].Description.indexOf(\"(\")) : \"Impact statement\"\n            });\n        }\n    }\n\n    if (props.PDFFile && props.PDFFile.length > 0) {\n        pdfLink = <a href={props.PDFFile[0].FileURL} target=\"_blank\" className=\"link-pdf\">PDF</a>\n    }\n    let descriptionAndDisposition = props.Description + (props.pushWithKeywords ? \" \" + props.DocumentCode : \"\");\n    let substituteLdAndDocCodeString = \"\";\n    // add (LD#-DocCodeSuffix) to the description (if not already there) if it is a substitute and does not have 'C' in the document code\n    if (props.LegislationVersion === \"Substitute\" && props.LDNumber && !props.Description.includes(props.LDNumber.replace(\"D\", \"\")) && props.DocumentCode && !props.DocumentCode.includes('C')) {\n        const subDocCodeRegex = /[HS](?:.(?![HS]))+$/; //matches the last H/S in the string and everything after (e.g. H13 from HB202H13)\n        substituteLdAndDocCodeString = \" (\" + props.LDNumber + \"-\" + props.DocumentCode.match(subDocCodeRegex) + \")\";\n    }\n    // Versions that are held should not be linked to except for certain signed in users\n    // Also the text disposition is hidden because they don't want public users to see that it is held\n    // We do not need to worry about adding the 'keyword-hit-list' class if props.pushWithKeywords is true (like we do for other dispositions) since 'Hold' versions shouldn't be returned in the keyword search results\n    if (props.TextDisposition === \"Hold\") {\n        return (<div className=\"bill-details-versions-grid-container\">\n            <div className={`bill-details-versions-grid${!props.IsPublic ? ' not-public' : ''}`}>\n                {/* Previously date */}\n                <div>{props.ChamberCode && props.ChamberCode !== \"\" ? props.ChamberCode === \"H\" ? \"House\" : \"Senate\" : props.Sponsor}</div>\n                <div>{props.userClaims.resources.find(resource => resource === VERSION_AUTHOR) ? <Link to={`/bill-details/${props.SessionCode || props.sessionCode}/${props.LegislationNumber}/text/${props.DocumentCode}`}>{props.Description}{substituteLdAndDocCodeString} (On Hold)</Link> : `${props.Description}`}</div>\n            </div>\n        </div>);\n    } else if (props.TextDisposition !== \"Posted\") {\n        descriptionAndDisposition = props.Description + \" \" +\n            (props.TextDisposition &&\n                (props.TextDisposition !== \"Offered\" || props.ChamberCode !== \"S\")\n                && ((props.LegislationVersion !== \"Substitute\" || props.TextDisposition === \"Adopted\" || props.ChamberCode === props.LegislationNumber.charAt(0))\n                    || (props.LegislationVersion === \"Substitute\" && props.ChamberCode !== props.LegislationNumber.charAt(0) && props.TextDisposition === \"Not Adopted\"))\n                ? props.TextDisposition\n                : '') + \" \"\n            + (substituteLdAndDocCodeString != \"\"\n                ? substituteLdAndDocCodeString\n                : props.pushWithKeywords\n                    ? props.DocumentCode\n                    : props.TextDisposition === \"Offered\"\n                        ? \"Offered\"\n                        : \"\");\n\n        //Bandaid over offered not always appear but also sometimes appearing twice\n        descriptionAndDisposition = descriptionAndDisposition.substring(descriptionAndDisposition.length - 15, descriptionAndDisposition.length) === \"Offered Offered\" ? descriptionAndDisposition.substring(0, descriptionAndDisposition.length - 8) : descriptionAndDisposition\n    }\n    //If the IsReprint boolean is true and the service didn't append Reprint to the description already\n    if (props.IsReprint && !descriptionAndDisposition.includes(\"(Reprint)\")) {\n        descriptionAndDisposition = descriptionAndDisposition + \" (Reprint)\";\n    }\n\n    return (\n        <React.Fragment>\n            <div className={showText && props.LegislationVersion && props.LegislationVersion.includes(\"Amendment\") ? \"bill-details-versions-grid-container no-border\" : \"bill-details-versions-grid-container\"}>\n                {/* This is a grid instead of a table because displaying the draft text messes up the alignment of tables */}\n                <div className={(props.pushWithKeywords\n                    ? \"bill-details-versions-grid keyword-hit-list\"\n                    : \"bill-details-versions-grid\" + (!props.IsPublic ? \" not-public\" : \"\"))\n                }>\n                    {/* Previously date */}\n                    <div>{props.Sponsor === \"Governor\" ? \"Governor\" : props.ChamberCode && props.ChamberCode !== \"\" ? props.ChamberCode === \"H\" ? \"House\" : \"Senate\" : props.Sponsor}</div>\n                    <div className={props.pushWithKeywords && \"double-version-links\"}>\n                        {props.editing == false || props.editing == undefined\n                            ? <React.Fragment>\n                                {props.pushWithKeywords || props.legislationClass === \"Budget\"\n                                    ? <span>{descriptionAndDisposition}</span>\n                                    : <Link to={`/bill-details/${props.SessionCode || props.sessionCode}/${props.LegislationNumber\n                                        ? props.LegislationNumber\n                                        : props.legislationNumber}/text/${props.DocumentCode}`}>{descriptionAndDisposition}</Link>\n                                }\n                                {props.userClaims && props.userClaims.roles && props.userClaims.roles.find(x => x === \"DLASStaff\") && <button className='icon edit' onClick={() => { props.handleToggleDescriptionEdit(props.index) }} />}\n                            </React.Fragment>\n                            : <React.Fragment>\n                                <input value={props.tempDescription} onChange={(e) => props.handleDescriptionChange(e.target.value, props.index)} />\n                                <span>{(props.TextDisposition && (props.TextDisposition !== \"Offered\" || props.ChamberCode !== \"S\") && (props.LegislationVersion !== \"Substitute\" || props.TextDisposition === \"Adopted\" || props.ChamberCode === props.LegislationNumber.charAt(0)) ? descriptionAndDisposition.includes(props.TextDisposition) && props.TextDisposition : '')}</span>\n                                <a className=\"icon save\" onClick={() => props.saveDescription(props.index)}></a>\n                                <a className=\"icon delete\" onClick={() => { props.handleToggleDescriptionEdit(props.index) }}></a>\n                            </React.Fragment>}\n                        {props.pushWithKeywords && <a style={{ zIndex: 2 }} onClick={() => props.pushWithKeywords(props.SessionCode || props.sessionCode, props.legislationNumber, props.DocumentCode)}>View Keyword Hits {props.countMatches === 'LOADING' ? <div aria-label=\"Loading\" className=\"small-spinner\" /> : props.countMatches > 0 ? \"(\" + props.countMatches + \")\" : ''}</a>}\n                        {!props.IsPublic && !props.pushWithKeywords &&\n                            <React.Fragment>\n                                <i data-tip=\"This version has not been published and is not visible to the public.\" className={'icon notification unpublished-version'} />\n                                <ReactTooltip />\n                            </React.Fragment>}\n                    </div>\n                    <div>{impactFileUrls[0] != undefined ? <a type=\"button\" href=\"javascript:void(0)\" onClick={() => toggleText(!showText)}>{impactFileUrls.length > 1 ? \"Impact Statements\" : \"Impact Statement\"}</a> : null}</div>\n                    <div>{props.LinkFile && props.LinkFile.length > 0 ? <a href={props.LinkFile[0].FileURL} target=\"_blank\" className=\"link-new-tab\">Link</a> : null}</div>\n                    <div>{pdfLink ? pdfLink : null}</div>\n                    <div>{props.userClaims && props.userClaims.roles && props.userClaims.roles.find(x => x === \"ImpactStatementAuthor\") && props.toggleStatementForm ? <div><a type=\"button\" className=\"button-link icon add impact-statement\" onClick={() => props.toggleStatementForm((props.VersionDate ? props.VersionDate : props.DraftDate), descriptionAndDisposition, props.DocumentCode)}>IS</a></div> : null}</div>\n                    <div style={{ textAlign: 'right' }}>{((props.LegislationVersion && props.LegislationVersion.includes(\"Amendment\")) || impactFileUrls.length) ? <button aria-expanded={showText} type=\"button\" className={showText ? \"arrow-up\" : \"arrow-down\"} onClick={() => toggleText(!showText)}>Show amendment text and/or impact statement(s)</button> : null}</div>\n                </div>\n                {showText && impactFileUrls.length ?\n                    <div>\n                        {impactFileUrls.map((file, idx) => {\n                            return (\n                                <div key={idx} className=\"impact-statements-grid\">\n                                    <div />\n                                    <div>\n                                        <a href={file.url} target=\"_blank\" className=\"link-pdf\">{file.description}</a>\n                                    </div>\n                                    <br />\n                                </div>\n                            )\n                        })\n                        }\n                    </div>\n                    :\n                    null\n                }\n            </div>\n            {showText && props.LegislationVersion && props.LegislationVersion.includes(\"Amendment\") &&\n                <div className=\"amendment-text\" style={{ paddingBottom: \"10px\", borderBottom: \"1px solid #d9dddd\" }}>\n                    {renderHTML(props.DraftText || '')}\n                </div>\n            }\n        </React.Fragment>\n    )\n}\n\nclass VersionList extends React.Component {\n    constructor(props) {\n        super(props);\n\n        this.pushWithKeywords = this.pushWithKeywords.bind(this);\n        this.toggleStatementForm = this.toggleStatementForm.bind(this);\n        this.handleToggleDescriptionEdit = this.handleToggleDescriptionEdit.bind(this);\n        this.handleDescriptionChange = this.handleDescriptionChange.bind(this);\n        this.saveDescription = this.saveDescription.bind(this);\n    }\n\n    pushWithKeywords(sessionCode, legislationNumber, documentCode) {\n        const keywordExpression = this.props.selectedKeywords;\n        if (keywordExpression) {\n            const partsRegex = /(\\().*?(\\)+)|(\").*?(\"+)|(').*?('+)|['a-zA-Z*]*/g;\n            const keywordParts = keywordExpression.match(partsRegex);\n            let foundAnOperator = false;\n            for (const keywordPart of keywordParts) {\n                if (keywordPart && (keywordPart.toLowerCase() === \"and\" || keywordPart.toLowerCase() === \"or\")) { foundAnOperator = true; break; }\n            }\n\n            let sanitizedKeywords = [];\n            var chars = { \"(\": \"\", \")\": \"\", '\"': \"\" };\n            if (!foundAnOperator) {\n                //need to behave like API to keep it consistent:\n                //per API, no operators so just clean expression from single quote operators and treat it as single keyword\n                let phraseToInsert = keywordExpression.replace(/[()\"]/g, m => chars[m]);\n                if (phraseToInsert.startsWith(\"'\") && phraseToInsert.endsWith(\"'\")) { phraseToInsert = phraseToInsert.substr(1, phraseToInsert.length - 2) }\n                if (phraseToInsert) { sanitizedKeywords.push(phraseToInsert); }\n            } else {\n                for (const keywordPart of keywordParts) {\n                    if (keywordPart && keywordPart.toLowerCase() != \"and\" && keywordPart.toLowerCase() != \"or\") {\n                        let wordToInsert = keywordPart.replace(/[()\"]/g, m => chars[m]);\n                        if (wordToInsert.startsWith(\"'\") && wordToInsert.endsWith(\"'\")) { wordToInsert = wordToInsert.substr(1, wordToInsert.length - 2) }\n                        if (wordToInsert) { sanitizedKeywords.push(wordToInsert); }\n                    }\n                }\n            }\n\n            this.props.history.push({\n                pathname: `/bill-details/${sessionCode}/${legislationNumber}/text/${documentCode}`,\n                state: { selectedKeywords: sanitizedKeywords }\n            })\n        }\n    }\n\n    toggleStatementForm(statementDate, statementDescription, documentCode) {\n        this.props.toggleStatementForm(statementDate, statementDescription, documentCode)\n    }\n\n    handleToggleDescriptionEdit(index) {\n        this.props.handleToggleDescriptionEdit(index);\n    }\n\n    handleDescriptionChange(value, index) {\n        this.props.handleDescriptionChange(value, index);\n    }\n\n    saveDescription(index) {\n        this.props.saveDescription(index);\n    }\n\n    render() {\n        const { version, userClaims, selectedKeywords, sessionCode } = this.props;\n        return (\n            version.map((version, i) => {\n                return (selectedKeywords\n                    ? <VersionData key={i} index={i} {...version} userClaims={userClaims} descriptionEditable={this.props.descriptionEditable} handleDescriptionChange={this.handleDescriptionChange} handleToggleDescriptionEdit={this.handleToggleDescriptionEdit} saveDescription={this.saveDescription} history={this.props.history} pushWithKeywords={this.pushWithKeywords} legislationNumber={this.props.legislationNumber} toggleStatementForm={this.toggleStatementForm} sessionCode={sessionCode} />\n                    : <VersionData key={i} index={i} {...version} userClaims={userClaims} descriptionEditable={this.props.descriptionEditable} handleDescriptionChange={this.handleDescriptionChange} handleToggleDescriptionEdit={this.handleToggleDescriptionEdit} saveDescription={this.saveDescription} history={this.props.history} toggleStatementForm={this.toggleStatementForm} legislationClass={this.props.legislationClass} sessionCode={sessionCode} />\n                )\n            })\n        )\n    }\n}\n\nexport default withRouter(VersionList);","import { bindActionCreators } from 'redux';\nimport { partnerRequest, publicRequest } from '../services/request.service';\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst reportTypesSuccess = \"REPORT_TYPES_SUCCESS\";\nconst reportTypesFailure = \"REPORT_TYPES_FAILURE\";\n\nconst reportSuccess = \"GET_REPORT_SUCCESS\";\nconst reportFailure = \"GET_REPORT_FAILURE\";\n\nconst billReportInformationSuccess = \"BILL_REPORT_INFORMATION_SUCCESS\";\nconst billReportInformationFailure = \"BILL_REPORT_INFORMATION_FAILURE\";\n\nconst shareReportRequest = \"SHARE_REPORT_REQUEST\";\n\nconst initialState = {\n    reportTypes: [],\n    reportTypesError: '',\n    report: [],\n    reportError: '',\n    shareReport: '',\n    billReportInformation: [],\n    billReportInformationError: ''\n};\n\nexport const reportActionCreators = {\n\n    receiveReportTypes: res => ({\n        type: reportTypesSuccess,\n        reportTypes: res,\n    }),\n\n    reportTypesError: message => ({\n        type: reportTypesFailure,\n        reportTypesError: message,\n    }),\n\n    getReportTypes: () => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_REPORT_FILE_GEN_SERVICE) + '/ReportFileGeneration/api/GetPartnerReportListAsync', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(reportActionCreators.reportTypesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(reportActionCreators.receiveReportTypes(result[1].Reports))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(reportActionCreators.receiveReportTypes([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveReport: res => ({\n        type: reportSuccess,\n        report: res,\n    }),\n\n    reportError: message => ({\n        type: reportFailure,\n        reportError: message,\n    }),\n\n    getReport: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_REPORT_FILE_GEN_SERVICE) + '/ReportFileGeneration/api/GetPartnerReportDataAsync', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(reportActionCreators.reportError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(reportActionCreators.receiveReport(result[1].ReportDataList))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(reportActionCreators.reportError('No Data Found'));\n                        return Promise.reject('No Data Found');\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveBillReportInformation: res => ({\n        type: billReportInformationSuccess,\n        billReportInformation: res,\n    }),\n\n    billReportInformationError: message => ({\n        type: billReportInformationFailure,\n        billReportInformationError: message,\n    }),\n\n    getBillReportInformation: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_REPORT_FILE_GEN_SERVICE) + '/ReportFileGeneration/api/GetReportInformation', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(reportActionCreators.billReportInformationError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(reportActionCreators.receiveBillReportInformation(result[1].StronglyTypedObject));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(reportActionCreators.billReportInformationError('No Data Found'));\n                        return Promise.reject('No Data Found');\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    saveBillReportInformation: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_REPORT_FILE_GEN_SERVICE) + '/ReportFileGeneration/api/SaveReportInformation', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(reportActionCreators.billReportInformationError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(reportActionCreators.receiveBillReportInformation(result[1].StronglyTypedObject));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(reportActionCreators.billReportInformationError('No Data Found'));\n                        return Promise.reject('No Data Found');\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    shareReport: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_NOTIFICATIONS_API_URL) + '/Notification/api/ShareReportAsync', 'POST', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch({\n                            type: shareReportRequest,\n                            shareReportError: result[1],\n                        })\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch({\n                            type: shareReportRequest,\n                            shareReport: result[1],\n                        })\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch({\n                            type: shareReportRequest,\n                            shareReportError: \"No data returned\",\n                        })\n                        return Promise.reject('No Data Found');\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n};\n\nexport const reducer = (state, action) => {\n\n    state = state || initialState;\n\n    switch (action.type) {\n        case reportTypesSuccess:\n            return Object.assign({}, state, {\n                reportTypes: action.reportTypes,\n                reportTypesError: ''\n            })\n        case reportTypesFailure:\n            return Object.assign({}, state, {\n                reportTypesError: action.reportTypesError\n            })\n        case reportSuccess:\n            return Object.assign({}, state, {\n                report: action.report,\n                reportError: ''\n            })\n        case reportFailure:\n            return Object.assign({}, state, {\n                reportError: action.reportError\n            })\n        case billReportInformationSuccess:\n            return Object.assign({}, state, {\n                billReportInformation: action.billReportInformation,\n                billReportInformationError: ''\n            })\n        case billReportInformationFailure:\n            return Object.assign({}, state, {\n                billReportInformationError: action.billReportInformationError\n            })\n        case shareReportRequest:\n            return Object.assign({}, state, {\n                shareReport: action.shareReport || state.shareReport,\n                shareReportError: action.shareReportError || ''\n            })\n        default:\n            return state;\n    }\n};","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\nimport { reportActionCreators } from \"../../../stores/lis-report-store\";\nimport { navActionCreators } from '../../../stores/lis-nav-store';\n\nconst BILL_COLLECTION_AUTHOR = \"LegislationCollections\";\n\nclass ReportMaker extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            creating: false,\n            showCatchline: false,\n            showCurrentStatus: false,\n            showTitle: false,\n            showChiefPatron: false,\n            showAllPatrons: false,\n            showSummary: false,\n            showNotes: false,\n            selectedNotes: props.selectedCollection && this.props.selectedCollection.Name && this.props.selectedCollection.WatchListID ? 'current' : 'all',\n            showHistory: false,\n            showHouseAmendments: false,\n            showSenateAmendments: false,\n            showConferenceAmendments: false,\n            showGovernorsRecommendations: false,\n            personalMessage: '',\n            showStatus: {},\n            showCommitteeEvent: {},\n            showAllBills: false,\n            showClerkNames: false,\n            showDlsStaffNames: false,\n            showLdNumber: false,\n            startRange: '',\n            endRange: '',\n            rangeError: false,\n            DLS_STAFF: this.props.login && this.props.login.userClaims && this.props.login.userClaims.claims && this.props.login.userClaims.claims.find(c => c.RoleName === 'BDSDrafter')\n        };\n        this.handleInputChange = this.handleInputChange.bind(this);\n        this.getReportUrl = this.getReportUrl.bind(this);\n        this.toggleShowBills = this.toggleShowBills.bind(this);\n        this.checkParams = this.checkParams.bind(this);\n        this.generateBillList = this.generateBillList.bind(this);\n        this.selectAll = this.selectAll.bind(this);\n    }\n\n    handleInputChange(key, val) {\n        if (key === 'showHistory' && val && !val.all && (!val.recent || val.mostRecentAmount === '' || val.mostRecentAmount < 2)) {\n            val.showVotes = false;\n        }\n        if (['startRange', 'endRange'].includes(key)) {\n            val = val.replace(/[^a-zA-Z0-9]/, \"\");\n        }\n        this.setState({\n            [key]: val,\n            rangeError: false\n        });\n    }\n\n    getReportUrl(newWindow) {\n        const billList = this.generateBillList();\n        if (billList && billList.length === 0) {\n            this.setState({\n                rangeError: true\n            });\n        } else {\n            this.setState({ creating: true }, () => {\n                const jsonData = JSON.stringify({\n                    showCatchline: this.state.showCatchline,\n                    showCurrentStatus: this.state.showCurrentStatus,\n                    showTitle: this.state.showTitle,\n                    showChiefPatron: this.state.showChiefPatron,\n                    showAllPatrons: this.state.showAllPatrons,\n                    showSummary: this.state.showSummary,\n                    showNotes: this.state.showNotes,\n                    userCreated: this.props.login.userProfile.email || '',\n                    selectedNotes: this.state.selectedNotes,\n                    selectedCollection: this.props.selectedCollection && this.props.selectedCollection.Name && this.props.selectedCollection.WatchListID ? this.props.selectedCollection.WatchListID : '',\n                    reportTitle: this.props.reportTitle || '',\n                    showHistory: this.state.showHistory,\n                    showHouseAmendments: this.state.showHouseAmendments,\n                    showSenateAmendments: this.state.showSenateAmendments,\n                    showConferenceAmendments: this.state.showConferenceAmendments,\n                    showGovernorsRecommendations: this.state.showGovernorsRecommendations,\n                    showStatus: this.state.showStatus,\n                    showCommitteeEvent: this.state.showCommitteeEvent,\n                    showLdNumber: this.state.showLdNumber,\n                    showClerkNames: this.state.showClerkNames,\n                    showDlsStaffNames: this.state.showDlsStaffNames,\n                    personalMessage: this.state.personalMessage,\n                    billList: billList\n                });\n                this.props.actions.saveBillReportInformation(window.btoa(jsonData)).then(() => {\n                    const billReportInformation = this.props.report.billReportInformation;\n                    if (billReportInformation && billReportInformation.ReportNumber) {\n                        newWindow.location = '/bill-search-report/' + billReportInformation.ReportNumber;\n                    } else {\n                        this.props.actions.makeToast([{ message: \"Report Failed\", type: \"failure\" }]);\n                        newWindow?.close();\n                    }\n                    this.setState({ creating: false })\n                }).catch(err => {\n                    newWindow?.close();\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    console.log(err)\n                    this.props.actions.makeToast([{ message: \"Report Failed\", type: \"failure\" }]);\n                    this.setState({\n                        creating: false\n                    });\n                })\n            })\n        }\n    }\n\n    toggleShowBills() {\n        this.setState({\n            showAllBills: !this.state.showAllBills\n        })\n    }\n\n    checkParams() {\n        for (const x in this.state) {\n            if (typeof this.state[x] === \"object\") {\n                for (const y in this.state[x]) {\n                    if (this.state[x][y] === true)\n                        return false;\n                }\n            } else if (this.state[x] === true && x !== \"showAllBills\") {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    //Report bill range differs slightly from the bill search range functionality as it allows more advanced cross-chamber/cross-type searching.\n    //Order is HB, HJ, HR, SB, SJ, SR.\n    //If only one field is entered, it is ignored.\n    //If list is empty, it displays an error.\n    generateBillList() {\n        const startType = this.state.startRange.substring(0, 2).toUpperCase(), endType = this.state.endRange.substring(0, 2).toUpperCase();\n        const typeFilled = startType === '' || endType === '';\n        const startRange = parseInt(this.state.startRange.substring(2), 10);\n        const endRange = parseInt(this.state.endRange.substring(2), 10);\n\n        //return empty array if startType is alphabetically greater than endType (e.g. startType === SB, endType === HB)\n        if (startType.localeCompare(endType) === 1) {\n            return [];\n        }\n\n        return this.props.billList ? this.props.billList.filter(bill => {\n            const number = parseInt(bill.LegislationNumber.substring(2), 10), type = bill.LegislationNumber.substring(0, 2);\n            return typeFilled ? true :\n                //return true IF\n                //startType (e.g. HB) === type (e.g. HB) && number (e.g. 123) >= startRange (e.g. 123) \n                //OR type (e.g. SB) is alphabetically greater than startType (e.g. HB) && either endType (e.g. SR) !== type (e.g. SB) or number (e.g 123) <= endRange (e.g. 123)\n                ((startType === type && number >= startRange) || (type.localeCompare(startType) === 1 && type.localeCompare(endType) < 1 && (endType !== type || number <= endRange)))\n                //AND either endType (e.g. SR) !== type (e.g. HB) or number (e.g. 123) <= endRange (e.g. 123)\n                && (endType !== type || number <= endRange)\n        }).map(bill => ({\n            LegislationNumber: bill.LegislationNumber,\n            SessionID: bill.SessionID\n        })) : []\n    }\n\n    selectAll() {\n        this.setState({\n            showCatchline: true,\n            showCurrentStatus: true,\n            showTitle: true,\n            showChiefPatron: true,\n            showAllPatrons: true,\n            showSummary: true,\n            showNotes: true,\n            showHistory: {\n                all: true,\n                recent: false,\n                mostRecentAmount: 5,\n                showVotes: true,\n                Committee: false,\n                Subcommittee: false\n            },\n            showHouseAmendments: true,\n            showSenateAmendments: true,\n            showConferenceAmendments: true,\n            showGovernorsRecommendations: true,\n            showStatus: {\n                showPassedHouse: true,\n                showPassedSenate: true,\n                showPassed: true,\n                showApproved: true,\n                showVetoed: true,\n                showContinued: true,\n                showFailed: true,\n                showEmergency: true\n            },\n            showCommitteeEvent: {\n                showFirstHouseCommittee: true,\n                showFirstSenateCommittee: true,\n                showLastHouseSubcommittee: true,\n                showLastSenateSubcommittee: true\n            },\n            showAllBills: true,\n            selectedNotes: \"all\"\n        })\n    }\n\n    render() {\n        const { showCatchline, showCurrentStatus, showTitle, showChiefPatron, showAllPatrons, showSummary, showNotes, selectedNotes, showHistory, showHouseAmendments, showSenateAmendments, showConferenceAmendments, showGovernorsRecommendations, showStatus, showCommitteeEvent, rangeError, showLdNumber, showClerkNames, showDlsStaffNames, DLS_STAFF } = this.state;\n        return (<div onClick={() => this.props.toggleReportMaker(this.props.autoReport)} className=\"overlay center-content\">\n            <div className=\"full\" style={{ maxHeight: '100%' }}>\n                <div onClick={e => e.stopPropagation()} className=\"report-maker dlas-forms user-forms advanced-search overlay-content animated-fade-in-up\">\n                    <div onClick={() => this.props.toggleReportMaker(this.props.autoReport)} className=\"close-cross\">\n                        <span>x</span>\n                    </div>\n                    <div>\n                        <h3><b>Create Report</b>{this.props.selectedCollection.Name ? <span> | {this.props.selectedCollection.Name}</span> : \"\"}</h3>\n                    </div>\n                    <div className=\"inner-grid two-col-sidebar-tiny\">\n                        {this.props.billList && this.props.billList.length > 25\n                            ?\n                            <React.Fragment>\n                                {this.state.showAllBills\n                                    ?\n                                    <React.Fragment>\n                                        <p className=\"small-text\">{this.props.billList && this.props.billList.map((bill, billIndex) =>\n                                            <React.Fragment key={billIndex}>{billIndex !== 0 && `, `}{bill.LegislationNumber}</React.Fragment>\n                                        )}</p>\n                                        <button className=\"arrow-up\" onClick={this.toggleShowBills} />\n                                    </React.Fragment>\n                                    :\n                                    <React.Fragment>\n                                        <p className=\"small-text\">{this.props.billList && this.props.billList.map((bill, billIndex) => {\n                                            if (billIndex < 24) {\n                                                return (\n                                                    <React.Fragment key={billIndex}>{billIndex !== 0 && `, `}{bill.LegislationNumber}</React.Fragment>\n                                                )\n                                            } else if (billIndex == 25) {\n                                                return (\n                                                    <React.Fragment key={billIndex}>, {bill.LegislationNumber}...</React.Fragment>\n                                                )\n                                            }\n                                        })}</p>\n                                        <button className=\"arrow-down\" onClick={this.toggleShowBills} />\n                                    </React.Fragment>\n                                }\n                            </React.Fragment>\n                            :\n                            <p className=\"small-text\">{this.props.billList && this.props.billList.map((bill, billIndex) =>\n                                <React.Fragment key={billIndex}>{billIndex !== 0 && `, `}{bill.LegislationNumber}</React.Fragment>\n                            )}</p>\n                        }\n                    </div>\n                    <div className={`inner-grid ${DLS_STAFF ? 'four' : 'three'}`}>\n                        <div>\n                            <div className=\"checkbox-container\">\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange(\"showCatchline\", !showCatchline)}>\n                                        <input id=\"report-catchline\" checked={showCatchline} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-catchline\" className=\"checkbox-label no-background\">Catch line</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange(\"showCurrentStatus\", !showCurrentStatus)}>\n                                        <input id=\"report-current-status\" checked={showCurrentStatus} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-current-status\" className=\"checkbox-label no-background\">Current Status</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange(\"showSummary\", !showSummary)}>\n                                        <input id=\"report-summary\" checked={showSummary} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-summary\" className=\"checkbox-label no-background\">Summary</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange(\"showTitle\", !showTitle)}>\n                                        <input id=\"report-title\" checked={showTitle} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-title\" className=\"checkbox-label no-background\">Title</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange(\"showChiefPatron\", !showChiefPatron)}>\n                                        <input id=\"report-patrons\" checked={showChiefPatron} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-patrons\" className=\"checkbox-label no-background\">Chief Patron</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange(\"showAllPatrons\", !showAllPatrons)}>\n                                        <input id=\"report-patrons\" checked={showAllPatrons} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-patrons\" className=\"checkbox-label no-background\">All Patrons</label>\n                                </div>\n                            </div>\n                            <div className=\"checkbox-container\">\n                                <div style={{ padding: \"10px\", display: \"inline-flex\", width: \"100%\" }}>\n                                    <label htmlFor=\"report-personal-message\" className=\"label\">Personal Message</label>\n                                    <textarea id=\"report-personal-message\" onChange={e => this.handleInputChange(\"personalMessage\", e.target.value)} type=\"text\" />\n                                </div>\n                            </div>\n                            <div className='checkbox-container' style={{ padding: \"10px\" }}>\n                                <div className=\"inner-grid two\" style={{ gridGap: \"10px\" }}>\n                                    <div className=\"inner-grid two\" style={{ gridGap: \"0\" }}>\n                                        <label style={{ padding: \"0\", marginRight: \"15px\" }} htmlFor=\"report-start-range\" className=\"label report-range-start-label\">Select From Bill #</label>\n                                        <input id=\"report-start-range\" onChange={e => this.handleInputChange(\"startRange\", e.target.value)} type=\"text\" value={this.state.startRange} className=\"report-range-input\" />\n                                    </div>\n                                    <div className=\"inner-grid two\" style={{ gridGap: \"0\" }}>\n                                        <label style={{ padding: \"0\" }} htmlFor=\"report-end-range\" className=\"label report-range-end-label\">&nbsp;Through Bill #</label>\n                                        <input id=\"report-end-range\" onChange={e => this.handleInputChange(\"endRange\", e.target.value)} type=\"text\" value={this.state.endRange} className=\"report-range-input\" />\n                                    </div>\n                                </div>\n                                {rangeError && <span className=\"input-feedback\">No bills within this range</span>}\n                            </div>\n                        </div>\n                        <div>\n                            <div className=\"checkbox-container\">\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange(\"showHistory\", showHistory === false ? { all: false, recent: false, mostRecentAmount: 5, showVotes: false, Committee: false, Subcommittee: false } : false)}>\n                                        <input id=\"report-history\" checked={showHistory} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-history\" className=\"checkbox-label no-background\">Bill History</label>\n                                </div>\n                                <div style={{ marginLeft: '10px' }}>\n                                    <div className=\"checkbox checkbox-group\">\n                                        <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                            <div className=\"toggle-switch\" disabled={!showHistory} onClick={() => this.handleInputChange(\"showHistory\", { ...showHistory, all: !showHistory.all, recent: false })}>\n                                                <input id=\"report-history-type-all\" checked={showHistory.all} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                                <span className=\"slider\"></span>\n                                            </div>\n                                            <label htmlFor=\"report-history-type-all\" className={`checkbox-label no-background${showHistory ? \"\" : \" txt-greyed\"}`}>All Events{showHistory.all && \"*\"}</label>\n                                        </div>\n                                    </div>\n                                    <div className=\"checkbox checkbox-group\">\n                                        <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                            <div className=\"toggle-switch\" disabled={!showHistory} onClick={() => this.handleInputChange(\"showHistory\", { ...showHistory, recent: !showHistory.recent, all: false })}>\n                                                <input id=\"report-history-type-recent\" checked={showHistory.recent} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                                <span className=\"slider\"></span>\n                                            </div>\n                                            <label className=\"screen-reader-only\" htmlFor=\"report-history-type-recent-amount\">Most recent amount</label>\n                                            <label htmlFor=\"report-history-type-recent\" className={`checkbox-label no-background${showHistory ? \"\" : \" txt-greyed\"}`}>                                        <input\n                                                id=\"report-history-type-recent-amount\"\n                                                type=\"text\"\n                                                className=\"label-input\"\n                                                disabled={!showHistory.recent}\n                                                value={showHistory.mostRecentAmount}\n                                                onChange={(e) => {\n                                                    const val = e.target.value;\n                                                    if (val === '' || /[^0-9]/.test(val) === false) {\n                                                        this.handleInputChange(\"showHistory\", { ...showHistory, mostRecentAmount: val });\n                                                    }\n                                                }} />\n                                                Last Events{showHistory.recent && showHistory.mostRecentAmount > 1 && \"*\"}</label>\n                                        </div>\n                                    </div>\n                                    <div className=\"checkbox checkbox-group\">\n                                        <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                            <div className=\"toggle-switch\" disabled={!showHistory} onClick={() => this.handleInputChange(\"showHistory\", { ...showHistory, Committee: !showHistory.Committee })}>\n                                                <input id=\"report-history-type-committee\" checked={showHistory.Committee} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                                <span className=\"slider\"></span>\n                                            </div>\n                                            <label htmlFor=\"report-history-type-committee\" className={`checkbox-label no-background${showHistory ? \"\" : \" txt-greyed\"}`}>Last Committee Event</label>\n                                        </div>\n                                    </div>\n                                    <div className=\"checkbox checkbox-group\">\n                                        <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                            <div className=\"toggle-switch\" disabled={!showHistory} onClick={() => this.handleInputChange(\"showHistory\", { ...showHistory, Subcommittee: !showHistory.Subcommittee })}>\n                                                <input id=\"report-history-type-sub\" checked={showHistory.Subcommittee} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                                <span className=\"slider\"></span>\n                                            </div>\n                                            <label htmlFor=\"report-history-type-sub\" className={`checkbox-label no-background${showHistory ? \"\" : \" txt-greyed\"}`}>Last Subcommittee Event</label>\n                                        </div>\n                                    </div>\n                                </div>\n                                {(showHistory.all || (showHistory.recent && showHistory.mostRecentAmount > 1)) &&\n                                    <div className=\"checkbox checkbox-group\">\n                                        <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                            <div className=\"toggle-switch\" disabled={!showHistory} onClick={() => this.handleInputChange(\"showHistory\", { ...showHistory, showVotes: !showHistory.showVotes })}>\n                                                <input id=\"report-votes\" checked={showHistory.showVotes} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                                <span className=\"slider\"></span>\n                                            </div>\n                                            <label htmlFor=\"report-votes\" className={`checkbox-label no-background${showHistory ? \"\" : \" txt-greyed\"}`}>Include Votes for '{showHistory.all ? 'All Events' : showHistory.mostRecentAmount.toString() + ' Last Events'}'</label>\n                                        </div>\n                                    </div>\n                                }\n                            </div>\n                            <div className=\"checkbox-container\">\n                                <div style={{ margin: '5px' }} className=\"small-text\">Include this detail:</div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showCommitteeEvent', { ...showCommitteeEvent, showFirstHouseCommittee: !showCommitteeEvent.showFirstHouseCommittee })}>\n                                        <input id=\"report-committee-house-referred\" checked={showCommitteeEvent.showFirstHouseCommittee || \"\"} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-committee-house-referred\" className=\"checkbox-label no-background\">First House Committee Referred</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showCommitteeEvent', { ...showCommitteeEvent, showFirstSenateCommittee: !showCommitteeEvent.showFirstSenateCommittee })}>\n                                        <input id=\"report-committee-senate-referred\" checked={showCommitteeEvent.showFirstSenateCommittee || \"\"} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-committee-senate-referred\" className=\"checkbox-label no-background\">First Senate Committee Referred</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showCommitteeEvent', { ...showCommitteeEvent, showLastHouseSubcommittee: !showCommitteeEvent.showLastHouseSubcommittee })}>\n                                        <input id=\"report-committee-house-assigned\" checked={showCommitteeEvent.showLastHouseSubcommittee || \"\"} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-committee-house-assigned\" className=\"checkbox-label no-background\">Last House Subcommittee Assigned</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showCommitteeEvent', { ...showCommitteeEvent, showLastSenateSubcommittee: !showCommitteeEvent.showLastSenateSubcommittee })}>\n                                        <input id=\"report-committee-senate-assigned\" checked={showCommitteeEvent.showLastSenateSubcommittee || \"\"} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-committee-senate-assigned\" className=\"checkbox-label no-background\">Last Senate Subcommittee Assigned</label>\n                                </div>\n                            </div>\n                        </div>\n                        <div>\n                            <div className=\"checkbox-container\">\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showHouseAmendments', !showHouseAmendments)}>\n                                        <input id=\"report-house-amendments\" checked={showHouseAmendments} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-house-amendments\" className=\"checkbox-label no-background\">House Amendments</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showSenateAmendments', !showSenateAmendments)}>\n                                        <input id=\"report-senate-amendments\" checked={showSenateAmendments} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-senate-amendments\" className=\"checkbox-label no-background\">Senate Amendments</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showConferenceAmendments', !showConferenceAmendments)}>\n                                        <input id=\"report-conference-amendments\" checked={showConferenceAmendments} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-conference-amendments\" className=\"checkbox-label no-background\">Conference Amendments</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showGovernorsRecommendations', !showGovernorsRecommendations)}>\n                                        <input id=\"report-governors-recommendations\" checked={showGovernorsRecommendations} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-governors-recommendations\" className=\"checkbox-label no-background\">Governor's Recommendations</label>\n                                </div>\n                            </div>\n                            <div className=\"checkbox-container\">\n                                <div style={{ margin: '5px' }} className=\"small-text\">Include whether the bill has ever been in this status:</div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showStatus', { ...showStatus, showPassedHouse: !showStatus.showPassedHouse })}>\n                                        <input id=\"report-passed-house\" checked={showStatus.showPassedHouse || \"\"} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-passed-house\" className=\"checkbox-label no-background\">Passed House</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showStatus', { ...showStatus, showPassedSenate: !showStatus.showPassedSenate })}>\n                                        <input id=\"report-passed-senate\" checked={showStatus.showPassedSenate || \"\"} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-passed-senate\" className=\"checkbox-label no-background\">Passed Senate</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showStatus', { ...showStatus, showPassed: !showStatus.showPassed })}>\n                                        <input id=\"report-passed\" checked={showStatus.showPassed || \"\"} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-passed\" className=\"checkbox-label no-background\">Passed</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showStatus', { ...showStatus, showApproved: !showStatus.showApproved })}>\n                                        <input id=\"report-approved\" checked={showStatus.showApproved || \"\"} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-approved\" className=\"checkbox-label no-background\">Approved</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showStatus', { ...showStatus, showVetoed: !showStatus.showVetoed })}>\n                                        <input id=\"report-vetoed\" checked={showStatus.showVetoed || \"\"} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-vetoed\" className=\"checkbox-label no-background\">Vetoed</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showStatus', { ...showStatus, showContinued: !showStatus.showContinued })}>\n                                        <input id=\"report-continued\" checked={showStatus.showContinued || \"\"} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-continued\" className=\"checkbox-label no-background\">Continued</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showStatus', { ...showStatus, showFailed: !showStatus.showFailed })}>\n                                        <input id=\"report-failed\" checked={showStatus.showFailed || \"\"} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-failed\" className=\"checkbox-label no-background\">Failed</label>\n                                </div>\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showStatus', { ...showStatus, showEmergency: !showStatus.showEmergency })}>\n                                        <input id=\"report-emergency\" checked={showStatus.showEmergency || \"\"} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"report-emergency\" className=\"checkbox-label no-background\">Emergency</label>\n                                </div>\n                            </div>\n                            {this.props.login.userClaims.resources.find(resource => resource === BILL_COLLECTION_AUTHOR) &&\n                                <div className=\"checkbox-container\">\n                                    <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                        <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showNotes', !showNotes)}>\n                                            <input id=\"report-notes\" checked={showNotes} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                            <span className=\"slider\"></span>\n                                        </div>\n                                        <label htmlFor=\"report-notes\" className=\"checkbox-label no-background\">Notes</label>\n                                    </div>\n                                    {this.props.selectedCollection && this.props.selectedCollection.Name && this.props.selectedCollection.WatchListID &&\n                                        <div className=\"checkbox\">\n                                            <label htmlFor=\"report-notes-from-collection\" className={`label radio-label ${showNotes ? \"\" : \"txt-greyed\"}`}>\n                                                <input id=\"report-notes-from-collection\" disabled={!showNotes} checked={selectedNotes === 'current'} onChange={() => this.handleInputChange(\"selectedNotes\", 'current')} type=\"radio\" />\n                                                Notes from {this.props.selectedCollection.Name}\n                                            </label>\n                                            <label htmlFor=\"report-notes-from-all\" className={`label radio-label ${showNotes ? \"\" : \"txt-greyed\"}`}>\n                                                <input id=\"report-notes-from-all\" disabled={!showNotes} checked={selectedNotes === 'all'} onChange={() => this.handleInputChange(\"selectedNotes\", 'all')} type=\"radio\" />\n                                                All Notes\n                                            </label>\n                                        </div>\n                                    }\n                                </div>\n                            }\n                        </div>\n                        {DLS_STAFF &&\n                            <div>\n                                <div className=\"checkbox-container\">\n                                    <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                        <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showLdNumber', !showLdNumber)}>\n                                            <input id=\"report-ld-number\" checked={showLdNumber} type=\"checkbox\" style={{ width: \"inherit\" }} />\n                                            <span className=\"slider\"></span>\n                                        </div>\n                                        <label htmlFor=\"report-ld-number\" className=\"checkbox-label no-background\">LD Number of current version</label>\n                                    </div>\n                                    <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                        <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showClerkNames', !showClerkNames)}>\n                                            <input id=\"report-clerk-names\" checked={showClerkNames} type=\"checkbox\" style={{ width: \"inherit\" }} />\n                                            <span className=\"slider\"></span>\n                                        </div>\n                                        <label htmlFor=\"report-clerk-names\" className=\"checkbox-label no-background\">Show clerk name(s) of current committee</label>\n                                    </div>\n                                    <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                        <div className=\"toggle-switch\" onClick={() => this.handleInputChange('showDlsStaffNames', !showDlsStaffNames)}>\n                                            <input id=\"report-staff-names\" checked={showDlsStaffNames} type=\"checkbox\" style={{ width: \"inherit\" }} />\n                                            <span className=\"slider\"></span>\n                                        </div>\n                                        <label htmlFor=\"report-staff-names\" className=\"checkbox-label no-background\">Show DLS staff name(s) of current committee</label>\n                                    </div>\n                                </div>\n                            </div>\n                        }\n                    </div>\n                    {(showHistory.all || (showHistory.recent && showHistory.mostRecentAmount > 1)) && <small>* If you include '{showHistory.all ? 'All Events' : showHistory.mostRecentAmount.toString() + ' Last Events'}' for each bill, and decide to generate a CSV on the resulting report, 2 CSVs will be generated: one CSV containing '{showHistory.all ? 'All Events' : showHistory.mostRecentAmount.toString() + ' Last Events'}' on that bill, and another CSV containing all other selected options (e.g. Catch line, Summary, etc.).</small>}\n                    <div className=\"inline-list\">\n                        <button className='button primary' onClick={() => this.selectAll()}>Select All</button>\n                        <button style={{ marginRight: \"10px\", marginLeft: \"0px\", float: \"right\" }} type=\"button\" className=\"button right\" disabled={this.state.creating || this.checkParams()} onClick={() => { const newWindow = window.open(); this.getReportUrl(newWindow) }}>{this.state.creating ? 'Creating' : 'Create'}</button>\n                        <button style={{ float: \"right\" }} type=\"button\" className=\"button secondary right\" onClick={() => this.props.toggleReportMaker(this.props.autoReport)}>Close</button>\n                    </div>\n                </div>\n            </div>\n        </div>);\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { login, nav, report } = state;\n        return {\n            login,\n            nav,\n            report\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, authActionCreators, navActionCreators, reportActionCreators), dispatch)\n        }\n    }\n)(ReportMaker);","import React from 'react';\n\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport moment from 'moment-timezone';\nimport { saveAs } from 'file-saver';\nimport { generateCsv } from '../../services/csv.service';\nimport { voteActionCreators } from '../../stores/lis-votes-store';\nimport { patronActionCreators } from '../../stores/lis-patron-store';\nimport { Link } from 'react-router-dom';\nimport AgendaItemsComponent from './lis-agenda-items';\nimport VersionList from '../lis-bills/lis-bill-version-list';\nimport CreatableSelect from 'react-select/creatable';\nimport renderHTML from 'react-render-html';\nimport ReportMaker from '../../lis-public/components/lis-bill-search/lis-report-maker';\n\nconst BILL_COLLECTION_AUTHOR = \"LegislationCollections\";\nconst BILL_MANAGEMENT_AUTHOR = \"Legislation\";\nconst COMMUNICATION_AUTHOR = \"CommunicationFileGeneration\";\nconst CALENDAR_AUTHOR = \"Calendar\";\nconst lisDocDomain = window.env?.STORAGE_ACCOUNT_DOMAIN;\n\nconst HOUSE_NUMERIC_SORT_CATEGORIES = [2, 3, 4, 26, 27, 5, 41, 6, 7, 28, 29, 30, 31, 32, 57, 33, 35, 45, 9, 10, 8, 11, 13, 37, 38, 44, 46];\nconst SENATE_NUMERIC_SORT_CATEGORIES = [72, 111, 109, 112, 60, 110, 98, 102, 83, 90, 87, 93, 100, 104, 117, 118, 105, 106, 66, 67, 96, 97, 64, 68, 69, 65];\n\nconst sortAgendas = (a, b, calendarChamber) => {\n    if (calendarChamber === \"H\") {\n        return !a.IsActive && b.IsActive\n            ? 1\n            : a.IsActive && !b.IsActive\n                ? -1\n                : a.Sequence > 0 && b.Sequence > 0 ? a.Sequence - b.Sequence : (!a.Ranking || a.Ranking === \"\") && (b.Ranking && b.Ranking !== \"\")\n                    ? -1\n                    : (a.Ranking && a.Ranking !== \"\") && (!b.Ranking || b.Ranking === \"\")\n                        ? 1\n                        : a.Ranking > b.Ranking\n                            ? 1\n                            : a.Ranking < b.Ranking\n                                ? -1\n                                : moment(a.CalendarDate).isAfter(b.CalendarDate, \"day\")\n                                    ? 1\n                                    : moment(b.CalendarDate).isAfter(a.CalendarDate, \"day\")\n                                        ? -1\n                                        : moment(a.CandidateDate).isAfter(b.CandidateDate, \"day\")\n                                            ? 1\n                                            : moment(b.CandidateDate).isAfter(a.CandidateDate, \"day\")\n                                                ? -1\n                                                : a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) !== 0 ?\n                                                    a.LegislationNumber[0].localeCompare(calendarChamber) !== 0\n                                                        ? -1 : 1\n                                                    : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) > 0\n                                                        ? 1\n                                                        : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) < 0\n                                                            ? -1\n                                                            : a.LegislationKey > b.LegislationKey\n                                                                ? 1\n                                                                : -1\n    } else {\n        return b.IsActive !== a.IsActive\n            ? b.IsActive\n                ? 1\n                : -1\n            : a.Sequence > 0 && b.Sequence > 0 && a.Sequence !== b.Sequence\n                ? a.Sequence - b.Sequence > 0\n                    ? 1\n                    : -1\n                : a.CalendarDate !== b.CalendarDate\n                    ?\n                    !a.CalendarDate ?\n                        1 :\n                        !b.CalendarDate ? -1\n                            :\n                            a.CalendarDate - b.CalendarDate\n                    : a.CandidateDate !== b.CandidateDate\n                        ?\n                        !a.CandidateDate ?\n                            1 :\n                            !b.CandidateDate ? -1\n                                :\n                                a.CandidateDate - b.CandidateDate\n                        : a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) !== 0 ?\n                            a.LegislationNumber[0].localeCompare(calendarChamber) !== 0\n                                ? -1 : 1\n                            : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) !== 0\n                                ? a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) > 0\n                                    ? 1\n                                    : -1\n                                : a.LegislationKey && parseInt(a.LegislationKey) !== parseInt(b.LegislationKey)\n                                    ? parseInt(a.LegislationKey) - parseInt(b.LegislationKey) > 0\n                                        ? 1\n                                        : -1\n                                    : 0\n    }\n}\n\nconst sortAgendasNumerically = (a, b, calendarChamber) => {\n    if (calendarChamber === \"H\") {\n        return !a.IsActive && b.IsActive\n            ? 1\n            : a.IsActive && !b.IsActive\n                ? -1\n                : (!a.Ranking || a.Ranking === \"\") && (b.Ranking && b.Ranking !== \"\")\n                    ? -1\n                    : (a.Ranking && a.Ranking !== \"\") && (!b.Ranking || b.Ranking === \"\")\n                        ? 1\n                        : a.Ranking > b.Ranking\n                            ? 1\n                            : a.Ranking < b.Ranking\n                                ? -1\n                                : a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) !== 0 ?\n                                    a.LegislationNumber[0].localeCompare(calendarChamber) !== 0\n                                        ? -1 : 1\n                                    : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) > 0\n                                        ? 1\n                                        : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) < 0\n                                            ? -1\n                                            : a.LegislationKey > b.LegislationKey\n                                                ? 1\n                                                : -1\n    } else {\n        return !a.IsActive && b.IsActive\n            ? 1\n            : a.IsActive && !b.IsActive\n                ? -1\n                : a.Sequence > 0 && b.Sequence > 0 && a.Sequence !== b.Sequence\n                    ? a.Sequence - b.Sequence > 0\n                        ? 1\n                        : -1\n                    : a.LegislationNumber && b.LegislationNumber && a.LegislationNumber[0] !== b.LegislationNumber[0] ?\n                        a.LegislationNumber[0].localeCompare(calendarChamber) !== 0\n                            ? -1\n                            : 1\n                        : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) > 0\n                            ? 1\n                            : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) < 0\n                                ? -1\n                                : a.LegislationKey > b.LegislationKey\n                                    ? 1\n                                    : -1\n    }\n}\n\nclass CalendarDetailsComponent extends React.Component {\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            hideAll: false,\n            hide: [],\n            showAgendaItemEditor: -1,\n            showAgendaItemEditorCategoryIndex: -1,\n            currentItemSelection: ''\n        }\n\n        this.toggleAll = this.toggleAll.bind(this);\n        this.toggleCategory = this.toggleCategory.bind(this);\n        this.fetchCsv = this.fetchCsv.bind(this);\n        this.toggleAgendaItemEditor = this.toggleAgendaItemEditor.bind(this);\n        this.handleCurrentItemChange = this.handleCurrentItemChange.bind(this);\n        this.generateClerksCopy = this.generateClerksCopy.bind(this);\n        this.toggleReportMaker = this.toggleReportMaker.bind(this);\n    }\n\n    toggleAll() {\n        const opposite = !this.state.hideAll;\n        let hide = new Array(this.props.calendar.CalendarCategories.length);\n        hide.fill(opposite);\n\n        this.setState({\n            hideAll: opposite,\n            hide: hide\n        });\n    }\n\n    toggleCategory(catIndex) {\n        let hide = [...this.state.hide];\n        hide[catIndex] = !hide[catIndex];\n        this.setState({\n            hide: hide\n        })\n    }\n\n    fetchCsv() {\n        let rows = [];\n        //Flatten the data and add the category to each row\n        this.props.calendar.CalendarCategories.forEach(category => {\n            category.Agendas.forEach(agenda => {\n                if (agenda.IsActive) {\n                    agenda.CalendarCategory = category.DisplayType ? category.Description + \" - \" + category.CategoryType : category.Description;\n                    //Handle inserting description text for non-legislation agenda items\n                    if (!agenda.LegislationDescription)\n                        agenda.LegislationDescription = agenda.Description;\n                    //Handle inserting patrons\n                    if (agenda.Patrons) {\n                        agenda.Patron = agenda.Patrons.map(p => p.PatronDisplayName).join(\",\");\n                    }\n                    rows.push(agenda);\n                }\n            });\n        })\n\n        let fileName = this.props.calendar.ChamberCode === \"S\" ? \"SenateCalendar\" : \"HouseCalendar\";\n        fileName = fileName + moment(this.props.calendar.CalendarDate).format(\"MMMMDoYYYY\") + \".csv\";\n\n        saveAs(new Blob([generateCsv([\"Calendar Category\", \"Legislation Number\", \"Legislation Description\", \"Patron\", \"Page Number\"], rows)], { type: \"data:text/csv;charset=utf-8,\" }), fileName);\n    }\n\n    toggleAgendaItemEditor(agendaIndex, categoryIndex) {\n        this.setState({\n            showAgendaItemEditor: agendaIndex,\n            showAgendaItemEditorCategoryIndex: categoryIndex || -1\n        });\n    }\n\n    handleCurrentItemChange(val) {\n        this.setState({\n            currentItemSelection: val\n        });\n    }\n\n    generateClerksCopy(category, e) {\n        e.stopPropagation();\n        this.props.generateClerksCopy(category);\n    }\n\n    toggleReportMaker(catIndex, e) {\n        if (e) {\n            e.stopPropagation();\n        }\n\n        if (!this.state.showReportMaker && !isNaN(parseInt(catIndex))) {\n            this.setCategoryReportBillList(catIndex);\n        } else {\n            //needs to be separated otherwise this will run before the setCategoryReportBillList method is done and the ReportMaker component will not have the info needed, resulting in NREs\n            this.setState(state => ({\n                showReportMaker: !state.showReportMaker\n            }));\n        }\n    }\n\n    setCategoryReportBillList(catIndex) {\n        const category = this.props.calendar.CalendarCategories[catIndex];\n        let categoryReportBillList = [];\n        category.Agendas.forEach(agenda => {\n            if (agenda.LegislationID && agenda.IsActive) {\n                categoryReportBillList.push({ LegislationID: agenda.LegislationID, LegislationNumber: agenda.LegislationNumber, SessionID: this.props.calendar.SessionID });\n            }\n        });\n\n        this.setState({ showReportMaker: true, categoryReportBillList })\n    }\n\n    render() {\n        const { session, calendar, comments } = this.props;\n        const { hide, hideAll } = this.state;\n        const filteredCategories = calendar.CalendarCategories.map(category => {\n            const checkForActiveAgendas = category.Agendas.find(agenda => agenda.IsActive && !agenda.IsHidden);\n            if (checkForActiveAgendas) {\n                if (category.CategoryType != \"Order\") {\n                    let unrankedAgendas = [];\n                    let rankedAgendas = [];\n                    let rankings = [];\n\n                    if (calendar.ChamberCode === \"H\") {\n                        //house calendar sort\n                        category.Agendas.forEach((agenda) => {\n                            if (!agenda.Ranking && agenda.IsActive) {\n                                unrankedAgendas.push(agenda);\n                            } else if (agenda.IsActive) {\n                                rankedAgendas.push(agenda);\n                                rankings.push(agenda.Ranking);\n                            }\n                        })\n\n                        rankings.sort((a, b) => a - b);\n\n                        let gaps = [];\n                        for (let i = 1; i < rankings.length; i++) {\n                            gaps.push(rankings[i] - rankings[i - 1]);\n                        }\n\n                        if (HOUSE_NUMERIC_SORT_CATEGORIES.includes(category.CalendarCategoryTypeID)) {\n                            rankedAgendas.sort((a, b) => sortAgendasNumerically(a, b, calendar.ChamberCode));\n                        } else {\n                            rankedAgendas.sort((a, b) => sortAgendas(a, b, calendar.ChamberCode));\n                        }\n                        if (HOUSE_NUMERIC_SORT_CATEGORIES.includes(category.CalendarCategoryTypeID)) {\n                            unrankedAgendas.sort((a, b) => sortAgendasNumerically(a, b, calendar.ChamberCode));\n                        } else {\n                            unrankedAgendas.sort((a, b) => sortAgendas(a, b, calendar.ChamberCode));\n                        }\n\n                        //If there are multiple ranks with a gap larger than 1 place all unranked agendas between them\n                        if (new Set(rankings).size > 1 && Math.max(...gaps) > 1) {\n                            let insertPoint = gaps.findIndex(x => x === Math.max(...gaps)) + 1\n\n                            for (let i = 0; i < unrankedAgendas.length; i++) {\n                                rankedAgendas.splice(insertPoint, 0, unrankedAgendas[i]);\n                                insertPoint++;\n                            }\n\n                            category.Agendas = rankedAgendas;\n                        } else {\n                            //If the largest rank is greated than 50 put all unranked agendas above the ranked agendas, otherwise put them all at the bottom\n                            if (Math.max(...rankings) >= 50) {\n                                category.Agendas = unrankedAgendas.concat(rankedAgendas);\n                            } else {\n                                category.Agendas = rankedAgendas.concat(unrankedAgendas);\n                            }\n                        }\n                    } else {\n                        //senate calendar sort\n                        if (SENATE_NUMERIC_SORT_CATEGORIES.includes(category.CalendarCategoryTypeID)) {\n                            category.Agendas.sort((a, b) => sortAgendasNumerically(a, b, calendar.ChamberCode))\n                        } else {\n                            category.Agendas.sort((a, b) => sortAgendas(a, b, calendar.ChamberCode))\n                        }\n                    }\n                }\n                return category;\n            } else {\n                return null;\n            }\n        });\n\n        let calendarFileUrl = '';\n        const pdfFile = calendar.CalendarFiles.find(file => file.FileURL.toUpperCase().includes('PDF'));\n        if (pdfFile) {\n            const url = new URL(pdfFile.FileURL);\n            calendarFileUrl = lisDocDomain + (url.pathname[0] === '/' ? url.pathname : '/' + url.pathname);\n        }\n        const categoryDescription = category => {\n            //if it's been edited, leave it at that\n            const associatedReferenceCategory = this.props.calendarCategoryReferences.find(x => x.CalendarCategoryTypeID === category.CalendarCategoryTypeID);\n            if (associatedReferenceCategory && associatedReferenceCategory.Description !== category.Description && associatedReferenceCategory.PluralDescription !== category.Description) {\n                return category.Description;\n            }\n\n            //otherwise, use singular or plural reference description\n            if (calendar.ChamberCode === 'H' && category.CategoryCode === \"HOUBRC\" || category.CategoryCode === \"SENBRC\") {\n                return category.Description;\n            } else if (category.Agendas.filter(a => a.IsActive).length > 1 && category.PluralDescription) {\n                return category.PluralDescription;\n            } else {\n                return category.Description;\n            }\n        }\n        const sessionHeader = session ? session.SessionYear + \" \" + session.DisplayName : '';\n        const canSetCurrentItem = Boolean(this.props.userClaims && this.props.userClaims.resources.find(resource => resource === CALENDAR_AUTHOR)) && this.props.userClaims.resources.find(x => x === \"LegislationEvent\");\n        return (\n            <div>\n                {this.state.showReportMaker &&\n                    <ReportMaker\n                        toggleReportMaker={this.toggleReportMaker}\n                        selectedCollection={{\n                            Name: `Report on ${moment(this.props.calendar.CalendarDate).format('MM/DD/YY')}`,\n                        }}\n                        billList={this.state.categoryReportBillList}\n                        reportTitle={`Report on ${moment(this.props.calendar.CalendarDate).format('MM/DD/YY')}`}\n                    />\n                }\n                {this.state.showAgendaItemEditor !== -1 &&\n                    <AgendaItemsComponent\n                        toggleAgendaItemEditor={this.toggleAgendaItemEditor}\n                        agenda={calendar.CalendarCategories[this.state.showAgendaItemEditorCategoryIndex].Agendas[this.state.showAgendaItemEditor]}\n                        categoryIndex={this.state.showAgendaItemEditorCategoryIndex}\n                        agendaIndex={this.state.showAgendaItemEditor}\n                        updateAgendaItems={this.props.updateAgendaItems}\n                    />\n                }\n                <br />\n                <div className=\"flex-row flex-vertical-center multiple-icons\">\n                    <h2 className=\"no-margin\">{sessionHeader}</h2>\n                    {calendarFileUrl\n                        && (this.props.userClaims && this.props.userClaims.resources.find(x => x !== \"LegislationCollections\") || this.props.isCalendarForm)\n                        && this.props.sessionList.find(x => x.SessionCode === this.props.calendar.SessionCode)\n                        && this.props.sessionList.find(x => x.SessionCode === this.props.calendar.SessionCode).SessionYear >= 2023\n                        && calendar.CalendarNumber < 2 ?\n                        //Need to prevent the padded calendar from displaying if the session is before go live\n                        <a target=\"_blank\" href={calendarFileUrl.replace(\".PDF\", \"-padded.PDF\")}>\n                            <span title=\"Padded-PDF\" aria-label=\"Padded-PDF\" className=\"icon file-empty\"></span>\n                        </a>\n                        :\n                        <div /> //For grid layout formatting\n                    }\n                    {calendarFileUrl &&\n                        <a target=\"_blank\" href={calendarFileUrl}>\n                            <span title=\"PDF\" aria-label=\"PDF\" className=\"icon pdf\"></span>\n                        </a>\n                    }\n                    <a target=\"_blank\" onClick={this.fetchCsv}>\n                        <span aria-label=\"Spreadsheet\" title=\"Spreadsheet\" role=\"button\" className=\"icon csv\"></span>\n                    </a>\n                </div>\n                <hr />\n                <div className=\"flex-row details-page-data-container\">\n                    <div>\n                        <h3 className=\"no-margin\">{calendar.ChamberCode === \"S\" ? \"Senate \" : \"House \"} Calendar {calendar.IsProforma && \"(Pro Forma)\"}</h3>\n                        <span>{moment(calendar.CalendarDate).format(\"LL\") + (calendar.CalendarNumber > 1 ? [' (', ')'].join('Supp. ' + (calendar.CalendarNumber - 1)) : '')}</span>\n                    </div>\n                    <div>\n                        <button className=\"button-link\" aria-expanded={!hideAll} onClick={this.toggleAll} type=\"button\">{hideAll ? \"Expand\" : \"Collapse\"} All +/-</button>\n                    </div>\n                </div>\n                {comments.length > 0 &&\n                    <div className=\"details-page-data-container public-details\">\n                        {comments.map((comment, i) => {\n                            return (\n                                <p key={i}>{\"Comment \" + comment.Sequence + \": \" + comment.Comment}</p>\n                            )\n                        })}\n                    </div>\n                }\n                <div className=\"flex-row\">\n                    <div className='details-page-data-container'>\n                        {\n                            this.props.currentProceduralMotion ? <span>Current Item: {this.props.currentProceduralMotion}</span>\n                                :\n                                this.props.currentAgendaItem && filteredCategories.find(cat => cat && cat.Agendas && cat.Agendas.find(agenda => agenda.AgendaID === this.props.currentAgendaItem)) ? <span>Current Item: {filteredCategories.find(cat => cat && cat.Agendas && cat.Agendas.find(agenda => agenda.AgendaID === this.props.currentAgendaItem)).Agendas.find(agenda => agenda.AgendaID === this.props.currentAgendaItem).LegislationNumber}</span>\n                                    :\n                                    this.props.currentCategoryItem && filteredCategories.find(cat => cat && cat.CalendarCategoryID === this.props.currentCategoryItem) ? <span>Current Item: {categoryDescription(filteredCategories.find(cat => cat && cat.CalendarCategoryID === this.props.currentCategoryItem))}</span>\n                                        :\n                                        null}\n                    </div>\n                    {!this.props.isCalendarForm && canSetCurrentItem &&\n                        <div className=\"inner-grid three-and-one\">\n                            <CreatableSelect\n                                options={this.props.commonCurrentItemOptions}\n                                onChange={this.handleCurrentItemChange}\n                                formatCreateLabel={val => val}\n                                value={this.state.currentItemSelection}\n                            />\n                            <button disabled={!this.state.currentItemSelection || this.props.isSavingCalendarCurrentItem} onClick={e => this.props.setCurrentItem(e, null, null, this.state.currentItemSelection.label)} className=\"button\" type=\"button\">Set current item</button>\n                        </div>\n                    }\n                </div>\n\n                <br />\n                <div className=\"collapsible-table\">\n                    {filteredCategories.map((category, catIndex) => {\n                        if (category) {\n                            return (<div key={catIndex}>\n                                <div style={{ cursor: 'pointer' }}\n                                    className={`${!hide[catIndex] ? 'opened' : ''} flex-row section-header`}\n                                    onClick={() => this.toggleCategory(catIndex)}\n                                    title={!this.props.currentAgendaItem && this.props.currentCategoryItem === category.CalendarCategoryID ? \"Current Item\" : \"\"}>\n                                    <div>\n                                        {!this.props.currentAgendaItem && this.props.currentCategoryItem === category.CalendarCategoryID &&\n                                            <div style={{ display: 'inline-block' }}>\n                                                <div className=\"arrow-right-text-filled\">Current Item</div>\n                                            </div>\n                                        }\n                                        {!this.props.isCalendarForm && canSetCurrentItem &&\n                                            <button onClick={e => this.props.setCurrentItem(e, category.CalendarCategoryID)} style={{ marginRight: '5px' }} className=\"txt-dark-blue button-link\">(c)</button>\n                                        }\n                                        <span>\n                                            {categoryDescription(category)}\n                                            {category.DisplayType && \" - \" + category.CategoryType}\n                                        </span>\n                                    </div>\n                                    <div>\n                                        <div className=\"inline-list\">\n                                            {this.props.creatingCollection === catIndex ?\n                                                <span className=\"small-spinner\"></span>\n                                                :\n                                                <React.Fragment>\n                                                    {this.props.userClaims && this.props.userClaims.resources.find(x => x === COMMUNICATION_AUTHOR) &&\n                                                        <React.Fragment>\n                                                            {this.props.calendarCategoryReferences && this.props.calendarCategoryReferences.find(x => x.CalendarCategoryTypeID === category.CalendarCategoryTypeID) && this.props.calendarCategoryReferences.find(x => x.CalendarCategoryTypeID === category.CalendarCategoryTypeID).ClerksCopy &&\n                                                                <button type=\"button\" onClick={(e) => this.generateClerksCopy(category, e)} className=\"button small-button\">Clerk's Copy</button>\n                                                            }\n                                                        </React.Fragment>\n                                                    }\n                                                    {this.props.editHistory && this.props.userClaims.resources.find(resource => resource === BILL_MANAGEMENT_AUTHOR) && category.IsLegislationCategory && this.props.userClaims.resources.find(x => x === \"LegislationEvent\") &&\n                                                        <React.Fragment>\n                                                            <button disabled={this.props.creatingCollection !== null} type=\"button\" onClick={(e) => this.props.editHistory(e, catIndex, categoryDescription(category) + (category.DisplayType ? ' - ' + category.CategoryType : ''))} className=\"button small-button\">Edit History</button>\n                                                        </React.Fragment>\n                                                    }\n                                                    {this.props.createWatchlist && this.props.userClaims.resources.find(resource => resource === BILL_COLLECTION_AUTHOR) && category.IsLegislationCategory &&\n                                                        <React.Fragment>\n                                                            <button type=\"button\" onClick={(e) => this.toggleReportMaker(catIndex, e)} className=\"button small-button\">Create Report</button>\n                                                            {this.props.createdCollections[catIndex] ?\n                                                                <Link\n                                                                    style={{ fontSize: '12px' }}\n                                                                    to={{ pathname: \"bill-search\", search: `?collection=${this.props.createdCollections[catIndex].WatchListID}&q=${window.btoa(JSON.stringify({ selectedSession: calendar.SessionID, sessionOnly: true }))}` }}\n                                                                    target=\"_blank\">\n                                                                    Open Watchlist\n                                                                </Link>\n                                                                :\n                                                                <button disabled={this.props.creatingCollection !== null} type=\"button\" onClick={(e) => this.props.createWatchlist(e, catIndex)} className=\"button small-button\">Create Watchlist</button>\n                                                            }\n                                                        </React.Fragment>\n                                                    }\n                                                </React.Fragment>\n                                            }\n                                            <button aria-expanded={!hide[catIndex]} aria-label={`${hide[catIndex] ? \"Show\" : \"Hide\"} items`} type=\"button\" className=\"button-link\">+/-</button>\n                                        </div>\n                                    </div>\n                                </div>\n                                <div className=\"section-body\">\n                                    {!hide[catIndex] &&\n                                        <React.Fragment>\n                                            {category.Agendas.map((agenda, agendaIndex) =>\n                                                <React.Fragment key={agendaIndex}>\n                                                    {agenda.IsActive && !agenda.IsHidden &&\n                                                        <React.Fragment>\n                                                            <div title={this.props.currentAgendaItem === agenda.AgendaID ? \"Current Item\" : \"\"} className=\"section-row inner-grid med-two-one\">\n                                                                <div className='align-right'>\n                                                                    {this.props.currentAgendaItem === agenda.AgendaID &&\n                                                                        <div style={{ display: 'inline-block', float: 'left' }}>\n                                                                            <div className=\"arrow-right-text-filled\">Current Item</div>\n                                                                        </div>\n                                                                    }\n                                                                    {!this.props.isCalendarForm && canSetCurrentItem && this.props.userClaims.resources.find(x => x === \"LegislationEvent\") &&\n                                                                        <button onClick={e => this.props.setCurrentItem(e, category.CalendarCategoryID, agenda.AgendaID, agenda.Description)} style={{ marginRight: '5px' }} className=\"txt-dark-blue button-link\">(c)</button>\n                                                                    }\n                                                                    {agenda.LegislationNumber && <Link target=\"_blank\" to={`/bill-details/${session.SessionCode}/${agenda.LegislationNumber}`}>{agenda.LegislationNumber}</Link>}\n                                                                </div>\n                                                                <div>\n                                                                    <div>\n                                                                        <span>{renderHTML(agenda.LegislationDescription || (agenda.Description === \"Call to Order\" && this.props.calendarTime ? \"Call to Order - \" + this.props.calendarTime : agenda.Description))}</span>\n                                                                        {this.props.isCalendarForm &&\n                                                                            <span className=\"inline-list\">\n                                                                                {agenda.AgendaItems && agenda.AgendaItems.length > 0 && !this.props.isCalendarForm &&\n                                                                                    <button type=\"button\" onClick={() => this.toggleAgendaItemEditor(agendaIndex, catIndex)} className=\"button-link\">Edit Agenda Items</button>\n                                                                                }\n                                                                            </span>\n                                                                        }\n                                                                    </div>\n                                                                </div>\n                                                                <span className='align-right'>\n                                                                    {((agenda.AgendaItems && agenda.AgendaItems.length > 0) || agenda.LegislationNumber) &&\n                                                                        <button aria-label=\"Show patrons, agenda descriptions, and versions\" aria-expanded={!!agenda.show} type=\"button\" onClick={() => this.props.toggleAgenda(catIndex, agendaIndex)} className={`${agenda.show ? \"arrow-up\" : \"arrow-down\"}`}></button>\n                                                                    }\n                                                                </span>\n                                                            </div>\n                                                            {agenda.show &&\n                                                                <AgendaActivities\n                                                                    agenda={agenda}\n                                                                    sessionCode={session.SessionCode}\n                                                                    chamberCode={agenda.LegislationNumber ? agenda.LegislationNumber[0] : calendar.ChamberCode}\n                                                                    agendaNote={agenda.AgendaNote}\n                                                                />\n                                                            }\n                                                        </React.Fragment>\n                                                    }\n                                                </React.Fragment>\n                                            )}\n                                        </React.Fragment>\n                                    }\n                                </div>\n                            </div>)\n                        } else {\n                            return null;\n                        }\n                    })}\n                </div>\n            </div >);\n    }\n}\n\nexport const AgendaActivities = props => {\n    const { agenda, chamberCode, sessionCode, agendaNote } = props;\n    const sortedPatrons = agenda.Patrons ? agenda.Patrons.sort((a, b) => { return chamberCode === b.ChamberCode ? 1 : -1 }) : [];\n    const patrons = sortedPatrons.length > 0\n        ? sortedPatrons.map((patron, patronIndex) => {\n            let sameAsPrevious = (!sortedPatrons[patronIndex - 1] && patron.ChamberCode === chamberCode && !sortedPatrons.find(p => p.ChamberCode !== chamberCode)) || (sortedPatrons[patronIndex - 1] && patron.ChamberCode === sortedPatrons[patronIndex - 1].ChamberCode);\n            let sameAsNext = sortedPatrons[patronIndex + 1] && patron.ChamberCode === sortedPatrons[patronIndex + 1].ChamberCode;\n            let patronDisplayName = patron.PatronDisplayName;\n            return (\n                <React.Fragment key={patronIndex}>\n                    {patron.ChamberCode !== chamberCode\n                        ? patronIndex !== agenda.Patrons.length - 1\n                            ? chamberCode === \"S\"\n                                ? !sameAsPrevious ? (patronIndex !== 0 ? \"; \" : \"\") + \"Delegates: \" + patronDisplayName + \", \" : sameAsNext ? patronDisplayName + \", \" : patronDisplayName\n                                : !sameAsPrevious ? (patronIndex !== 0 ? \"; \" : \"\") + \"Senators: \" + patronDisplayName + \", \" : sameAsNext ? patronDisplayName + \", \" : patronDisplayName\n                            : chamberCode === \"S\"\n                                ? !sameAsPrevious ? (patronIndex !== 0 ? \"; \" : \"\") + \"Delegate: \" + patronDisplayName : patronDisplayName\n                                : !sameAsPrevious ? (patronIndex !== 0 ? \"; \" : \"\") + \"Senator: \" + patronDisplayName : patronDisplayName\n                        : sameAsNext\n                            ? patronDisplayName + \", \" : patronDisplayName\n                    }\n                </React.Fragment>\n            )\n        })\n        : \"\"\n\n    return (\n        <div className=\"inner-grid med-two-one\">\n            <br />\n            <div>\n                <div>\n                    {patrons.length > 0 && <span>Patron(s): {patrons}</span>}\n                </div>\n                <div>\n                    {agenda.AgendaItems.filter(a => a.IsActive).map((item, itemIndex) =>\n                        <div key={itemIndex}>\n                            {renderHTML(item.Description || \"\")}\n                        </div>\n                    )}\n                </div>\n                <p className=\"bold line-break\">\n                    {agendaNote}\n                </p>\n                {agenda.Versions &&\n                    <>\n                        {agenda.Versions.length > 0 ?\n                            <>\n                                {agenda.Versions === 'fail' ?\n                                    <div className=\"small-text\">Failed to get versions</div>\n                                    :\n                                    <VersionList userClaims={[]} sessionCode={sessionCode} version={agenda.Versions} descriptionEditable={false} legislationClass={agenda.LegislationDescription.includes(\"Budget Bill\") ? \"Budget\" : \"\"} />\n                                }\n                            </>\n                            :\n                            <div className=\"small-spinner\"></div>\n                        }\n                    </>\n                }\n            </div>\n        </div>\n    );\n}\n\nexport default connect(\n    (state) => {\n        const { votes, patrons } = state;\n        return {\n            votes,\n            patrons\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, voteActionCreators, patronActionCreators), dispatch)\n        }\n    }\n)(CalendarDetailsComponent);\n","import React from 'react';\n\nimport moment from 'moment-timezone';\nimport { AgendaActivities } from './lis-calendar-details';\n\nconst CalendarDetailsPrintout = props => {\n    const { session, calendar, comments } = props;\n    const filteredCategories = calendar.CalendarCategories.map(category => {\n        const checkForActiveAgendas = category.Agendas.find(agenda => agenda.IsActive && !agenda.IsHidden);\n        if (checkForActiveAgendas) {\n            return category;\n        } else {\n            return null;\n        }\n    });\n    const categoryDescription = category => {\n        if (category.Agendas.filter(a => a.IsActive).length > 1 && category.PluralDescription) {\n            return category.PluralDescription;\n        } else {\n            return category.Description;\n        }\n    }\n    const sessionHeader = session ? session.SessionYear + \" \" + session.DisplayName : '';\n\n    return (\n        <div>\n            <br />\n            <div className=\"flex-row flex-vertical-center multiple-icons\">\n                <h2 className=\"no-margin\">{sessionHeader}</h2>\n            </div>\n            <hr />\n            <div className=\"flex-row\">\n                <div>\n                    <h3 className=\"no-margin\">{calendar.ChamberCode === \"S\" ? \"Senate \" : \"House \"} Calendar {calendar.IsProforma && \"(Pro Forma)\"}</h3>\n                    <span>{moment(calendar.CalendarDate).format(\"MMMM Do, YYYY\") + (calendar.CalendarNumber > 1 ? [' (', ')'].join('Supp. ' + (calendar.CalendarNumber - 1)) : '')}</span>\n                </div>\n                <div>\n                </div>\n            </div>\n            {comments.length > 0 &&\n                <div className=\"public-details\">\n                    {comments.map((comment, i) => {\n                        return (\n                            <p key={i}>{\"Comment \" + comment.Sequence + \": \" + comment.Comment}</p>\n                        )\n                    })}\n                </div>\n            }\n            <br />\n            <div className=\"collapsible-table\">\n                {filteredCategories.map((category, catIndex) => {\n                    if (category) {\n                        return (<div key={catIndex}>\n                            <div>\n                                <div>\n                                    <span>\n                                        {categoryDescription(category)}\n                                        {category.DisplayType && \" - \" + category.CategoryType}\n                                    </span>\n                                </div>\n                                <div>\n                                </div>\n                            </div>\n                            <div className=\"section-body\">\n                                {category.Agendas.map((agenda, agendaIndex) =>\n                                    <React.Fragment key={agendaIndex}>\n                                        {agenda.IsActive && !agenda.IsHidden &&\n                                            <React.Fragment>\n                                                <div>\n                                                    <div>\n                                                        <span>{agenda.LegislationNumber}</span>\n                                                    </div>\n                                                    <div>\n                                                        <div>\n                                                            <span>{agenda.LegislationDescription || agenda.Description}</span>\n                                                        </div>\n                                                    </div>\n                                                    <div>\n                                                        <AgendaActivities\n                                                            agenda={agenda}\n                                                            chamberCode={calendar.ChamberCode}\n                                                            sessionCode={calendar.SessionCode}\n                                                            agendaNode={agenda.AgendaNote}\n                                                        />\n                                                    </div>\n                                                    <div>\n                                                        {agenda.AgendaItems.map((x) => {\n                                                            if (x.Description && x.Description.includes(\"Amendment\")) {\n                                                                return <div dangerouslySetInnerHTML={{ __html: x.DraftText }} />\n                                                            }\n                                                        })}\n\n                                                    </div>\n                                                </div>\n                                            </React.Fragment>\n                                        }\n                                    </React.Fragment>\n                                )}\n                            </div>\n                        </div>)\n                    } else {\n                        return null;\n                    }\n                })}\n            </div>\n        </div>);\n}\n\nexport default CalendarDetailsPrintout;\n","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { Prompt } from 'react-router';\nimport * as Fields from '../../../lis-shared/lis-layout/components/lis-forms-component';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport moment from 'moment-timezone';\nimport ReactToPrint from \"react-to-print\";\nimport { calendarActionCreators } from '../../../stores/lis-calendar-store';\nimport BillsGrid from './lis-house-bills-grid';\nimport CalendarDetailsComponent from '../../../lis-shared/lis-calendar/lis-calendar-details'\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { billActionCreators } from '../../../stores/lis-legislation-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport Popout from '../../../lis-shared/lis-layout/components/lis-popout-component';\nimport DatePicker from 'react-datepicker';\nimport CalendarDetailsPrintout from '../../../lis-shared/lis-calendar/lis-calendar-details-printout';\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\n\nconst PUBLISH_CALENDAR = true;\nconst SAVE_CALENDAR = false;\nconst lisDocDomain = window.env?.STORAGE_ACCOUNT_DOMAIN;\n\nconst NUMERIC_SORT_CATEGORIES = [2, 3, 4, 26, 27, 5, 41, 6, 7, 28, 29, 30, 31, 32, 57, 33, 35, 45, 9, 10, 8, 11, 13, 37, 38, 44, 46];\n\nconst sortAgendas = (a, b, calendarChamber) => {\n    return !a.IsActive && b.IsActive\n        ? 1\n        : a.IsActive && !b.IsActive\n            ? -1\n            : (!a.Ranking || a.Ranking === \"\") && (b.Ranking && b.Ranking !== \"\")\n                ? -1\n                : (a.Ranking && a.Ranking !== \"\") && (!b.Ranking || b.Ranking === \"\")\n                    ? 1\n                    : a.Ranking > b.Ranking\n                        ? 1\n                        : a.Ranking < b.Ranking\n                            ? -1\n                            : moment(a.CalendarDate).isAfter(b.CalendarDate, \"day\")\n                                ? 1\n                                : moment(b.CalendarDate).isAfter(a.CalendarDate, \"day\")\n                                    ? -1\n                                    : moment(a.CandidateDate).isAfter(b.CandidateDate, \"day\")\n                                        ? 1\n                                        : moment(b.CandidateDate).isAfter(a.CandidateDate, \"day\")\n                                            ? -1\n                                            : a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) !== 0 ?\n                                                a.LegislationNumber[0].localeCompare(calendarChamber) !== 0\n                                                    ? -1 : 1\n                                                : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) > 0\n                                                    ? 1\n                                                    : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) < 0\n                                                        ? -1\n                                                        : a.LegislationKey > b.LegislationKey\n                                                            ? 1\n                                                            : -1\n}\n\nconst sortAgendasNumerically = (a, b, calendarChamber) => {\n    return !a.IsActive && b.IsActive\n        ? 1\n        : a.IsActive && !b.IsActive\n            ? -1\n            : (!a.Ranking || a.Ranking === \"\") && (b.Ranking && b.Ranking !== \"\")\n                ? -1\n                : (a.Ranking && a.Ranking !== \"\") && (!b.Ranking || b.Ranking === \"\")\n                    ? 1\n                    : a.Ranking > b.Ranking\n                        ? 1\n                        : a.Ranking < b.Ranking\n                            ? -1\n                            : a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) !== 0 ?\n                                a.LegislationNumber[0].localeCompare(calendarChamber) !== 0\n                                    ? -1 : 1\n                                : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) > 0\n                                    ? 1\n                                    : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) < 0\n                                        ? -1\n                                        : a.LegislationKey > b.LegislationKey\n                                            ? 1\n                                            : -1\n}\n\nconst sortInactiveAgendas = (a, b, calendarChamber) => {\n    return (!a.Ranking || a.Ranking === \"\") && (b.Ranking && b.Ranking !== \"\")\n        ? -1\n        : (a.Ranking && a.Ranking !== \"\") && (!b.Ranking || b.Ranking === \"\")\n            ? 1\n            : a.Ranking > b.Ranking\n                ? 1\n                : a.Ranking < b.Ranking\n                    ? -1\n                    : moment(a.CalendarDate).isAfter(b.CalendarDate, \"day\")\n                        ? 1\n                        : moment(b.CalendarDate).isAfter(a.CalendarDate, \"day\")\n                            ? -1\n                            : moment(a.CandidateDate).isAfter(b.CandidateDate, \"day\")\n                                ? 1\n                                : moment(b.CandidateDate).isAfter(a.CandidateDate, \"day\")\n                                    ? -1\n                                    : a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) !== 0 ?\n                                        a.LegislationNumber[0].localeCompare(calendarChamber) !== 0\n                                            ? -1 : 1\n                                        : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) > 0\n                                            ? 1\n                                            : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) < 0\n                                                ? -1\n                                                : a.LegislationKey > b.LegislationKey\n                                                    ? 1\n                                                    : -1\n}\n\nconst sortInactiveAgendasNumerically = (a, b, calendarChamber) => {\n    return (!a.Ranking || a.Ranking === \"\") && (b.Ranking && b.Ranking !== \"\")\n        ? -1\n        : (a.Ranking && a.Ranking !== \"\") && (!b.Ranking || b.Ranking === \"\")\n            ? 1\n            : a.Ranking > b.Ranking\n                ? 1\n                : a.Ranking < b.Ranking\n                    ? -1\n                    : a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) !== 0 ?\n                        a.LegislationNumber[0].localeCompare(calendarChamber) !== 0\n                            ? -1 : 1\n                        : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) > 0\n                            ? 1\n                            : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) < 0\n                                ? -1\n                                : a.LegislationKey > b.LegislationKey\n                                    ? 1\n                                    : -1\n}\n\nconst findLastByIsActiveThenCalendarDateThenCandidateDateThenLegChamberTypeKey = (a, b, calendarChamber, ignoreCalendarDate, ignoreCandidateDate) => (\n    a.IsActive && findLastByCalendarDateThenCandidateDateThenLegChamberTypeKey(a, b, calendarChamber, ignoreCalendarDate, ignoreCandidateDate)\n)\n\nconst findLastByCalendarDateThenCandidateDateThenLegChamberTypeKey = (a, b, calendarChamber, ignoreCalendarDate, ignoreCandidateDate) => (\n    (((ignoreCalendarDate || (a.CalendarDate && b.CalendarDate && moment(a.CalendarDate).isSame(b.CalendarDate, \"day\"))) && findLastByLegChamberTypeKey(a, b, calendarChamber)) ||\n        (!ignoreCalendarDate && a.CalendarDate && b.CalendarDate && moment(a.CalendarDate).isBefore(b.CalendarDate, \"day\"))) ||\n    (((ignoreCandidateDate || (a.CandidateDate && b.CandidateDate && moment(a.CandidateDate).isSame(b.CandidateDate, \"day\"))) && findLastByLegChamberTypeKey(a, b, calendarChamber)) ||\n        (!ignoreCandidateDate && a.CandidateDate && b.CandidateDate && moment(a.CandidateDate).isBefore(b.CandidateDate, \"day\"))) ||\n    ((ignoreCalendarDate || (!a.CalendarDate && !b.CalendarDate)) && (ignoreCandidateDate || (!a.CandidateDate && !b.CandidateDate)) &&\n        findLastByLegChamberTypeKey(a, b, calendarChamber))\n    || (!ignoreCalendarDate && !b.CalendarDate && a.CandidateDate)\n    || !ignoreCandidateDate && !b.CandidateDate && a.CandidateDate\n)\n\nconst findLastByLegChamberTypeKey = (a, b, calendarChamber) => (\n    (a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) === (calendarChamber === \"H\" ? 1 : -1)) ||\n    (a.LegislationNumber && a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) === 0 && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) === -1) ||\n    (a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) === 0 && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) === 0 && a.LegislationKey && a.LegislationKey < parseInt(b.LegislationKey))\n)\n\nclass HouseCalendarFormComponent extends React.Component {\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            isLoaded: false,\n            calendarData: '',\n            hideCategories: [],\n            showPreview: false,\n            isSaving: false,\n            pendingSave: false,\n            comments: [],\n            message: '',\n            selectedSession: '',\n            selectAllActive: false,\n            selectAllInactive: false,\n            calendarCategories: [],\n            selectedCategory: '',\n            selectedBill: [],\n            billList: [],\n            showCategoryPreview: -1,\n            selectedFile: '',\n            calendatDate: \"\",\n            commentEdit: [],\n            tempComments: [],\n            showTitles: false,\n            selectedDate: \"\",\n            selectedCommittee: \"\",\n            dateList: [],\n            committeeList: [],\n            hideAllNonIncludedBills: false\n        };\n\n        this.initializeForm = this.initializeForm.bind(this);\n        this.handleAgendaSort = this.handleAgendaSort.bind(this);\n        this.handleBulkAgendaSort = this.handleBulkAgendaSort.bind(this);\n        this.togglePreview = this.togglePreview.bind(this);\n        this.updateAgenda = this.updateAgenda.bind(this);\n        this.updateAgendaItems = this.updateAgendaItems.bind(this);\n        this.changeCategoryDropdown = this.changeCategoryDropdown.bind(this);\n        this.addCategory = this.addCategory.bind(this);\n        this.toggleHideCategory = this.toggleHideCategory.bind(this);\n        this.toggleHideAllCategories = this.toggleHideAllCategories.bind(this);\n        this.toggleHideAllNonIncludedBills = this.toggleHideAllNonIncludedBills.bind(this);\n        this.changeBillDropdown = this.changeBillDropdown.bind(this);\n        this.changeDateDropdown = this.changeDateDropdown.bind(this);\n        this.changeCommitteeDropdown = this.changeCommitteeDropdown.bind(this);\n        this.addBill = this.addBill.bind(this);\n        this.addComment = this.addComment.bind(this);\n        this.removeComment = this.removeComment.bind(this);\n        this.commentShift = this.commentShift.bind(this);\n        this.handleProFormaChange = this.handleProFormaChange.bind(this);\n        this.toggleCalendarPreview = this.toggleCalendarPreview.bind(this);\n        this.togglePortal = this.togglePortal.bind(this);\n        this.saveCalendar = this.saveCalendar.bind(this);\n        this.handlePdfFile = this.handlePdfFile.bind(this);\n        this.submitPdfFile = this.submitPdfFile.bind(this);\n        this.changeConveneTime = this.changeConveneTime.bind(this);\n        this.toggleAgenda = this.toggleAgenda.bind(this);\n        this.toggleCommentEdit = this.toggleCommentEdit.bind(this);\n        this.confirmCommentEdit = this.confirmCommentEdit.bind(this);\n        this.toggleShowTitles = this.toggleShowTitles.bind(this);\n        this.setPending = this.setPending.bind(this);\n        this.deleteCategory = this.deleteCategory.bind(this);\n\n        this.pdfRef = React.createRef();\n        this.fileInput = React.createRef();\n    }\n\n    componentDidMount() {\n        this.initializeForm();\n    }\n\n    initializeForm() {\n        let calendarData = { ...this.props.calendarData };\n        let noSavedItems = true;\n        let comments = [];\n        let dateList = [];\n        let committeeList = [];\n\n        // For the 'add category' dropdown\n        this.props.actions.getCalendarCategoriesReferences('?chamberCode=' + calendarData.ChamberCode)\n            .then(() => {\n                let calendarCategories = this.props.calendar.calendarCategoriesReferences;\n                calendarCategories.forEach(category => {\n                    category.label = category.DisplayType ? `${category.Description} - ${category.CategoryType}` : category.Description;\n                    category.value = category.CalendarCategoryTypeID;\n                });\n                this.setState({\n                    calendarCategories: calendarCategories\n                }, () => {\n                    this.props.actions.getCommitteeList(\"sessionID=\" + calendarData.SessionID)\n                        .then(() => {\n                            calendarData.CalendarCategories.forEach((category, j) => {\n                                const referenceCategory = this.state.calendarCategories.find(c => c.CalendarCategoryTypeID === category.CalendarCategoryTypeID);\n                                const response = this.handleAgendaSort(category.Agendas, category.CategoryType, category.CalendarCategoryTypeID, calendarData.ChamberCode)\n                                category.Agendas = response;\n                                category.Agendas.forEach((agenda, i) => {\n                                    //If a bill is on first reading capture its committee and candidate date to use in the filters\n                                    if (referenceCategory && referenceCategory.OnDemand) {\n                                        if (agenda.CommitteeID && this.props.committee.committeeList.find(x => x.ChamberCode === calendarData.ChamberCode && x.CommitteeID === agenda.CommitteeID)) {\n                                            committeeList.push({ label: this.props.committee.committeeList.find(x => x.ChamberCode === calendarData.ChamberCode && x.CommitteeID === agenda.CommitteeID).Name, value: agenda.CommitteeID, date: agenda.CandidateDate });\n                                        }\n\n                                        if (agenda.CandidateDate && this.props.committee.committeeList.find(x => x.ChamberCode === calendarData.ChamberCode && x.CommitteeID === agenda.CommitteeID)) {\n                                            let thisDate = dateList.findIndex(x => moment(x.value).isSame(agenda.CandidateDate, \"day\"));\n                                            if (thisDate > -1) {\n                                                if (!dateList[thisDate].committee.includes(agenda.CommitteeID)) {\n                                                    dateList[thisDate].committee.push(agenda.CommitteeID)\n                                                }\n                                            } else {\n                                                dateList.push({ label: moment(agenda.CandidateDate).format(\"MM/DD/YYYY\"), value: agenda.CandidateDate, committee: [agenda.CommitteeID] });\n                                            }\n                                        }\n                                    }\n\n                                    //Item has an agenda ID so this means that a bill has been previously saved to this calendar\n                                    if (agenda.AgendaID) {\n                                        noSavedItems = false;\n                                    }\n\n                                    //If we've parsed the last agenda of the last category then set the reference lists to be used in the dropdowns\n                                    if (j === calendarData.CalendarCategories.length - 1 && i === category.Agendas.length - 1) {\n                                        dateList = dateList.sort((a, b) => { return moment(a.value) - moment(b.value) })\n                                        committeeList = committeeList.sort((a, b) => a.label.localeCompare(b.label));\n\n                                        this.setState({\n                                            dateList: [...new Map(dateList.map(x => [x[\"label\"], x])).values()],\n                                            committeeList: [...new Map(committeeList.map(x => [x[\"value\"], x])).values()]\n                                        })\n                                    }\n                                });\n                                if ([98, 102].includes(category.CalendarCategoryTypeID)) {\n                                    category.showAmendments = !!category.Agendas.flatMap(agenda => agenda.AgendaItems).find(agendaItem => agendaItem.IsActive && agendaItem.LDNumber);\n                                }\n                            })\n\n                            let commentEdit = [];\n                            let tempComments = [];\n\n                            for (let i = 0; i < calendarData.CalendarComments.length; i++) {\n                                let comment = calendarData.CalendarComments[i];\n                                comment.Sequence = i + 1;\n                                comments.push(comment);\n                                commentEdit.push(false);\n                                //I kid you not if I don't make a separate tempComment object here and push it into the tempComment array instead of inserting the entire comment\n                                //then this.state.comments gets mutated in the handleCommentChange function even though it would never get explicitly changed -JGB                    \n                                let tempComment = {\n                                    Sequence: comment.Sequence,\n                                    Comment: comment.Comment\n                                }\n                                tempComments.push(tempComment)\n                            }\n\n                            calendarData.CalendarCategories.forEach(category => this.handleAgendaSort(category.Agendas, category.CategoryType, category.CalendarCategoryTypeID, calendarData.ChamberCode));\n\n                            this.toggleHideAllCategories(true, calendarData.CalendarCategories);\n\n                            this.setState({\n                                calendarData: calendarData,\n                                showTitles: calendarData.ChamberCode === \"H\",\n                                pendingSave: noSavedItems,\n                                comments: comments,\n                                tempComments: tempComments,\n                                isLoaded: true,\n                                calendarDate: calendarData.CalendarDate,\n                                commentEdit: commentEdit,\n                            }, () => {\n                                //Get bills in the session for the bill dropdown\n                                this.props.actions.getSessionBills('?sessionID= ' + this.state.calendarData.SessionID).then(() => {\n                                    let billList = [...this.props.bills.sessionBills];\n                                    billList.forEach(bill => {\n                                        bill.label = bill.LegislationNumber\n                                        bill.value = bill.LegislationID\n                                    });\n                                    this.setState({\n                                        billList: billList,\n                                    })\n                                })\n                                this.props.actions.getSessionById(this.state.calendarData.SessionID)\n                                    .then(() =>\n                                        this.setState({ selectedSession: this.props.session.selectedSession })\n                                    );\n                            });\n                        })\n                });\n            });\n    }\n\n    togglePreview() {\n        const opposite = !this.state.showPreview;\n        this.setState({\n            showPreview: opposite\n        });\n    }\n\n    handleCommentChange(e, sequence) {\n        let tempComments = [...this.state.tempComments];\n\n        tempComments.find(x => x.Sequence === sequence).Comment = e.target.value;\n\n        this.setState({\n            tempComments: tempComments\n        });\n    }\n\n    updateAgenda(organizedBills, saveRequired) {\n        let calendarData = { ...this.state.calendarData };\n        calendarData.CalendarCategories = organizedBills;\n\n        this.setState({\n            calendarData: calendarData,\n            pendingSave: saveRequired === undefined ? this.state.pendingSave : saveRequired\n        }, () => {\n            this.forceUpdate();\n        });\n    }\n\n    updateAgendaItems(agendaItems, categoryIndex, agendaIndex) {\n        let calendarData = { ...this.state.calendarData };\n        calendarData.CalendarCategories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].AgendaItems = agendaItems;\n\n        this.setState({\n            calendarData: calendarData,\n            pendingSave: true\n        });\n    }\n\n    changeCategoryDropdown(value) {\n        this.setState({\n            selectedCategory: value\n        });\n    }\n\n    addCategory() {\n        const selectedCategory = this.state.selectedCategory;\n        //Used to find the new index of the category so the hidden categories indices can be updated\n        const categoryFinder = new Date().getTime();\n        let organizedBills = [...this.state.calendarData.CalendarCategories];\n        let newCalendarCategory = {\n            IsLegislationCategory: selectedCategory.IsLegislationCategory,\n            Agendas: [],\n            CalendarCategoryTypeID: selectedCategory.CalendarCategoryTypeID,\n            CategoryCode: selectedCategory.CategoryCode,\n            Description: selectedCategory.Description,\n            PluralDescription: selectedCategory.PluralDescription,\n            DisplayType: selectedCategory.DisplayType,\n            CategoryType: selectedCategory.CategoryType,\n            Sequence: selectedCategory.Sequence,\n            isNewCategory: categoryFinder\n        }\n        organizedBills.push(newCalendarCategory);\n        //Sort the calendar by smallest to greatest sequence\n        organizedBills.sort((a, b) => (a.Sequence > b.Sequence) ? 1 : -1)\n        //Update the categories that are hidden since the array indices have changed\n        const newCategoryIndex = organizedBills.filter(c => !c.DeletionDate).findIndex(cat => cat.isNewCategory === categoryFinder);\n        if (newCategoryIndex !== -1) {\n            let hideCategories = this.state.hideCategories;\n            hideCategories.splice(newCategoryIndex, 0, false);\n            this.setState({\n                hideCategories: hideCategories\n            });\n        }\n        //Remove the selected category so the user doesn't accidentally add it twice\n        this.setState({\n            selectedCategory: ''\n        });\n        this.updateAgenda(organizedBills, true);\n\n    }\n\n    deleteCategory(category) {\n        let calendarData = { ...this.state.calendarData };\n        const selectedCategoryIndex = calendarData.CalendarCategories.filter(c => !c.DeletionDate).findIndex(c => c.CategoryCode === category.CategoryCode);\n        calendarData.CalendarCategories.filter(c => !c.DeletionDate)[selectedCategoryIndex].DeletionDate = new Date();\n\n        let hideCategories = this.state.hideCategories;\n        if (hideCategories[selectedCategoryIndex] !== null && hideCategories[selectedCategoryIndex] !== undefined) {\n            hideCategories.splice(selectedCategoryIndex, 1);\n        }\n        this.setState({ calendarData, hideCategories })\n    }\n\n    toggleHideCategory(catIndex) {\n        let hideCategories = this.state.hideCategories;\n        hideCategories[catIndex] = !hideCategories[catIndex]\n        this.setState({\n            hideCategories: hideCategories\n        });\n    }\n\n    toggleHideAllCategories(hide, calendarCategories) {\n        let hideCategories = this.state.hideCategories;\n        calendarCategories = calendarCategories || this.state.calendarData.CalendarCategories;\n        calendarCategories.forEach((cat, catIndex) => {\n            hideCategories[catIndex] = hide\n        })\n        this.setState({\n            hideCategories: hideCategories\n        });\n    }\n\n    toggleHideAllNonIncludedBills() {\n        this.setState({\n            hideAllNonIncludedBills: !this.state.hideAllNonIncludedBills\n        });\n    }\n\n    changeBillDropdown(index, value) {\n        let selectedBill = [...this.state.selectedBill];\n        selectedBill[index] = value;\n        this.setState({\n            selectedBill: selectedBill\n        });\n    }\n\n    changeDateDropdown(value, callback) {\n        this.setState({\n            selectedDate: value\n        }, () => {\n            if (this.state.selectedDate && this.state.selectedCommittee)\n                this.setPending();\n            if (callback) {\n                callback();\n            }\n        });\n    }\n\n    changeCommitteeDropdown(value, callback) {\n        this.setState({\n            selectedCommittee: value\n        }, () => {\n            if (this.state.selectedDate && this.state.selectedCommittee)\n                this.setPending();\n            if (callback) {\n                callback();\n            }\n        });\n    }\n\n    setPending() {\n        let calendarData = { ...this.state.calendarData };\n        calendarData.CalendarCategories.forEach((category, i) => {\n            category.Agendas.forEach((agenda, j) => {\n                //If a given agenda item matches one filter (if one filter is selected) or both filters (if both are selected) \n                //Then mark it isActive and give it the pending value so we know to deactivate it if the user changes the filter selections   \n                //Otherwise if it's active, pending, and it no longer matches the filters then remove the pending value and deactivate it so it's hidden\n                if (((!this.state.selectedDate || this.state.selectedDate === \"\") && this.state.selectedCommittee && this.state.selectedCommittee.value === agenda.CommitteeID && !agenda.IsHidden && agenda.pending !== false)\n                    || ((!this.state.selectedCommittee || this.state.selectedCommittee === \"\") && this.state.selectedDate && this.state.selectedDate.value === agenda.CandidateDate && !agenda.IsHidden && agenda.pending !== false)\n                    || (this.state.selectedDate && this.state.selectedDate !== \"\" && this.state.selectedCommittee && this.state.selectedCommittee !== \"\" && this.state.selectedCommittee.value === agenda.CommitteeID && this.state.selectedDate.value === agenda.CandidateDate && !agenda.IsHidden && agenda.pending !== false)) {\n                    agenda.IsActive = true;\n                    //Disabling the pending feature which removes bills from the calendar if they've been included but not saved. I feel like there's a chance they'll want it back -JGB\n                    //agenda.pending = true; \n                } else if (agenda.IsActive === true && agenda.pending === true) {\n                    agenda.IsActive = false;\n                    delete agenda.pending;\n                }\n            })\n\n            category.Agendas = this.handleAgendaSort(category.Agendas, category.CategoryType, category.CalendarCategoryTypeID);\n        })\n\n        this.setState({\n            calendarData\n        })\n    }\n\n    addBill(index, callback) {\n        let calendarCategories = [...this.state.calendarData.CalendarCategories];\n        let newAgenda = {};\n\n        //Check whether to move the bill from another category or add the bill\n        let billExists = false;\n        if (this.state.selectedBill[index]) {\n            let associatedCategory = calendarCategories.filter(c => !c.DeletionDate)[index];\n            calendarCategories.some((category, categoryIndex) => {\n                const duplicateBillIndex = category.Agendas.findIndex(bill => bill.LegislationID === this.state.selectedBill[index].LegislationID);\n                if (duplicateBillIndex >= 0) {\n                    billExists = true;\n                    newAgenda = { ...calendarCategories[categoryIndex].Agendas[duplicateBillIndex] };\n                    newAgenda.IsActive = true;\n                    newAgenda.CalendarCategoryTypeID = associatedCategory.CalendarCategoryTypeID;\n                    newAgenda.CalendarCategoryID = associatedCategory.CalendarCategoryID;\n                    calendarCategories[categoryIndex].Agendas.splice(duplicateBillIndex, 1);\n                    return true;\n                }\n            });\n\n            if (!billExists) {\n                newAgenda = {\n                    CalendarCategoryTypeID: associatedCategory.CalendarCategoryTypeID,\n                    CalendarCategoryID: associatedCategory.CalendarCategoryID,\n                    IsActive: true,\n                    LegislationID: this.state.selectedBill[index].LegislationID,\n                    LegislationNumber: this.state.selectedBill[index].LegislationNumber,\n                    LegislationKey: this.state.selectedBill[index].LegislationKey,\n                    Patrons: this.state.selectedBill[index].Patrons,\n                    LegislationDescription: this.state.selectedBill[index].Description,\n                    LegislationTitle: this.state.selectedBill[index].LegislationTitle,\n                    Ranking: null\n                }\n            }\n\n            associatedCategory.Agendas.splice(0, 0, newAgenda);\n            associatedCategory.Agendas = this.handleAgendaSort(associatedCategory.Agendas, associatedCategory.CategoryType, associatedCategory.CalendarCategoryTypeID)\n\n            this.updateAgenda(calendarCategories, true);\n\n            //Remove object so the bill is no longer currently selected in the dropdown\n            let selectedBill = [...this.state.selectedBill];\n            selectedBill[index] = '';\n            this.setState({\n                selectedBill: selectedBill\n            });\n        }\n\n        if (callback) {\n            callback();\n        }\n    }\n\n    handleBulkAgendaSort(calendar) {\n        calendar.CalendarCategories.forEach((category, i) => {\n            if (category.Agendas) {\n                const response = this.handleAgendaSort(category.Agendas, category.CategoryType, category.CalendarCategoryTypeID)\n                category.Agendas = response;\n            }\n\n            //Persist old showAmendments after save or unpublish\n            if ([98, 102].includes(category.CalendarCategoryTypeID)) {\n                category.showAmendments = !!category.Agendas.flatMap(agenda => agenda.AgendaItems).find(agendaItem => agendaItem.IsActive && agendaItem.LDNumber);\n            }\n        })\n\n        return calendar\n    }\n\n    handleAgendaSort(agendas, categoryType, categoryTypeId, chamberCode) {\n        let unrankedAgendas = [];\n        let rankedAgendas = [];\n        let inactiveAgendas = [];\n        let rankings = [];\n\n        if (agendas && categoryType != \"Order\") {\n            agendas.forEach((agenda) => {\n                if (!agenda.Ranking && agenda.IsActive) {\n                    unrankedAgendas.push(agenda);\n                } else if (agenda.IsActive) {\n                    rankedAgendas.push(agenda);\n                    rankings.push(agenda.Ranking);\n                } else {\n                    inactiveAgendas.push(agenda)\n                }\n            })\n\n            rankings.sort((a, b) => a - b);\n\n            let gaps = [];\n            for (let i = 1; i < rankings.length; i++) {\n                gaps.push(rankings[i] - rankings[i - 1]);\n            }\n\n            if (NUMERIC_SORT_CATEGORIES.includes(categoryTypeId)) {\n                rankedAgendas.sort((a, b) => sortAgendasNumerically(a, b, this.state.calendarData.ChamberCode ?? chamberCode));\n            } else {\n                rankedAgendas.sort((a, b) => sortAgendas(a, b, this.state.calendarData.ChamberCode));\n            }\n            if (NUMERIC_SORT_CATEGORIES.includes(categoryTypeId)) {\n                unrankedAgendas.sort((a, b) => sortAgendasNumerically(a, b, this.state.calendarData.ChamberCode ?? chamberCode));\n            } else {\n                unrankedAgendas.sort((a, b) => sortAgendas(a, b, this.state.calendarData.ChamberCode));\n            }\n            if (NUMERIC_SORT_CATEGORIES.includes(categoryTypeId)) {\n                inactiveAgendas.sort((a, b) => sortInactiveAgendasNumerically(a, b, this.state.calendarData.ChamberCode ?? chamberCode));\n            } else {\n                inactiveAgendas.sort((a, b) => sortInactiveAgendas(a, b, this.state.calendarData.ChamberCode ?? chamberCode));\n            }\n\n            //If there are multiple ranks with a gap larger than 1 place all unranked agendas between them\n            if (new Set(rankings).size > 1 && Math.max(...gaps) > 1) {\n                let insertPoint = gaps.findIndex(x => x === Math.max(...gaps)) + 1\n\n                for (let i = 0; i < unrankedAgendas.length; i++) {\n                    rankedAgendas.splice(insertPoint, 0, unrankedAgendas[i]);\n                    insertPoint++;\n                }\n\n                return rankedAgendas.concat(inactiveAgendas);\n            } else {\n                //If the largest rank is greater than 50 put all unranked agendas above the ranked agendas, otherwise put them all at the bottom\n                if (Math.max(...rankings) >= 50) {\n                    return unrankedAgendas.concat(rankedAgendas).concat(inactiveAgendas);\n                } else {\n                    return rankedAgendas.concat(unrankedAgendas).concat(inactiveAgendas);\n                }\n            }\n        } else {\n            return agendas;\n        }\n    }\n\n    genCalendarPreview(category) {\n        this.setState({\n            gettingPdf: true\n        });\n        // This endpoint returns a pdf document and not json so the partnerRequest function will not work\n        // It doesn't need to be saved to the redux store because it will not be referenced after the user sees it. So it is called here within the component.\n        const API_URL = window.env ? window.env.API_SERVER : '';\n        const idToken = 'LIS_ID_TOKEN';\n        let signal = new window.AbortController().signal;\n        const config = {\n            headers: {\n                'content-type': \"application/json; charset=utf-8\",\n                Authorization: \"Bearer \" + localStorage.getItem(idToken),\n                'WebAPIKey': process.env.REACT_APP_API_KEY\n            },\n            method: \"GET\",\n            signal: signal\n        };\n        let params = `?calendarId=${this.state.calendarData.CalendarID}`\n        if (category) {\n            params += `&calendarCategoryID=${category.CalendarCategoryID}`\n        }\n        fetch((API_URL || process.env.REACT_APP_CALENDAR_FILE_API_URL) + '/CalendarFileGeneration/api/PreviewCalendarFileAsync' + params, config)\n            .then(response => {\n                if (response.status === 204) {\n                    throw 'No Content';\n                } else if (response.status > 399) {\n                    throw response;\n                } else {\n                    response.blob()\n                        .then(res => {\n                            if (this.pdfRef && this.pdfRef.current) {\n                                let pdfRef = this.pdfRef.current;\n                                pdfRef.setAttribute('src', URL.createObjectURL(res));\n                                pdfRef.onload = () => {\n                                    this.setState({\n                                        gettingPdf: false\n                                    });\n                                };\n                            }\n                        })\n                }\n            }).catch(err => {\n                if (err.name === 'AbortError') {\n                    return;\n                }\n                this.setState({\n                    gettingPdf: false\n                });\n                //This is a response and the text needs to be extracted\n                if (err.text) {\n                    err.text().then(err => console.log(err.toString()));\n                } else {\n                    console.log(err.toString())\n                }\n                this.props.actions.makeToast([{ message: \"Failed To Get Data\", type: \"failure\" }]);\n            })\n    }\n\n    addComment() {\n        let newComments = this.state.comments;\n        let newTempComments = this.state.tempComments\n\n        newComments.push(\n            {\n                CalendarID: this.state.calendarData.CalendarID,\n                Comment: \"\",\n                Sequence: this.state.comments.length > 0 ? this.state.comments[this.state.comments.length - 1].Sequence + 1 : 1\n            }\n        )\n\n        newTempComments.push(\n            {\n                Comment: \"\",\n                Sequence: newComments[newComments.length - 1].Sequence\n            }\n        )\n\n        this.setState({\n            comments: newComments,\n            tempComments: newTempComments\n        }, () => {\n            this.toggleCommentEdit(newComments[newComments.length - 1].Sequence)\n        })\n    }\n\n    removeComment(i) {\n        let newComments = this.state.comments;\n        if (newComments[i].CalendarCommentID != undefined) {\n            newComments[i].DeletionDate = moment().toISOString();\n            newComments[i].Sequence = 0;\n            newComments.sort((a, b) => a.Sequence - b.Sequence);\n        } else {\n            newComments.splice(i, 1);\n        }\n\n        let newSequence = 1;\n\n        for (let j = 0; j < newComments.length; j++) {\n            if (!newComments[j].DeletionDate) {\n                newComments[j].Sequence = newSequence;\n                newSequence++;\n            }\n        }\n\n        this.setState({\n            comments: newComments\n        })\n    }\n\n    commentShift(i, shiftUp) {\n        let newComments = [...this.state.comments];\n        let newTempComments = [...this.state.tempComments];\n        let newSequence = shiftUp ? newComments[i - 1].Sequence : newComments[i + 1].Sequence;\n\n        let commentEdit = [...this.state.commentEdit];\n        commentEdit[i] = commentEdit[shiftUp ? i - 1 : i + 1] == true ? true : false;\n        commentEdit[shiftUp ? i - 1 : i + 1] = true;\n\n        newComments[i].Sequence = newSequence;\n        newTempComments[i].Sequence = newSequence\n\n        if (shiftUp) {\n            newComments[i - 1].Sequence = newSequence + 1;\n            newTempComments[i - 1].Sequence = newSequence + 1;\n        } else {\n            newComments[i + 1].Sequence = newSequence - 1;\n            newTempComments[i + 1].Sequence = newSequence - 1;\n        }\n\n        newComments.sort((a, b) => a.Sequence - b.Sequence);\n        newTempComments.sort((a, b) => a.Sequence - b.Sequence);\n\n        this.setState({\n            comments: newComments,\n            tempComments: newTempComments,\n            commentEdit: commentEdit\n        })\n    }\n\n    handleProFormaChange() {\n        let calendarData = { ...this.state.calendarData };\n        calendarData.IsProforma = !calendarData.IsProforma\n        this.setState({\n            calendarData: calendarData\n        });\n    }\n\n    toggleCalendarPreview(categoryIndex) {\n        this.setState({\n            showCategoryPreview: categoryIndex\n        });\n    }\n\n    togglePortal(state, category) {\n        this.setState({\n            showPortal: !state\n        }, () => {\n            if (this.state.showPortal && category) {\n                this.genCalendarPreview(category === 'All' ? '' : category);\n            }\n        });\n    }\n\n    saveCalendar(publishFlag) {\n        this.setState({ isSaving: true });\n        let calendarSave = { ...this.state.calendarData };\n        //Add new comments\n        calendarSave.CalendarComments = this.state.comments;\n\n        //If saving or publishing set isActive off showAmendments. If unpublishing, set showAmendments off isActive. \n        calendarSave.CalendarCategories.forEach(category => {\n            if ([98, 102].includes(category.CalendarCategoryTypeID)) {\n                if (publishFlag || (!calendarSave.IsPublic && !publishFlag)) {\n                    category.Agendas.forEach(agenda => {\n                        agenda.AgendaItems?.forEach(item => {\n                            if (item.LDNumber) {\n                                item.IsActive = category.showAmendments;\n                            }\n                        });\n                    });\n                } else if (!publishFlag) {\n                    category.showAmendments = !!category.Agendas.flatMap(agenda => agenda.AgendaItems).find(agendaItem => agendaItem.IsActive && agendaItem.LDNumber);\n                }\n            }\n        })\n\n        calendarSave.CalendarCategories.forEach(category => {\n            const response = this.handleAgendaSort(category.Agendas, category.CategoryType, category.CalendarCategoryTypeID)\n            response.forEach((agenda, i) => {\n                if (agenda.IsActive) {\n                    agenda.Sequence = i + 1\n                }\n            })\n            category.Agendas = response;\n        });\n\n        //Set whether it should be published or not. The published value depends on what button the user clicked\n        calendarSave.IsPublic = publishFlag;\n        this.props.actions.saveCalendar({ Calendars: [calendarSave] })\n            .then(failureMessage => {\n                if (this.state.showPreview || calendarSave.IsPublic) {\n                    let content = this.componentRef.innerHTML.replace(/\\\\\"/g, '');\n                    this.props.actions.sendCalendarHtml({ Chamber: calendarSave.ChamberCode, CalendarDate: calendarSave.CalendarDate, CalendarNumber: calendarSave.CalendarNumber, ContentHTML: content });\n                }\n                if (publishFlag) {\n                    //Calendars cannot be edited once published so send the user back to the grid\n                    const calendarId = this.props.calendar.calendarSave.CalendarID;\n                    this.props.navigate('/calendar-management');\n                    this.props.actions.saveCalendarFile(\"?calendarID=\" + calendarId)\n                } else {\n                    //If the form was not published then get the new mod dates and update the React state variables\n                    let calendarSave = { ...this.props.calendar.calendarSave };\n                    let comments = [];\n\n                    for (let i = 0; i < calendarSave.CalendarComments.length; i++) {\n                        let comment = calendarSave.CalendarComments[i];\n                        comment.Sequence = i + 1;\n                        comments.push(comment);\n                    }\n\n                    const response = this.handleBulkAgendaSort(calendarSave)\n                    this.setState({\n                        calendarData: response,\n                        comments: comments,\n                        isSaving: false,\n                        pendingSave: false,\n                        calendarDate: calendarSave.CalendarDate\n                    }, () => {\n                        this.forceUpdate();\n                    });\n                }\n\n                let toasts = [];\n                if (failureMessage && failureMessage.includes(\"Minutes\")) {\n                    toasts.push({ message: \"Problem with Minutes Creation\", type: \"failure\" });\n                }\n                toasts.push({ message: `Calendar ${publishFlag ? 'Published' : 'Saved'}`, type: \"success\" });\n                this.props.actions.makeToast(toasts)\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    isSaving: false\n                });\n                console.log(err)\n                this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n            });\n    }\n\n    handlePdfFile(e) {\n        this.setState({\n            selectedFile: e.target.files[0]\n        });\n    }\n\n    submitPdfFile() {\n        this.setState({\n            isSubmittingFile: true\n        });\n        this.props.actions.replacePdf('?calendarID=' + this.state.calendarData.CalendarID, this.state.selectedFile)\n            .then(() => {\n                this.setState({\n                    isSubmittingFile: false,\n                    selectedFile: ''\n                });\n                this.props.actions.makeToast([{ message: \"PDF Replacement Success\", type: \"success\" }]);\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    isSubmittingFile: false\n                });\n                this.props.actions.makeToast([{ message: \"PDF Replacement Failed\", type: \"failure\" }]);\n            })\n    }\n\n    changeConveneTime(date) {\n        let calendarData = { ...this.state.calendarData };\n        calendarData.CalendarDate = date.toISOString();\n        this.setState({\n            calendarData: calendarData\n        });\n    }\n\n    toggleAgenda(catIndex, agendaIndex) {\n        let calendar = { ...this.state.calendarData };\n        let agenda = calendar.CalendarCategories.filter(c => !c.DeletionDate)[catIndex].Agendas[agendaIndex];\n        agenda.show = !agenda.show;\n        if (agenda.IsActive && agenda.LegislationNumber && !agenda.Versions) {\n            agenda.Versions = []\n            this.props.actions.getBillVersionByBillNumber('?BillNumber=' + calendar.CalendarCategories.filter(c => !c.DeletionDate)[catIndex].Agendas[agendaIndex].LegislationNumber + '&SessionID=' + calendar.SessionID)\n                .then(() => {\n                    // Get the calendar data again just in case the user toggled the agenda items\n                    calendar = { ...this.state.calendarData };\n                    let versions = this.props.bills.billVersion.filter(ver => ver.Version !== \"Amendment\" && moment(ver.DraftDate).isSameOrBefore(calendar.CalendarDate))\n                    // Most recent versions first\n                    versions = versions.sort((a, b) => moment(a.DraftDate).isSameOrBefore(b.DraftDate))\n                    calendar.CalendarCategories.filter(c => !c.DeletionDate)[catIndex].Agendas[agendaIndex].Versions = versions\n                    this.setState({\n                        calendarData: calendar\n                    });\n                }).catch(err => {\n                    if (err === \"Aborted\") {\n                        return\n                    }\n                    calendar = { ...this.state.calendarData };\n                    calendar.CalendarCategories.filter(c => !c.DeletionDate)[catIndex].Agendas[agendaIndex].Versions = \"fail\";\n                    this.setState({\n                        calendarData: calendar\n                    });\n                })\n        }\n        this.setState({\n            calendarData: calendar\n        });\n    }\n\n    toggleCommentEdit(sequence) {\n        let commentEdit = [...this.state.commentEdit];\n        let tempComments = [...this.state.tempComments];\n\n        commentEdit[sequence - 1] = !commentEdit[sequence - 1];\n        //Reset the temporary comment value\n        tempComments.find(x => x.Sequence === sequence).Comment = this.state.comments.find(x => x.Sequence === sequence).Comment;\n\n        this.setState({\n            commentEdit: commentEdit,\n            tempComments: tempComments\n        })\n    }\n\n    confirmCommentEdit(sequence) {\n        let comments = [...this.state.comments];\n\n        comments.find(x => x.Sequence === sequence).Comment = this.state.tempComments.find(x => x.Sequence === sequence).Comment;\n\n        this.setState({\n            comments: comments\n        }, () => {\n            this.toggleCommentEdit(sequence)\n        })\n    }\n\n    toggleShowTitles() {\n        this.setState({\n            showTitles: !this.state.showTitles\n        })\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { message } = this.state;\n\n        let conveneTime = moment.utc(this.state.calendarData.CalendarDate);\n        let timeChecker = conveneTime.clone().startOf('day');\n        // By default created calendars have a time of 00:00. If it is midnight then display it as 12:00 pm instead\n        if (conveneTime.isSame(timeChecker)) {\n            conveneTime.hour(12).startOf('hour');\n        }\n        if (message) {\n            return (\n                <div className=\"dlas-forms\">\n                    <span>{message}</span>\n                </div>\n            );\n        }\n        else {\n            let calendarFileUrl = '';\n            if (this.state.calendarData.CalendarFiles) {\n                const pdfFile = this.state.calendarData.CalendarFiles.find(file => file.FileURL.toUpperCase().includes('PDF'));\n                if (pdfFile) {\n                    const url = new URL(pdfFile.FileURL);\n                    calendarFileUrl = lisDocDomain + (url.pathname[0] === '/' ? url.pathname : '/' + url.pathname);\n                }\n            }\n\n            //This calendarTime logic is also set in lis-public-calendar-details, if changed here, change there as well\n            const calendarTime = moment.utc(this.state.calendarData.CalendarDate).isSame(moment.utc(this.state.calendarData.CalendarDate).hour(0), \"minute\")\n                || moment.utc(this.state.calendarData.CalendarDate).isSame(moment.utc(this.state.calendarData.CalendarDate).hour(12), \"minute\")\n                ? \"12 noon\"\n                : moment.utc(this.state.calendarData.CalendarDate).format(\"h:mm a\");\n\n            if (this.state.showPreview) {\n                return (\n                    <div style={{ paddingBottom: '75px' }}>\n                        {this.state.showPortal &&\n                            <Popout togglePortal={this.togglePortal} windowTitle=\"PDF Preview\">\n                                {this.state.gettingPdf &&\n                                    <div className=\"center-spinner spinner\">You must save before seeing changes in this PDF preview</div>\n                                }\n                                <iframe style={{ display: this.state.gettingPdf ? 'none' : 'block', width: '100%', height: '100%' }} ref={this.pdfRef}></iframe>\n                            </Popout>\n                        }\n                        <div className=\"flex-row\">\n                            <h2>Calendar Preview</h2>\n                            <ReactToPrint\n                                trigger={() => <a type=\"button\" className=\"button print\"> Print</a>}\n                                content={() => this.componentRef}\n                                pageStyle={\"break-inside: avoid\"}\n                            />\n                        </div>\n                        <CalendarDetailsComponent\n                            calendar={this.state.calendarData}\n                            calendarTime={calendarTime}\n                            session={this.state.selectedSession}\n                            comments={this.state.comments}\n                            updateAgendaItems={this.updateAgendaItems}\n                            isCalendarForm={true}\n                            toggleAgenda={this.toggleAgenda}\n                            sessionList={this.props.session.sessionList}\n                            calendarCategoryReferences={this.state.calendarCategories}\n                        />\n                        <div style={{ display: \"none\" }}>\n                            <div ref={el => (this.componentRef = el)}>\n                                <CalendarDetailsPrintout\n                                    calendar={this.state.calendarData}\n                                    session={this.state.selectedSession}\n                                    comments={this.state.comments}\n                                />\n                            </div>\n                        </div>\n                        <div className=\"align-right floating-button-bar inline-list\">\n                            <button onClick={() => this.saveCalendar(PUBLISH_CALENDAR)} disabled={this.state.isSaving} className=\"button\">{this.state.isSaving ? \"Publishing...\" : \"Publish\"}</button>\n                            <button onClick={this.togglePreview} className=\"button secondary\">Edit</button>\n                            <button disabled={this.state.pendingSave || this.state.calendarData.IsPublic} onClick={() => this.togglePortal(this.state.showPortal, 'All')} className=\"button\" type=\"button\">PDF Preview</button>\n                        </div>\n                    </div>\n                );\n            } else {\n                return (\n                    <React.Fragment>\n                        <div>\n                            <Prompt\n                                when={this.state.pendingSave === true}\n                                message={`You have unsaved changes. Are you sure you would like to leave?`}\n                            />\n                        </div>\n                        {this.state.calendarData ? <h1>{(this.state.calendarData.ChamberCode === \"H\" ? \"House \" : \"Senate \") + \"Calendar\"}</h1> : <h1>&nbsp;</h1>}\n                        {this.state.showPortal &&\n                            <Popout togglePortal={this.togglePortal} windowTitle=\"Preview\">\n                                {this.state.gettingPdf &&\n                                    <div className=\"center-spinner spinner\">You must save before seeing changes in this PDF preview</div>\n                                }\n                                <iframe style={{ display: this.state.gettingPdf ? 'none' : 'block', width: '100%', height: '100%' }} ref={this.pdfRef}></iframe>\n                            </Popout>\n                        }\n                        {this.state.showCategoryPreview !== -1 &&\n                            <div onClick={() => this.toggleCalendarPreview(-1)} className=\"overlay center-content\">\n                                <div className=\"full\">\n                                    <div onClick={e => e.stopPropagation()} className=\"dlas-forms user-forms advanced-search overlay-content animated-fade-in-up\" ref={el => (this.componentRef = el)}>\n                                        <CalendarDetailsComponent\n                                            calendar={{ ...this.state.calendarData, CalendarCategories: [this.state.calendarData.CalendarCategories[this.state.showCategoryPreview]] }}\n                                            calendarTime={calendarTime}\n                                            session={this.state.selectedSession}\n                                            comments={[]}\n                                            userClaims={{ resources: [] }}\n                                            toggleAgenda={this.toggleAgenda}\n                                            sessionList={this.props.session.sessionList}\n                                            isCalendarForm={true}\n                                            calendarCategoryReferences={this.state.calendarCategories}\n                                        />\n                                        <button type=\"button\" onClick={() => this.toggleCalendarPreview(-1)} className=\"button secondary\">Close</button>\n                                    </div>\n                                </div>\n                            </div>\n                        }\n                        <div className=\"user-forms\">\n                            {!this.state.isLoaded &&\n                                <div className=\"center-spinner spinner\">Loading results...</div>\n                            }\n                            {this.state.isLoaded &&\n                                <div className=\"dlas-forms\">\n                                    <span className=\"error-message\">{message}</span>\n\n                                    <fieldset style={{ paddingBottom: '50px' }} className=\"fieldset-collapse fieldset-open\">\n                                        <legend>Calendar Information</legend>\n                                        <div>\n                                            <div className=\"multi-row four no-margin\">\n                                                <div>\n                                                    <Fields.TextInput\n                                                        value={this.state.selectedSession ? this.state.selectedSession.SessionYear + ' ' + this.state.selectedSession.DisplayName : ''}\n                                                        disabled={true}\n                                                    />\n                                                </div>\n                                                <div>\n                                                    <Fields.TextInput\n                                                        value={this.state.calendarData ? moment(this.state.calendarData.CalendarDate).format(\"L\") + (this.state.calendarData.CalendarNumber > 1 ? [' (', ')'].join('Supp. ' + (this.state.calendarData.CalendarNumber - 1)) : '') : ''}\n                                                        disabled\n                                                    />\n                                                </div>\n                                                <div>\n                                                    {/* Supplemental calendars do not get this date picker */}\n                                                    {this.state.calendarData.CalendarNumber < 2 &&\n                                                        <DatePicker\n                                                            selected={conveneTime}\n                                                            showTimeSelect\n                                                            showTimeSelectOnly\n                                                            dateFormat=\"h:mm a\"\n                                                            timeFormat=\"h:mm a\"\n                                                            onChange={this.changeConveneTime}\n                                                        />\n                                                    }\n                                                </div>\n                                                <div className=\"flex-row flex-end flex-vertical-center\">\n                                                    {calendarFileUrl && !this.state.isSubmittingFile &&\n                                                        <>\n                                                            <button style={{ marginRight: 5 }} type=\"button\" className=\"button small-button file-button\"><input type=\"file\" accept=\".pdf\" onChange={this.handlePdfFile} />{this.state.selectedFile ? this.state.selectedFile.name : \"Replace PDF\"}</button>\n                                                            {this.state.selectedFile ?\n                                                                <button onClick={this.submitPdfFile} type=\"button\" className=\"button small-button\">Submit</button>\n                                                                :\n                                                                <React.Fragment>\n                                                                    <a target=\"_blank\" className=\"icon pdf\" href={calendarFileUrl}></a>\n                                                                    {this.state.calendarData.CalendarNumber < 2 &&\n                                                                        <a target=\"_blank\" className=\"icon file-empty\" style={{ marginLeft: \"5px\" }} href={calendarFileUrl.replace(\".PDF\", \"-padded.PDF\")}></a>}\n                                                                </React.Fragment>\n                                                            }\n                                                        </>\n                                                    }\n                                                    {calendarFileUrl && this.state.isSubmittingFile &&\n                                                        <div className=\"small-spinner\"></div>\n                                                    }\n                                                </div>\n                                            </div>\n                                            <div className=\"flex-row\">\n                                                <label className=\"label-and-checkbox pro-forma\"><input type=\"checkbox\" checked={this.state.calendarData.IsProforma} onChange={this.handleProFormaChange} /> Create a Pro Forma Calendar</label>\n                                                <button type=\"button\" className=\"button float-right title-toggle\" onClick={() => this.toggleShowTitles()}>{this.state.showTitles ? \"Show Bill Captions\" : \"Show Bill Titles\"}</button>\n                                            </div>\n                                            {this.state.comments.map((comment, i) => {\n                                                return (\n                                                    comment.DeletionDate === undefined &&\n                                                    <div className=\"grid-wrapper calendar-comment-row\" key={i}>\n                                                        {this.state.commentEdit[comment.Sequence - 1] ?\n                                                            <React.Fragment>\n                                                                <div>\n                                                                    <Fields.TextArea\n                                                                        label={\"Comment \" + comment.Sequence}\n                                                                        type=\"text\"\n                                                                        style={{ resize: 'vertical', minHeight: 65, width: \"100%\" }}\n                                                                        placeholder=\"Comments\"\n                                                                        value={this.state.tempComments.find(x => x.Sequence === comment.Sequence).Comment}\n                                                                        onChange={(e) => this.handleCommentChange(e, comment.Sequence)}\n                                                                    />\n                                                                </div>\n                                                                <div className=\"grid-wrapper two comment-controls\">\n                                                                    <div style={{ paddingTop: \"25px\" }}>\n                                                                        <button className=\"icon save\" style={{ marginRight: \"10px\" }} onClick={() => this.confirmCommentEdit(comment.Sequence)} />\n                                                                        <button className=\"icon delete\" onClick={() => this.toggleCommentEdit(comment.Sequence)} />\n                                                                    </div>\n                                                                    <div className=\"arrows\">\n                                                                        {i !== 0 && this.state.comments.length > 1 &&\n                                                                            <button className=\"arrow-up\" onClick={() => this.commentShift(i, true)} />\n                                                                        }\n                                                                        {i !== this.state.comments.length - 1 &&\n                                                                            <button className=\"arrow-down\" onClick={() => this.commentShift(i, false)} />\n                                                                        }\n                                                                    </div>\n                                                                </div>\n                                                            </React.Fragment>\n                                                            :\n                                                            <React.Fragment>\n                                                                <div>\n                                                                    <label>{\"Comment \" + comment.Sequence}</label>\n                                                                    <p class=\"calendar-comment\">{comment.Comment}</p>\n                                                                </div>\n                                                                <div className=\"grid-wrapper two\">\n                                                                    <div style={{ paddingTop: \"30px\", display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gridGap: \"10px\" }}>\n                                                                        <button className=\"button edit\" onClick={() => this.toggleCommentEdit(comment.Sequence)} />\n                                                                        <button className=\"icon bin\" onClick={() => this.removeComment(i)} />\n                                                                    </div>\n                                                                    <div />\n                                                                </div>\n                                                            </React.Fragment>\n                                                        }\n                                                    </div>\n                                                )\n                                            })\n                                            }\n                                            <div className=\"add-comment\">\n                                                <button className=\"button float-right\" onClick={() => this.addComment()}>Add Comment</button>\n                                            </div>\n                                        </div>\n                                        <BillsGrid\n                                            organizedBills={this.state.calendarData.CalendarCategories}\n                                            updateAgenda={this.updateAgenda}\n                                            calendarCategories={this.state.calendarCategories}\n                                            hideCategories={this.state.hideCategories}\n                                            selectAllActive={this.state.selectAllActive}\n                                            selectAllInactive={this.state.selectAllInactive}\n                                            changeCategoryDropdown={this.changeCategoryDropdown}\n                                            selectedCategory={this.state.selectedCategory}\n                                            addCategory={this.addCategory}\n                                            deleteCategory={this.deleteCategory}\n                                            selectedBill={this.state.selectedBill}\n                                            changeBillDropdown={this.changeBillDropdown}\n                                            addBill={this.addBill}\n                                            billList={this.state.billList}\n                                            toggleCalendarPreview={this.toggleCalendarPreview}\n                                            pendingSave={this.state.pendingSave}\n                                            toggleHideCategory={this.toggleHideCategory}\n                                            toggleHideAllCategories={this.toggleHideAllCategories}\n                                            toggleHideAllNonIncludedBills={this.toggleHideAllNonIncludedBills}\n                                            hideAllNonIncludedBills={this.state.hideAllNonIncludedBills}\n                                            togglePortal={this.togglePortal}\n                                            showPortal={this.state.showPortal}\n                                            updateAgendaItems={this.updateAgendaItems}\n                                            calendarTime={calendarTime}\n                                            showTitles={this.state.showTitles}\n                                            changeDateDropdown={this.changeDateDropdown}\n                                            changeCommitteeDropdown={this.changeCommitteeDropdown}\n                                            dateList={this.state.selectedCommittee && this.state.selectedCommittee !== \"\" ? this.state.dateList.filter(x => x.committee.includes(this.state.selectedCommittee.value)) : this.state.dateList}\n                                            committeeList={this.state.selectedDate && this.state.selectedDate !== \"\" ? this.state.committeeList.filter(x => this.state.selectedDate.committee.includes(x.value)) : this.state.committeeList}\n                                            selectedCommittee={this.state.selectedCommittee}\n                                            selectedDate={this.state.selectedDate}\n                                            fullCommitteeList={this.props.committee.committeeList}\n                                            chamberCode={this.state.calendarData.ChamberCode}\n                                            sessionCode={this.state.calendarData.SessionCode}\n                                            userRoles={this.props.login.userClaims.roles}\n                                        />\n                                    </fieldset>\n                                    <div className=\"align-right floating-button-bar inline-list\">\n                                        <button disabled={this.state.isSaving} onClick={() => this.saveCalendar(SAVE_CALENDAR)} className=\"button\" type=\"submit\">{this.state.calendarData.IsPublic ? \"Unpublish\" : this.state.isSaving ? \"Saving...\" : \"Save\"}</button>\n                                        <button disabled={this.state.pendingSave || this.state.isSaving || this.state.calendarData.IsPublic} onClick={this.togglePreview} className=\"button\" type=\"button\">Preview</button>\n                                        <button disabled={this.state.pendingSave || this.state.isSaving || this.state.calendarData.IsPublic} onClick={() => this.togglePortal(this.state.showPortal, 'All')} className=\"button\" type=\"button\">PDF Preview</button>\n                                    </div>\n                                </div>\n                            }\n                        </div>\n                    </React.Fragment>\n                );\n            }\n        }\n    }\n};\n\nconst CalendarManagementForm = connect(\n    (state) => {\n        const { calendar, session, bills, nav, committee, login } = state;\n        return {\n            calendar,\n            session,\n            bills,\n            nav,\n            committee,\n            login\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, calendarActionCreators, sessionActionCreators, billActionCreators, navActionCreators, committeeActionCreators), dispatch)\n        }\n    }\n)(HouseCalendarFormComponent)\n\nexport default CalendarManagementForm;\n","import React from \"react\";\nimport { LargeListSelect } from '../../../lis-shared/lis-layout/components/lis-forms-component';\nimport Select from 'react-select';\nimport { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';\nimport ReactTooltip from 'react-tooltip';\nimport { Link } from 'react-router-dom';\nimport renderHTML from 'react-render-html';\nimport AgendaItemsComponent from '../../../lis-shared/lis-calendar/lis-agenda-items';\nimport moment from 'moment-timezone';\n\nconst isNotHidden = (agenda, category, committeeList) => (!agenda.CommitteeID && !agenda.IsHidden) || (agenda.IsActive && !agenda.IsHidden) || (committeeList.find(x => x.value == agenda.CommitteeID) && category.CalendarCategoryTypeID === 66) /* Bills or Resolutions Rereferred */\n\nconst NUMERIC_SORT_CATEGORIES = [72, 111, 109, 112, 60, 110, 98, 102, 83, 90, 87, 93, 100, 104, 117, 118, 105, 106, 66, 67, 96, 97, 64, 68, 69, 65];\n\nconst sortAgendas = (a, b, calendarChamber) => {\n    {\n        return b.IsActive !== a.IsActive\n            ? b.IsActive\n                ? 1\n                : -1\n            : a.Sequence > 0 && b.Sequence > 0 && a.Sequence !== b.Sequence\n                ? a.Sequence - b.Sequence > 0\n                    ? 1\n                    : -1\n                : a.CalendarDate !== b.CalendarDate\n                    ?\n                    !a.CalendarDate ?\n                        1 :\n                        !b.CalendarDate ? -1\n                            :\n                            a.CalendarDate - b.CalendarDate\n                    : a.CandidateDate !== b.CandidateDate\n                        ?\n                        !a.CandidateDate ?\n                            1 :\n                            !b.CandidateDate ? -1\n                                :\n                                a.CandidateDate - b.CandidateDate\n                        : a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) !== 0 ?\n                            a.LegislationNumber[0].localeCompare(calendarChamber) !== 0\n                                ? -1 : 1\n                            : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) !== 0\n                                ? a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) > 0\n                                    ? 1\n                                    : -1\n                                : a.LegislationKey && parseInt(a.LegislationKey) !== parseInt(b.LegislationKey)\n                                    ? parseInt(a.LegislationKey) - parseInt(b.LegislationKey) > 0\n                                        ? 1\n                                        : -1\n                                    : 0\n    }\n}\n\nconst sortAgendasNumerically = (a, b, calendarChamber) => {\n    {\n        return !a.IsActive && b.IsActive\n            ? 1\n            : a.IsActive && !b.IsActive\n                ? -1\n                : a.Sequence > 0 && b.Sequence > 0 && a.Sequence !== b.Sequence\n                    ? a.Sequence - b.Sequence > 0\n                        ? 1\n                        : -1\n                    : a.LegislationNumber && b.LegislationNumber && a.LegislationNumber[0] !== b.LegislationNumber[0] ?\n                        a.LegislationNumber[0].localeCompare(calendarChamber) !== 0\n                            ? -1\n                            : 1\n                        : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) > 0\n                            ? 1\n                            : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) < 0\n                                ? -1\n                                : a.LegislationKey > b.LegislationKey\n                                    ? 1\n                                    : -1\n    }\n}\n\nconst findLastByIsActiveThenCalendarDateThenCandidateDateThenLegChamberTypeKey = (a, b, calendarChamber, ignoreCalendarDate, ignoreCandidateDate) => (\n    a.IsActive && findLastByCalendarDateThenCandidateDateThenLegChamberTypeKey(a, b, calendarChamber, ignoreCalendarDate, ignoreCandidateDate)\n)\n\nconst findLastByCalendarDateThenCandidateDateThenLegChamberTypeKey = (a, b, calendarChamber, ignoreCalendarDate, ignoreCandidateDate) => (\n    (((ignoreCalendarDate || (a.CalendarDate && b.CalendarDate && moment(a.CalendarDate).isSame(b.CalendarDate, \"day\"))) && findLastByLegChamberTypeKey(a, b, calendarChamber)) ||\n        (!ignoreCalendarDate && a.CalendarDate && b.CalendarDate && moment(a.CalendarDate).isBefore(b.CalendarDate, \"day\"))) ||\n    (((ignoreCandidateDate || (a.CandidateDate && b.CandidateDate && moment(a.CandidateDate).isSame(b.CandidateDate, \"day\"))) && findLastByLegChamberTypeKey(a, b, calendarChamber)) ||\n        (!ignoreCandidateDate && a.CandidateDate && b.CandidateDate && moment(a.CandidateDate).isBefore(b.CandidateDate, \"day\"))) ||\n    ((ignoreCalendarDate || (!a.CalendarDate && !b.CalendarDate)) && (ignoreCandidateDate || (!a.CandidateDate && !b.CandidateDate)) &&\n        findLastByLegChamberTypeKey(a, b, calendarChamber))\n    || (!ignoreCalendarDate && !b.CalendarDate && a.CandidateDate)\n    || !ignoreCandidateDate && !b.CandidateDate && a.CandidateDate\n)\n\nconst findLastByLegChamberTypeKey = (a, b, calendarChamber) => (\n    (a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) === (calendarChamber === \"H\" ? 1 : -1)) ||\n    (a.LegislationNumber && a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) === 0 && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) === -1) ||\n    (a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) === 0 && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) === 0 && a.LegislationKey && a.LegislationKey < parseInt(b.LegislationKey))\n)\n\nconst getItemStyle = (isDragging, draggableStyle, isActive) => ({\n    // some basic styles to make the items look a bit nicer\n    userSelect: 'none',\n    // change background colour if dragging\n    background: isDragging ? '#34495e' : 'white',\n    color: isDragging ? 'white' : '#34495e',\n    border: 'none',\n    borderLeft: '1px solid #e0e0e0',\n    borderBottom: '1px solid #e0e0e0',\n    color: isActive ? '' : '#8b8b8b',\n    // styles we need to apply on draggables\n    ...draggableStyle,\n});\n\nclass SenateBillsGrid extends React.Component {\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            selectAllActive: false,\n            selectAllInactive: false,\n            showAgendaItemEditor: -1,\n            showAgendaItemEditorCategoryIndex: -1,\n            lastCheckedBills: [],\n            textHeight: []\n        };\n        this.toggleSelectAll = this.toggleSelectAll.bind(this);\n        this.toggleRow = this.toggleRow.bind(this);\n        this.toggleBill = this.toggleBill.bind(this);\n        this.showAgendaItems = this.showAgendaItems.bind(this);\n        this.toggleEdit = this.toggleEdit.bind(this);\n        this.toggleEditCategoryDescription = this.toggleEditCategoryDescription.bind(this);\n        this.saveChange = this.saveChange.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n        this.onDragEnd = this.onDragEnd.bind(this);\n        this.toggleAgendaItemEditor = this.toggleAgendaItemEditor.bind(this);\n        this.expandTitle = this.expandTitle.bind(this);\n        this.getCategoryBills = this.getCategoryBills.bind(this);\n        this.setDescription = this.setDescription.bind(this);\n        this.setBillsInConferenceCategoryDescription = this.setBillsInConferenceCategoryDescription.bind(this);\n        this.categoryDescriptionIsEdited = this.categoryDescriptionIsEdited.bind(this);\n        this.changeCommitteeDropdown = this.changeCommitteeDropdown.bind(this);\n        this.changeDateDropdown = this.changeDateDropdown.bind(this);\n        this.addBill = this.addBill.bind(this);\n        this.toggleShowAmendments = this.toggleShowAmendments.bind(this);\n        this.handleDescriptionChange = this.handleDescriptionChange.bind(this);\n    }\n\n    toggleSelectAll(categoryIndex) {\n        let organizedBills = [...this.props.organizedBills];\n        const opposite = !organizedBills.filter(c => !c.DeletionDate)[categoryIndex].selectAll;\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].selectAll = opposite\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.forEach(leg => { if (isNotHidden(leg, organizedBills.filter(c => !c.DeletionDate)[categoryIndex], this.props.committeeList)) leg.checked = opposite });\n        this.props.updateAgenda(organizedBills);\n\n\n        let lastCheckedBills = this.state.lastCheckedBills;\n        lastCheckedBills[categoryIndex] = -1;\n        this.setState({\n            lastCheckedBills: lastCheckedBills\n        });\n    }\n\n    toggleRow(categoryIndex, itemIndex, e) {\n        let organizedBills = [...this.props.organizedBills];\n        let lastCheckedBills = this.state.lastCheckedBills;\n        let lastCheckedBill = lastCheckedBills[categoryIndex];\n        if (e.nativeEvent.shiftKey && !isNaN(lastCheckedBill) && lastCheckedBill !== -1) {\n            organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.forEach(agenda => agenda.checked = false);\n            for (let i = 0; i < Math.abs(itemIndex - lastCheckedBill); i++) {\n                const index = lastCheckedBill + i * (itemIndex - lastCheckedBill) / Math.abs(itemIndex - lastCheckedBill);\n                organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas[index].checked = true;\n            }\n        } else {\n            lastCheckedBill = itemIndex;\n        }\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas[itemIndex].checked = !organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas[itemIndex].checked;\n        this.props.updateAgenda(organizedBills);\n\n        lastCheckedBills[categoryIndex] = lastCheckedBill;\n        this.setState({\n            lastCheckedBills: lastCheckedBills\n        });\n    }\n\n    categoryDescriptionIsEdited(categoryAsDisplayed, associatedReferenceCategory) {\n        if (this.props.chamberCode === 'H' && categoryAsDisplayed.CategoryCode === \"SENBRC\" || categoryAsDisplayed.CategoryCode === \"HOUBRC\") {\n            return !(\n                [\"House Bill in Conference\", \"Senate Bill in Conference\",\n                    \"House Bills in Conference\", \"Senate Bills in Conference\",\n                    \"House Joint Resolution in Conference\", \"Senate Joint Resolution in Conference\",\n                    \"House Joint Resolutions in Conference\", \"Senate Joint Resolutions in Conference\",\n                    \"House Bill and Joint Resolution in Conference\", \"Senate Bill and Joint Resolution in Conference\",\n                    \"House Bills and Joint Resolution in Conference\", \"Senate Bills and Joint Resolution in Conference\",\n                    \"House Bill and Joint Resolutions in Conference\", \"Senate Bill and Joint Resolutions in Conference\",\n                    \"House Bills and Joint Resolutions in Conference\", \"Senate Bills and Joint Resolutions in Conference\",\n                ].includes(categoryAsDisplayed.Description))\n        } else {\n            if (associatedReferenceCategory && associatedReferenceCategory.Description !== categoryAsDisplayed.Description && associatedReferenceCategory.PluralDescription !== categoryAsDisplayed.Description) {\n                return true;\n            } else {\n                return false;\n            }\n        }\n    }\n\n    setDescription(organizedBills, categoryIndex) {\n        let updatedOrganizedBills = [...organizedBills];\n\n        if (categoryIndex) {\n            //if it's been edited, leave it at that\n            const associatedReferenceCategory = this.props.calendarCategories.find(x => x.CalendarCategoryTypeID === updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryTypeID);\n            if (this.categoryDescriptionIsEdited(updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex], associatedReferenceCategory)) {\n                //leave it alone\n            } else {\n                //otherwise, set description based on singular/plural reference description\n                if (this.props.chamberCode === 'H' && updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].CategoryCode === \"SENBRC\" || updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].CategoryCode === \"HOUBRC\") {\n                    updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].Description = this.setBillsInConferenceCategoryDescription(updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex]);\n                } else {\n                    if (associatedReferenceCategory) {\n                        if (updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.filter(x => x.IsActive).length > 1) {\n                            updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].Description = this.props.calendarCategories.find(x => x.CalendarCategoryTypeID === updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryTypeID).PluralDescription;\n                        } else {\n                            updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].Description = this.props.calendarCategories.find(x => x.CalendarCategoryTypeID === updatedOrganizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryTypeID).Description;\n                        }\n                    }\n                }\n            }\n        } else {\n            //iterate through all\n            updatedOrganizedBills.forEach((cat, index) => {\n                //if it's been edited, leave it at that\n                const associatedReferenceCategory = this.props.calendarCategories.find(x => x.CalendarCategoryTypeID === updatedOrganizedBills[index].CalendarCategoryTypeID)\n                if (this.categoryDescriptionIsEdited(cat, associatedReferenceCategory)) {\n                    return;\n                }\n\n                //otherwise, set description based on singular/plural reference description                \n                if (this.props.chamberCode === 'H' && cat.CategoryCode === \"SENBRC\" || cat.CategoryCode === \"HOUBRC\") {\n                    updatedOrganizedBills[index].Description = this.setBillsInConferenceCategoryDescription(cat);\n                } else {\n                    if (associatedReferenceCategory) { //calendarCategories prop only contains same chamber categories, so could cause an NRE if iterating over an opposite-chamber category\n                        if (updatedOrganizedBills[index].Agendas.filter(x => x.IsActive).length > 1) {\n                            updatedOrganizedBills[index].Description = associatedReferenceCategory.PluralDescription;\n                        } else {\n                            updatedOrganizedBills[index].Description = associatedReferenceCategory.Description;\n                        }\n                    }\n                }\n            })\n        }\n\n        return updatedOrganizedBills;\n    }\n\n    setBillsInConferenceCategoryDescription(category) {\n        let existingDescription = category.Description;\n        let newTypeAndPluralityLanguage;\n        let newDescription;\n\n        //get all legislations in this category\n        const categoryLegislations = category.Agendas;\n        if (categoryLegislations) {\n            //filter to only the active legislations\n            const activeCategoryLegislations = categoryLegislations.filter(cl => cl.IsActive);\n            if (!activeCategoryLegislations.length) {\n                //not any active legislations - should only say 'bill'\n                newTypeAndPluralityLanguage = 'Bill';\n            } else {\n                const numResolutions = activeCategoryLegislations.filter(acl => acl.LegislationNumber[1] !== \"B\").length;\n                const numBills = activeCategoryLegislations.filter(acl => acl.LegislationNumber[1] === \"B\").length;\n                if (numResolutions > 0 && numBills > 0) {\n                    //At least one bill and at least one resolution\n                    newTypeAndPluralityLanguage = (numBills > 1 ? 'Bills' : 'Bill') + ' and Joint ';\n                    newTypeAndPluralityLanguage += numResolutions > 1 ? 'Resolutions' : 'Resolution';\n                } else if (numResolutions > 0 && numBills === 0) {\n                    //at least one resolution and no bills\n                    newTypeAndPluralityLanguage = numResolutions > 1 ? 'Joint Resolutions' : 'Joint Resolution';\n                } else if (numResolutions === 0 && numBills > 0) {\n                    //at least one bill and no resolutions\n                    newTypeAndPluralityLanguage = numBills > 1 ? 'Bills' : 'Bill';\n                }\n            }\n            newDescription = existingDescription.replace(/\\b(Bill and Joint Resolution|Bills and Joint Resolution|Bills and Joint Resolutions|Bill and Joint Resolutions|Bill|Bills|Joint Resolution|Joint Resolutions)\\b/, newTypeAndPluralityLanguage);\n        }\n\n        return newDescription;\n    }\n\n    toggleBill(categoryIndex, itemIndex) {\n        let organizedBills = [...this.props.organizedBills];\n        const sortNumeric = NUMERIC_SORT_CATEGORIES.includes(JSON.parse(JSON.stringify(organizedBills)).filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryTypeID);\n        let agenda = organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas[itemIndex]\n        agenda.IsActive = !agenda.IsActive;\n        agenda.checked = false;\n        if (agenda.pending === false) {\n            delete agenda.pending;\n        }\n        organizedBills = this.setDescription(organizedBills, categoryIndex);\n\n        let newAgendaSequence = null;\n        const categoryIsSequenced = Boolean(organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas && organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.find(a => a.IsActive && Number.isInteger(a.Sequence)));\n        if (agenda.IsActive && categoryIsSequenced) {\n            let sortedAgendas;\n            if (sortNumeric) {\n                sortedAgendas = JSON.parse(JSON.stringify(organizedBills)).filter(c => !c.DeletionDate)[categoryIndex].Agendas.sort((a, b) => sortAgendasNumerically(a, b, this.props.chamberCode))\n            } else {\n                sortedAgendas = JSON.parse(JSON.stringify(organizedBills)).filter(c => !c.DeletionDate)[categoryIndex].Agendas.sort((a, b) => sortAgendas(a, b, this.props.chamberCode))\n            }\n\n            const lowerLegislationNumberAgenda = sortedAgendas.findLast(a => findLastByIsActiveThenCalendarDateThenCandidateDateThenLegChamberTypeKey(a, agenda, this.props.chamberCode, sortNumeric, sortNumeric));\n            if (lowerLegislationNumberAgenda) {\n                const finalLowerLegislationNumberIndex = organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.findIndex(a => a.LegislationNumber === lowerLegislationNumberAgenda.LegislationNumber);\n                newAgendaSequence = organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas[finalLowerLegislationNumberIndex].Sequence + 1;\n            } else {\n                newAgendaSequence = 1;\n            }\n            organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.forEach(agenda => {\n                if (agenda.IsActive && agenda.Sequence >= newAgendaSequence) {\n                    agenda.Sequence++;\n                }\n            })\n\n            agenda.Sequence = newAgendaSequence;\n        } else if (!agenda.IsActive) { agenda.Sequence = 0; }\n\n        if (sortNumeric) {\n            organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.sort((a, b) => sortAgendasNumerically(a, b, this.props.chamberCode))\n        } else {\n            organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.sort((a, b) => sortAgendas(a, b, this.props.chamberCode))\n        }\n\n        //check for this bill being a duplicate in other categories\n        const isDuplicate = organizedBills.filter(cc => cc.CalendarCategoryTypeID !== organizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryTypeID && cc.Agendas.find(a => a.LegislationNumber === agenda.LegislationNumber))\n        if (isDuplicate.length) {\n            isDuplicate.forEach(duplicateCategory => {\n                duplicateCategory.Agendas.filter(a => a.LegislationNumber === agenda.LegislationNumber).forEach(duplicateAgenda => {\n                    duplicateAgenda.IsActive = false;\n                    duplicateAgenda.Sequence = 0;\n                })\n                const duplicateCategoryIndex = organizedBills.findIndex(cc => cc.CalendarCategoryTypeID === duplicateCategory.CalendarCategoryTypeID);\n                organizedBills = this.setDescription(organizedBills, duplicateCategoryIndex);\n                organizedBills[duplicateCategoryIndex].Agendas.sort((a, b) => NUMERIC_SORT_CATEGORIES.includes(organizedBills[duplicateCategoryIndex].CalendarCategoryTypeID) ? sortAgendasNumerically(a, b, this.props.chamberCode) : sortAgendas(a, b, this.props.chamberCode));\n            })\n        }\n\n        this.props.updateAgenda(organizedBills, true);\n    }\n\n    toggleBillBulk(activate, categoryIndex) {\n        let organizedBills = [...this.props.organizedBills];\n\n        const legNumbersToBeIncluded = activate ? organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.filter(a => a.checked).flatMap(a => a.LegislationNumber) : [];\n        const sortCategoryNumeric = NUMERIC_SORT_CATEGORIES.includes(JSON.parse(JSON.stringify(organizedBills)).filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryTypeID);\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.forEach(leg => {\n            if (leg.checked) {\n                leg.IsActive = activate;\n            }\n\n            if (leg.pending === false) {\n                delete leg.pending;\n            }\n\n            const categoryIsSequenced = Boolean(organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas && organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.find(a => a.IsActive && Number.isInteger(a.Sequence)));\n            let newAgendaSequence = null;\n            if (leg.checked && leg.IsActive && categoryIsSequenced) {\n                const sortedAgendas = JSON.parse(JSON.stringify(organizedBills)).filter(c => !c.DeletionDate)[categoryIndex].Agendas.sort((a, b) => sortCategoryNumeric ? sortAgendasNumerically(a, b, this.props.chamberCode) : sortAgendas(a, b, this.props.chamberCode))\n\n                const lowerLegislationNumberAgenda = sortedAgendas.findLast(a => findLastByIsActiveThenCalendarDateThenCandidateDateThenLegChamberTypeKey(a, leg, this.props.chamberCode, sortCategoryNumeric, sortCategoryNumeric));\n                if (lowerLegislationNumberAgenda) {\n                    const finalLowerLegislationNumberIndex = organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.findIndex(a => a.LegislationNumber === lowerLegislationNumberAgenda.LegislationNumber);\n                    newAgendaSequence = organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas[finalLowerLegislationNumberIndex].Sequence + 1;\n                } else {\n                    newAgendaSequence = 1;\n                }\n                organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.forEach(agenda => {\n                    if (!agenda.checked && agenda.IsActive && agenda.Sequence >= newAgendaSequence) {\n                        agenda.Sequence++;\n                    }\n                })\n                leg.Sequence = newAgendaSequence;\n            } else if (!leg.IsActive) { leg.Sequence = 0; };\n            leg.checked = false;\n        });\n\n        organizedBills = this.setDescription(organizedBills, categoryIndex);\n\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.sort((a, b) => NUMERIC_SORT_CATEGORIES.includes(organizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryTypeID) ? sortAgendasNumerically(a, b, this.props.chamberCode) : sortAgendas(a, b, this.props.chamberCode));\n\n        //check for this bill being a duplicate in other categories\n        const isDuplicate = organizedBills.filter(cc => cc.CalendarCategoryTypeID !== organizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryTypeID && cc.Agendas.find(a => legNumbersToBeIncluded.includes(a.LegislationNumber)))\n        if (isDuplicate.length) {\n            isDuplicate.forEach(duplicateCategory => {\n                duplicateCategory.Agendas.filter(a => legNumbersToBeIncluded.includes(a.LegislationNumber)).forEach(duplicateAgenda => {\n                    duplicateAgenda.IsActive = false;\n                    duplicateAgenda.Sequence = 0;\n                })\n                const duplicateCategoryIndex = organizedBills.findIndex(cc => cc.CalendarCategoryTypeID === duplicateCategory.CalendarCategoryTypeID);\n                organizedBills = this.setDescription(organizedBills, duplicateCategoryIndex);\n                organizedBills[duplicateCategoryIndex].Agendas.sort((a, b) => NUMERIC_SORT_CATEGORIES.includes(organizedBills[duplicateCategoryIndex]) ? sortAgendasNumerically(a, b, this.props.chamberCode) : sortAgendas(a, b, this.props.chamberCode));\n            })\n        }\n\n        this.props.updateAgenda(organizedBills, true);\n    }\n\n    moveTo(topOrBottom, categoryIndex) {\n        let organizedBills = [...this.props.organizedBills];\n\n        let newSequence = topOrBottom === 'top' ? 1 : (Math.max.apply(Math, organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.filter(a => a.Sequence).map(a => a.Sequence)) + 1) || 1;\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.forEach(leg => {\n            if (leg.checked && leg.IsActive) {\n                leg.Sequence = newSequence;\n                newSequence++;\n            }\n        });\n        newSequence = topOrBottom === 'top' ? newSequence : 1;\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.filter(a => !a.checked && a.IsActive).forEach(agenda => {\n            agenda.Sequence = newSequence;\n            newSequence++;\n        })\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.filter(a => a.checked).forEach(agenda => {\n            agenda.checked = false;\n        });\n        organizedBills = this.setDescription(organizedBills, categoryIndex);\n\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.sort((a, b) => NUMERIC_SORT_CATEGORIES.includes(organizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryTypeID) ? sortAgendasNumerically(a, b, this.props.chamberCode) : sortAgendas(a, b, this.props.chamberCode))\n\n        this.props.updateAgenda(organizedBills, true);\n    }\n\n    switchCategory(categoryIndex) {\n        let organizedBills = [...this.props.organizedBills];\n\n        //uncheck the ones that are already in this category so that they don't get resequenced\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.forEach(a => a.checked = false);\n\n        let categoriesWithCheckedBills = organizedBills.filter(c => !c.DeletionDate && c.IsLegislationCategory && c.Agendas.find(a => a.checked));\n        categoriesWithCheckedBills.forEach(cat => {\n            cat.Agendas.filter(a => a.checked).forEach(checkedAgenda => {\n                checkedAgenda.Sequence = 0; //will get set later in toggleBillBulk\n                if (organizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryID) {\n                    checkedAgenda.CalendarCategoryID = organizedBills.filter(c => !c.DeletionDate)[categoryIndex].CalendarCategoryID;\n                } else {\n                    delete checkedAgenda.CalendarCategoryID;\n                }\n                organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.push(checkedAgenda);\n                const existingCategoryAgendaIndex = cat.Agendas.findIndex(a => a.LegislationNumber === checkedAgenda.LegislationNumber);\n                if (existingCategoryAgendaIndex > -1) { //remove the bill from the old category; always should be found\n                    cat.Agendas.splice(existingCategoryAgendaIndex, 1);\n                }\n            })\n        })\n\n        this.toggleBillBulk(true, categoryIndex);\n    }\n\n    showAgendaItems(categoryIndex, agendaIndex) {\n        let organizedBills = [...this.props.organizedBills].filter(c => !c.DeletionDate);\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].showAgendaItems = !organizedBills[categoryIndex].Agendas[agendaIndex].showAgendaItems;\n        this.props.updateAgenda(organizedBills);\n    }\n\n    toggleEdit(categoryIndex, agendaIndex) {\n        let categories = [...this.props.organizedBills];\n        //This key is used to tell the DOM whether to display an input or a span\n        categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].isEditing = !categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].isEditing;\n        //Create a key called newDescription that will hold the text that  the user types in\n        categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].newDescription = categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].Description;\n        this.props.updateAgenda(categories);\n    }\n\n    handleChange(categoryIndex, agendaIndex, e, title) {\n        let textHeight = [...this.state.textHeight];\n\n        //Init the nested height value if undefined at the category or agenda index\n        if (!textHeight[categoryIndex]) {\n            textHeight[categoryIndex] = {};\n            textHeight[categoryIndex].Agendas = [];\n            textHeight[categoryIndex].Agendas[agendaIndex] = {};\n            textHeight[categoryIndex].Agendas[agendaIndex].height = '40px';\n        } else if (!textHeight[categoryIndex].Agendas[agendaIndex]) {\n            textHeight[categoryIndex].Agendas[agendaIndex] = {};\n            textHeight[categoryIndex].Agendas[agendaIndex].height = '40px';\n        }\n\n        let height = Math.round(e.target.value.length / 95) * 20 + 40;\n\n        textHeight[categoryIndex].Agendas[agendaIndex].height = height.toString() + \"px\";\n\n        let categories = [...this.props.organizedBills];\n        if (title) {\n            categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].LegislationTitle = e.target.value;\n        } else {\n            categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].newDescription = e.target.value;\n        }\n\n        this.props.updateAgenda(categories);\n\n        this.setState({\n            textHeight: textHeight\n        })\n    }\n\n    saveChange(categoryIndex, agendaIndex) {\n        //Turn input back into span\n        let categories = [...this.props.organizedBills];\n        categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].isEditing = false;\n        //Set description to the text that the user has typed in. If new description is null then set it to the current description\n        categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].Description = categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].newDescription;\n        this.props.updateAgenda(categories, true);\n    }\n\n    expandTitle(categoryIndex, agendaIndex) {\n        let categories = [...this.props.organizedBills];\n        categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].expandTitle = !categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].expandTitle ? true : false;\n\n        this.props.updateAgenda(categories, this.props.pendingSave);\n    }\n\n    onDragEnd(result, categoryIndex) {\n        if (!result.destination) {\n            return;\n        }\n        let categories = [...this.props.organizedBills];\n        const [removed] = categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas.splice(result.source.index, 1);\n        categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas.splice(result.destination.index, 0, removed);\n        categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas.forEach((element, index) => element.Sequence = index + 1);\n\n        categories.filter(c => !c.DeletionDate)[categoryIndex].Agendas.sort((a, b) => NUMERIC_SORT_CATEGORIES.includes(categories.filter(c => !c.DeletionDate)[categoryIndex]) ? sortAgendasNumerically(a, b, this.props.chamberCode) : sortAgendas(a, b, this.props.chamberCode))\n\n        this.props.updateAgenda(categories);\n    }\n\n    toggleAgendaItemEditor(agendaIndex, categoryIndex) {\n        if (!categoryIndex || ([...this.props.organizedBills].filter(c => !c.DeletionDate).length && [...this.props.organizedBills].filter(c => !c.DeletionDate)[categoryIndex])) {\n            this.setState({\n                showAgendaItemEditor: agendaIndex,\n                showAgendaItemEditorCategoryIndex: Number.isInteger(categoryIndex) ? categoryIndex : -1\n            });\n        }\n    }\n\n    getCategoryBills(category) {\n        const associatedCategory = this.props.calendarCategories.find(c => c.CalendarCategoryTypeID === category.CalendarCategoryTypeID);\n        if (associatedCategory) {\n            return this.props.billList.filter(b => (b.ChamberCode === associatedCategory.LegislationChamberCode || !associatedCategory.LegislationChamberCode) && (b.LegislationTypeCode === associatedCategory.LegislationTypeCode || !associatedCategory.LegislationTypeCode))\n        } else { return this.props.billList }\n    }\n\n    toggleShowAmendments(categoryIndex) {\n        let organizedBills = [...this.props.organizedBills];\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].showAmendments = !organizedBills[categoryIndex].showAmendments;\n        organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas.forEach(agenda => {\n            agenda.AgendaItems.forEach(item => {\n                if (item.LDNumber) {\n                    item.IsActive = organizedBills[categoryIndex].showAmendments;\n                }\n            })\n        });\n        this.props.updateAgenda(organizedBills);\n    }\n\n    changeCommitteeDropdown(value) {\n        this.props.changeCommitteeDropdown(value, () => {\n            let organizedBills = [...this.props.organizedBills];\n            organizedBills = this.setDescription(organizedBills);\n            this.props.updateAgenda(organizedBills, true);\n        });\n    }\n\n    changeDateDropdown(value) {\n        this.props.changeDateDropdown(value, () => {\n            let organizedBills = [...this.props.organizedBills];\n            organizedBills = this.setDescription(organizedBills);\n            this.props.updateAgenda(organizedBills, true);\n        });\n    }\n\n    addBill(categoryIndex) {\n        this.props.addBill(categoryIndex, () => {\n            let organizedBills = [...this.props.organizedBills];\n            organizedBills = this.setDescription(organizedBills);\n            this.props.updateAgenda(organizedBills, true);\n        });\n    }\n\n    toggleEditCategoryDescription(categoryIndex, save) {\n        const categories = [...this.props.organizedBills];\n        let category = categories.filter(c => !c.DeletionDate)[categoryIndex];\n        category.editing = !category.editing;\n        if (save) {\n            category.Description = category.tempDescription;\n        } else {\n            category.tempDescription = this.categoryDescription(category);\n        }\n        this.props.updateAgenda(categories, save);\n    }\n\n    handleDescriptionChange(categoryIndex, val) {\n        let organizedBills = [...this.props.organizedBills];\n        organizedBills[categoryIndex].tempDescription = val;\n        this.props.updateAgenda(organizedBills);\n    }\n\n    categoryDescription = category => {\n        //if it's been edited, leave it at that\n        const associatedReferenceCategory = this.props.calendarCategories.find(x => x.CalendarCategoryTypeID === category.CalendarCategoryTypeID);\n        if (associatedReferenceCategory && associatedReferenceCategory.Description !== category.Description && associatedReferenceCategory.PluralDescription !== category.Description) {\n            return category.Description;\n        }\n\n        //otherwise, use singular or plural reference description\n        if (this.props.chamberCode === 'H' && category.CategoryCode === \"HOUBRC\" || category.CategoryCode === \"SENBRC\") {\n            return category.Description;\n        } else if (category.Agendas.filter(a => a.IsActive).length > 1 && category.PluralDescription) {\n            return category.PluralDescription;\n        } else {\n            return category.Description;\n        }\n    }\n\n    render() {\n        //Filter out the categories that have already been added to the calendar\n        const calendarCategoryOptions = this.props.calendarCategories.filter(category => {\n            if (this.props.organizedBills.findIndex(cat => !cat.DeletionDate && cat.CalendarCategoryTypeID === category.CalendarCategoryTypeID) < 0) {\n                return category;\n            }\n        });\n        // The button will read 'Add' if the bill is not already part of a category. The button will read 'Move' if it is already part of a category.\n        const billButtonText = index => {\n            let billExists = false;\n            if (this.props.selectedBill[index]) {\n                this.props.organizedBills.some(category => {\n                    if (category.Agendas.findIndex(bill => bill.LegislationID === this.props.selectedBill[index].LegislationID) >= 0) {\n                        billExists = true;\n                        return true;\n                    }\n                });\n                if (billExists) {\n                    return (\"Move\");\n                }\n            }\n            return (\"Add\");\n        }\n\n        return (\n            <div className=\"drag-container\">\n                {this.state.showAgendaItemEditor !== -1 &&\n                    <AgendaItemsComponent\n                        toggleAgendaItemEditor={this.toggleAgendaItemEditor}\n                        agenda={this.props.organizedBills.filter(c => !c.DeletionDate)[this.state.showAgendaItemEditorCategoryIndex].Agendas[this.state.showAgendaItemEditor]}\n                        categoryIndex={this.state.showAgendaItemEditorCategoryIndex}\n                        agendaIndex={this.state.showAgendaItemEditor}\n                        updateAgendaItems={this.props.updateAgendaItems}\n                    />\n                }\n                <div className=\"inner-grid two\">\n                    <React.Fragment>\n                        <span>Use these two selectors to view candidate bills reported out of committee.</span>\n                        <div />\n                        <div className=\"inner-grid two\">\n                            <div>\n                                <label>Committee Reported Out</label>\n                                <Select\n                                    classNamePrefix=\"grid-selector-dropdown\"\n                                    value={this.props.selectedCommittee}\n                                    onChange={this.changeCommitteeDropdown}\n                                    options={this.props.committeeList.sort((a, b) => a.label > b.label)}\n                                    styles={{ menu: provided => ({ ...provided, zIndex: this.props.organizedBills.length + 1 }) }}\n                                    isSearchable\n                                    isClearable\n                                />\n                            </div>\n                            <div>\n                                <label>Date Reported Out</label>\n                                <Select\n                                    classNamePrefix=\"grid-selector-dropdown\"\n                                    value={this.props.selectedDate}\n                                    onChange={this.changeDateDropdown}\n                                    options={this.props.dateList.sort((a, b) => a.label > b.label)}\n                                    styles={{ menu: provided => ({ ...provided, zIndex: this.props.organizedBills.length + 1 }) }}\n                                    isSearchable\n                                    isClearable\n                                />\n                            </div>\n                        </div>\n                    </React.Fragment>\n                    <div className=\"inner-grid eight-and-one\">\n                        <div>\n                            <label>Category</label>\n                            <Select\n                                classNamePrefix=\"grid-selector-dropdown\"\n                                options={calendarCategoryOptions}\n                                value={this.props.selectedCategory}\n                                onChange={this.props.changeCategoryDropdown}\n                                styles={{ menu: provided => ({ ...provided, textAlign: 'right', whiteSpace: 'nowrap', right: '0', width: 'auto', zIndex: this.props.organizedBills.length + 1 }) }}\n                            />\n                        </div>\n                        <button disabled={!this.props.selectedCategory} type=\"button\" className=\"button primary\" style={{ marginTop: \"24px\", height: \"36px\" }} onClick={this.props.addCategory}>Add Category</button>\n                    </div>\n                </div>\n                <div style={{ display: 'flex', gap: '25px' }}>\n                    <button className=\"button-link\" onClick={() => this.props.toggleHideAllCategories(this.props.hideCategories.filter(c => c).length !== this.props.organizedBills.length)}>{this.props.hideCategories.filter(c => c).length !== this.props.organizedBills.length ? \"Collapse All Categories\" : \"Expand All Categories\"}</button>\n                    <button className=\"button-link\" onClick={() => this.props.toggleHideAllNonIncludedBills()}>{this.props.hideAllNonIncludedBills ? \"Show All Legislation\" : \"Hide Non-Included Legislation\"}</button>\n                </div>\n                <div style={{ marginTop: 15 }}>\n                    <div className=\"bill-grid communications-category-grid calendar-category-grid\">\n                        <div className=\"bill-grid-header\">\n                            <span></span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span></span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>Bill #</span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>Committee/Date Reported</span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>{this.props.showTitles ? \"Title\" : \"Caption\"}</span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>Status</span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>Action</span>\n                        </div>\n                    </div>\n                    {this.props.organizedBills.filter(c => !c.DeletionDate).map((category, categoryIndex) =>\n                        <form key={categoryIndex}>\n                            <div style={{ position: 'sticky', top: '0px', zIndex: this.props.organizedBills.filter(c => !c.DeletionDate).length - categoryIndex }}>\n                                <div className={`calendar-category-grid calendar-category-grid-header${category.Agendas && category.Agendas.length ? '' : ' deletable'}`}>\n                                    <div>\n                                        <button onClick={() => this.props.toggleHideCategory(categoryIndex)} type=\"button\" className={`${this.props.hideCategories[categoryIndex] ? \"arrow-down\" : \"arrow-up\"}`}></button>\n                                    </div>\n                                    <div>\n                                        <input\n                                            type=\"checkbox\"\n                                            className=\"checkbox\"\n                                            checked={category.selectAll || ''}\n                                            onChange={() => this.toggleSelectAll(categoryIndex)}\n                                        />\n                                    </div>\n                                    <div>\n                                        <span>\n                                            {category.editing ?\n                                                <React.Fragment>\n                                                    <textarea\n                                                        className={`category-description-${categoryIndex}`}\n                                                        style={{ width: '90%', fontSize: '0.9em' }}\n                                                        type=\"text\"\n                                                        onChange={(e) => this.handleDescriptionChange(categoryIndex, e.target.value)}\n                                                        value={category.tempDescription}\n                                                    />\n                                                    <a className=\"icon save\" style={{ marginLeft: '7px' }} onClick={() => this.toggleEditCategoryDescription(categoryIndex, true)} />\n                                                    <a className=\"icon delete\" style={{ marginLeft: '7px' }} onClick={() => this.toggleEditCategoryDescription(categoryIndex)} />\n                                                </React.Fragment>\n                                                :\n                                                <React.Fragment>\n                                                    <b>{category.DisplayType ? `${this.categoryDescription(category)} - ${category.CategoryType} ` : this.categoryDescription(category)}</b>\n                                                    <a className=\"icon edit\" style={{ marginLeft: '7px' }} onClick={() => this.toggleEditCategoryDescription(categoryIndex)} />\n                                                </React.Fragment>\n                                            }\n                                        </span>\n                                    </div>\n                                    <div>\n                                        {!category.Agendas || !category.Agendas.length ? <button onClick={() => this.props.deleteCategory(category)} className=\"icon delete\" type=\"button\" />\n                                            :\n                                            this.props.userRoles.find(x => x === \"SenateCalendarEditor\") && [98, 102].includes(category.CalendarCategoryTypeID) &&\n                                            <React.Fragment>\n                                                <label style={{ margin: \"0 5px 0 0\" }}>Show w/ Amendments</label>\n                                                <div className=\"bill-grid-actions\">\n                                                    <div onClick={() => this.toggleShowAmendments(categoryIndex)} className=\"toggle-switch\">\n                                                        <input id=\"sr-status-change\" checked={category.showAmendments} type=\"checkbox\" />\n                                                        <span className=\"slider\"></span>\n                                                    </div>\n                                                </div>\n                                            </React.Fragment>\n                                        }\n                                    </div>\n                                    <div className=\"flex-row\" style={{ gap: '10px' }}>\n                                        {\n                                            category.IsLegislationCategory && this.props.organizedBills.find(cat => !cat.DeletionDate && cat.CalendarCategoryTypeID !== category.CalendarCategoryTypeID && cat.IsLegislationCategory && cat.Agendas.find(agenda => agenda.checked)) ?\n                                                <button type=\"button\" className=\"button small-button\" onClick={() => this.switchCategory(categoryIndex)}>Move to Category</button>\n                                                : !category.IsLegislationCategory && category.Agendas.length && category.Agendas.find(a => a.checked) &&\n                                                <React.Fragment>\n                                                    <div>\n                                                        <button type=\"button\" className=\"button small-button\" onClick={() => this.toggleBillBulk(false, categoryIndex)}>Exclude Selected</button>\n                                                    </div>\n                                                    <div>\n                                                        <button type=\"button\" className=\"button small-button\" onClick={() => this.toggleBillBulk(true, categoryIndex)}>Include Selected</button>\n                                                    </div>\n                                                </React.Fragment>\n                                        }\n                                    </div>\n                                    <div>\n                                        {!this.props.pendingSave && <button type=\"button\" className=\"button small-button\" onClick={() => this.props.toggleCalendarPreview(categoryIndex)} >Preview</button>}\n                                    </div>\n                                    <div>\n                                        {!this.props.pendingSave && category.CalendarCategoryTypeID != 132 && <button type=\"button\" className=\"button small-button\" onClick={() => this.props.togglePortal(this.props.showPortal, category)}>PDF Preview </button>}\n                                    </div>\n                                </div>\n                                {!this.props.hideCategories[categoryIndex] && category.IsLegislationCategory &&\n                                    <div className=\"bill-grid communications-category-grid calendar-category-grid\">\n                                        <div></div>\n                                        <div></div>\n                                        <div>\n                                            <LargeListSelect\n                                                className=\"grid-selector-dropdown\"\n                                                classNamePrefix=\"grid-selector-dropdown\"\n                                                options={this.getCategoryBills(category)}\n                                                onChange={(value) => this.props.changeBillDropdown(categoryIndex, value)}\n                                                value={this.props.selectedBill[categoryIndex]}\n                                                filterOption={(bill, inputValue) => {\n                                                    if (category.Agendas.findIndex(agenda => agenda.LegislationID === bill.value) < 0) {\n                                                        return bill.label.toLowerCase().includes(inputValue.toLowerCase());\n                                                    } else { return false; }\n                                                }}\n                                            />\n                                        </div>\n                                        <div className=\"center\">\n                                            <button\n                                                className=\"button\"\n                                                type=\"button\"\n                                                disabled={!this.props.selectedBill[categoryIndex]}\n                                                onClick={() => this.addBill(categoryIndex)}>\n                                                {billButtonText(categoryIndex)}\n                                            </button>\n                                        </div>\n                                        <div className=\"flex-row four space-around\" style={{ display: 'flex', alignItems: 'center' }}>\n                                            {category.Agendas.length && category.Agendas.find(a => a.checked) ?\n                                                <React.Fragment>\n                                                    <div>\n                                                        <span>Checked Legislation:</span>\n                                                    </div>\n                                                    <div>\n                                                        <button type=\"button\" className=\"button small-button\" onClick={() => this.toggleBillBulk(false, categoryIndex)}>Exclude</button>\n                                                    </div>\n                                                    <div>\n                                                        <button type=\"button\" className=\"button small-button\" onClick={() => this.toggleBillBulk(true, categoryIndex)}>Include</button>\n                                                    </div>\n                                                    <div>\n                                                        <button type=\"button\" className=\"button small-button\" onClick={() => this.moveTo('top', categoryIndex)}>Move to Top</button>\n                                                    </div>\n                                                    <div>\n                                                        <button type=\"button\" className=\"button small-button\" onClick={() => this.moveTo('bottom', categoryIndex)}>Move to Bottom</button>\n                                                    </div>\n                                                </React.Fragment>\n                                                : null\n                                            }\n                                        </div>\n                                    </div>\n                                }\n                            </div>\n                            {!this.props.hideCategories[categoryIndex] &&\n                                <DragDropContext onDragEnd={result => this.onDragEnd(result, categoryIndex)}>\n                                    <Droppable droppableId=\"droppable\">\n                                        {(provided, _snapshot) => (\n                                            <div ref={provided.innerRef}>\n                                                {category.Agendas.map((item, itemIndex) => {\n                                                    if (this.props.hideAllNonIncludedBills && !item.IsActive) { return; }\n                                                    const showNewIndicator = category.CategoryCode != \"Order\" && category.CalendarCategoryID && !item.AgendaID;\n                                                    return (\n                                                        <React.Fragment key={`${item.AgendaID}-${itemIndex}`}>\n                                                            {isNotHidden(item, category, this.props.committeeList) ?\n                                                                <Draggable draggableId={`${item.AgendaID}-${itemIndex}`} index={itemIndex}>\n                                                                    {(provided, snapshot) => (\n                                                                        <div ref={provided.innerRef}\n                                                                            className=\"bill-grid communications-category-grid calendar-category-grid\"\n                                                                            {...provided.draggableProps}\n                                                                            {...provided.dragHandleProps}\n                                                                            style={getItemStyle(\n                                                                                snapshot.isDragging,\n                                                                                provided.draggableProps.style,\n                                                                                item.IsActive\n                                                                            )}\n                                                                        >\n                                                                            <div><button className=\"button draggable\">Drag and drop</button></div>\n                                                                            <div>\n                                                                                <input\n                                                                                    type=\"checkbox\"\n                                                                                    className=\"checkbox\"\n                                                                                    checked={item.checked || ''}\n                                                                                    onChange={e => this.toggleRow(categoryIndex, itemIndex, e)} />\n                                                                            </div>\n                                                                            <div className=\"new-container\">\n                                                                                {this.props.organizedBills.find(c => c.CalendarCategoryTypeID !== category.CalendarCategoryTypeID && c.Agendas.find(a => a.LegislationNumber === item.LegislationNumber)) &&\n                                                                                    <React.Fragment>\n                                                                                        <i data-tip=\"This legislation exists in multiple categories.\" className={`icon notification calendar-authoring${showNewIndicator ? ' new' : ''}`} />\n                                                                                    </React.Fragment>\n                                                                                }\n                                                                                <Link to={`/bill-details/${this.props.sessionCode}/${item.LegislationNumber}`} target=\"_blank\" rel=\"noreferrer\" style={!item.IsActive ? { color: 'inherit' } : {}}> {item.LegislationNumber}</Link>\n                                                                                {showNewIndicator && <span className='corner-new'>NEW</span>}\n                                                                            </div>\n                                                                            <div>\n                                                                                <span>{this.props.fullCommitteeList.find(x => x.CommitteeID === item.CommitteeID) ? this.props.fullCommitteeList.find(x => x.CommitteeID === item.CommitteeID).Abbreviation + \" - \" + moment(item.CandidateDate).format(\"MM/DD/YYYY\") : category.CategoryCode != \"Order\" && item.CandidateDate && moment(item.CandidateDate).format(\"MM/DD/YYYY\")}</span>\n                                                                            </div>\n                                                                            <div>\n                                                                                <div className=\"flex-row\" style={{ display: 'flex' }}>\n                                                                                    <div className=\"flex-row flex-vertical-center\" style={{ width: \"100%\", display: \"inline-flex\" }}>\n                                                                                        {item.isEditing ?\n                                                                                            <textarea value={item.LegislationTitle ? item.LegislationTitle : item.newDescription} style={{\n                                                                                                resize: 'vertical', width: '75%', height: this.state.textHeight[categoryIndex]\n                                                                                                    && this.state.textHeight[categoryIndex].Agendas[itemIndex]\n                                                                                                    && this.state.textHeight[categoryIndex].Agendas[itemIndex].height\n                                                                                                    ? this.state.textHeight[categoryIndex].Agendas[itemIndex].height\n                                                                                                    : \"40px\"\n                                                                                            }}\n                                                                                                cols=\"2\" onChange={(e) => this.handleChange(categoryIndex, itemIndex, e, item.LegislationTitle != null)}></textarea>\n                                                                                            :\n                                                                                            <React.Fragment>\n                                                                                                <span className={this.props.organizedBills && this.props.organizedBills.filter(c => !c.DeletionDate)[categoryIndex].Agendas[itemIndex].expandTitle ? \"calendar-leg-title-wrapper expanded\" : \"calendar-leg-title-wrapper\"}>{item.Description === \"Call to Order\" ? \"Call to Order - \" + this.props.calendarTime : renderHTML(!this.props.showTitles && item.LegislationDescription ? item.LegislationDescription : !this.props.showTitles && item.Description ? item.Description : this.props.showTitles && item.LegislationTitle ? item.LegislationTitle : item.Description ? item.Description : \"\")}</span>\n                                                                                                {!this.props.showTitles && item.LegislationDescription && item.LegislationDescription.length > 75\n                                                                                                    ? <a onClick={() => this.expandTitle(categoryIndex, itemIndex)} style={{ cursor: \"pointer\" }}>...</a>\n                                                                                                    : !this.props.showTitles && item.Description && item.Description.length > 75\n                                                                                                        ? <a onClick={() => this.expandTitle(categoryIndex, itemIndex)} style={{ cursor: \"pointer\" }}>...</a>\n                                                                                                        : this.props.showTitles && item.LegislationTitle && item.LegislationTitle.length > 75\n                                                                                                            ? <a onClick={() => this.expandTitle(categoryIndex, itemIndex)} style={{ cursor: \"pointer\" }}>...</a>\n                                                                                                            : item.Description && item.Description.length > 75\n                                                                                                                ? <a onClick={() => this.expandTitle(categoryIndex, itemIndex)} style={{ cursor: \"pointer\" }}>...</a>\n                                                                                                                : null}\n                                                                                            </React.Fragment>\n                                                                                        }\n                                                                                    </div>\n                                                                                    <React.Fragment>\n                                                                                        <div className=\"bill-grid-actions\">\n                                                                                            {item.isEditing\n                                                                                                ?\n                                                                                                <div className=\"bill-grid-actions\" style={{ display: \"inline-flex\" }}>\n                                                                                                    <button onClick={() => this.saveChange(categoryIndex, itemIndex)} type=\"button\" className=\"icon save float-right\"></button>\n                                                                                                    <button onClick={() => this.toggleEdit(categoryIndex, itemIndex)} type=\"button\" className=\"icon delete float-right\"></button>\n                                                                                                </div>\n                                                                                                :\n                                                                                                <div className=\"bill-grid-actions\">\n                                                                                                    {/*Allow edit if it is not the call to order item, the item IsActive, and we are viewing titles OR it is the invocation, pledge, or reading of the journal*/}\n                                                                                                    {item.Description !== \"Call to Order\" && item.IsActive && (this.props.showTitles || [2, 3, 4, 6, 7, 8].includes(item.CalendarCategoryTemplateID)) &&\n                                                                                                        <button onClick={() => this.toggleEdit(categoryIndex, itemIndex)} type=\"button\" className=\"icon edit float-right\"></button>\n                                                                                                    }\n                                                                                                </div>\n                                                                                            }\n                                                                                            {category.CategoryCode !== \"Order\" && <button onClick={() => this.showAgendaItems(categoryIndex, itemIndex)} className={item.showAgendaItems ? 'arrow-up' : 'arrow-down'} type=\"button\"></button>}\n                                                                                        </div>\n                                                                                    </React.Fragment>\n                                                                                </div>\n                                                                                {item.showAgendaItems &&\n                                                                                    <div>\n                                                                                        <button type=\"button\" onClick={() => this.toggleAgendaItemEditor(itemIndex, categoryIndex)} className=\"button-link\">Edit Notes</button>\n                                                                                        {/* If an item has an LdNumber it's assumed to be an amendment */}\n                                                                                        {item.AgendaItems.filter(item => item.Description && item.IsActive && (!item.LDNumber ? true : category.showAmendments || ![98, 102].includes(category.CalendarCategoryTypeID) ? true : false)).map((item, itemIndex) =>\n                                                                                            <div key={itemIndex} className=\"programmatic-notes\">\n                                                                                                {renderHTML(item.DraftText || item.CalendarDescription || item.Description)}\n                                                                                            </div>\n                                                                                        )}\n                                                                                    </div>\n                                                                                }\n                                                                            </div>\n                                                                            <div>\n                                                                                <span className={item.IsActive ? \"message-success\" : \"\"}>{item.IsActive ? 'Included' : 'Not Included'}</span>\n                                                                            </div>\n                                                                            <div className=\"bill-grid-actions\">\n                                                                                <div onClick={() => this.toggleBill(categoryIndex, itemIndex)} className=\"toggle-switch\">\n                                                                                    <input id=\"sr-status-change\" checked={item.IsActive} type=\"checkbox\" />\n                                                                                    <span className=\"slider\"></span>\n                                                                                </div>\n                                                                            </div>\n                                                                        </div>)}\n                                                                </Draggable>\n                                                                :\n                                                                null\n                                                            }\n                                                        </React.Fragment>\n                                                    )\n                                                }\n                                                )}\n                                            </div>)}\n                                    </Droppable>\n                                </DragDropContext>\n                            }\n                        </form>\n                    )}\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default SenateBillsGrid;","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { Prompt } from 'react-router';\nimport * as Fields from '../../../lis-shared/lis-layout/components/lis-forms-component';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport moment from 'moment-timezone';\nimport ReactToPrint from \"react-to-print\";\nimport { calendarActionCreators } from '../../../stores/lis-calendar-store';\nimport BillsGrid from './lis-senate-bills-grid';\nimport CalendarDetailsComponent from '../../../lis-shared/lis-calendar/lis-calendar-details'\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { billActionCreators } from '../../../stores/lis-legislation-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport Popout from '../../../lis-shared/lis-layout/components/lis-popout-component';\nimport DatePicker from 'react-datepicker';\nimport CalendarDetailsPrintout from '../../../lis-shared/lis-calendar/lis-calendar-details-printout';\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\n\nconst PUBLISH_CALENDAR = true;\nconst SAVE_CALENDAR = false;\nconst lisDocDomain = window.env?.STORAGE_ACCOUNT_DOMAIN;\n\nconst NUMERIC_SORT_CATEGORIES = [72, 111, 109, 112, 60, 110, 98, 102, 83, 90, 87, 93, 100, 104, 117, 118, 105, 106, 66, 67, 96, 97, 64, 68, 69, 65];\n\nconst sortAgendas = (a, b, calendarChamber) => {\n    {\n        return b.IsActive !== a.IsActive\n            ? b.IsActive\n                ? 1\n                : -1\n            : a.Sequence > 0 && b.Sequence > 0 && a.Sequence !== b.Sequence\n                ? a.Sequence - b.Sequence > 0\n                    ? 1\n                    : -1\n                : a.CalendarDate !== b.CalendarDate\n                    ?\n                    !a.CalendarDate ?\n                        1 :\n                        !b.CalendarDate ? -1\n                            :\n                            a.CalendarDate - b.CalendarDate\n                    : a.CandidateDate !== b.CandidateDate\n                        ?\n                        !a.CandidateDate ?\n                            1 :\n                            !b.CandidateDate ? -1\n                                :\n                                a.CandidateDate - b.CandidateDate\n                        : a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) !== 0 ?\n                            a.LegislationNumber[0].localeCompare(calendarChamber) !== 0\n                                ? -1 : 1\n                            : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) !== 0\n                                ? a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) > 0\n                                    ? 1\n                                    : -1\n                                : a.LegislationKey && parseInt(a.LegislationKey) !== parseInt(b.LegislationKey)\n                                    ? parseInt(a.LegislationKey) - parseInt(b.LegislationKey) > 0\n                                        ? 1\n                                        : -1\n                                    : 0\n    }\n}\n\nconst sortAgendasNumerically = (a, b, calendarChamber) => {\n    {\n        return !a.IsActive && b.IsActive\n            ? 1\n            : a.IsActive && !b.IsActive\n                ? -1\n                : a.Sequence > 0 && b.Sequence > 0 && a.Sequence !== b.Sequence\n                    ? a.Sequence - b.Sequence > 0\n                        ? 1\n                        : -1\n                    : a.LegislationNumber && b.LegislationNumber && a.LegislationNumber[0] !== b.LegislationNumber[0] ?\n                        a.LegislationNumber[0].localeCompare(calendarChamber) !== 0\n                            ? -1\n                            : 1\n                        : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) > 0\n                            ? 1\n                            : a.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) < 0\n                                ? -1\n                                : a.LegislationKey > b.LegislationKey\n                                    ? 1\n                                    : -1\n    }\n}\n\nconst findLastByIsActiveThenCalendarDateThenCandidateDateThenLegChamberTypeKey = (a, b, calendarChamber, ignoreCalendarDate, ignoreCandidateDate) => (\n    a.IsActive && findLastByCalendarDateThenCandidateDateThenLegChamberTypeKey(a, b, calendarChamber, ignoreCalendarDate, ignoreCandidateDate)\n)\n\nconst findLastByCalendarDateThenCandidateDateThenLegChamberTypeKey = (a, b, calendarChamber, ignoreCalendarDate, ignoreCandidateDate) => (\n    (((ignoreCalendarDate || (a.CalendarDate && b.CalendarDate && moment(a.CalendarDate).isSame(b.CalendarDate, \"day\"))) && findLastByLegChamberTypeKey(a, b, calendarChamber)) ||\n        (!ignoreCalendarDate && a.CalendarDate && b.CalendarDate && moment(a.CalendarDate).isBefore(b.CalendarDate, \"day\"))) ||\n    (((ignoreCandidateDate || (a.CandidateDate && b.CandidateDate && moment(a.CandidateDate).isSame(b.CandidateDate, \"day\"))) && findLastByLegChamberTypeKey(a, b, calendarChamber)) ||\n        (!ignoreCandidateDate && a.CandidateDate && b.CandidateDate && moment(a.CandidateDate).isBefore(b.CandidateDate, \"day\"))) ||\n    ((ignoreCalendarDate || (!a.CalendarDate && !b.CalendarDate)) && (ignoreCandidateDate || (!a.CandidateDate && !b.CandidateDate)) &&\n        findLastByLegChamberTypeKey(a, b, calendarChamber))\n    || (!ignoreCalendarDate && !b.CalendarDate && a.CandidateDate)\n    || !ignoreCandidateDate && !b.CandidateDate && a.CandidateDate\n)\n\nconst findLastByLegChamberTypeKey = (a, b, calendarChamber) => (\n    (a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) === (calendarChamber === \"H\" ? 1 : -1)) ||\n    (a.LegislationNumber && a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) === 0 && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) === -1) ||\n    (a.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) === 0 && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) === 0 && a.LegislationKey && a.LegislationKey < parseInt(b.LegislationKey))\n)\n\nclass SenateCalendarFormComponent extends React.Component {\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            isLoaded: false,\n            calendarData: '',\n            hideCategories: [],\n            showPreview: false,\n            isSaving: false,\n            pendingSave: false,\n            comments: [],\n            message: '',\n            selectedSession: '',\n            selectAllActive: false,\n            selectAllInactive: false,\n            calendarCategories: [],\n            selectedCategory: '',\n            selectedBill: [],\n            billList: [],\n            showCategoryPreview: -1,\n            hideCategory: [],\n            selectedFile: '',\n            calendatDate: \"\",\n            commentEdit: [],\n            tempComments: [],\n            showTitles: false,\n            selectedDate: \"\",\n            selectedCommittee: \"\",\n            dateList: [],\n            committeeList: [],\n            hideAllNonIncludedBills: false\n        };\n        this.togglePreview = this.togglePreview.bind(this);\n        this.updateAgenda = this.updateAgenda.bind(this);\n        this.updateAgendaItems = this.updateAgendaItems.bind(this);\n        this.changeCategoryDropdown = this.changeCategoryDropdown.bind(this);\n        this.addCategory = this.addCategory.bind(this);\n        this.toggleHideCategory = this.toggleHideCategory.bind(this);\n        this.toggleHideAllCategories = this.toggleHideAllCategories.bind(this);\n        this.toggleHideAllNonIncludedBills = this.toggleHideAllNonIncludedBills.bind(this);\n        this.changeBillDropdown = this.changeBillDropdown.bind(this);\n        this.changeDateDropdown = this.changeDateDropdown.bind(this);\n        this.changeCommitteeDropdown = this.changeCommitteeDropdown.bind(this);\n        this.addBill = this.addBill.bind(this);\n        this.addComment = this.addComment.bind(this);\n        this.removeComment = this.removeComment.bind(this);\n        this.commentShift = this.commentShift.bind(this);\n        this.handleProFormaChange = this.handleProFormaChange.bind(this);\n        this.toggleCalendarPreview = this.toggleCalendarPreview.bind(this);\n        this.togglePortal = this.togglePortal.bind(this);\n        this.saveCalendar = this.saveCalendar.bind(this);\n        this.handlePdfFile = this.handlePdfFile.bind(this);\n        this.submitPdfFile = this.submitPdfFile.bind(this);\n        this.changeConveneTime = this.changeConveneTime.bind(this);\n        this.toggleAgenda = this.toggleAgenda.bind(this);\n        this.toggleCommentEdit = this.toggleCommentEdit.bind(this);\n        this.confirmCommentEdit = this.confirmCommentEdit.bind(this);\n        this.toggleShowTitles = this.toggleShowTitles.bind(this);\n        this.setPending = this.setPending.bind(this);\n        this.deleteCategory = this.deleteCategory.bind(this);\n\n        this.pdfRef = React.createRef();\n        this.fileInput = React.createRef();\n    }\n\n    componentDidMount() {\n        let calendarData = { ...this.props.calendarData };\n        let noSavedItems = true;\n        let comments = [];\n        let dateList = [];\n        let committeeList = [];\n\n        // For the 'add category' dropdown\n        this.props.actions.getCalendarCategoriesReferences('?chamberCode=' + calendarData.ChamberCode)\n            .then(() => {\n                let calendarCategories = this.props.calendar.calendarCategoriesReferences;\n                calendarCategories.forEach(category => {\n                    category.label = category.DisplayType ? `${category.Description} - ${category.CategoryType}` : category.Description;\n                    category.value = category.CalendarCategoryTypeID;\n                });\n                this.setState({\n                    calendarCategories: calendarCategories\n                }, () => {\n                    this.props.actions.getCommitteeList(\"sessionID=\" + calendarData.SessionID)\n                        .then(() => {\n                            calendarData.CalendarCategories.forEach(category => {\n                                const referenceCategory = this.state.calendarCategories.find(c => c.CalendarCategoryTypeID === category.CalendarCategoryTypeID);\n                                let sequence = 1;\n                                category.Agendas.forEach((agenda, i) => {\n                                    //If a bill is on first reading capture its committee and candidate date to use in the filters\n                                    if (referenceCategory && referenceCategory.OnDemand) {\n                                        if (agenda.CommitteeID && this.props.committee.committeeList.find(x => x.ChamberCode === calendarData.ChamberCode && x.CommitteeID === agenda.CommitteeID)) {\n                                            committeeList.push({ label: this.props.committee.committeeList.find(x => x.ChamberCode === calendarData.ChamberCode && x.CommitteeID === agenda.CommitteeID).Name, value: agenda.CommitteeID, date: agenda.CandidateDate });\n                                        }\n\n                                        if (agenda.CandidateDate && this.props.committee.committeeList.find(x => x.ChamberCode === calendarData.ChamberCode && x.CommitteeID === agenda.CommitteeID)) {\n                                            let thisDate = dateList.findIndex(x => moment(x.value).isSame(agenda.CandidateDate, \"day\"));\n                                            if (thisDate > -1) {\n                                                if (!dateList[thisDate].committee.includes(agenda.CommitteeID)) {\n                                                    dateList[thisDate].committee.push(agenda.CommitteeID)\n                                                }\n                                            } else {\n                                                dateList.push({ label: moment(agenda.CandidateDate).format(\"MM/DD/YYYY\"), value: agenda.CandidateDate, committee: [agenda.CommitteeID] });\n                                            }\n                                        }\n                                    }\n\n                                    //Item has an agenda ID so this means that a bill has been previously saved to this calendar\n                                    if (agenda.AgendaID) {\n                                        noSavedItems = false;\n                                    }\n                                });\n                                if ([98, 102].includes(category.CalendarCategoryTypeID)) {\n                                    category.showAmendments = !!category.Agendas.flatMap(agenda => agenda.AgendaItems).find(agendaItem => agendaItem.IsActive && agendaItem.LDNumber);\n                                }\n                                category.Agendas.sort((a, b) => NUMERIC_SORT_CATEGORIES.includes(category.CalendarCategoryTypeID) ? sortAgendasNumerically(a, b, calendarData.ChamberCode) : sortAgendas(a, b, calendarData.ChamberCode))\n                                category.Agendas.forEach((agenda, i) => {\n                                    if (agenda.IsActive) {\n                                        agenda.pending = false;\n                                        agenda.Sequence = sequence;\n                                        sequence++;\n                                    } else {\n                                        agenda.Sequence = 0;\n                                    }\n                                })\n                            });\n\n\n                            let commentEdit = [];\n                            let tempComments = [];\n\n                            for (let i = 0; i < calendarData.CalendarComments.length; i++) {\n                                let comment = calendarData.CalendarComments[i];\n                                comment.Sequence = i + 1;\n                                comments.push(comment);\n                                commentEdit.push(false);\n                                //I kid you not if I don't make a separate tempComment object here and push it into the tempComment array instead of inserting the entire comment\n                                //then this.state.comments gets mutated in the handleCommentChange function even though it would never get explicitly changed -JGB                    \n                                let tempComment = {\n                                    Sequence: comment.Sequence,\n                                    Comment: comment.Comment\n                                }\n                                tempComments.push(tempComment)\n                            }\n\n                            dateList = dateList.sort((a, b) => { return moment(a.value) - moment(b.value) })\n                            committeeList = committeeList.sort((a, b) => a.label.localeCompare(b.label));\n\n                            this.toggleHideAllCategories(true, calendarData.CalendarCategories);\n\n                            this.setState({\n                                calendarData: calendarData,\n                                showTitles: calendarData.ChamberCode === \"H\",\n                                pendingSave: noSavedItems,\n                                comments: comments,\n                                tempComments: tempComments,\n                                isLoaded: true,\n                                calendarDate: calendarData.CalendarDate,\n                                commentEdit: commentEdit,\n                                dateList: [...new Map(dateList.map(x => [x[\"label\"], x])).values()],\n                                committeeList: [...new Map(committeeList.map(x => [x[\"value\"], x])).values()]\n                            }, () => {\n                                //Get bills in the session for the bill dropdown\n                                this.props.actions.getSessionBills('?sessionID= ' + this.state.calendarData.SessionID).then(() => {\n                                    let billList = [...this.props.bills.sessionBills];\n                                    billList.forEach(bill => {\n                                        bill.label = bill.LegislationNumber\n                                        bill.value = bill.LegislationID\n                                    });\n                                    this.setState({\n                                        billList: billList,\n                                    })\n                                })\n                                this.props.actions.getSessionById(this.state.calendarData.SessionID)\n                                    .then(() =>\n                                        this.setState({ selectedSession: this.props.session.selectedSession })\n                                    );\n                            });\n                        });\n                });\n            })\n    }\n\n    togglePreview() {\n        const opposite = !this.state.showPreview;\n        this.setState({\n            showPreview: opposite\n        });\n    }\n\n    handleCommentChange(e, sequence) {\n        let tempComments = [...this.state.tempComments];\n\n        tempComments.find(x => x.Sequence === sequence).Comment = e.target.value;\n\n        this.setState({\n            tempComments: tempComments\n        });\n    }\n\n    updateAgenda(organizedBills, saveRequired) {\n        let calendarData = { ...this.state.calendarData };\n        calendarData.CalendarCategories = organizedBills;\n        this.setState({\n            calendarData: calendarData,\n            pendingSave: saveRequired === undefined ? this.state.pendingSave : saveRequired\n        });\n    }\n\n    updateAgendaItems(agendaItems, categoryIndex, agendaIndex) {\n        let calendarData = { ...this.state.calendarData };\n        calendarData.CalendarCategories.filter(c => !c.DeletionDate)[categoryIndex].Agendas[agendaIndex].AgendaItems = agendaItems;\n\n        this.setState({\n            calendarData: calendarData,\n            pendingSave: true\n        });\n    }\n\n    changeCategoryDropdown(value) {\n        this.setState({\n            selectedCategory: value\n        });\n    }\n\n    addCategory() {\n        const selectedCategory = this.state.selectedCategory;\n        //Used to find the new index of the category so the hidden categories indices can be updated\n        const categoryFinder = new Date().getTime();\n        let organizedBills = [...this.state.calendarData.CalendarCategories];\n        let newCalendarCategory = {\n            IsLegislationCategory: selectedCategory.IsLegislationCategory,\n            Agendas: [],\n            CalendarCategoryTypeID: selectedCategory.CalendarCategoryTypeID,\n            CategoryCode: selectedCategory.CategoryCode,\n            Description: selectedCategory.Description,\n            PluralDescription: selectedCategory.PluralDescription,\n            DisplayType: selectedCategory.DisplayType,\n            CategoryType: selectedCategory.CategoryType,\n            Sequence: selectedCategory.Sequence,\n            isNewCategory: categoryFinder\n        }\n        organizedBills.push(newCalendarCategory);\n        //Sort the calendar by smallest to greatest sequence\n        organizedBills.sort((a, b) => (a.Sequence > b.Sequence) ? 1 : -1)\n        //Update the categories that are hidden since the array indices have changed\n        const newCategoryIndex = organizedBills.filter(c => !c.DeletionDate).findIndex(cat => cat.isNewCategory === categoryFinder);\n        if (newCategoryIndex !== -1) {\n            let hideCategories = this.state.hideCategories;\n            hideCategories.splice(newCategoryIndex, 0, false);\n            this.setState({\n                hideCategories: hideCategories\n            });\n        }\n        //Remove the selected category so the user doesn't accidentally add it twice\n        this.setState({\n            selectedCategory: ''\n        });\n        this.updateAgenda(organizedBills, true);\n\n    }\n\n    deleteCategory(category) {\n        let calendarData = { ...this.state.calendarData };\n        const selectedCategoryIndex = calendarData.CalendarCategories.filter(c => !c.DeletionDate).findIndex(c => c.CategoryCode === category.CategoryCode);\n        calendarData.CalendarCategories.filter(c => !c.DeletionDate)[selectedCategoryIndex].DeletionDate = new Date();\n        let hideCategories = this.state.hideCategories;\n        if (hideCategories[selectedCategoryIndex] !== null && hideCategories[selectedCategoryIndex] !== undefined) {\n            hideCategories.splice(selectedCategoryIndex, 1);\n        }\n        this.setState({ calendarData, hideCategories })\n    }\n\n    toggleHideCategory(catIndex) {\n        let hideCategories = this.state.hideCategories;\n        hideCategories[catIndex] = !hideCategories[catIndex]\n        this.setState({\n            hideCategories: hideCategories\n        });\n    }\n\n    toggleHideAllCategories(hide, calendarCategories) {\n        let hideCategories = this.state.hideCategories;\n        calendarCategories = calendarCategories || this.state.calendarData.CalendarCategories;\n        calendarCategories.forEach((cat, catIndex) => {\n            hideCategories[catIndex] = hide\n        })\n        this.setState({\n            hideCategories: hideCategories\n        });\n    }\n\n    toggleHideAllNonIncludedBills() {\n        this.setState({\n            hideAllNonIncludedBills: !this.state.hideAllNonIncludedBills\n        });\n    }\n\n    changeBillDropdown(index, value) {\n        let selectedBill = [...this.state.selectedBill];\n        selectedBill[index] = value;\n        this.setState({\n            selectedBill: selectedBill\n        });\n    }\n\n    changeDateDropdown(value, callback) {\n        this.setState({\n            selectedDate: value\n        }, () => {\n            if (this.state.selectedDate && this.state.selectedCommittee)\n                this.setPending();\n            if (callback) {\n                callback();\n            }\n        });\n    }\n\n    changeCommitteeDropdown(value, callback) {\n        this.setState({\n            selectedCommittee: value\n        }, () => {\n            if (this.state.selectedDate && this.state.selectedCommittee)\n                this.setPending();\n            if (callback) {\n                callback();\n            }\n        });\n    }\n\n    setPending() {\n        let calendarData = { ...this.state.calendarData };\n        calendarData.CalendarCategories.forEach((category, i) => {\n            category.Agendas.forEach((agenda, j) => {\n                //If a given agenda item matches one filter (if one filter is selected) or both filters (if both are selected) \n                //Then mark it isActive and give it the pending value so we know to deactivate it if the user changes the filter selections   \n                //Otherwise if it's active, pending, and it no longer matches the filters then remove the pending value and deactivate it so it's hidden\n                if (((!this.state.selectedDate || this.state.selectedDate === \"\") && this.state.selectedCommittee && this.state.selectedCommittee.value === agenda.CommitteeID && !agenda.IsHidden && agenda.pending !== false)\n                    || ((!this.state.selectedCommittee || this.state.selectedCommittee === \"\") && this.state.selectedDate && this.state.selectedDate.value === agenda.CandidateDate && !agenda.IsHidden && agenda.pending !== false)\n                    || (this.state.selectedDate && this.state.selectedDate !== \"\" && this.state.selectedCommittee && this.state.selectedCommittee !== \"\" && this.state.selectedCommittee.value === agenda.CommitteeID && this.state.selectedDate.value === agenda.CandidateDate && !agenda.IsHidden && agenda.pending !== false)) {\n                    agenda.IsActive = true;\n                    //Disabling the pending feature which removes bills from the calendar if they've been included but not saved. I feel like there's a chance they'll want it back -JGB\n                    //agenda.pending = true; \n                } else if (agenda.IsActive === true && agenda.pending === true) {\n                    agenda.IsActive = false;\n                    delete agenda.pending;\n                }\n            })\n\n            category.Agendas.sort((a, b) => NUMERIC_SORT_CATEGORIES.includes(category.CalendarCategoryTypeID) ? sortAgendasNumerically(a, b, calendarData.ChamberCode) : sortAgendas(a, b, calendarData.ChamberCode))\n        })\n\n        this.setState({\n            calendarData\n        })\n    }\n\n    addBill(index, callback) {\n        let calendarCategories = [...this.state.calendarData.CalendarCategories];\n        let newAgenda = {};\n        //Check whether to move the bill from another category or add the bill\n        let billExists = false;\n        if (this.state.selectedBill[index]) {\n            let associatedCategory = calendarCategories.filter(c => !c.DeletionDate)[index];\n            calendarCategories.some((category, categoryIndex) => {\n                const duplicateBillIndex = category.Agendas.findIndex(bill => bill.LegislationID === this.state.selectedBill[index].LegislationID);\n                if (duplicateBillIndex >= 0) {\n                    billExists = true;\n                    newAgenda = { ...calendarCategories[categoryIndex].Agendas[duplicateBillIndex] };\n                    newAgenda.IsActive = true;\n                    newAgenda.CalendarCategoryTypeID = associatedCategory.CalendarCategoryTypeID;\n                    newAgenda.CalendarCategoryID = associatedCategory.CalendarCategoryID;\n                    calendarCategories[categoryIndex].Agendas.splice(duplicateBillIndex, 1);\n                    calendarCategories[categoryIndex].Agendas.forEach((item, itemIndex) => item.Sequence = itemIndex + 1);\n                    return true;\n                }\n            });\n            const sortNumeric = NUMERIC_SORT_CATEGORIES.includes(associatedCategory.CalendarCategoryTypeID);\n            let newAgendaSequence = null;\n            const categoryIsSequenced = Boolean(associatedCategory.Agendas && associatedCategory.Agendas.find(a => a.IsActive && Number.isInteger(a.Sequence)));\n            if (categoryIsSequenced) {\n                const sortedAgendas = associatedCategory.Agendas.sort((a, b) => sortNumeric ? sortAgendasNumerically(a, b, this.state.calendarData.ChamberCode) : sortAgendas(a, b, this.state.calendarData.ChamberCode));\n                const lowerLegislationNumberAgenda = sortedAgendas.findLast(a => findLastByIsActiveThenCalendarDateThenCandidateDateThenLegChamberTypeKey(a, this.state.selectedBill[index], this.state.calendarData.ChamberCode, sortNumeric, sortNumeric));\n                if (lowerLegislationNumberAgenda) {\n                    const finalLowerLegislationNumberIndex = associatedCategory.Agendas.findIndex(a => a.LegislationNumber === lowerLegislationNumberAgenda.LegislationNumber);\n                    newAgendaSequence = associatedCategory.Agendas[finalLowerLegislationNumberIndex].Sequence + 1;\n                } else {\n                    newAgendaSequence = 1;\n                }\n                associatedCategory.Agendas.forEach(agenda => {\n                    if (agenda.IsActive && agenda.Sequence >= newAgendaSequence) {\n                        agenda.Sequence++;\n                    }\n                })\n            }\n            if (!billExists) {\n                newAgenda = {\n                    CalendarCategoryTypeID: associatedCategory.CalendarCategoryTypeID,\n                    CalendarCategoryID: associatedCategory.CalendarCategoryID,\n                    IsActive: true,\n                    LegislationID: this.state.selectedBill[index].LegislationID,\n                    LegislationNumber: this.state.selectedBill[index].LegislationNumber,\n                    LegislationKey: this.state.selectedBill[index].LegislationKey,\n                    Patrons: this.state.selectedBill[index].Patrons,\n                    LegislationDescription: this.state.selectedBill[index].Description,\n                    LegislationTitle: this.state.selectedBill[index].LegislationTitle,\n                }\n            }\n            newAgenda.Sequence = newAgendaSequence;\n            associatedCategory.Agendas.splice(newAgendaSequence || 0, 0, newAgenda);\n            associatedCategory.Agendas.sort((a, b) => sortNumeric ? sortAgendasNumerically(a, b, this.state.calendarData.ChamberCode) : sortAgendas(a, b, this.state.calendarData.ChamberCode))\n            associatedCategory.Agendas.forEach((item, itemIndex) => { if (item.IsActive) { item.Sequence = itemIndex + 1 } });\n\n            this.updateAgenda(calendarCategories, true);\n\n            //Remove object so the bill is no longer currently selected in the dropdown\n            let selectedBill = [...this.state.selectedBill];\n            selectedBill[index] = '';\n            this.setState({\n                selectedBill: selectedBill\n            });\n        }\n\n        if (callback) {\n            callback();\n        }\n    }\n\n    genCalendarPreview(category) {\n        this.setState({\n            gettingPdf: true\n        });\n        // This endpoint returns a pdf document and not json so the partnerRequest function will not work\n        // It doesn't need to be saved to the redux store because it will not be referenced after the user sees it. So it is called here within the component.\n        const API_URL = window.env ? window.env.API_SERVER : '';\n        const idToken = 'LIS_ID_TOKEN';\n        let signal = new window.AbortController().signal;\n        const config = {\n            headers: {\n                'content-type': \"application/json; charset=utf-8\",\n                Authorization: \"Bearer \" + localStorage.getItem(idToken),\n                'WebAPIKey': process.env.REACT_APP_API_KEY\n            },\n            method: \"GET\",\n            signal: signal\n        };\n        let params = `?calendarId=${this.state.calendarData.CalendarID}`\n        if (category) {\n            params += `&calendarCategoryID=${category.CalendarCategoryID}`\n        }\n        fetch((API_URL || process.env.REACT_APP_CALENDAR_FILE_API_URL) + '/CalendarFileGeneration/api/PreviewCalendarFileAsync' + params, config)\n            .then(response => {\n                if (response.status === 204) {\n                    throw 'No Content';\n                } else if (response.status > 399) {\n                    throw response;\n                } else {\n                    response.blob()\n                        .then(res => {\n                            if (this.pdfRef && this.pdfRef.current) {\n                                let pdfRef = this.pdfRef.current;\n                                pdfRef.setAttribute('src', URL.createObjectURL(res));\n                                pdfRef.onload = () => {\n                                    this.setState({\n                                        gettingPdf: false\n                                    });\n                                };\n                            }\n                        })\n                }\n            }).catch(err => {\n                if (err.name === 'AbortError') {\n                    return;\n                }\n                this.setState({\n                    gettingPdf: false\n                });\n                //This is a response and the text needs to be extracted\n                if (err.text) {\n                    err.text().then(err => console.log(err.toString()));\n                } else {\n                    console.log(err.toString())\n                }\n                this.props.actions.makeToast([{ message: \"Failed To Get Data\", type: \"failure\" }]);\n            })\n    }\n\n    addComment() {\n        let newComments = this.state.comments;\n        let newTempComments = this.state.tempComments\n\n        newComments.push(\n            {\n                CalendarID: this.state.calendarData.CalendarID,\n                Comment: \"\",\n                Sequence: this.state.comments.length > 0 ? this.state.comments[this.state.comments.length - 1].Sequence + 1 : 1\n            }\n        )\n\n        newTempComments.push(\n            {\n                Comment: \"\",\n                Sequence: newComments[newComments.length - 1].Sequence\n            }\n        )\n\n        this.setState({\n            comments: newComments,\n            tempComments: newTempComments\n        }, () => {\n            this.toggleCommentEdit(newComments[newComments.length - 1].Sequence)\n        })\n    }\n\n    removeComment(i) {\n        let newComments = this.state.comments;\n        if (newComments[i].CalendarCommentID != undefined) {\n            newComments[i].DeletionDate = moment().toISOString();\n            newComments[i].Sequence = 0;\n            newComments.sort((a, b) => a.Sequence - b.Sequence);\n        } else {\n            newComments.splice(i, 1);\n        }\n\n        let newSequence = 1;\n\n        for (let j = 0; j < newComments.length; j++) {\n            if (!newComments[j].DeletionDate) {\n                newComments[j].Sequence = newSequence;\n                newSequence++;\n            }\n        }\n\n        this.setState({\n            comments: newComments\n        })\n    }\n\n    commentShift(i, shiftUp) {\n        let newComments = [...this.state.comments];\n        let newTempComments = [...this.state.tempComments];\n        let newSequence = shiftUp ? newComments[i - 1].Sequence : newComments[i + 1].Sequence;\n\n        let commentEdit = [...this.state.commentEdit];\n        commentEdit[i] = commentEdit[shiftUp ? i - 1 : i + 1] == true ? true : false;\n        commentEdit[shiftUp ? i - 1 : i + 1] = true;\n\n        newComments[i].Sequence = newSequence;\n        newTempComments[i].Sequence = newSequence\n\n        if (shiftUp) {\n            newComments[i - 1].Sequence = newSequence + 1;\n            newTempComments[i - 1].Sequence = newSequence + 1;\n        } else {\n            newComments[i + 1].Sequence = newSequence - 1;\n            newTempComments[i + 1].Sequence = newSequence - 1;\n        }\n\n        newComments.sort((a, b) => a.Sequence - b.Sequence);\n        newTempComments.sort((a, b) => a.Sequence - b.Sequence);\n\n        this.setState({\n            comments: newComments,\n            tempComments: newTempComments,\n            commentEdit: commentEdit\n        })\n    }\n\n    handleProFormaChange() {\n        let calendarData = { ...this.state.calendarData };\n        calendarData.IsProforma = !calendarData.IsProforma\n        this.setState({\n            calendarData: calendarData\n        });\n    }\n\n    toggleCalendarPreview(categoryIndex) {\n        this.setState({\n            showCategoryPreview: categoryIndex\n        });\n    }\n\n    togglePortal(state, category) {\n        this.setState({\n            showPortal: !state\n        }, () => {\n            if (this.state.showPortal && category) {\n                this.genCalendarPreview(category === 'All' ? '' : category);\n            }\n        });\n    }\n\n    saveCalendar(publishFlag) {\n        this.setState({ isSaving: true });\n        let calendarSave = { ...this.state.calendarData };\n        //Add new comments\n        calendarSave.CalendarComments = this.state.comments;\n\n        //If saving or publishing set isActive off showAmendments. If unpublishing, set showAmendments off isActive. \n        calendarSave.CalendarCategories.forEach(category => {\n            if ([98, 102].includes(category.CalendarCategoryTypeID)) {\n                if (publishFlag || (!calendarSave.IsPublic && !publishFlag)) {\n                    category.Agendas.forEach(agenda => {\n                        agenda.AgendaItems?.forEach(item => {\n                            if (item.LDNumber) {\n                                item.IsActive = category.showAmendments;\n                            }\n                        });\n                    });\n                } else if (!publishFlag) {\n                    category.showAmendments = !!category.Agendas.flatMap(agenda => agenda.AgendaItems).find(agendaItem => agendaItem.IsActive && agendaItem.LDNumber);\n                }\n            }\n        })\n\n        //Set whether it should be published or not. The published value depends on what button the user clicked\n        calendarSave.IsPublic = publishFlag;\n        this.props.actions.saveCalendar({ Calendars: [calendarSave] })\n            .then(failureMessage => {\n                if (this.state.showPreview || calendarSave.IsPublic) {\n                    let content = this.componentRef.innerHTML.replace(/\\\\\"/g, '');\n                    this.props.actions.sendCalendarHtml({ Chamber: calendarSave.ChamberCode, CalendarDate: calendarSave.CalendarDate, CalendarNumber: calendarSave.CalendarNumber, ContentHTML: content });\n                }\n                if (publishFlag) {\n                    //Calendars cannot be edited once published so send the user back to the grid\n                    const calendarId = this.props.calendar.calendarSave.CalendarID;\n                    this.props.navigate('/calendar-management')\n                    this.props.actions.saveCalendarFile(\"?calendarID=\" + calendarId)\n                } else {\n                    //If the form was not published then get the new mod dates and update the React state variables\n                    let calendarSave = { ...this.props.calendar.calendarSave };\n                    let comments = [];\n\n                    for (let i = 0; i < calendarSave.CalendarComments.length; i++) {\n                        let comment = calendarSave.CalendarComments[i];\n                        comment.Sequence = i + 1;\n                        comments.push(comment);\n                    }\n\n                    calendarSave.CalendarCategories.forEach(category => {\n                        category.Agendas.sort((a, b) => NUMERIC_SORT_CATEGORIES.includes(category.CalendarCategoryTypeID) ? sortAgendasNumerically(a, b, calendarSave.ChamberCode) : sortAgendas(a, b, calendarSave.ChamberCode))\n                        //Persist old showAmendments after save or unpublish\n                        if ([98, 102].includes(category.CalendarCategoryTypeID)) {\n                            category.showAmendments = !!category.Agendas.flatMap(agenda => agenda.AgendaItems).find(agendaItem => agendaItem.IsActive && agendaItem.LDNumber);\n                        }\n                    })\n\n                    this.setState({\n                        calendarData: calendarSave,\n                        comments: comments,\n                        isSaving: false,\n                        pendingSave: false,\n                        calendarDate: calendarSave.CalendarDate\n                    });\n                }\n                let toasts = [];\n                if (failureMessage && failureMessage.includes(\"Minutes\")) {\n                    toasts.push({ message: \"Problem with Minutes Creation\", type: \"failure\" });\n                }\n                toasts.push({ message: `Calendar ${publishFlag ? 'Published' : 'Saved'}`, type: \"success\" });\n                this.props.actions.makeToast(toasts)\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    isSaving: false\n                });\n                console.log(err)\n                this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n            });\n    }\n\n    handlePdfFile(e) {\n        this.setState({\n            selectedFile: e.target.files[0]\n        });\n    }\n\n    submitPdfFile() {\n        this.setState({\n            isSubmittingFile: true\n        });\n        this.props.actions.replacePdf('?calendarID=' + this.state.calendarData.CalendarID, this.state.selectedFile)\n            .then(() => {\n                this.setState({\n                    isSubmittingFile: false,\n                    selectedFile: ''\n                });\n                this.props.actions.makeToast([{ message: \"PDF Replacement Success\", type: \"success\" }]);\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    isSubmittingFile: false\n                });\n                this.props.actions.makeToast([{ message: \"PDF Replacement Failed\", type: \"failure\" }]);\n            })\n    }\n\n    changeConveneTime(date) {\n        let calendarData = { ...this.state.calendarData };\n        calendarData.CalendarDate = date.toISOString();\n        this.setState({\n            calendarData: calendarData\n        });\n    }\n\n    toggleAgenda(catIndex, agendaIndex) {\n        let calendar = { ...this.state.calendarData };\n        let agenda = calendar.CalendarCategories.filter(c => !c.DeletionDate)[catIndex].Agendas[agendaIndex];\n        agenda.show = !agenda.show;\n        if (agenda.IsActive && agenda.LegislationNumber && !agenda.Versions) {\n            agenda.Versions = []\n            this.props.actions.getBillVersionByBillNumber('?BillNumber=' + calendar.CalendarCategories.filter(c => !c.DeletionDate)[catIndex].Agendas[agendaIndex].LegislationNumber + '&SessionID=' + calendar.SessionID)\n                .then(() => {\n                    // Get the calendar data again just in case the user toggled the agenda items\n                    calendar = { ...this.state.calendarData };\n                    let versions = this.props.bills.billVersion.filter(ver => ver.Version !== \"Amendment\" && moment(ver.DraftDate).isSameOrBefore(calendar.CalendarDate))\n                    // Most recent versions first\n                    versions = versions.sort((a, b) => moment(a.DraftDate).isSameOrBefore(b.DraftDate))\n                    calendar.CalendarCategories.filter(c => !c.DeletionDate)[catIndex].Agendas[agendaIndex].Versions = versions\n                    this.setState({\n                        calendarData: calendar\n                    });\n                }).catch(err => {\n                    if (err === \"Aborted\") {\n                        return\n                    }\n                    calendar = { ...this.state.calendarData };\n                    calendar.CalendarCategories.filter(c => !c.DeletionDate)[catIndex].Agendas[agendaIndex].Versions = \"fail\";\n                    this.setState({\n                        calendarData: calendar\n                    });\n                })\n        }\n        this.setState({\n            calendarData: calendar\n        });\n    }\n\n    toggleCommentEdit(sequence) {\n        let commentEdit = [...this.state.commentEdit];\n        let tempComments = [...this.state.tempComments];\n\n        commentEdit[sequence - 1] = !commentEdit[sequence - 1];\n        //Reset the temporary comment value\n        tempComments.find(x => x.Sequence === sequence).Comment = this.state.comments.find(x => x.Sequence === sequence).Comment;\n\n        this.setState({\n            commentEdit: commentEdit,\n            tempComments: tempComments\n        })\n    }\n\n    confirmCommentEdit(sequence) {\n        let comments = [...this.state.comments];\n\n        comments.find(x => x.Sequence === sequence).Comment = this.state.tempComments.find(x => x.Sequence === sequence).Comment;\n\n        this.setState({\n            comments: comments\n        }, () => {\n            this.toggleCommentEdit(sequence)\n        })\n    }\n\n    toggleShowTitles() {\n        this.setState({\n            showTitles: !this.state.showTitles\n        })\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { message } = this.state;\n\n        let conveneTime = moment.utc(this.state.calendarData.CalendarDate);\n        let timeChecker = conveneTime.clone().startOf('day');\n        // By default created calendars have a time of 00:00. If it is midnight then display it as 12:00 pm instead\n        if (conveneTime.isSame(timeChecker)) {\n            conveneTime.hour(12).startOf('hour');\n        }\n        if (message) {\n            return (\n                <div className=\"dlas-forms\">\n                    <span>{message}</span>\n                </div>\n            );\n        }\n        else {\n            let calendarFileUrl = '';\n            if (this.state.calendarData.CalendarFiles) {\n                const pdfFile = this.state.calendarData.CalendarFiles.find(file => file.FileURL.toUpperCase().includes('PDF'));\n                if (pdfFile) {\n                    const url = new URL(pdfFile.FileURL);\n                    calendarFileUrl = lisDocDomain + (url.pathname[0] === '/' ? url.pathname : '/' + url.pathname);\n                }\n            }\n\n            //This calendarTime logic is also set in lis-public-calendar-details, if changed here, change there as well\n            const calendarTime = moment.utc(this.state.calendarData.CalendarDate).isSame(moment.utc(this.state.calendarData.CalendarDate).hour(0), \"minute\")\n                || moment.utc(this.state.calendarData.CalendarDate).isSame(moment.utc(this.state.calendarData.CalendarDate).hour(12), \"minute\")\n                ? \"12 noon\"\n                : moment.utc(this.state.calendarData.CalendarDate).format(\"h:mm a\");\n\n            if (this.state.showPreview) {\n                return (\n                    <div style={{ paddingBottom: '75px' }}>\n                        {this.state.showPortal &&\n                            <Popout togglePortal={this.togglePortal} windowTitle=\"PDF Preview\">\n                                {this.state.gettingPdf &&\n                                    <div className=\"center-spinner spinner\">You must save before seeing changes in this PDF preview</div>\n                                }\n                                <iframe style={{ display: this.state.gettingPdf ? 'none' : 'block', width: '100%', height: '100%' }} ref={this.pdfRef}></iframe>\n                            </Popout>\n                        }\n                        <div className=\"flex-row\">\n                            <h2>Calendar Preview</h2>\n                            <ReactToPrint\n                                trigger={() => <a type=\"button\" className=\"button print\"> Print</a>}\n                                content={() => this.componentRef}\n                                pageStyle={\"break-inside: avoid\"}\n                            />\n                        </div>\n                        <CalendarDetailsComponent\n                            calendar={this.state.calendarData}\n                            calendarTime={calendarTime}\n                            session={this.state.selectedSession}\n                            comments={this.state.comments}\n                            updateAgendaItems={this.updateAgendaItems}\n                            isCalendarForm={true}\n                            toggleAgenda={this.toggleAgenda}\n                            sessionList={this.props.session.sessionList}\n                            calendarCategoryReferences={this.state.calendarCategories}\n                        />\n                        <div style={{ display: \"none\" }}>\n                            <div ref={el => (this.componentRef = el)}>\n                                <CalendarDetailsPrintout\n                                    calendar={this.state.calendarData}\n                                    session={this.state.selectedSession}\n                                    comments={this.state.comments}\n                                />\n                            </div>\n                        </div>\n                        <div className=\"align-right floating-button-bar inline-list\">\n                            <button onClick={() => this.saveCalendar(PUBLISH_CALENDAR)} disabled={this.state.isSaving} className=\"button\">{this.state.isSaving ? \"Publishing...\" : \"Publish\"}</button>\n                            <button onClick={this.togglePreview} className=\"button secondary\">Edit</button>\n                            <button disabled={this.state.pendingSave || this.state.calendarData.IsPublic} onClick={() => this.togglePortal(this.state.showPortal, 'All')} className=\"button\" type=\"button\">PDF Preview</button>\n                        </div>\n                    </div>\n                );\n            } else {\n                return (\n                    <React.Fragment>\n                        <div>\n                            <Prompt\n                                when={this.state.pendingSave === true}\n                                message={`You have unsaved changes. Are you sure you would like to leave?`}\n                            />\n                        </div>\n                        {this.state.calendarData ? <h1>{(this.state.calendarData.ChamberCode === \"H\" ? \"House \" : \"Senate \") + \"Calendar\"}</h1> : <h1>&nbsp;</h1>}\n                        {this.state.showPortal &&\n                            <Popout togglePortal={this.togglePortal} windowTitle=\"Preview\">\n                                {this.state.gettingPdf &&\n                                    <div className=\"center-spinner spinner\">You must save before seeing changes in this PDF preview</div>\n                                }\n                                <iframe style={{ display: this.state.gettingPdf ? 'none' : 'block', width: '100%', height: '100%' }} ref={this.pdfRef}></iframe>\n                            </Popout>\n                        }\n                        {this.state.showCategoryPreview !== -1 &&\n                            <div onClick={() => this.toggleCalendarPreview(-1)} className=\"overlay center-content\">\n                                <div className=\"full\">\n                                    <div onClick={e => e.stopPropagation()} className=\"dlas-forms user-forms advanced-search overlay-content animated-fade-in-up\" ref={el => (this.componentRef = el)}>\n                                        <CalendarDetailsComponent\n                                            calendar={{ ...this.state.calendarData, CalendarCategories: [this.state.calendarData.CalendarCategories[this.state.showCategoryPreview]] }}\n                                            calendarTime={calendarTime}\n                                            session={this.state.selectedSession}\n                                            comments={[]}\n                                            userClaims={{ resources: [] }}\n                                            toggleAgenda={this.toggleAgenda}\n                                            sessionList={this.props.session.sessionList}\n                                            isCalendarForm={true}\n                                            calendarCategoryReferences={this.state.calendarCategories}\n                                        />\n                                        <button type=\"button\" onClick={() => this.toggleCalendarPreview(-1)} className=\"button secondary\">Close</button>\n                                    </div>\n                                </div>\n                            </div>\n                        }\n                        <div className=\"user-forms\">\n                            {!this.state.isLoaded &&\n                                <div className=\"center-spinner spinner\">Loading results...</div>\n                            }\n                            {this.state.isLoaded &&\n                                <div className=\"dlas-forms\">\n                                    <span className=\"error-message\">{message}</span>\n\n                                    <fieldset style={{ paddingBottom: '50px' }} className=\"fieldset-collapse fieldset-open\">\n                                        <legend>Calendar Information</legend>\n                                        <div>\n                                            <div className=\"multi-row four no-margin\">\n                                                <div>\n                                                    <Fields.TextInput\n                                                        value={this.state.selectedSession ? this.state.selectedSession.SessionYear + ' ' + this.state.selectedSession.DisplayName : ''}\n                                                        disabled={true}\n                                                    />\n                                                </div>\n                                                <div>\n                                                    <Fields.TextInput\n                                                        value={this.state.calendarData ? moment(this.state.calendarData.CalendarDate).format(\"L\") + (this.state.calendarData.CalendarNumber > 1 ? [' (', ')'].join('Supp. ' + (this.state.calendarData.CalendarNumber - 1)) : '') : ''}\n                                                        disabled\n                                                    />\n                                                </div>\n                                                <div>\n                                                    {/* Supplemental calendars do not get this date picker */}\n                                                    {this.state.calendarData.CalendarNumber < 2 &&\n                                                        <DatePicker\n                                                            selected={conveneTime}\n                                                            showTimeSelect\n                                                            showTimeSelectOnly\n                                                            dateFormat=\"h:mm a\"\n                                                            timeFormat=\"h:mm a\"\n                                                            onChange={this.changeConveneTime}\n                                                        />\n                                                    }\n                                                </div>\n                                                <div className=\"flex-row flex-end flex-vertical-center\">\n                                                    {calendarFileUrl && !this.state.isSubmittingFile &&\n                                                        <>\n                                                            <button style={{ marginRight: 5 }} type=\"button\" className=\"button small-button file-button\"><input type=\"file\" accept=\".pdf\" onChange={this.handlePdfFile} />{this.state.selectedFile ? this.state.selectedFile.name : \"Replace PDF\"}</button>\n                                                            {this.state.selectedFile ?\n                                                                <button onClick={this.submitPdfFile} type=\"button\" className=\"button small-button\">Submit</button>\n                                                                :\n                                                                <React.Fragment>\n                                                                    <a target=\"_blank\" className=\"icon pdf\" href={calendarFileUrl}></a>\n                                                                    {this.state.calendarData.CalendarNumber < 2 &&\n                                                                        <a target=\"_blank\" className=\"icon file-empty\" style={{ marginLeft: \"5px\" }} href={calendarFileUrl.replace(\".PDF\", \"-padded.PDF\")}></a>}\n                                                                </React.Fragment>\n                                                            }\n                                                        </>\n                                                    }\n                                                    {calendarFileUrl && this.state.isSubmittingFile &&\n                                                        <div className=\"small-spinner\"></div>\n                                                    }\n                                                </div>\n                                            </div>\n                                            <div className=\"flex-row\">\n                                                <label className=\"label-and-checkbox pro-forma\"><input type=\"checkbox\" checked={this.state.calendarData.IsProforma} onChange={this.handleProFormaChange} /> Create a Pro Forma Calendar</label>\n                                                <button type=\"button\" className=\"button float-right title-toggle\" onClick={() => this.toggleShowTitles()}>{this.state.showTitles ? \"Show Bill Captions\" : \"Show Bill Titles\"}</button>\n                                            </div>\n                                            {this.state.comments.map((comment, i) => {\n                                                return (\n                                                    comment.DeletionDate === undefined &&\n                                                    <div className=\"grid-wrapper calendar-comment-row\" key={i}>\n                                                        {this.state.commentEdit[comment.Sequence - 1] ?\n                                                            <React.Fragment>\n                                                                <div>\n                                                                    <Fields.TextArea\n                                                                        label={\"Comment \" + comment.Sequence}\n                                                                        type=\"text\"\n                                                                        style={{ resize: 'vertical', minHeight: 65, width: \"100%\" }}\n                                                                        placeholder=\"Comments\"\n                                                                        value={this.state.tempComments.find(x => x.Sequence === comment.Sequence).Comment}\n                                                                        onChange={(e) => this.handleCommentChange(e, comment.Sequence)}\n                                                                    />\n                                                                </div>\n                                                                <div className=\"grid-wrapper two comment-controls\">\n                                                                    <div style={{ paddingTop: \"25px\" }}>\n                                                                        <button className=\"icon save\" style={{ marginRight: \"10px\" }} onClick={() => this.confirmCommentEdit(comment.Sequence)} />\n                                                                        <button className=\"icon delete\" onClick={() => this.toggleCommentEdit(comment.Sequence)} />\n                                                                    </div>\n                                                                    <div className=\"arrows\">\n                                                                        {i !== 0 && this.state.comments.length > 1 &&\n                                                                            <button className=\"arrow-up\" onClick={() => this.commentShift(i, true)} />\n                                                                        }\n                                                                        {i !== this.state.comments.length - 1 &&\n                                                                            <button className=\"arrow-down\" onClick={() => this.commentShift(i, false)} />\n                                                                        }\n                                                                    </div>\n                                                                </div>\n                                                            </React.Fragment>\n                                                            :\n                                                            <React.Fragment>\n                                                                <div>\n                                                                    <label>{\"Comment \" + comment.Sequence}</label>\n                                                                    <p class=\"calendar-comment\">{comment.Comment}</p>\n                                                                </div>\n                                                                <div className=\"grid-wrapper two\">\n                                                                    <div style={{ paddingTop: \"30px\", display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gridGap: \"10px\" }}>\n                                                                        <button className=\"button edit\" onClick={() => this.toggleCommentEdit(comment.Sequence)} />\n                                                                        <button className=\"icon bin\" onClick={() => this.removeComment(i)} />\n                                                                    </div>\n                                                                    <div />\n                                                                </div>\n                                                            </React.Fragment>\n                                                        }\n                                                    </div>\n                                                )\n                                            })\n                                            }\n                                            <div className=\"add-comment\">\n                                                <button className=\"button float-right\" onClick={() => this.addComment()}>Add Comment</button>\n                                            </div>\n                                        </div>\n                                        <BillsGrid\n                                            organizedBills={this.state.calendarData.CalendarCategories}\n                                            updateAgenda={this.updateAgenda}\n                                            calendarCategories={this.state.calendarCategories}\n                                            hideCategories={this.state.hideCategories}\n                                            selectAllActive={this.state.selectAllActive}\n                                            selectAllInactive={this.state.selectAllInactive}\n                                            changeCategoryDropdown={this.changeCategoryDropdown}\n                                            selectedCategory={this.state.selectedCategory}\n                                            addCategory={this.addCategory}\n                                            deleteCategory={this.deleteCategory}\n                                            selectedBill={this.state.selectedBill}\n                                            changeBillDropdown={this.changeBillDropdown}\n                                            addBill={this.addBill}\n                                            billList={this.state.billList}\n                                            toggleCalendarPreview={this.toggleCalendarPreview}\n                                            pendingSave={this.state.pendingSave}\n                                            hideCategory={this.state.hideCategory}\n                                            toggleHideCategory={this.toggleHideCategory}\n                                            toggleHideAllCategories={this.toggleHideAllCategories}\n                                            toggleHideAllNonIncludedBills={this.toggleHideAllNonIncludedBills}\n                                            hideAllNonIncludedBills={this.state.hideAllNonIncludedBills}\n                                            togglePortal={this.togglePortal}\n                                            showPortal={this.state.showPortal}\n                                            updateAgendaItems={this.updateAgendaItems}\n                                            calendarTime={calendarTime}\n                                            showTitles={this.state.showTitles}\n                                            changeDateDropdown={this.changeDateDropdown}\n                                            changeCommitteeDropdown={this.changeCommitteeDropdown}\n                                            dateList={this.state.selectedCommittee && this.state.selectedCommittee !== \"\" ? this.state.dateList.filter(x => x.committee.includes(this.state.selectedCommittee.value)) : this.state.dateList}\n                                            committeeList={this.state.selectedDate && this.state.selectedDate !== \"\" ? this.state.committeeList.filter(x => this.state.selectedDate.committee.includes(x.value)) : this.state.committeeList}\n                                            selectedCommittee={this.state.selectedCommittee}\n                                            selectedDate={this.state.selectedDate}\n                                            fullCommitteeList={this.props.committee.committeeList}\n                                            chamberCode={this.state.calendarData.ChamberCode}\n                                            sessionCode={this.state.calendarData.SessionCode}\n                                            userRoles={this.props.login.userClaims.roles}\n                                        />\n                                    </fieldset>\n                                    <div className=\"align-right floating-button-bar inline-list\">\n                                        <button disabled={this.state.isSaving} onClick={() => this.saveCalendar(SAVE_CALENDAR)} className=\"button\" type=\"submit\">{this.state.calendarData.IsPublic ? \"Unpublish\" : this.state.isSaving ? \"Saving...\" : \"Save\"}</button>\n                                        <button disabled={this.state.pendingSave || this.state.isSaving || this.state.calendarData.IsPublic} onClick={this.togglePreview} className=\"button\" type=\"button\">Preview</button>\n                                        <button disabled={this.state.pendingSave || this.state.isSaving || this.state.calendarData.IsPublic} onClick={() => this.togglePortal(this.state.showPortal, 'All')} className=\"button\" type=\"button\">PDF Preview</button>\n                                    </div>\n                                </div>\n                            }\n                        </div>\n                    </React.Fragment>\n                );\n            }\n        }\n    }\n};\n\nconst CalendarManagementForm = connect(\n    (state) => {\n        const { calendar, session, bills, nav, committee, login } = state;\n        return {\n            calendar,\n            session,\n            bills,\n            nav,\n            committee,\n            login\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, calendarActionCreators, sessionActionCreators, billActionCreators, navActionCreators, committeeActionCreators), dispatch)\n        }\n    }\n)(SenateCalendarFormComponent)\n\nexport default CalendarManagementForm;\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\n\nimport { calendarActionCreators } from '../../../stores/lis-calendar-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport HouseForm from './lis-house-calendar-form';\nimport SenateForm from './lis-senate-calendar-form';\n\nclass CalendarFormContainerComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            isLoading: true\n        }\n\n        this.navigate = this.navigate.bind(this);\n    }\n\n    componentDidMount() {\n        let calendarBillParams = '?calendarId=' + this.props.match.params.calendarid;\n\n        this.props.actions.getCalendarById(calendarBillParams, true)\n            .then(() => {\n                this.setState({\n                    isLoading: false\n                })\n            })\n            .catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    isLoading: false,\n                    message: \"Failed to get data from server\"\n                })\n                this.props.actions.makeToast([{ message: \"Load Failed\", type: \"failure\" }])\n            });\n    }\n\n    navigate(path) {\n        this.props.history.push(path);\n    }\n\n    render() {\n        return (\n            <div>\n                {!this.state.isLoading ?\n                    <React.Fragment>\n                        {this.props.calendar.calendarGet.ChamberCode === \"H\"\n                            ? <HouseForm\n                                calendarData={this.props.calendar.calendarGet}\n                                navigate={this.navigate}\n                            />\n                            : <SenateForm\n                                calendarData={this.props.calendar.calendarGet}\n                                navigate={this.navigate}\n                            />\n                        }\n                    </React.Fragment>\n                    : <div className=\"center-spinner spinner\">Loading results...</div>\n                }\n            </div>\n        )\n    }\n}\n\nconst CalendarFormContainer = connect(\n    (state) => {\n        const { calendar, nav } = state;\n        return {\n            calendar,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, calendarActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(CalendarFormContainerComponent)\n\nexport default CalendarFormContainer;","import React from 'react';\nimport { Route } from 'react-router';\nimport CalendarGrid from './lis-calendar-grid';\nimport CalendarFormContainer from './lis-calendar-form-container';\n\nclass CalendarManagement extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            selectedChamber: '',\n            selectedSession: ''\n        }\n        this.handleDropdownChange = this.handleDropdownChange.bind(this);\n    }\n\n    handleDropdownChange(key, val, callback) {\n        this.setState({\n            [key]: val\n        }, () => callback());\n    }\n\n    render() {\n        const { selectedChamber, selectedSession } = this.state;\n        return (\n            <div>\n                <Route exact path={this.props.match.path} render={props => <CalendarGrid\n                    {...props}\n                    selectedChamber={selectedChamber}\n                    selectedSession={selectedSession}\n                    handleDropdownChange={this.handleDropdownChange}\n                />} />\n                <Route path={\"/calendar-management/edit-calendar/:calendarid\"} component={CalendarFormContainer} />\n            </div>\n        )\n    }\n}\n\nexport default CalendarManagement;","import { partnerRequest, publicRequest } from '../services/request.service'\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst minutesListRequest = 'MINUTES_LIST_REQUEST';\nconst minutesListSuccess = 'MINUTES_LIST_SUCCESS';\nconst minutesListFailure = 'MINUTES_LIST_FAILURE';\n\nconst minutesCreateRequest = 'MINUTES_CREATE_REQUEST';\nconst minutesCreateSuccess = 'MINUTES_CREATE_SUCCESS';\nconst minutesCreateFailure = 'MINUTES_CREATE_FAILURE';\n\nconst categoryCreateSuccess = 'CATEGORY_CREATE_SUCCESS';\nconst categoryCreateFailure = 'CATEGORY_CREATE_FAILURE';\n\nconst minutesBookSuccess = 'MINUTES_BOOK_SUCCESS';\nconst minutesBookFailure = 'MINUTES_BOOK_FAILURE';\n\nconst minutesBookForCalendarSuccess = 'MINUTES_BOOK_FOR_CALENDAR_SUCCESS';\nconst minutesBookForCalendarFailure = 'MINUTES_BOOK_FOR_CALENDAR_FAILURE';\n\nconst minutesBookSaveSuccess = 'MINUTES_BOOK_SAVE_SUCCESS';\nconst minutesBookSaveFailure = 'MINUTES_BOOK_SAVE_FAILURE';\n\nconst minutesBookPublishSuccess = 'MINUTES_BOOK_SAVE_SUCCESS';\nconst minutesBookPublishFailure = 'MINUTES_BOOK_SAVE_FAILURE';\n\nconst clerksCopyGenSuccess = 'GEN_CLERKS_COPY_SUCCESS';\nconst clerksCopyGenFailure = 'GEN_CLERKS_COPY_FAILURE';\n\nconst entriesSaveSuccess = 'ENTRIES_SAVE_SUCCESS';\nconst entriesSaveFailure = 'ENTRIES_SAVE_FAILURE';\n\nconst entriesCreateSuccess = 'ENTRIES_CREATE_SUCCESS';\nconst entriesCreateFailure = 'ENTRIES_CREATE_FAILURE';\n\nconst entriesCommunicationSaveSuccess = 'ENTRY_COMMUNICATION_SAVE_SUCCESS';\nconst entriesCommunicationSaveFailure = 'ENTRY_COMMUNICATION_SAVE_FAILURE';\n\nconst actionTypesSuccess = \"ACTION_TYPE_LIST_SUCCESS\";\nconst actionTypesFailure = \"ACTION_TYPE_LIST_FAILURE\";\n\nconst chairReportSuccess = \"CHAIR_REPORT_SUCCESS\";\nconst chairReportFailure = \"CHAIR_REPORT_FAILURE\";\n\nconst committeeMinutesSummarySuccess = \"COMMITTEE_MINUTES_SUMMARY_SUCCESS\";\nconst committeeMinutesSummaryFailure = \"COMMITTEE_MINUTES_SUMMARY_FAILURE\";\n\nconst initialState = {\n    minutesList: [],\n    minutesMessage: '',\n    minutesCreateMessage: '',\n    minutesBook: '',\n    minutesBookError: '',\n    minutesBookForCalendar: '',\n    minutesBookErrorForCalendarError: '',\n    minutesBookSave: [],\n    minutesBookSaveError: '',\n    minutesBookPublish: [],\n    minutesBookPublishError: '',\n    clerksCopyGen: [],\n    clerksCopyGenError: '',\n    categoryCreate: '',\n    categoryCreateError: '',\n    entriesSave: [],\n    entriesSaveError: '',\n    entriesCreate: [],\n    entriesCreateError: '',\n    entriesCommunicationSave: '',\n    entriesCommunicationSaveError: '',\n    minutesGen: '',\n    minutesGenError: '',\n    actionTypes: [],\n    actionTypesError: '',\n    chairReport: '',\n    chairReportError: '',\n    committeeMinutesSummary: '',\n    committeeMinutesSummaryError: ''\n};\n\nexport const minutesActionCreators = {\n    // GET MINUTES LIST FOR MINUTES MGMT GRID\n    requestMinutesList: () => ({\n        type: minutesListRequest,\n        minutesList: [],\n        isFetching: true\n    }),\n\n    receiveMinutesList: (list, message) => ({\n        type: minutesListSuccess,\n        isFetching: false,\n        minutesList: list,\n        minutesMessage: message\n    }),\n\n    minutesListError: (message) => ({\n        type: minutesListFailure,\n        isFetching: false,\n        minutesList: [],\n        minutesMessage: message\n    }),\n\n    getMinutesList: (params, partner) => {\n        return dispatch => {\n            dispatch(minutesActionCreators.requestMinutesList());\n\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            let request = '';\n            if (partner) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_MINUTES_API_URL) + '/MinutesBook/api/GetPartnerMinutesBookListAsync?', 'GET', headers, '', params);\n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_MINUTES_API_URL) + '/MinutesBook/api/GetPublishedMinutesBookListAsync?', 'GET', headers, '', params);\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(minutesActionCreators.minutesListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(minutesActionCreators.receiveMinutesList(result[1].Minutes))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(minutesActionCreators.receiveMinutesList([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    // MINUTES CREATE\n    requestMinutesCreate: () => ({\n        type: minutesCreateRequest,\n        isFetching: true\n    }),\n\n    receiveMinutesCreate: (message) => ({\n        type: minutesCreateSuccess,\n        isFetching: false,\n        minutesCreateMessage: message\n    }),\n\n    minutesCreateError: (message) => ({\n        type: minutesCreateFailure,\n        isFetching: false,\n        minutesCreateMessage: message\n    }),\n\n    createMinutes: (body, callback) => {\n        return dispatch => {\n            dispatch(minutesActionCreators.requestMinutesCreate());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_MINUTES_API_URL) + '/MinutesBook/api/CreateMinuteBookAsync', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(minutesActionCreators.createMinutesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(minutesActionCreators.receiveMinutesCreate(result[1]))\n                        if (callback) callback()\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(minutesActionCreators.minutesCreateError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveMinutesBook: (resObj) => ({\n        type: minutesBookSuccess,\n        minutesBook: resObj,\n    }),\n\n    minutesBookError: (message) => ({\n        type: minutesBookFailure,\n        minutesBook: '',\n        minutesBookError: message\n    }),\n\n    getMinutesBook: (params, partner) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            let request = '';\n            if (partner) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_MINUTES_API_URL) + '/MinutesBook/api/GetPartnerMinutesBookAsync/', 'GET', headers, '', params);\n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_MINUTES_API_URL) + '/MinutesBook/api/GetMinutesBookAsync/', 'GET', headers, '', params)\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(minutesActionCreators.minutesBookError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(minutesActionCreators.receiveMinutesBook(result[1].MinutesBooks[0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(minutesActionCreators.minutesBookError('Minutes Data not available'))\n                        return Promise.reject('No Minutes Data')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveMinutesBookForCalendar: (resObj) => ({\n        type: minutesBookForCalendarSuccess,\n        minutesBookForCalendar: resObj,\n    }),\n\n    minutesBookForCalendarError: (message) => ({\n        type: minutesBookForCalendarFailure,\n        minutesBookForCalendar: '',\n        minutesBookForCalendarError: message\n    }),\n\n    getMinutesBookForCalendar: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_MINUTES_API_URL) + '/MinutesBook/api/GetMinutesbookInteractiveCalendarAsync/', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(minutesActionCreators.minutesBookForCalendarError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(minutesActionCreators.receiveMinutesBookForCalendar(result[1].MinutesBooks[0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(minutesActionCreators.minutesBookForCalendarError('Minutes Data not available'))\n                        return Promise.reject('No Minutes Data')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveMinutesBookSave: (list) => ({\n        type: minutesBookSaveSuccess,\n        minutesBookSave: list,\n    }),\n\n    minutesBookSaveError: (message) => ({\n        type: minutesBookSaveFailure,\n        minutesBookSave: [],\n        minutesBookSaveError: message\n    }),\n\n    saveMinutesBook: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_MINUTES_API_URL) + '/MinutesBook/api/SaveMinuteBookAsync/?', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(minutesActionCreators.minutesBookSaveError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[1]) {\n                        // Dispatch the success action\n                        dispatch(minutesActionCreators.receiveMinutesBookSave(result[1][0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(minutesActionCreators.minutesBookSaveError('Minutes Data not available'))\n                        return Promise.reject('No Minutes Data')\n                    }\n                }).catch(err => console.log(err))\n        }\n    },\n\n    receiveMinutesBookPublish: (list) => ({\n        type: minutesBookPublishSuccess,\n        minutesBookPublish: list,\n    }),\n\n    minutesBookPublishError: (message) => ({\n        type: minutesBookPublishFailure,\n        minutesBookPublish: [],\n        minutesBookPublishError: message\n    }),\n\n    publishMinutesBook: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_MINUTES_API_URL) + '/MinutesBook/api/PublishMinuteBookAsync/?', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(minutesActionCreators.minutesBookPublishError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[1]) {\n                        // Dispatch the success action\n                        dispatch(minutesActionCreators.receiveMinutesBookPublish(result[1][0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(minutesActionCreators.minutesBookPublishError('Minutes Data not available'))\n                        return Promise.reject('No Minutes Data')\n                    }\n                }).catch(err => console.log(err))\n        }\n    },\n\n    receiveClerksCopyGen: (list) => ({\n        type: clerksCopyGenSuccess,\n        clerksCopyGen: list,\n    }),\n\n    clerksCopyGenError: (message) => ({\n        type: clerksCopyGenFailure,\n        clerksCopyGen: [],\n        clerksCopyGenError: message\n    }),\n\n    genClerksCopy: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_MINUTES_API_URL) + '/LegislationFileGeneration/api/ProcessMinutesClerkCopyAsync/?', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(minutesActionCreators.clerksCopyGenError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[1]) {\n                        // Dispatch the success action\n                        dispatch(minutesActionCreators.receiveClerksCopyGen(result[1][0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(minutesActionCreators.clerksCopyGenError('Minutes Data not available'))\n                        return Promise.reject('No Minutes Data')\n                    }\n                }).catch(err => console.log(err))\n        }\n    },\n\n    receiveCategoryCreate: (result) => ({\n        type: categoryCreateSuccess,\n        categoryCreate: result\n    }),\n\n    categoryCreateError: (message) => ({\n        type: categoryCreateFailure,\n        categoryCreate: '',\n        categoryCreateError: message\n    }),\n\n    createCategory: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_MINUTES_API_URL) + '/MinutesBook/api/CreateMinuteCategoryAsync/?', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(minutesActionCreators.calendarCreateError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(minutesActionCreators.receiveCategoryCreate(result[1][0]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(minutesActionCreators.calendarCreateError('Minutes Data not available'))\n                        return Promise.reject('No Minutes Data')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveEntriesSave: (list) => ({\n        type: entriesSaveSuccess,\n        entriesSave: list[0]\n    }),\n\n    entriesSaveError: (message) => ({\n        type: entriesSaveFailure,\n        entriesSave: [],\n        entriesSaveError: message\n    }),\n\n    saveEntries: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_MINUTES_ENTRY_API_URL) + '/MinuteEntries/api/SaveMinutesEntryAsync/?', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(minutesActionCreators.entriesSaveError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(minutesActionCreators.receiveEntriesSave(result[1]))\n                        //result returns an array with one element\n                        return (result[1][0]);\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(minutesActionCreators.entriesSaveError('Minutes Data not available'))\n                        return Promise.reject('No Minutes Data')\n                    }\n                }).catch(err => console.log(err))\n        }\n    },\n\n    receiveEntriesCreate: (list) => ({\n        type: entriesCreateSuccess,\n        entriesCreate: list[0]\n    }),\n\n    entriesCreateError: (message) => ({\n        type: entriesCreateFailure,\n        entriesCreate: [],\n        entriesCreateError: message\n    }),\n\n    createEntries: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_MINUTES_ENTRY_API_URL) + '/MinuteEntries/api/CreateMinutesEntryAsync/?', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(minutesActionCreators.entriesCreateError(result[1]));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(minutesActionCreators.receiveEntriesCreate(result[1]));\n                        return (result[1][0]);\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(minutesActionCreators.entriesCreateError('Minutes Data not available'));\n                        return Promise.reject('No Minutes Data');\n                    }\n                }).catch(err => console.log(err));\n        }\n    },\n\n    receiveEntriesCommunicationSave: (res) => ({\n        type: entriesCommunicationSaveSuccess,\n        entriesCreate: res\n    }),\n\n    entriesCommunicationSaveError: (message) => ({\n        type: entriesCommunicationSaveFailure,\n        entriesCommunicationSaveError: message\n    }),\n\n    saveEntriesCommunication: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_MINUTES_ENTRY_API_URL) + '/MinuteEntries/api/SaveMinuteEntryCommunicationAsync/', 'PUT', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(minutesActionCreators.entriesCommunicationSaveError(result[1]));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(minutesActionCreators.receiveEntriesCommunicationSave(result[1]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(minutesActionCreators.entriesCommunicationSaveError('No Content'));\n                        return Promise.reject('No Content');\n                    }\n                }).catch(err => console.log(err));\n        }\n    },\n\n    receiveActionTypes: (res) => ({\n        type: actionTypesSuccess,\n        actionTypes: res\n    }),\n\n    actionTypesError: (message) => ({\n        type: actionTypesFailure,\n        actionTypesError: message\n    }),\n\n    getActionTypes: () => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_MINUTES_API_URL) + '/MinutesBook/api/GetActionReferenceTypeListAsync', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(minutesActionCreators.actionTypesError(result[1]));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(minutesActionCreators.receiveActionTypes(result[1].ActionReferenceTypeList));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(minutesActionCreators.actionTypesError('No Content'));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveChairReport: (res) => ({\n        type: chairReportSuccess,\n        chairReport: res\n    }),\n\n    chairReportError: (message) => ({\n        type: chairReportFailure,\n        chairReportError: message\n    }),\n\n    getChairReport: (minutesBookID) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_MINUTES_API_URL) + '/MinutesBook/api/GetChairReportAsync/', 'GET', headers, '', minutesBookID)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(minutesActionCreators.chairReportError(result[1]));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(minutesActionCreators.receiveChairReport(result[1].ChairReports[0]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(minutesActionCreators.chairReportError('No Content'));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveCommitteeMinutesSummary: (res) => ({\n        type: committeeMinutesSummarySuccess,\n        committeeMinutesSummary: res\n    }),\n\n    committeeMinutesSummaryError: (message) => ({\n        type: committeeMinutesSummaryFailure,\n        committeeMinutesSummaryError: message\n    }),\n\n    getCommitteeMinutesSummary: (minutesBookIDs) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_MINUTES_API_URL) + '/MinutesBook/api/GetCommitteeMinutesSummaryAsync/', 'GET', headers, '', minutesBookIDs)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(minutesActionCreators.committeeMinutesSummaryError(result[1]));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(minutesActionCreators.receiveCommitteeMinutesSummary(result[1]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(minutesActionCreators.committeeMinutesSummaryError('No Content'));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    }\n\n}\n\nexport const reducer = (state, action) => {\n\n    state = state || initialState;\n\n    switch (action.type) {\n\n        case minutesListRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            })\n        case minutesListSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                minutesList: action.minutesList,\n                minutesMessage: ''\n            })\n        case minutesListFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                minutesList: action.minutesList,\n                minutesMessage: action.minutesMessage\n            })\n        case minutesCreateRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            })\n        case minutesCreateSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                minutesCreateMessage: ''\n            })\n        case minutesCreateFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                minutesCreateMessage: action.minutesCreateMessage\n            })\n        case minutesBookSuccess:\n            return Object.assign({}, state, {\n                minutesBook: action.minutesBook,\n                minutesBookError: ''\n            })\n        case minutesBookFailure:\n            return Object.assign({}, state, {\n                minutesBookError: action.minutesBookError\n            })\n        case minutesBookForCalendarSuccess:\n            return Object.assign({}, state, {\n                minutesBookForCalendar: action.minutesBookForCalendar,\n                minutesBookForCalendarError: ''\n            })\n        case minutesBookForCalendarFailure:\n            return Object.assign({}, state, {\n                minutesBookForCalendarError: action.minutesBookForCalendarError\n            })\n        case minutesBookSaveSuccess:\n            return Object.assign({}, state, {\n                minutesBookSave: action.minutesBookSave,\n                minutesBookSaveError: ''\n            })\n        case minutesBookSaveFailure:\n            return Object.assign({}, state, {\n                minutesBookSaveError: action.minutesBookSaveError\n            })\n        case minutesBookPublishSuccess:\n            return Object.assign({}, state, {\n                minutesBookPublish: action.minutesBookPublish,\n                minutesBookPublishError: ''\n            })\n        case minutesBookPublishFailure:\n            return Object.assign({}, state, {\n                minutesBookPublishError: action.minutesBookPublishError\n            })\n        case categoryCreateFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                categoryCreateMessage: action.categoryCreateMessage\n            })\n        case categoryCreateSuccess:\n            return Object.assign({}, state, {\n                categoryCreate: action.categoryCreate,\n                categoryCreateMessage: ''\n            })\n        case entriesSaveFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                entriesSaveMessage: action.entriesSaveMessage\n            })\n        case entriesSaveSuccess:\n            return Object.assign({}, state, {\n                entriesSave: action.entriesSave,\n                entriesSaveMessage: ''\n            })\n        case entriesCreateFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                entriesCreateMessage: action.entriesCreateMessage\n            })\n        case entriesCreateSuccess:\n            return Object.assign({}, state, {\n                entriesCreate: action.entriesCreate,\n                entriesCreateMessage: ''\n            })\n        case entriesCommunicationSaveFailure:\n            return Object.assign({}, state, {\n                entriesCommunicationSaveError: action.entriesCommunicationSaveError\n            })\n        case entriesCommunicationSaveSuccess:\n            return Object.assign({}, state, {\n                entriesCommunicationSave: action.entriesCommunicationSave,\n                entriesCommunicationSaveError: ''\n            })\n        case actionTypesFailure:\n            return Object.assign({}, state, {\n                actionTypesError: action.actionTypesError\n            })\n        case actionTypesSuccess:\n            return Object.assign({}, state, {\n                actionTypes: action.actionTypes,\n                actionTypesError: ''\n            })\n        case chairReportFailure:\n            return Object.assign({}, state, {\n                chairReportError: action.chairReportError\n            })\n        case chairReportSuccess:\n            return Object.assign({}, state, {\n                chairReport: action.chairReport,\n                chairReportError: ''\n            })\n        case committeeMinutesSummaryFailure:\n            return Object.assign({}, state, {\n                committeeMinutesSummaryError: action.committeeMinutesSummaryError\n            })\n        case committeeMinutesSummarySuccess:\n            return Object.assign({}, state, {\n                committeeMinutesSummary: action.committeeMinutesSummary,\n                committeeMinutesSummaryError: ''\n            })\n        default:\n            return state\n    }\n};","import React from \"react\";\nimport ReactTable from \"react-table\";\nimport { Link } from 'react-router-dom';\nimport '../../../stylesheets/shared/react-table.css';\nimport moment from 'moment-timezone';\nimport * as Fields from '../../../lis-shared/lis-layout/components/lis-forms-component';\nimport DatePicker from \"react-datepicker\";\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { minutesActionCreators } from '../../../stores/lis-minutes-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { cancelRequest } from '../../../services/request.service';\n\n\nclass MinutesGridComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            showCreateSuccess: false,\n            showCreateFailure: false,\n            isSaving: false,\n            minutesDate: moment(),\n            isLoaded: false,\n            selected: {},\n            sessionList: [],\n            chamberOptions: [{ value: 'H', label: 'House' }, {value: 'S', label: 'Senate' }],\n            sessionDropdown: [],\n            selectedSessionToolbar: '',\n            selectedSessionGrid: '',\n            selectAll: 0,\n            filtered: [{ id: 'all', value: 'true' }],\n            filterAll: 'true',\n            selectedRow: []\n        };\n        this.toggleRow = this.toggleRow.bind(this);\n        this.handleDateChange = this.handleDateChange.bind(this);\n        this.filterAll = this.filterAll.bind(this);\n    };\n\n    //When component has mounted, make the call to the list users API\n    componentDidMount() {\n        let selectedSession = this.props.selectedSession;\n        let defaultSession = '';\n        this.props.actions.getSessionList().then(() => {\n            let sessionList = [...this.props.session.sessionList].reverse();\n            sessionList.forEach(session => {\n                session.label = session.SessionYear + ' ' + session.DisplayName;\n                session.value = session.SessionID;\n                if (session.IsDefault) {\n                    selectedSession = selectedSession || session;\n                    defaultSession = session;\n                }\n            });\n            this.setState({\n                sessionDropdown: sessionList,\n                sessionList: sessionList,\n                selectedSessionGrid: defaultSession\n            });\n            this.props.handleSessionChange(selectedSession, () => this.getMinutesData());\n        });\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    getMinutesData() {\n        if (!this.props.selectedSession) {\n            return\n        }\n        const params = 'sessionID=' + this.props.selectedSession.SessionID + '&chamberCode=S';\n        this.setState({\n            isLoaded: false\n        });\n        this.props.actions.getMinutesList(params, true).then(() => {\n            this.setState({\n                isLoaded: true,\n                minutesList: [...this.props.minutes.minutesList].filter(m => !m.CommitteeID)\n            });\n        }).catch(err => {\n            if(err === 'Aborted') {\n                return;\n            }\n            this.setState({\n                isLoaded: true,\n                message: err.toString()\n            });\n        });\n    }\n\n    handleDateChange(date) {\n        this.setState({\n            minutesDate: moment(date)\n        });\n    }\n\n    handleDropDownChange = (value, state) => {\n        this.setState({\n            [state]: value\n        })\n    }\n\n    handleSessionSelectChange = value => {\n        this.props.handleSessionChange(value, () => this.getMinutesData())\n    }\n\n\n    sendCreateDetails() {\n        const minutesObj = {\n            \"SessionID\": this.state.selectedSessionGrid.SessionID,\n            \"ChamberCode\": \"S\",\n            \"MinutesDate\": this.state.minutesDate\n        }\n        this.setState({\n            isSaving: true\n        });\n        this.props.actions.createMinutes(minutesObj).then(() => {\n            this.setState({\n                showCreateSuccess: true,\n                isSaving: false\n            })\n            setTimeout(function () {\n                this.setState({ showCreateSuccess: false });\n            }.bind(this), 5000);\n            this.props.handleSessionChange(this.state.selectedSessionGrid, () => this.getMinutesData())\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            this.setState({\n                showCreateFailure: true,\n                isSaving: false\n            });\n            setTimeout(function () {\n                this.setState({ showCreateFailure: false });\n            }.bind(this), 5000);\n        });\n    }\n\n    onFilteredChange(filtered) {\n        if (filtered.length > 1 && this.state.filterAll.length) {\n            // NOTE: this removes any FILTER ALL filter\n            const filterAll = '';\n            this.setState({ filtered: filtered.filter((item) => item.id !== 'all'), filterAll })\n        }\n        else\n            this.setState({ filtered });\n    }\n\n    filterAll(value) {\n        const filterAll = value;\n        const filtered = [{ id: 'all', value: filterAll }];\n        // NOTE: this completely clears any COLUMN filters\n        this.setState({ filterAll, filtered });\n    }\n\n    toggleRow(minutesId) {\n        const newSelected = Object.assign({}, this.state.selected);\n        newSelected[minutesId] = !this.state.selected[minutesId];\n        this.setState({\n            selected: newSelected,\n            selectAll: 2\n        });\n    }\n\n    toggleSelectAll() {\n        let newSelected = {};\n\n        if (this.state.selectAll === 0) {\n            this.state.minutesList.forEach(x => {\n                newSelected[x.MinutesBookID] = true;\n            });\n        }\n\n        this.setState({\n            selected: newSelected,\n            selectAll: this.state.selectAll === 0 ? 1 : 0\n        });\n    }\n\n    getTrProps = (state, rowInfo, instance) => {\n        if (rowInfo) {\n            return {\n                style: {\n                    background: rowInfo.original.IsDefault ? 'rgb(202, 225, 241)' : null,\n                }\n            }\n        }\n        return {};\n    }\n\n\n    render() {\n        return (\n            <div>\n                <div className=\"header-half\">\n                    <h1>Minutes Management</h1>\n                </div>\n\n                <div className=\"toolbar minutes-toolbar dlas-forms\">\n                    <div>\n                        <Fields.Dropdown\n                            value={this.props.selectedSession}\n                            options={this.state.sessionDropdown}\n                            id=\"sessionDropdown\"\n                            onChange={this.handleSessionSelectChange}\n                        />\n                    </div>\n                </div>\n                {this.state.message &&\n                    <span className=\"fail small-text\">{this.state.message}</span>\n                }\n                <ReactTable\n                    resizable={false}\n                    loading={!this.state.isLoaded}\n                    data={this.state.minutesList}\n                    ref={r => this.reactTable = r}\n                    defaultFilterMethod={(filter, row) =>\n                        String(row[filter.id]) === filter.value}\n                    noDataText={this.props.minutes.minutesMessage}\n                    onFilteredChange={this.onFilteredChange.bind(this)}\n                    columns={[\n                        {\n                            Header: \"Minutes Date\",\n                            columns: [\n                                {\n                                    id: \"checkbox\",\n                                    className: \"checkbox-column\",\n                                    headerClassName: \"header-checkbox\",\n                                    accessor: \"\",\n                                    Cell: ({ original, index }) => {\n                                        return (\n                                            <input\n                                                id={'cm-checkbox-' + index}\n                                                type=\"checkbox\"\n                                                className=\"checkbox\"\n                                                checked={this.state.selected[original.MinutesBookID] === true}\n                                                onChange={() => this.toggleRow(original.MinutesBookID)}\n                                            />\n                                        );\n                                    },\n                                    Header: x => {\n                                        return (\n                                            <input\n                                                id={'cm-checkbox-selectall'}\n                                                type=\"checkbox\"\n                                                className=\"checkbox\"\n                                                checked={this.state.selectAll === 1}\n                                                ref={input => {\n                                                    if (input) {\n                                                        input.indeterminate = this.state.selectAll === 2;\n                                                    }\n                                                }}\n                                                onChange={() => this.toggleSelectAll()}\n                                            />\n                                        );\n                                    },\n                                    sortable: false,\n                                    filterable: false,\n                                    width: 45\n                                },\n                                {\n                                    Header: (\n                                        <div className=\"dlas-forms datepicker-container\">\n                                            {!this.state.showCreateSuccess && !this.state.showCreateFailure &&\n                                                <DatePicker\n                                                    id=\"minutesDate\"\n                                                    className=\"dnd-field\"\n                                                    selected={this.state.minutesDate}\n                                                    onChange={this.handleDateChange}\n                                                    placeholderText=\"Minutes Date\"\n                                                />\n                                            }\n                                        </div>\n                                    ),\n                                    headerClassName: \"header-insert\",\n                                    accessor: \"MinutesDate\",\n                                    sortable: false,\n                                    filterAll: true,\n                                    width: 200,\n                                    Cell: row => {\n                                        return (\n                                            <span id={'cm-datecell-' + row.index}>{moment(row.original.MinutesDate).format('L')}</span>\n                                        )\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            Header: \"Session\",\n                            columns: [\n                                {\n                                    Header: (\n                                        <div>\n                                            {!this.state.showCreateSuccess && !this.state.showCreateFailure &&\n                                                <Fields.Dropdown\n                                                    value={this.state.selectedSessionGrid}\n                                                    options={this.state.sessionList}\n                                                    className=\"grid-selector-dropdown\"\n                                                    classNamePrefix=\"grid-selector-dropdown\"\n                                                    id=\"sessionDropdown\"\n                                                    onChange={(value) => { this.handleDropDownChange(value, 'selectedSessionGrid') }} />\n                                            }\n                                            {this.state.showCreateSuccess &&\n                                                <span className=\"insert-message\">Minutes created successfully</span>\n                                            }\n                                            {this.state.showCreateFailure &&\n                                                <span className=\"insert-message fail\">Minutes creation failed</span>\n                                            }\n                                        </div>\n                                    ),\n                                    headerClassName: \"header-insert-dropdown\",\n                                    accessor: \"SessionName\",\n                                    sortable: false,\n                                    filterAll: true,\n                                    Cell: row => {\n                                        return <span id={'mm-session-' + row.index}>{row.value}</span>\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            Header: \"Status\",\n                            columns: [\n                                {\n                                    Header: (\n                                        <div>\n                                            {!this.state.showCreateSuccess &&\n                                                <span className=\"txt-greyed txt-grid-header\">Pending</span>\n                                            }\n                                        </div>\n                                    ),\n                                    headerClassName: \"header-insert\",\n                                    accessor: \"Status\",\n                                    sortable: false,\n                                    filterAll: true,\n                                    Cell: row => {\n                                        return <span className=\"txt-greyed\" id={'mm-status-' + row.index}>{row.value}</span>\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            Header: \"Actions\",\n                            headerClassName: \"submit-action\",\n                            columns: [\n\n                                {\n                                    Header: (<span><button id=\"submit-new-minutes\" onClick={this.sendCreateDetails.bind(this)} disabled={this.state.isSaving} className=\"button\">Create</button></span>),\n                                    headerClassName: \"header-action\",\n                                    accessor: \"action\",\n                                    sortable: false,\n                                    className: \"action-column\",\n                                    width: 50,\n                                    Cell: row => {\n                                        return (\n                                            <Link id={'cm-edit-' + row.index} to={`/minutes-management/edit-minutes/${row.original.MinutesBookID}`} className=\"button edit\">Edit</Link>\n                                        )\n                                    }\n                                },\n                                {\n                                    Header: \"\",\n                                    headerClassName: \"flag-header\",\n                                    accessor: \"PendingChange\",\n                                    width: 40,\n                                    Cell: row => {\n                                        if (row.original.PendingChange) {\n                                            return <span id={'cm-flag-' + row.index} className=\"button flag\">Flag</span>\n                                        } else {\n                                            return <span></span>;\n                                        }\n                                    }\n                                },\n                                {\n                                    Header: \"All\",\n                                    id: 'all',\n                                    className: \"all-column\",\n                                    headerClassName: \"all-header\",\n                                    width: 0,\n                                    resizable: false,\n                                    sortable: false,\n                                    Filter: () => { },\n                                    getProps: () => {\n                                        return {\n                                            style: { padding: \"0px\" }\n                                        }\n                                    },\n                                    filterMethod: (filter, rows) => {\n                                        return rows.chamber === this.state.selectedChamber;\n                                    }\n                                }\n                            ]\n                        }\n                    ]}\n                    defaultSorted={[\n                        {\n                            id: \"Name\",\n                            desc: false\n                        }\n                    ]}\n                    defaultPageSize={15}\n                    pageSizeOptions={[5, 10, 15, 20, 25, 50, 100]}\n                    className=\"committee-table -striped -highlight\"\n                    getTrProps={(state, rowInfo) => {\n                        // console.log('original:',rowInfo.original);\n                        // console.log('row:',rowInfo.row);\n                        // console.log('row.firstName:',rowInfo.row.firstName);\n                        // console.log('original.children:',rowInfo.original.children);\n                        return {}\n                    }}\n                />\n                <br />\n\n            </div>\n        );\n    }\n}\n\nconst MinutesManagementGrid = connect(\n    (state) => {\n        const { minutes, session } = state;\n        return {\n            minutes,\n            session\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, sessionActionCreators, minutesActionCreators), dispatch)\n        }\n    }\n)(MinutesGridComponent)\n\n\nexport default MinutesManagementGrid;","import React from 'react';\n\nfunction LoaderComponent(props) {\n    let loadingCheck = false;\n    //typeof doesn't differentiate between an array and an object so we have to do this type of check\n    switch (Object.prototype.toString.call(props.data)) {\n        case '[object Array]':\n            if (props.data.length > 0) loadingCheck = true;\n            break;\n        case '[object Object]':\n            if (props.data) loadingCheck = true;\n            break;\n        default:\n            if (props.data) loadingCheck = true;\n    }\n    return (\n        <div className={`spinner-loader ${loadingCheck ? 'hide' : 'show'}`}>\n            <div className={`${props.className} spinner`}>Loading results...</div>\n        </div>\n    )\n}\n\nexport default (LoaderComponent);","import React from \"react\";\nimport 'tinymce/themes/silver/theme';\nimport 'tinymce/icons/default'\nimport 'tinymce/plugins/paste/plugin';\nimport 'tinymce/plugins/link/plugin';\nimport 'tinymce/plugins/save/plugin';\nimport 'tinymce/plugins/lists/plugin';\nimport 'tinymce/plugins/code/plugin';\nimport 'tinymce/plugins/preview/plugin';\nimport 'tinymce/plugins/searchreplace/plugin';\nimport 'tinymce/plugins/pagebreak/plugin';\nimport 'tinymce/plugins/table/plugin';\nimport '../../../../stylesheets/tinymce/oxide/skin.min.css';\nimport { Editor } from '@tinymce/tinymce-react';\nimport renderHTML from \"react-render-html\";\n\nclass Misc extends React.Component {\n    constructor(props) {\n        super(props)\n        this.state = {\n            newEntries: [],\n            editing: false\n        };\n\n        this.handleChange = this.handleChange.bind(this);\n        this.toggleEdit = this.toggleEdit.bind(this);\n        this.cancelEdit = this.cancelEdit.bind(this);\n        this.saveChange = this.saveChange.bind(this);\n    }\n\n    handleChange(content) {\n        //Update the local entry text without saving data to the parent\n        let entries = [...this.state.newEntries];\n\n        entries[0].EntryText = content;\n\n        this.setState({\n            newEntries: entries\n        });\n    }\n\n    toggleEdit() {\n        this.setState({\n            editing: !this.state.editing,\n        })\n    }\n\n    cancelEdit() {\n        this.setState({\n            editing: false,\n            newEntries: this.props.formData.MinutesEntries\n        })\n    }\n\n    saveChange() {\n        this.props.handleSaveEntry(this.state.newEntries[0])\n        this.toggleEdit();\n    }\n\n    componentDidMount() {\n        this.setState({\n            newEntries: this.props.formData ? this.props.formData.MinutesEntries : []\n        })\n    }\n\n    componentDidUpdate(prevProps) {\n        //If the entry has been saved or changed then swap out the entry with the latest\n        if (prevProps.formData && this.props.formData && prevProps.formData.MinutesEntries[0].ModificationDate != this.props.formData.MinutesEntries[0].ModificationDate) {\n            this.setState({\n                newEntries: this.props.formData.MinutesEntries\n            })\n        }\n    }\n\n    render() {\n        return (\n            <React.Fragment>\n                {this.state.newEntries.map((entry, i) => {\n                    return (\n                        <React.Fragment>\n                            <div key={entry.MinutesEntryID}>\n                                {this.state.editing\n                                    ?\n                                    <div className=\"grid-wrapper two-col-sidebar\">\n                                        <Editor\n                                            value={entry.EntryText}\n                                            init={{\n                                                browser_spellcheck: true,\n                                                plugins: 'link paste save lists preview searchreplace pagebreak code table',\n                                                toolbar: 'undo redo | bold italic strikethrough | alignleft aligncenter alignright',\n                                                skin: false,\n                                                valid_children: '+body[style]',\n                                                content_css: false,\n                                                content_style: 'table { border-collapse: collapse; border: 1px solid #FFFFFF }' + 'td { padding: 12px 0px }',\n                                            }}\n                                            onEditorChange={content => this.handleChange(content)}\n                                        />\n                                        <div>\n                                            <button onClick={() => this.saveChange()} type=\"button\" className=\"icon save\" style={{ marginRight: \"10px\" }}></button>\n                                            <button onClick={() => this.cancelEdit()} type=\"button\" className=\"icon delete\"></button>\n                                        </div>\n                                    </div>\n                                    :\n                                    <div className=\"grid-wrapper two-col-sidebar\">\n                                        <p>{renderHTML(entry.EntryText)}</p>\n                                        <button onClick={() => this.toggleEdit()} type=\"button\" className=\"icon edit\"></button>\n                                    </div>\n                                }\n\n                            </div>\n                        </React.Fragment>\n                    )\n                })}\n            </React.Fragment>\n        );\n    }\n}\n\nexport default Misc","const getReferenceList = (eventCode, fullList) => {\n    let filteredOptions;\n    let otherVersions;\n    switch (eventCode.substring(1)) {\n        case '4210':\n        case '4211':\n        case '4212':\n            //committee amendment\n            filteredOptions = fullList.filter(text => (text.LegislationVersion || text.Version).toLowerCase() === 'amendment' && text.Sponsor && text.Sponsor.toLowerCase() === 'committee');\n            const otherAmendments = fullList.filter(lt => (lt.LegislationVersion || lt.Version).toLowerCase() === 'amendment' && !filteredOptions.map(o => o.LegislationTextID).includes(lt.LegislationTextID));\n            otherVersions = fullList.filter(lt => !filteredOptions.concat(otherAmendments).map(o => o.LegislationTextID).includes(lt.LegislationTextID));\n            return [\n                { label: 'Committee Amendments', options: filteredOptions },\n                { label: !filteredOptions.length ? 'Amendments' : 'Other Amendments', options: otherAmendments },\n                { label: !filteredOptions.length && !otherAmendments.length ? 'All Versions' : 'Other Versions', options: otherVersions }\n            ];\n        case '4230':\n        case '4232':\n        case '4278':\n        case '4280':\n            //member amendment (S codes correlate to Senator amends, H codes correlate to Delegate amends)\n            if (eventCode[0] === 'S') {\n                filteredOptions = fullList.filter(text => (text.LegislationVersion || text.Version).toLowerCase() === 'amendment' && text.Sponsor &&\n                    (text.Sponsor.toLowerCase() === 'senate' || (text.Sponsor.toLowerCase() === 'member' && text.ChamberCode === 'S')));\n                const otherAmendments = fullList.filter(lt => (lt.LegislationVersion || lt.Version).toLowerCase() === 'amendment' && !filteredOptions.map(o => o.LegislationTextID).includes(lt.LegislationTextID));\n                otherVersions = fullList.filter(lt => !filteredOptions.concat(otherAmendments).map(o => o.LegislationTextID).includes(lt.LegislationTextID));\n                return [\n                    { label: 'Senator Amendments', options: filteredOptions },\n                    { label: !filteredOptions.length ? 'Amendments' : 'Other Amendments', options: fullList.filter(lt => (lt.LegislationVersion || lt.Version).toLowerCase() === 'amendment' && !filteredOptions.map(o => o.LegislationTextID).includes(lt.LegislationTextID)) },\n                    { label: !filteredOptions.length && !otherAmendments.length ? 'All Versions' : 'Other Versions', options: otherVersions }\n                ]\n            } else {\n                filteredOptions = fullList.filter(text => (text.LegislationVersion || text.Version).toLowerCase() === 'amendment' && text.Sponsor &&\n                    (text.Sponsor.toLowerCase().includes('house') || (text.Sponsor.toLowerCase() === 'member' && text.ChamberCode === 'H')));\n                const otherAmendments = fullList.filter(lt => (lt.LegislationVersion || lt.Version).toLowerCase() === 'amendment' && !filteredOptions.map(o => o.LegislationTextID).includes(lt.LegislationTextID))\n                otherVersions = fullList.filter(lt => !filteredOptions.concat(otherAmendments).map(o => o.LegislationTextID).includes(lt.LegislationTextID));\n                return [\n                    { label: 'Delegate Amendments', options: filteredOptions },\n                    { label: !filteredOptions.length ? 'Amendments' : 'Other Amendments', options: otherAmendments },\n                    { label: !filteredOptions.length && !otherAmendments.length ? 'All Versions' : 'Other Versions', options: otherVersions }\n                ]\n            }\n        case '4410':\n        case '4640':\n            //committee sub\n            filteredOptions = fullList.filter(text => (text.LegislationVersion || text.Version).toLowerCase() === 'substitute' && text.Sponsor && text.Sponsor.toLowerCase() === 'committee');\n            const otherSubs = fullList.filter(lt => (lt.LegislationVersion || lt.Version).toLowerCase() === 'substitute' && !filteredOptions.map(o => o.LegislationTextID).includes(lt.LegislationTextID));\n            otherVersions = fullList.filter(lt => !filteredOptions.concat(otherSubs).map(o => o.LegislationTextID).includes(lt.LegislationTextID));\n            return [\n                { label: 'Committee Substitutes', options: filteredOptions },\n                { label: !filteredOptions.length ? 'Substitutes' : 'Other Substitutes', options: otherSubs },\n                { label: !filteredOptions.length && !otherSubs.length ? 'All Versions' : 'Other Versions', options: otherVersions }\n            ]\n        case '4420':\n        case '4450':\n            //member sub (S codes correlate to Senator subs, H codes correlate to Delegate subs)\n            if (eventCode[0] === 'S') {\n                filteredOptions = fullList.filter(text => (text.LegislationVersion || text.Version).toLowerCase() === 'substitute' && text.Sponsor &&\n                    (text.Sponsor.toLowerCase() === 'senate' || (text.Sponsor.toLowerCase() === 'member' && text.ChamberCode === 'S')));\n                const otherSubs = fullList.filter(lt => (lt.LegislationVersion || lt.Version).toLowerCase() === 'substitute' && !filteredOptions.map(o => o.LegislationTextID).includes(lt.LegislationTextID));\n                otherVersions = fullList.filter(lt => !filteredOptions.concat(otherSubs).map(o => o.LegislationTextID).includes(lt.LegislationTextID));\n                return [\n                    { label: 'Senator Substitutes', options: filteredOptions },\n                    { label: !filteredOptions.length ? 'Substitutes' : 'Other Substitutes', options: otherSubs },\n                    { label: !filteredOptions.length && !otherSubs.length ? 'All Versions' : 'Other Versions', options: otherVersions }\n                ]\n            } else {\n                filteredOptions = fullList.filter(text => (text.LegislationVersion || text.Version).toLowerCase() === 'substitute' && text.Sponsor &&\n                    (text.Sponsor.toLowerCase().includes('house') || (text.Sponsor.toLowerCase() === 'member' && text.ChamberCode === 'H')));\n                const otherSubs = fullList.filter(lt => (lt.LegislationVersion || lt.Version).toLowerCase() === 'substitute' && !filteredOptions.map(o => o.LegislationTextID).includes(lt.LegislationTextID));\n                otherVersions = fullList.filter(lt => !filteredOptions.concat(otherSubs).map(o => o.LegislationTextID).includes(lt.LegislationTextID));\n                return [\n                    { label: 'Delegate Substitutes', options: filteredOptions },\n                    { label: !filteredOptions.length ? 'Substitutes' : 'Other Substitutes', options: otherSubs },\n                    { label: !filteredOptions.length && !otherSubs.length ? 'All Versions' : 'Other Versions', options: otherVersions }\n                ]\n            }\n        case '4641':\n            //floor sub\n            return fullList.filter(text => (text.LegislationVersion || text.Version).toLowerCase() === 'substitute' && (!text.Sponsor || !['committee', 'governor', 'conference'].includes(text.Sponsor.toLowerCase())))\n        case '5432':\n        case '5433':\n        case '5434':\n            //senate/house specific sub (H codes correlate to Senate subs, S codes correlate to House subs)\n            if (eventCode[0] === 'S') {\n                filteredOptions = fullList.filter(text => (text.LegislationVersion || text.Version).toLowerCase() === 'substitute' && ((text.Sponsor && text.Sponsor.toLowerCase().includes('house')) || (!text.Sponsor && text.ChamberCode === 'H')));\n                const otherSubs = fullList.filter(lt => (lt.LegislationVersion || lt.Version).toLowerCase() === 'substitute' && !filteredOptions.map(o => o.LegislationTextID).includes(lt.LegislationTextID));\n                otherVersions = fullList.filter(lt => !filteredOptions.concat(otherSubs).map(o => o.LegislationTextID).includes(lt.LegislationTextID));\n                return [\n                    { label: 'House Substitutes', options: filteredOptions },\n                    { label: !filteredOptions.length ? 'Substitutes' : 'Other Substitutes', options: otherSubs },\n                    { label: !filteredOptions.length && !otherSubs.length ? 'All Versions' : 'Other Versions', options: otherVersions }\n                ]\n            } else {\n                filteredOptions = fullList.filter(text => (text.LegislationVersion || text.Version).toLowerCase() === 'substitute' && ((text.Sponsor && text.Sponsor.toLowerCase() === 'senate') || (!text.Sponsor && text.ChamberCode === 'S')));\n                const otherSubs = fullList.filter(lt => (lt.LegislationVersion || lt.Version).toLowerCase() === 'substitute' && !filteredOptions.map(o => o.LegislationTextID).includes(lt.LegislationTextID));\n                otherVersions = fullList.filter(lt => !filteredOptions.concat(otherSubs).map(o => o.LegislationTextID).includes(lt.LegislationTextID));\n                return [\n                    { label: 'Senate Substitutes', options: filteredOptions },\n                    { label: !filteredOptions.length ? 'Substitutes' : 'Other Substitutes', options: otherSubs },\n                    { label: !filteredOptions.length && !otherSubs.length ? 'All Versions' : 'Other Versions', options: otherVersions }\n                ]\n            }\n        case '4643':\n            //governor's sub\n            return fullList.filter(text => (text.LegislationVersion || text.Version).toLowerCase() === 'substitute' && text.Sponsor.toLowerCase().includes('governor'))\n        case '5602':\n            //reenrolled\n            return fullList.filter(text => (text.LegislationVersion || text.Version).toLowerCase() === 'reenrolled')\n        case '4010':\n        case '4011':\n            //member\n            return fullList; //return all the members passed down\n        case '6013':\n        case '6113':\n        case '6213':\n            //delegate/senator (H codes correlate to Delegates, S codes correlate to Senators)\n            return fullList; //return all the members passed down, already filtered down to delegates in history form\n        case '4610':\n        case '5300':\n        case '5310':\n        case '5330':\n        case '5350':\n        case '5360':\n        case '5370':\n        case '5380':\n        case '5800':\n        case '5810':\n        case '6060':\n        case '7304':\n        case '9600':\n            //event\n            return fullList; //return all the events passed down, already filtered in history form\n        //not 100% certain what 'printed as...' (4620, 4622, 4630) is supposed to return\n        case '4620':\n        case '4622':\n        case '4630':\n        //not sure what '... bill reprinted' (4644, 4645, 4646) is supposed to return; there aren't any pickers in UI despite them being in the spreadsheet\n        case '4644':\n        case '4645':\n        case '4646':\n        //not sure what 'Bill text as passed ...' (5601, 5603) is supposed to return\n        case '5601':\n        case '5603':\n        default:\n            return fullList;\n    }\n}\n\nexport default getReferenceList;","import React from \"react\";\nimport moment from 'moment-timezone';\nimport DatePicker from 'react-datepicker'\nimport CreatableSelect from 'react-select/creatable';\nimport Select from 'react-select';\nimport getReferenceList from '../../../services/event-references-helpers';\nimport 'tinymce/themes/silver/theme';\nimport 'tinymce/icons/default'\nimport 'tinymce/plugins/paste/plugin';\nimport 'tinymce/plugins/link/plugin';\nimport 'tinymce/plugins/save/plugin';\nimport 'tinymce/plugins/lists/plugin';\nimport 'tinymce/plugins/code/plugin';\nimport 'tinymce/plugins/preview/plugin';\nimport 'tinymce/plugins/searchreplace/plugin';\nimport 'tinymce/plugins/pagebreak/plugin';\nimport 'tinymce/plugins/table/plugin';\nimport '../../../stylesheets/tinymce/oxide/skin.min.css';\nimport { Editor } from '@tinymce/tinymce-react';\n\nclass CustomCreatableSelect extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            inputMinWidth: 150,\n            inputWidth: 0,\n            selectedActionType: ''\n        };\n        this.inputSizer = React.createRef();\n    }\n\n    componentDidMount() {\n        const newWidth = this.inputSizer.current ? this.inputSizer.current.scrollWidth + 45 : 0\n        this.setState({\n            inputWidth: newWidth\n        });\n    }\n\n    componentDidUpdate(prevProps) {\n        if (prevProps.value !== this.props.value) {\n            const newWidth = this.inputSizer.current ? this.inputSizer.current.scrollWidth + 45 : 0\n            this.setState({\n                inputWidth: newWidth\n            });\n        }\n    }\n    render() {\n        const wrapperStyle = {\n            display: 'inline-block',\n            position: 'relative'\n        };\n        const inputStyle = {\n            minWidth: `${this.state.inputMinWidth}px`,\n            width: `${this.state.inputWidth}px`,\n            boxShadow: this.props.autoselected && !this.props.isNewEvent ? '0 0 7px 1px green' : '',\n            borderRadius: this.props.autoselected && !this.props.isNewEvent ? '4px' : '',\n            marginTop: this.props.autoselected && !this.props.isNewEvent ? '5px' : ''\n        };\n        const sizerStyle = {\n            position: 'absolute',\n            top: 0,\n            left: 0,\n            visibility: 'hidden',\n            height: 0,\n            overflow: 'scroll',\n            whiteSpace: 'pre',\n        };\n        const inputValue = this.props.getOptionLabel ? this.props.getOptionLabel(this.props.value) :\n            this.props.value ? this.props.value.label : '';\n        return (\n            <div style={wrapperStyle}>\n                {this.props.autoselected && !this.props.isNewEvent && <label><small><em>This has been autoselected, but not saved.</em></small></label>}\n                <div ref={this.inputSizer} style={sizerStyle}>{inputValue}</div>\n                <div style={inputStyle}>\n                    <CreatableSelect\n                        options={this.props.options}\n                        styles={selectStyle()}\n                        onChange={this.props.onChange}\n                        value={this.props.value}\n                        formatCreateLabel={input => input}\n                        //This is so an option can only be created once an option has been selected\n                        isValidNewOption={() => Boolean(this.props.value)}\n                        {...this.props} />\n                </div>\n            </div>\n        );\n    }\n}\n\nclass CustomInput extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            inputMinWidth: 150,\n            inputWidth: 0\n        };\n        this.inputSizer = React.createRef();\n    }\n\n    componentDidMount() {\n        const newWidth = this.inputSizer.current ? this.inputSizer.current.scrollWidth + 2 : 0\n        this.setState({\n            inputWidth: newWidth\n        });\n    }\n\n    componentDidUpdate(prevProps) {\n        if (prevProps.value !== this.props.value) {\n            const newWidth = this.inputSizer.current ? this.inputSizer.current.scrollWidth + 2 : 0\n            this.setState({\n                inputWidth: newWidth\n            });\n        }\n    }\n\n    render() {\n        const wrapperStyle = {\n            display: 'inline-block',\n            position: 'relative'\n        };\n        const inputStyle = {\n            minWidth: `${this.state.inputMinWidth}px`,\n            width: `${this.state.inputWidth}px`,\n            maxWidth: '70vw'\n        };\n        const sizerStyle = {\n            position: 'absolute',\n            top: 0,\n            left: 0,\n            visibility: 'hidden',\n            height: 0,\n            overflow: 'scroll',\n            whiteSpace: 'pre',\n        };\n        return (<div style={wrapperStyle}>\n            <div ref={this.inputSizer} style={sizerStyle}>{this.props.value}</div>\n            {this.props.textListLength > 0\n                ? <input\n                    {...this.props}\n                    style={inputStyle}\n                />\n                : <React.Fragment>\n                    <textarea\n                        {...this.props}\n                        style={inputStyle}\n                    />\n                </React.Fragment>\n            }\n\n        </div>)\n    }\n}\n\n//This class is used to take the ActivityReferences and turn them into a form\nclass InputType extends React.Component {\n\n    constructor(props) {\n        super(props);\n        this.state = {};\n\n        this.handleChange = this.handleChange.bind(this);\n        this.handleActionTypeChange = this.handleActionTypeChange.bind(this);\n        this.addInput = this.addInput.bind(this);\n\n        this.actionTypeDropdown = React.createRef();\n    }\n\n    handleChange(referenceIndex, value, autoselected) {\n        const { entryIndex, activityIndex, references, billHistory } = this.props;\n        //Send the index of the minute entry, the entire minute entries object (so we don't have to save the entire book),\n        //the value of the text input, and the sequence to show which category to update\n        const originalValue = JSON.parse(JSON.stringify(references[referenceIndex]));\n        let reference = references[referenceIndex];\n        switch (reference.ActionReferenceType) {\n            case 'Member':\n            case 'Committee':\n            case 'Subcommittee':\n                reference.ReferenceText = value.label;\n                //If it is not created then __isNew__ will be false. Since it is not created then set the ID to whatever was selected\n                //The Creatable does not allow  creating an option if an option has not been selected yet, so if the value is new then use the existing reference ID\n                if (!value.__isNew__) {\n                    reference.ReferenceID = value.value;\n                }\n                break;\n            case 'LegislationText':\n                reference.ReferenceText = value.Description || value.label;\n                if (!value.__isNew__) {\n                    reference.ReferenceID = value.value;\n                } else {\n                    reference.ReferenceText = value.label\n                }\n                reference.autoselected = autoselected;\n                break;\n            case 'Time':\n                reference.ReferenceText = value.format('h:mm a');\n                break;\n            case 'Date and Time':\n                reference.ReferenceText = value.format(\"MMMM d, yyyy h:mm a\");\n                break;\n            case 'Text':\n                reference.ReferenceText = value;\n                break;\n            case 'HTML':\n                reference.ReferenceText = value;\n                break;\n            case 'LegislationEvent':\n                reference.ReferenceID = value.LegislationEventID;\n                reference.EventCode = value.EventCode;\n                reference.IsPassed = value.IsPassed;\n                break;\n            case 'Legislation':\n                reference.ReferenceText = value.label;\n                reference.ReferenceID = value.value;\n                break;\n            case 'Communication':\n                reference.ReferenceText = value.ReferenceNumber;\n                reference.CommunicationDate = value.CommunicationDate;\n                reference.CommunicationNumber = value.CommunicationNumber;\n                if (!value.__isNew__) {\n                    reference.ReferenceID = value.value;\n                }\n                reference.CommunicationSummaries = value.CommunicationSummaries\n                break;\n            default:\n                reference.ReferenceText = value;\n        }\n        this.props.handleChange(entryIndex, activityIndex, referenceIndex, reference, !billHistory && originalValue);\n    }\n\n    handleActionTypeChange(val) {\n        this.setState({\n            selectedActionType: val\n        })\n    }\n\n    addInput() {\n        const { entryIndex, activityIndex, references } = this.props;\n        const newInput = {\n            ReferenceID: null,\n            ReferenceText: '',\n            ActionReferenceTypeID: this.state.selectedActionType.ActionReferenceTypeID,\n            ActionReferenceType: this.state.selectedActionType.ActionReferenceType\n        }\n        this.props.handleChange(entryIndex, activityIndex, references.length, newInput);\n        this.setState({\n            selectedActionType: ''\n        });\n    }\n\n    render() {\n        const { entryIndex, activityIndex, references, actionTypes, style } = this.props;\n        const divStyle = {\n            display: 'inline-block',\n            margin: '0px 5px 3px 5px',\n            lineHeight: '0.8em'\n        }\n\n        const errorCheck = (referenceIndex) => {\n            return (\n                this.props.incompleteInputs && this.props.incompleteInputs.includes(referenceIndex) &&\n                <span className=\"fail\" style={{ fontSize: \"12px\" }}>You must enter a value.</span>\n            )\n        }\n\n        return (\n            <div style={{ ...style }}>\n                {references.map((reference, referenceIndex) => {\n                    switch (reference.ActionReferenceType) {\n                        case 'Text':\n                            return (\n                                <div key={referenceIndex} style={divStyle}>\n                                    <CustomInput\n                                        value={reference.ReferenceText}\n                                        onChange={(event) => this.handleChange(referenceIndex, event.target.value)}\n                                        textListLength={this.props.textList?.length ?? 0}\n                                    />\n                                    {errorCheck(referenceIndex)}\n                                </div>\n                            );\n                        case 'HTML':\n                            return (\n                                <div key={referenceIndex} style={{ ...divStyle, width: '100%' }}>\n                                    <Editor\n                                        value={reference.ReferenceText}\n                                        init={{\n                                            browser_spellcheck: true,\n                                            force_br_newlines: false,\n                                            force_p_newlines: false,\n                                            forced_root_block: '', //don't wrap votetally in minutes activities\n                                            plugins: 'link paste save lists preview searchreplace pagebreak code table',\n                                            toolbar: 'undo redo | bold italic strikethrough | alignleft aligncenter alignright',\n                                            skin: false,\n                                            valid_children: '+body[style]',\n                                            content_css: false,\n                                            content_style: 'table { border-collapse: collapse; border: 1px solid #FFFFFF }' + 'td { padding: 12px 0px }',\n                                        }}\n                                        onEditorChange={content => this.handleChange(referenceIndex, content)}\n                                    />\n                                    {errorCheck(referenceIndex)}\n                                </div>\n                            );\n                        case 'Member':\n                            let memberVal = null;\n                            const member = this.props.memberList.find(member => member.MemberID === reference.ReferenceID);\n                            if (member) {\n                                memberVal = {\n                                    label: reference.ReferenceText,\n                                    value: reference.ReferenceID\n                                };\n                            }\n                            return (\n                                <div key={referenceIndex} style={divStyle}>\n                                    <CustomCreatableSelect\n                                        options={this.props.newEvent && this.props.newEvent.EventCode ? getReferenceList(this.props.newEvent.EventCode, this.props.memberList || []) : this.props.memberList || []}\n                                        onChange={(event) => this.handleChange(referenceIndex, event)}\n                                        value={memberVal}\n                                    />\n                                    {errorCheck(referenceIndex)}\n                                </div>\n                            );\n                        case 'Committee':\n                            let committeeVal = null;\n                            const committee = this.props.committeeList.find(member => member.CommitteeID === reference.ReferenceID);\n                            if (committee) {\n                                committeeVal = {\n                                    label: reference.ReferenceText,\n                                    value: reference.ReferenceID\n                                };\n                            }\n                            let committeeList = this.props.committeeList ? this.props.committeeList.filter(c => !c.ParentCommitteeID) : [];\n                            let eventChamber = this.props.newEvent.EventCode[0];\n                            committeeList = committeeList.filter(x => x.ChamberCode == eventChamber)\n                            return (\n                                <div key={referenceIndex} style={divStyle}>\n                                    <CustomCreatableSelect\n                                        options={this.props.newEvent && this.props.newEvent.EventCode ? getReferenceList(this.props.newEvent.EventCode, committeeList) : committeeList}\n                                        onChange={(event) => this.handleChange(referenceIndex, event)}\n                                        value={committeeVal}\n                                    />\n                                    {errorCheck(referenceIndex)}\n                                </div>\n                            );\n                        case 'Subcommittee':\n                            let subCommitteeVal = null;\n                            const subCommittee = this.props.committeeList.find(member => member.CommitteeID === reference.ReferenceID);\n                            if (subCommittee) {\n                                subCommitteeVal = {\n                                    label: reference.ReferenceText,\n                                    value: reference.ReferenceID\n                                };\n                            }\n                            return (\n                                <div key={referenceIndex} style={divStyle}>\n                                    <CustomCreatableSelect\n                                        options={this.props.newEvent && this.props.newEvent.EventCode ? getReferenceList(this.props.newEvent.EventCode, this.props.committeeList ? this.props.committeeList.filter(c => c.ParentCommitteeID) : []) : this.props.committeeList ? this.props.committeeList.filter(c => c.ParentCommitteeID) : []}\n                                        onChange={(event) => this.handleChange(referenceIndex, event)}\n                                        value={subCommitteeVal}\n                                    />\n                                    {errorCheck(referenceIndex)}\n                                </div>\n                            );\n                        case 'LegislationText':\n                            const options = this.props.newEvent && this.props.newEvent.EventCode ? getReferenceList(this.props.newEvent.EventCode, this.props.textList || []) : this.props.textList || [];\n                            let textVal;\n                            //if we want to autoselect, do so only if the very first hierarchy/grouping has exactly one option; this is very likely the one they want to use\n                            if (this.props.autoselect && !reference.ReferenceText && !reference.ReferenceID && options.length && options[0].options && options[0].options.length === 1) {\n                                this.handleChange(referenceIndex, options[0].options[0], true);\n                            }\n                            textVal = {\n                                label: reference.ReferenceText !== null ? reference.ReferenceText : \"Select...\",\n                                value: reference.ReferenceID\n                            }\n                            return (\n                                <div key={referenceIndex} style={divStyle}>\n                                    <CustomCreatableSelect\n                                        options={options}\n                                        onChange={(event) => this.handleChange(referenceIndex, event)}\n                                        value={textVal}\n                                        getOptionLabel={opt => {\n                                            let newLabel = '';\n                                            if (opt.IsActive !== undefined) {\n                                                newLabel = `(${opt.IsActive ? \"active\" : \"inactive\"}) ${opt.label}`;\n                                            } else {\n                                                newLabel = opt.label;\n                                            }\n                                            newLabel += opt.LDNumber ? ` (${opt.LDNumber})` : '';\n                                            return newLabel;\n                                        }}\n                                        autoselected={reference.autoselected}\n                                        isNewEvent={this.props.isNewEvent}\n                                    />\n                                    {errorCheck(referenceIndex)}\n                                </div>\n                            );\n                        case 'Time':\n                            const time = reference.ReferenceText ? moment(reference.ReferenceText, 'h:mm a').isValid() ? moment(reference.ReferenceText, 'h:mm a') : null : null;\n                            return (\n                                <div key={referenceIndex} style={divStyle}>\n                                    <DatePicker\n                                        className='clock-date-picker'\n                                        showTimeSelect\n                                        showTimeSelectOnly\n                                        timeIntervals={15}\n                                        dateFormat=\"h:mm a\"\n                                        timeCaption=\"Time\"\n                                        selected={time}\n                                        onChange={(event) => this.handleChange(referenceIndex, event)}\n                                    />\n                                    {errorCheck(referenceIndex)}\n                                </div>\n                            );\n                        case 'Date and Time':\n                            const datetime = reference.ReferenceText ? moment(reference.ReferenceText).isValid() ? moment(reference.ReferenceText) : null : null;\n                            return (\n                                <div key={referenceIndex} style={divStyle}>\n                                    <DatePicker\n                                        className='clock-date-picker'\n                                        showTimeSelect\n                                        timeIntervals={15}\n                                        dateFormat=\"MMMM d, yyyy h:mm a\"\n                                        timeCaption=\"Time\"\n                                        selected={datetime}\n                                        onChange={(event) => this.handleChange(referenceIndex, event)}\n                                    />\n                                    {errorCheck(referenceIndex)}\n                                </div>\n                            );\n                        case 'LegislationEvent':\n                            return (\n                                <div key={referenceIndex} style={{ marginLeft: \"-5px\", marginTop: \"5px\" }}>\n                                    {this.props.newEvent && ((this.props.newEvent.ActionReferences && this.props.newEvent.ActionReferences[0] && this.props.newEvent.ActionReferences[0].ActionReferenceType === \"LegislationEvent\") || (this.props.newEvent.ActivityReferences && this.props.newEvent.ActivityReferences[0] && this.props.newEvent.ActivityReferences[0].ActionReferenceType === \"LegislationEvent\") || (this.props.newEvent.EventReferences && this.props.newEvent.EventReferences[0] && this.props.newEvent.EventReferences[0].ActionReferenceType === \"LegislationEvent\")) && this.props.eventList &&\n                                        <div style={divStyle}>\n                                            {this.props.eventList.length > 0 ?\n                                                <CustomCreatableSelect\n                                                    options={this.props.newEvent && this.props.newEvent.EventCode ? getReferenceList(this.props.newEvent.EventCode, this.props.eventList) : this.props.eventList}\n                                                    value={reference.ReferenceID && this.props.eventList.find(evt => evt.LegislationEventID === reference.ReferenceID) ? this.props.eventList.find(evt => evt.LegislationEventID === reference.ReferenceID) : \"\"}\n                                                    onChange={(event) => this.handleChange(referenceIndex, event)}\n                                                    getOptionValue={o => o.LegislationEventID}\n                                                    getOptionLabel={o => o.EventCode ? \"(\" + o.EventCode + \") \" + o.Description : \"\"}\n                                                />\n                                                :\n                                                <p>No eligible events.</p>\n                                            }\n                                        </div>\n                                    }\n                                    {errorCheck(referenceIndex)}\n                                </div>\n                            )\n                        case 'Communication':\n                            let communicationList = this.props.communicationList || [];\n                            let communicationVal = null;\n                            const communication = communicationList.find(comm => comm.CommunicationID === reference.ReferenceID);\n                            if (communication) {\n                                communicationVal = {\n                                    label: reference.ReferenceText,\n                                    value: reference.ReferenceID\n                                };\n                            }\n                            return (\n                                <div key={referenceIndex} style={divStyle}>\n                                    <CustomCreatableSelect\n                                        options={this.props.newEvent && this.props.newEvent.EventCode ? getReferenceList(this.props.newEvent.EventCode, communicationList) : communicationList}\n                                        onChange={(communication) => this.handleChange(referenceIndex, communication)}\n                                        value={communicationVal}\n                                    />\n                                    {errorCheck(referenceIndex)}\n                                </div>\n                            );\n                        case 'Legislation':\n                            let legislationVal = null;\n                            const legislation = this.props.legislationList ? this.props.legislationList.find(leg => leg.LegislationID === reference.ReferenceID) : null;\n                            if (legislation) {\n                                legislationVal = {\n                                    label: reference.ReferenceText,\n                                    value: reference.ReferenceID\n                                };\n                            }\n                            return (\n                                <div key={referenceIndex} style={divStyle}>\n                                    <CustomCreatableSelect\n                                        options={this.props.newEvent && this.props.newEvent.EventCode ? getReferenceList(this.props.newEvent.EventCode, this.props.legislationList || []) : this.props.legislationList || []}\n                                        onChange={(event) => this.handleChange(referenceIndex, event)}\n                                        value={legislationVal}\n                                        placeholder={this.props.fetchingSessionLegislation ? 'Loading bills...' : 'Select...'}\n                                    />\n                                    {errorCheck(referenceIndex)}\n                                </div>\n                            );\n                        default:\n                            return (\n                                <div key={referenceIndex} style={divStyle}>\n                                    <CustomInput\n                                        value={reference.ReferenceText}\n                                        onChange={(event) => this.handleChange(referenceIndex, event.target.value)}\n                                    />\n                                    {errorCheck(referenceIndex)}\n                                </div>\n                            );\n                    }\n                })\n                }\n                {actionTypes && actionTypes.length > 0 && this.props.textList.length > 0 && (!this.props.newEvent?.ActionReferences?.length || this.props.newEvent.ActionReferences[0].ActionReferenceType !== \"LegislationEvent\") &&\n                    <div style={divStyle}>\n                        <label className=\"txt-greyed smaller-text\" style={{ opacity: this.state.selectedActionType ? 1 : 0 }}>Press enter to add</label>\n                        <Select\n                            onKeyDown={(e) => {\n                                //Enter can also be used to select an option. Make sure that the menu is closed before trying to add the input\n                                if (e.key === 'Enter' && !this.actionTypeDropdown.state.menuIsOpen) {\n                                    this.addInput();\n                                }\n                            }}\n                            placeholder=\"Add\"\n                            options={actionTypes}\n                            value={this.state.selectedActionType}\n                            onChange={this.handleActionTypeChange}\n                            styles={selectStyle()}\n                            ref={ref => this.actionTypeDropdown = ref}\n                        />\n                    </div>\n                }\n\n            </div>\n        );\n    }\n}\n\n//react-select default style makes the element too tall and the font too large\nconst selectStyle = () => {\n    const fontSize = '0.8em';\n    return {\n        container: styles => ({\n            ...styles,\n            minWidth: '150px'\n        }),\n        control: styles => ({\n            ...styles,\n            minHeight: '0px',\n            padding: '0.12em 0.6em !important',\n        }),\n        valueContainer: styles => ({\n            ...styles,\n            padding: 0,\n        }),\n        input: styles => ({\n            ...styles,\n            fontSize: fontSize,\n            lineHeight: 'normal',\n        }),\n        singleValue: styles => ({\n            ...styles,\n            fontSize: fontSize,\n        }),\n        placeholder: styles => ({\n            ...styles,\n            fontSize: fontSize\n        }),\n        option: styles => ({\n            ...styles,\n            fontSize: fontSize\n        }),\n        dropdownIndicator: styles => ({\n            ...styles,\n            padding: '0px 8px'\n        }),\n        menu: provided => ({\n            ...provided,\n            whiteSpace: 'nowrap',\n            width: 'auto'\n        })\n    };\n}\n\nexport default InputType;","import React, {useState} from 'react';\nimport tinymce from 'tinymce/tinymce';\nimport 'tinymce/themes/silver/theme';\nimport 'tinymce/icons/default'\nimport 'tinymce/plugins/paste/plugin';\nimport 'tinymce/plugins/link/plugin';\nimport 'tinymce/plugins/save/plugin';\nimport 'tinymce/plugins/lists/plugin';\nimport 'tinymce/plugins/code/plugin';\nimport 'tinymce/plugins/preview/plugin';\nimport 'tinymce/plugins/searchreplace/plugin';\nimport 'tinymce/plugins/pagebreak/plugin';\nimport 'tinymce/plugins/table/plugin';\nimport '../../../../stylesheets/tinymce/oxide/skin.min.css';\nimport { Editor } from '@tinymce/tinymce-react';\nimport ReactTable from 'react-table';\n\nconst CommentBox = props => {\n    const [selectedComment, selectComment] = useState(-1);\n    const [showView, toggleViews] = useState(true);\n    const handleChange = content => {\n        let comments = [...props.comments];\n        comments[selectedComment].MinutesSummary = content;\n        props.handleCommentBoxChange(comments);\n    }\n    const addComment = () => {\n        let comments = [...props.comments];\n        comments.push({MinutesSummary: ''});\n        props.handleCommentBoxChange(comments);\n        selectComment(props.comments.length);\n        toggleViews(false);\n    };\n    const getCommentPreview = (comment, index) => {\n        // Shows the first paragraph of the comment to the user in the grid so they don't need to open the comment to know what its content is.\n        // If a paragraph doesn't exist then the first element of the text is used\n        // If there aren't any elements, then just put comment number so its not just a blank row.\n        const container = document.createElement(\"DIV\");\n        container.innerHTML = comment.MinutesSummary;\n        const paragraphs = container.getElementsByTagName(\"P\")\n        if(paragraphs.length > 0 && paragraphs[0].innerText) {\n            return(<span>{paragraphs[0].innerText}</span>)\n        } else {\n            const firstElement = container.childNodes[0];\n            if(firstElement && firstElement.innerText) {\n                return(<span>{firstElement.innerText}</span>)\n            } else {\n                return <span>Comment {index + 1}</span>;\n            }\n        }\n    }\n    return(\n        <div onClick={() => props.toggleBox(false)} className=\"overlay center-content\">\n            <div className=\"full\">\n                <div onClick={e => e.stopPropagation()} className=\"dlas-forms user-forms advanced-search overlay-content animated-fade-in-up\">\n                    <ReactTable\n                        data={props.comments}\n                        showPageSizeOptions={false}\n                        showPagination={false}\n                        showPageJump={false}\n                        pageSize={props.comments.length}\n                        getTrProps={(_state, rowInfo) => {\n                            return {\n                                style: {\n                                    background: rowInfo && rowInfo.index === selectedComment ? '#89ff89' : '',\n                                    cursor: rowInfo ? 'pointer' : 'default',\n                                    display: showView ? 'inline-flex' : 'none'\n                                },\n                                onClick: () => {\n                                    selectComment(rowInfo.index);\n                                    toggleViews(false);\n                                }\n                            }\n                        }}\n                        noDataText=\"\"\n                        columns={[\n                            {\n                                id: \"checkbox\",\n                                className: \"checkbox-column\",\n                                Header: () => <button onClick={() => toggleViews(!showView)} className={`${showView ? 'arrow-up' : 'arrow-down'} white-chevron`}></button>,\n                                Cell: ({ index }) => <span className={index === selectedComment ? \"icon checkmark\" : \"\"}></span>,\n                                sortable: false,\n                                filterable: false,\n                                width: 45\n                            },\n                            {\n                                Cell: ({original, index}) => getCommentPreview(original, index),\n                                Footer: () => showView ? <button onClick={addComment} className=\"button\" type=\"button\">Add Comment</button> : null\n                            },\n                        ]}\n                        className=\"-striped -highlight\"\n                    />\n                    <div style={{display: showView ? 'none' : 'block'}}>\n                        <Editor\n                            value={props.comments[selectedComment] ? props.comments[selectedComment].MinutesSummary : ''}\n                            init={{\n                                browser_spellcheck: true,\n                                height: window.innerHeight / 1.5,\n                                plugins: 'link paste save lists preview searchreplace pagebreak code table',\n                                toolbar: 'undo redo | bold italic strikethrough | alignleft aligncenter alignright',\n                                skin: false,\n                                valid_children: '+body[style]',\n                                content_css: false,\n                                content_style: 'table { border-collapse: collapse; border: 1px solid #FFFFFF }' + 'td { padding: 12px 0px }',\n                            }}\n                            onEditorChange={content => handleChange(content)}\n                        />\n                    </div>\n                    <div className=\"flex-row\">\n                        <br />\n                        <div className=\"inline-list\">\n                            <button type=\"button\" onClick={() => props.toggleBox(false)} className=\"button secondary\">Cancel</button>\n                            <button type=\"button\" onClick={props.saveComment} className=\"button\">Save</button>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    );\n};\n\nexport default CommentBox;","import React from \"react\";\nimport InputTypes from \"../input-types\";\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport Select from 'react-select'\nimport { calendarActionCreators } from \"../../../../stores/lis-calendar-store\";\nimport { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';\nimport CommentBox from './comment-box';\nimport renderHTML from 'react-render-html';\nimport { minutesActionCreators } from \"../../../../stores/lis-minutes-store\";\nimport { billActionCreators } from \"../../../../stores/lis-legislation-store\";\nimport ReactTooltip from \"react-tooltip\";\nimport moment from \"moment-timezone\";\n\nconst getItemStyle = (isDragging, draggableStyle, pendingDeletion) => ({\n    // some basic styles to make the items look a bit nicer\n    userSelect: 'none',\n    // change background colour if dragging\n    background: isDragging ? '#34495e' : 'white',\n    color: isDragging ? 'white' : '#34495e',\n    border: pendingDeletion ? 'red' : 'none',\n    // styles we need to apply on draggables\n    ...draggableStyle,\n});\n\nconst getListStyle = isDraggingOver => ({\n    background: isDraggingOver ? '#8b9fb3' : '#666666',\n    width: '100%',\n});\n\nclass NonLegislativeForm extends React.Component {\n\n    constructor(props) {\n        super(props)\n        this.state = {\n            selectedMotion: '',\n            insertEntry: [{ label: \"No Legislation\" }],\n            templateInputs: [],\n            references: [],\n            motionOptions: [],\n            selectedMotions: [],\n            newEntries: [],\n            templateInputs: [],\n            templatedEdited: false,\n            showMenu: -1,\n            showCommentBox: false,\n            commentBoxContent: [],\n            textList: [],\n            editing: false,\n            initialText: [],\n            checkedBills: [],\n            editingActivityDescription: {}\n        }\n\n        this.closeNewEntries = this.closeNewEntries.bind(this);\n        this.toggleEdit = this.toggleEdit.bind(this);\n        this.onEntryDragEnd = this.onEntryDragEnd.bind(this);\n        this.onActivityDragEnd = this.onActivityDragEnd.bind(this);\n        this.removeActivity = this.removeActivity.bind(this);\n        this.addBackActivity = this.addBackActivity.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n        this.saveChange = this.saveChange.bind(this);\n        this.insertMotion = this.insertMotion.bind(this);\n        this.handleTemplateChange = this.handleTemplateChange.bind(this);\n        this.handleMotionChange = this.handleMotionChange.bind(this);\n        this.handleSelectedMotionDescriptionChange = this.handleSelectedMotionDescriptionChange.bind(this);\n        this.getCatActionList = this.getCatActionList.bind(this);\n        this.toggleMenu = this.toggleMenu.bind(this);\n        this.addEntry = this.addEntry.bind(this);\n        this.handleCommentBoxChange = this.handleCommentBoxChange.bind(this);\n        this.toggleCommentBox = this.toggleCommentBox.bind(this);\n        this.saveComment = this.saveComment.bind(this);\n        this.toggleShowDeleted = this.toggleShowDeleted.bind(this);\n        this.getTextList = this.getTextList.bind(this);\n        this.getNonLegislativeActionList = this.getNonLegislativeActionList.bind(this);\n        this.handleNewMotionChange = this.handleNewMotionChange.bind(this);\n        this.toggleSwitchCategory = this.toggleSwitchCategory.bind(this);\n        this.handleSwitchCategoryChange = this.handleSwitchCategoryChange.bind(this);\n        this.switchCategory = this.switchCategory.bind(this);\n        this.toggleSelectEntry = this.toggleSelectEntry.bind(this);\n        this.toggleEditActivityDescription = this.toggleEditActivityDescription.bind(this);\n\n        this.menuBoxRef = React.createRef();\n    }\n\n    closeNewEntries() {\n        this.setState({\n            newEntries: []\n        });\n    }\n\n    toggleEdit(index) {\n        let newEntries = [...this.state.newEntries];\n        let init = [];\n        if (this.state.newEntries[index]) {\n            newEntries[index] = null;\n        } else {\n            if (this.state.newEntries.length === 0) {\n                newEntries.length = this.props.formData.MinutesEntries.length;\n            }\n            //If the user has multiple edit entries open clicking the X on one doesn't kill the changes to another\n            newEntries[index] = JSON.parse(JSON.stringify(this.props.formData.MinutesEntries[index]));\n            // Test to see if there are zero minute activities. If so then create one.\n            if (!newEntries[index].MinutesActivities || newEntries[index].MinutesActivities.length === 0) {\n                newEntries[index].MinutesActivities = [];\n                const newActivity = {\n                    Description: newEntries[index].EntryText,\n                    ActivityReferences: [],\n                    InPreview: true\n                };\n                newEntries[index].MinutesActivities.push(newActivity);\n            }\n            //Test to see if the activities have zero activity references. If they have zero then add a blank text one\n            newEntries[index].MinutesActivities.forEach(act => {\n                if (act.EventCode) {\n                    const eventReference = this.state.references.find(evt => evt.EventCode === act.EventCode && evt.IsPassed === act.IsPassed);\n                    if (eventReference) {\n                        const actionReferences = eventReference.ActionReferences;\n                        if (actionReferences) {\n                            const missingActivitiyReferences = actionReferences.filter(ref => !act.ActivityReferences || !act.ActivityReferences.map(existingActivities => existingActivities.ActionReferenceType).includes(ref.ActionReferenceType));\n                            if (missingActivitiyReferences.length) {\n                                act.ActivityReferences = act.ActivityReferences ? act.ActivityReferences.concat(JSON.parse(JSON.stringify(missingActivitiyReferences))) : JSON.parse(JSON.stringify(missingActivitiyReferences));\n                            }\n                        }\n                    }\n                }\n\n                if (!act.ActivityReferences || act.ActivityReferences.length === 0) {\n                    const textType = this.props.actionTypes.find(type => type.ActionReferenceType === 'Text');\n                    if (textType) {\n                        //Sometimes ActivityReferences is undefined. Make a blank one so the push does not fail\n                        act.ActivityReferences = [];\n                        act.ActivityReferences.push({\n                            ActionReferenceTypeID: textType.ActionReferenceTypeID,\n                            ActionReferenceType: textType.ActionReferenceType,\n                            ReferenceText: act.Description\n                        });\n                    }\n                }\n                //Need something from act we can reference back to when displaying the initial activity text value as a label\n                init.push({ ReferenceText: act.Description, MinutesActivityID: act.MinutesActivityID })\n            });\n        }\n        let editingActivityDescription = { ...this.state.editingActivityDescription };\n        editingActivityDescription[index] = {};\n        this.setState({\n            newEntries: newEntries,\n            editing: !this.state.editing,\n            initialText: init,\n            editingActivityDescription\n        }, () => {\n            if (this.state.editing) {\n                newEntries[index].MinutesActivities.forEach((activity, activityIndex) => {\n                    if (activity.VoteTally !== undefined)\n                        this.handleActivityDescriptionChange(null, \"VoteTally\", index, activityIndex)\n                })\n            }\n        });\n    }\n\n    toggleEditActivityDescription(entryIndex, activityIndex) {\n        let editingActivityDescription = { ...this.state.editingActivityDescription };\n        if (!editingActivityDescription[entryIndex]) {\n            editingActivityDescription[entryIndex] = {};\n        }\n        editingActivityDescription[entryIndex][activityIndex] = !editingActivityDescription[entryIndex][activityIndex];\n        this.setState({ editingActivityDescription }, () => {\n            this.handleActivityDescriptionChange(null, \"Description\", entryIndex, activityIndex)\n            this.handleActivityDescriptionChange(null, \"VoteTally\", entryIndex, activityIndex)\n        });\n    }\n\n    handleActivityDescriptionChange(value, attr, entryIndex, activityIndex, save) {\n        //Update the input with new text. Save change to this components state so it doesn't update the parent just yet (in case the user clicks the X)\n        let entries = this.state.newEntries;\n        let activity = entries[entryIndex].MinutesActivities[activityIndex];\n\n        if (save) {\n            activity.Description = activity.tempDescription ?? activity.Description;\n            activity.VoteTally = activity.tempVoteTally ?? activity.VoteTally;\n        } else {\n            activity['temp' + attr] = value ?? activity[attr];\n        }\n\n        this.setState({ entries }, () => {\n            if (save) this.toggleEditActivityDescription(entryIndex, activityIndex);\n        });\n    }\n\n    onActivityDragEnd(result, entryIndex) {\n        if (!result.destination) {\n            return;\n        }\n        if (result.destination.index === result.source.index) {\n            return;\n        }\n        let entries = [...this.state.newEntries];\n        let activities = entries[entryIndex].MinutesActivities;\n        const [removed] = activities.splice(result.source.index, 1);\n        activities.splice(result.destination.index, 0, removed);\n        activities.forEach((element, index) => {\n            element.Sequence = index + 1\n        });\n        this.setState({\n            newEntries: entries\n        });\n    }\n\n    onEntryDragEnd(result) {\n        if (!result.destination) {\n            return;\n        }\n        if (result.destination.index === result.source.index) {\n            return;\n        }\n        let entries = [...this.props.formData.MinutesEntries];\n        const [removed] = entries.splice(result.source.index, 1);\n        entries.splice(result.destination.index, 0, removed);\n        entries.forEach((element, index) => {\n            element.Sequence = index + 1;\n        });\n        this.props.onMultipleEntryChange(entries, this.props.currentActivitySequence);\n        this.props.handleSaveEntry(entries);\n        // \n        this.setState({\n            newEntries: []\n        });\n    }\n\n    removeActivity(entryIndex, activityIndex) {\n        let entries = [...this.state.newEntries];\n        entries[entryIndex].MinutesActivities[activityIndex].DeletionDate = moment();\n        if (entries[entryIndex].MinutesSummaries) {\n            //if this is a \"COMMUNICATION FROM HOUSE\" entry, delete the entire entry so nothing (including the minutes summaries) appears for the public\n            entries[entryIndex].DeletionDate = moment();\n        }\n        this.setState({\n            newEntries: entries\n        });\n    }\n\n    addBackActivity(entryIndex, activityIndex) {\n        let entries = [...this.state.newEntries];\n        entries[entryIndex].MinutesActivities[activityIndex].DeletionDate = null;\n        entries[entryIndex].MinutesActivities[activityIndex].IsPublic = false;\n        if (entries[entryIndex].MinutesSummaries) {\n            //if this is a \"COMMUNICATION FROM HOUSE\" entry, re-add the entire entry so everything (including the minutes summaries) appears\n            entries[entryIndex].DeletionDate = null;\n            entries[entryIndex].IsPublic = false;\n        }\n        this.setState({\n            newEntries: entries\n        });\n    }\n\n    handleChange(entryIndex, activityIndex, referenceIndex, reference, previousValue) {\n        //Update the input with new text. Save change to this components state so it doesn't update the parent just yet (in case the user clicks the X)\n        let entries = this.state.newEntries;\n        let activity = entries[entryIndex].MinutesActivities[activityIndex];\n        activity.ActivityReferences[referenceIndex] = reference;\n        let desc = '';\n        activity.ActivityReferences.forEach(tInput => desc += tInput.ReferenceText);\n        activity.Description = desc;\n        if (this.props.formData.CategoryType === \"Chairmans Report\") {\n            // if they are editing a chairs report summary, use the entrytext attr, as it won't persist otherwise\n            entries[entryIndex].EntryText = desc;\n            entries[entryIndex].IsPublic = false;\n        }\n        activity.IsPublic = false;\n        entries[entryIndex].MinutesActivities[activityIndex] = activity;\n        //if they are selecting a communication, add minutessummaries for each communicationsummary on that communication\n        if (reference.ActionReferenceType === 'Communication') {\n            //set the communication data for the entry level\n            entries[entryIndex].CommunicationID = reference.ReferenceID;\n            entries[entryIndex].CommunicationDate = reference.CommunicationDate;\n            if (reference.CommunicationNumber) {\n                entries[entryIndex].CommunicationNumber = Number(reference.CommunicationNumber);\n            }\n            //set minutessummaries array if not already available\n            entries[entryIndex].MinutesSummaries = entries[entryIndex].MinutesSummaries || [];\n            //if they are changing from one communication to another, delete the summaries related to the old communication\n            if (previousValue && previousValue.ReferenceID) {\n                entries[entryIndex].MinutesSummaries = entries[entryIndex].MinutesSummaries.filter(ms => ms.ModificationDate);\n                entries[entryIndex].MinutesSummaries.filter(ms => ms.ReferenceID === previousValue.ReferenceID).forEach(ms => ms.DeletionDate = moment())\n            }\n            if (reference.CommunicationSummaries) {\n                reference.CommunicationSummaries.filter(cs => cs.MinutesSummary && cs.CommunicationID).forEach(commSummary => {\n                    entries[entryIndex].MinutesSummaries.push({ MinutesSummary: commSummary.MinutesSummary, ReferenceID: commSummary.CommunicationID })\n                })\n            }\n        }\n        this.setState({\n            newEntries: entries\n        });\n    }\n\n    saveChange(entryIndex) {\n        let entry = this.state.newEntries[entryIndex];\n        //save any changes to vote tallies\n        let promises = [];\n        entry.MinutesActivities.forEach((activity, activityIndex) => {\n            if (activity.VoteTally !== undefined && !activity.ActivityReferences.find(ar => ar.ActionReferenceType !== \"Text\")) {\n                promises.push(new Promise(res => {\n                    this.handleActivityDescriptionChange(null, \"VoteTally\", entryIndex, activityIndex, true);\n                    res();\n                }))\n            }\n        })\n        Promise.all(promises).then(() => {\n            //Send the index of the minute entry, the entire minute entries object (so we don't have to save the entire book),\n            //the value of the text input, and the sequence to show which category to update\n            this.props.onEntryChange(entryIndex, entry, this.props.currentActivitySequence);\n            this.props.handleSaveEntry(entry);\n            //Turn it back into a span\n            let newEntries = [...this.state.newEntries];\n            newEntries[entryIndex] = null;\n            let editingActivityDescription = { ...this.state.editingActivityDescription };\n            editingActivityDescription[entryIndex] = {};\n            this.setState({\n                newEntries: newEntries,\n                editing: false,\n                editingActivityDescription\n            });\n        });\n    }\n\n    insertMotion(entryIndex) {\n        //A new motion wants to be added so take all this data and sent it to the parent div to be added to the state\n        const { templatedEdited } = this.state;\n        let templateInputs = [...this.state.templateInputs];\n        let selectedMotions = [...this.state.selectedMotions];\n        const entries = [...this.props.formData.MinutesEntries];\n        const selectedMotion = selectedMotions[entryIndex] ? selectedMotions[entryIndex] : this.state.selectedMotion;\n        let entry = entryIndex >= 0 ? entries[entryIndex] : {};\n        //If it is a null then create a new one so the push doesn't fail\n        if (!entry.MinutesActivities) {\n            entry.MinutesActivities = [];\n        }\n        entry.Sequence = Math.max(...entries.map(e => e.Sequence || 0)) + 1;\n        let desc = selectedMotion.Description || selectedMotion.CalendarDescription;\n        //If the user has changed the value of the action references then use those for the description instead of the existing one.\n        let activityRefs = [];\n        if (templatedEdited || (templateInputs.length && !templateInputs.find(tInput => ![\"Text\", \"HTML\"].includes(tInput.ActionReferenceType)))) {\n            desc = '';\n            templateInputs.forEach((tInput, actIndex) => {\n                desc += tInput.ReferenceText;\n                activityRefs[actIndex] = {\n                    ActionReferenceTypeID: tInput.ActionReferenceTypeID,\n                    ActionReferenceType: tInput.ActionReferenceType,\n                    Sequence: tInput.Sequence,\n                    ReferenceText: tInput.ReferenceText,\n                    ReferenceID: tInput.ReferenceID\n                }\n                if (tInput.CommunicationSummaries) {\n                    tInput.CommunicationSummaries.filter(cs => cs.MinutesSummary && cs.CommunicationID).forEach(commSummary => {\n                        entry.MinutesSummaries = entry.MinutesSummaries || [];\n                        entry.MinutesSummaries.push({ MinutesSummary: commSummary.MinutesSummary, ReferenceID: commSummary.CommunicationID })\n                    })\n                }\n            });\n        } else {\n            const textType = this.props.actionTypes.find(type => type.ActionReferenceType === 'Text');\n            if (textType) {\n                activityRefs = [{\n                    ActionReferenceTypeID: textType.ActionReferenceTypeID,\n                    ActionReferenceType: textType.ActionReferenceType,\n                    ReferenceText: desc\n                }];\n            }\n        }\n        entry.MinutesActivities.push(Object.assign(selectedMotion, {\n            MinutesEntryID: entry.MinutesEntryID,\n            ActivityReferences: activityRefs,\n            Description: desc,\n            Sequence: Math.max(...entry.MinutesActivities.map(m => m.Sequence || 0)) + 1\n        }));\n        //User cannot add an activity to an entry while they are editing that entry\n        if (this.state.newEntries[entryIndex]) {\n            let newEntries = [...this.state.newEntries];\n            newEntries[entryIndex] = null;\n            this.setState({\n                newEntries: newEntries\n            })\n        }\n        this.props.onEntryChange(entryIndex, entry, this.props.currentActivitySequence);\n        //Set MinutesCategoryID if we're adding an order of business entry and entryText\n        if (!entry.MinutesCategoryID) {\n            entry.MinutesCategoryID = this.props.formData.MinutesCategoryID;\n            entry.EntryText = desc;\n        }\n        this.props.handleSaveEntry(entry);\n\n        selectedMotions[entryIndex] = null;\n        templateInputs = [];\n        this.setState({\n            selectedMotion: '',\n            selectedMotions: selectedMotions,\n            templateInputs: templateInputs,\n            showSwitchCategory: false,\n            selectedSwitchCategory: null,\n        });\n    }\n\n    handleTemplateChange(entryIndex, activityIndex, referenceIndex, reference, previousValue) {\n        let templateInputs = [...this.state.templateInputs];\n        templateInputs[referenceIndex] = reference;\n        //Used when adding the motion to know whether to use the existing description or concatenate together the action reference values\n        //If they have change a value it is save to say they want the the description to be the action references stringed together\n        if (!this.state.templatedEdited) {\n            this.setState({\n                templatedEdited: true\n            });\n        }\n        //if they are selecting a communication, add minutessummaries for each communicationsummary on that communication\n        if (reference.ActionReferenceType === 'Communication') {\n            //set the communication data for the entry level\n            templateInputs[entryIndex].CommunicationID = reference.ReferenceID;\n            templateInputs[entryIndex].CommunicationDate = reference.CommunicationDate;\n            if (reference.CommunicationNumber) {\n                templateInputs[entryIndex].CommunicationNumber = Number(reference.CommunicationNumber);\n            }\n            //set minutessummaries array if not already available\n            templateInputs[entryIndex].MinutesSummaries = templateInputs[entryIndex].MinutesSummaries || [];\n            //if they are changing from one communication to another, delete the summaries related to the old communication\n            if (previousValue && previousValue.ReferenceID) {\n                templateInputs[entryIndex].MinutesSummaries = templateInputs[entryIndex].MinutesSummaries.filter(ms => ms.ModificationDate);\n                templateInputs[entryIndex].MinutesSummaries.filter(ms => ms.ReferenceID === previousValue.ReferenceID).forEach(ms => ms.DeletionDate = moment())\n            }\n            if (reference.CommunicationSummaries) {\n                reference.CommunicationSummaries.filter(cs => cs.MinutesSummary && cs.CommunicationID).forEach(commSummary => {\n                    templateInputs[entryIndex].MinutesSummaries.push({ MinutesSummary: commSummary.MinutesSummary, ReferenceID: commSummary.CommunicationID })\n                })\n            }\n        }\n        this.setState({\n            templateInputs: templateInputs\n        });\n    }\n\n    handleMotionChange(entryIndex, val) {\n        let selectedMotions = [...this.state.selectedMotions];\n        let templateInputs = [...this.state.templateInputs];\n        selectedMotions[entryIndex] = val;\n        templateInputs[entryIndex] = val ? JSON.parse(JSON.stringify(val.ActionReferences)) : null;\n        this.setState({\n            selectedMotions: selectedMotions,\n            templateInputs: templateInputs,\n        }, () => {\n            if (val && val.ActionReferences && val.ActionReferences.find(ar => ar.ActionReferenceType === \"LegislationText\")) {\n                this.getTextList();\n            }\n        });\n    }\n\n\n    handleSelectedMotionDescriptionChange(e) {\n        let selectedMotion = { ...this.state.selectedMotion };\n        selectedMotion.Description = e.target.value;\n        this.setState({\n            selectedMotion\n        });\n    }\n\n    getTextList() {\n        const entries = this.props.formData.MinutesEntries;\n        entries.forEach(entry => {\n            if (entry.LegislationID && !this.state.textList.find(text => text.LegislationID === entry.LegislationID)) {\n                this.props.actions.getTextList('?legislationID=' + entry.LegislationID + '&sessionID=' + this.props.sessionId)\n                    .then(() => {\n                        let textList = [...this.props.bills.textList];\n                        textList.forEach(text => {\n                            text.label = text.DocumentCode;\n                            text.value = text.LegislationTextID;\n                        });\n                        this.setState(state => ({\n                            textList: state.textList.concat(textList)\n                        }));\n                    });\n            }\n        })\n    }\n\n    componentDidUpdate(prevProps) {\n        if (prevProps.currentActivitySequence !== this.props.currentActivitySequence) {\n            this.setState({\n                selectedMotions: [],\n                newEntries: [],\n                templateInputs: [],\n                templatedEdited: false,\n                showSwitchCategory: false,\n                selectedSwitchCategory: null,\n            });\n            this.getCatActionList();\n        }\n    }\n\n    componentDidMount() {\n        this.getCatActionList();\n        this.getNonLegislativeActionList();\n    }\n\n    getCatActionList() {\n        //Get the calendar action reference data\n        const catId = this.props.formData.CalendarCategoryTypeID;\n        const referenceParams = `?calendarCategoryTypeID=${catId}&chamberCode=S`;\n        this.props.actions.getReferences(referenceParams)\n            .then(() => {\n                let motionOptions = this.props.calendar.references;\n                motionOptions.forEach(reference => {\n                    reference.label = `${reference.EventCode} ${reference.Description}`;\n                    reference.value = reference.CalendarActionID;\n                });\n                this.setState({\n                    motionOptions: motionOptions\n                });\n            });\n    }\n\n    toggleMenu(entryIndex, e) {\n        if (e) {\n            //Do not hide the small motion form if a child of the form is focused\n            if (e.currentTarget.contains(e.relatedTarget)) {\n                return;\n            }\n        }\n        this.setState({\n            showMenu: entryIndex\n        }, () => {\n            if (this.menuBoxRef.current) {\n                this.menuBoxRef.current.focus();\n            }\n        });\n    }\n\n    addEntry(entryIndex, position) {\n        let entries = [...this.props.formData.MinutesEntries];\n        const newEntry = {\n            IsOOB: entries[entryIndex].IsOOB,\n            IsPublic: false,\n            MinutesCategoryID: entries[entryIndex].MinutesCategoryID\n        }\n        entries.splice(entryIndex + position, 0, newEntry);\n        entries.forEach((entry, idx) => {\n            entry.Sequence = idx + 1\n        });\n        this.props.handleSaveEntry(entries);\n        this.setState({\n            showMenu: -1,\n            newEntries: [],\n            selectedMotions: []\n        });\n    }\n\n    handleCommentBoxChange(content) {\n        this.setState({\n            commentBoxContent: content\n        });\n    }\n\n    toggleCommentBox(show) {\n        const entries = this.props.formData.MinutesEntries;\n        let commentBoxContent = [];\n        if (entries[show] && entries[show].MinutesSummaries) {\n            if (entries[show].MinutesSummaries.length !== 0) {\n                commentBoxContent = entries[show].MinutesSummaries;\n            }\n        }\n        this.setState({\n            showCommentBox: show,\n            commentBoxContent: commentBoxContent\n        });\n    }\n\n    saveComment() {\n        let entries = [...this.props.formData.MinutesEntries];\n        if (entries[this.state.showCommentBox]) {\n            let entry = entries[this.state.showCommentBox];\n            entry.MinutesSummaries = this.state.commentBoxContent;\n            this.props.handleSaveEntry(entry);\n            this.setState({\n                showCommentBox: false\n            });\n        }\n    }\n\n    toggleShowDeleted(entryIndex) {\n        let entries = [...this.state.newEntries];\n        entries[entryIndex].showDeleted = !entries[entryIndex].showDeleted;\n        this.setState({\n            newEntries: entries\n        });\n    }\n\n    getNonLegislativeActionList() {\n        //Get the non legislative action reference data\n        this.props.actions.getBillEventReferences(\"?isActive=true\").then(() => {\n            let references = [...this.props.bills.billEventRef].filter(ref => ref.AdministrativeAction);\n            references.forEach(ref => {\n                ref.label = `${ref.EventCode} ${ref.CalendarDescription}`;\n                ref.value = `${ref.EventCode}-${ref.IsPassed}`\n            });\n            this.setState({\n                references: references\n            });\n        });\n    }\n\n    handleNewMotionChange(value) {\n        this.setState({\n            selectedMotion: value,\n            templateInputs: value ? JSON.parse(JSON.stringify(value.ActionReferences)) : [],\n            templatedEdited: false\n        });\n    }\n\n    toggleSwitchCategory(entryIndex) {\n        this.setState({\n            showSwitchCategory: !this.state.showSwitchCategory\n        }, () => {\n            if (this.state.showSwitchCategory) {\n                const dropdownOptions = this.props.categories.filter(c => c.CalendarCategoryTypeID === this.props.formData.CalendarCategoryTypeID && c.MinutesCategoryID !== this.props.formData.MinutesCategoryID);\n                if (dropdownOptions.length === 1) {\n                    this.handleSwitchCategoryChange(dropdownOptions[0]);\n                }\n                this.toggleSelectEntry(entryIndex);\n                this.toggleMenu(-1);\n            } else {\n                this.setState({ checkedBills: [] })\n                this.handleSwitchCategoryChange(null);\n            }\n        });\n    }\n\n    handleSwitchCategoryChange(val) {\n        this.setState({\n            selectedSwitchCategory: val\n        });\n    }\n\n    switchCategory() {\n        if (this.state.checkedBills.length && this.state.selectedSwitchCategory) {\n            this.setState({ switchingCategories: true }, () => {\n                const origSequence = this.props.currentActivitySequence;\n                let entries = [...this.props.formData.MinutesEntries].filter((e, i) => this.state.checkedBills[i]);\n                this.props.bulkMoveEntry(entries, origSequence - 1, this.state.selectedSwitchCategory.MinutesCategoryID);\n                this.setState({ checkedBills: [], showSwitchCategory: false, selectedSwitchCategory: null, switchingCategories: false })\n            })\n        }\n    }\n\n    toggleSelectEntry(billIndex, e) {\n        let checkedBills = [...this.state.checkedBills];\n        let lastCheckedBill = this.state.lastCheckedBill;\n        if (e && e.nativeEvent.shiftKey && this.state.lastCheckedBill !== -1) {\n            checkedBills = checkedBills.fill(false);\n            for (let i = 0; i < Math.abs(billIndex - this.state.lastCheckedBill); i++) {\n                const index = this.state.lastCheckedBill + i * (billIndex - this.state.lastCheckedBill) / Math.abs(billIndex - this.state.lastCheckedBill);\n                checkedBills[index] = true;\n            }\n        } else {\n            lastCheckedBill = !checkedBills[billIndex] ? billIndex : this.state.lastCheckedBill;\n        }\n        checkedBills[billIndex] = !checkedBills[billIndex]\n        this.setState({\n            checkedBills: checkedBills,\n            lastCheckedBill: lastCheckedBill\n        });\n    }\n\n    render() {\n        const { selectedMotion, references } = this.state;\n        const fontSize = '0.8em';\n        const selectStyle = {\n            control: styles => ({\n                ...styles,\n                minHeight: '0px',\n                padding: '0.12em 0.6em !important',\n            }),\n            valueContainer: styles => ({\n                ...styles,\n                padding: 0,\n            }),\n            input: styles => ({\n                ...styles,\n                fontSize: fontSize,\n                lineHeight: 'normal',\n            }),\n            singleValue: styles => ({\n                ...styles,\n                fontSize: fontSize,\n            }),\n            placeholder: styles => ({\n                ...styles,\n                fontSize: fontSize\n            }),\n            option: styles => ({\n                ...styles,\n                fontSize: fontSize\n            }),\n            dropdownIndicator: styles => ({\n                ...styles,\n                padding: '5px'\n            }),\n        }\n        const showDeletedItemsCheckbox = (entry) => {\n            return !!entry.MinutesActivities.find(act => act.DeletionDate)\n        }\n        // Sometimes the deleted items are shown and other times they are not. If they are not shown then the first activity might not be the first activity on the screen.\n        // So this variable is used to figure out whether to show the hr or not that seperates activities.\n        const getIndexOfFirstActivity = entry => {\n            if (entry.showDeleted) {\n                return 0\n            } else {\n                return entry.MinutesActivities.findIndex(act => !act.DeletionDate);\n            }\n        }\n\n        return (\n            <div className=\"user-forms\">\n                <div className=\"dlas-forms tooltip-wrap\">\n                    <form>\n                        {this.props.formData.CalendarCategoryTypeID == 132 /* Order of Business */ &&\n                            <>\n                                <div className=\"multi-row eight-and-one no-margin\" style={{ marginBottom: \"20px\" }}>\n                                    <div className=\"inner-grid two\">\n                                        <div>\n                                            <label>Motion</label>\n                                            <Select\n                                                value={selectedMotion}\n                                                options={references}\n                                                onChange={this.handleNewMotionChange}\n                                                styles={selectStyle}\n                                                isClearable\n                                            />\n                                        </div>\n                                        <div>\n                                            <label>Description</label>\n                                            <input\n                                                value={this.state.templateInputs.length > 0 ? '' : selectedMotion?.Description || selectedMotion?.CalendarDescription || ''}\n                                                placeholder={selectedMotion ? this.state.templateInputs.length > 0 ? \"See below...\" : \"\" : \"Select motion...\"}\n                                                disabled={!selectedMotion || this.state.templateInputs.length > 0}\n                                                onChange={this.handleSelectedMotionDescriptionChange}\n                                            />\n                                        </div>\n                                    </div>\n                                    <div className=\"inner-grid two\">\n                                        <div>\n                                            <br />\n                                            <button type='button' disabled={!this.state.selectedMotion || this.props.categoryFormDisabled} className='button' onClick={() => this.insertMotion(-1)}>Add Motion</button>\n                                        </div>\n                                    </div>\n                                </div>\n                                {this.state.templateInputs.length > 0 &&\n                                    <div className=\"multi-row small-two-one-alt no-margin\">\n                                        <br />\n                                        <div>\n                                            <div>\n                                                <span className='small-text txt-greyed'>{renderHTML(this.state.templateInputs.map((tInput, i) => {\n                                                    if (!tInput.ReferenceText && tInput.ActionReferenceType !== \"Text\") {\n                                                        return `[${tInput.ActionReferenceType}]`\n                                                    }\n                                                    return tInput.ReferenceText\n                                                }).join(''))}</span>\n                                            </div>\n                                            <InputTypes\n                                                newEvent={this.state.selectedMotion}\n                                                memberList={this.props.memberList}\n                                                committeeList={this.props.committeeList}\n                                                communicationList={this.props.communicationList}\n                                                eventList={this.state.reconsiderationEvents}\n                                                handleChange={this.handleTemplateChange}\n                                                entryIndex={0}\n                                                activityIndex={0}\n                                                references={this.state.templateInputs}\n                                            />\n                                        </div>\n                                    </div>\n                                }\n                            </>\n                        }\n                    </form>\n                    {this.state.showCommentBox !== false &&\n                        <CommentBox\n                            toggleBox={this.toggleCommentBox}\n                            handleCommentBoxChange={this.handleCommentBoxChange}\n                            comments={this.state.commentBoxContent}\n                            saveComment={this.saveComment}\n                        />\n                    }\n                    {this.props.formData.MinutesEntries.length ?\n                        <div className=\"flex-row flex-end\" style={{ marginBottom: '5px' }}>\n                            {this.state.showSwitchCategory &&\n                                <div className=\"inner-grid\" style={{ gap: '5px', gridTemplateColumns: '20px 4fr .1fr' }}>\n                                    <div className=\"inner-grid align-center\">\n                                        <button onClick={this.toggleSwitchCategory} type=\"button\" className=\"icon delete\"></button>\n                                    </div>\n                                    <Select\n                                        value={this.state.selectedSwitchCategory}\n                                        options={this.props.categories.filter(c => c.CalendarCategoryTypeID === this.props.formData.CalendarCategoryTypeID && c.MinutesCategoryID !== this.props.formData.MinutesCategoryID)}\n                                        getOptionLabel={opt => this.props.getCategoryDescriptionText(opt)}\n                                        onChange={this.handleSwitchCategoryChange}\n                                        styles={selectStyle}\n                                    />\n                                    <button onClick={this.switchCategory} disabled={!this.state.checkedBills.length || this.state.switchingCategories || !this.state.selectedSwitchCategory} type=\"button\" className=\"button float-right\">{this.state.switchingCategories ? <div className=\"small-spinner\" /> : 'Switch'}</button>\n                                </div>\n                            }\n                        </div>\n                        : null\n                    }\n                    <div className={this.props.disableChanges ? 'dnd-disabled' : ''}>\n                        <DragDropContext onDragEnd={this.onEntryDragEnd}>\n                            <Droppable droppableId={`entries-droppable`}>\n                                {(provided, snapshot) =>\n                                    <div ref={provided.innerRef} style={getListStyle(snapshot.isDraggingOver)}>\n                                        {this.props.formData.MinutesEntries.map((entry, entryIndex) =>\n                                            <Draggable isDragDisabled={this.props.categoryFormDisabled} key={`${entry.MinutesEntryID}-${entry.Sequence}`} draggableId={`${entry.MinutesEntryID}-${entry.Sequence}`} index={entryIndex}>\n                                                {(provided, snapshot) =>\n                                                    <div {...this.state.newEntries[entryIndex] ? null : { ...provided.dragHandleProps }} ref={provided.innerRef} {...provided.draggableProps} className=\"section-content\">\n                                                        <div>\n                                                            {this.state.newEntries[entryIndex] ?\n                                                                <React.Fragment>\n                                                                    {showDeletedItemsCheckbox(this.state.newEntries[entryIndex]) &&\n                                                                        <div className=\"flex-row flex-vertical-center flex-start\">\n                                                                            <div className=\"toggle-switch\" onClick={() => this.toggleShowDeleted(entryIndex)}>\n                                                                                <input type=\"checkbox\" checked={this.state.newEntries[entryIndex].showDeleted} />\n                                                                                <span className=\"slider\"></span>\n                                                                            </div>\n                                                                            <label style={{ fontSize: \"12px\" }} className=\"checkbox-label\">Show Deleted</label>\n                                                                        </div>}\n                                                                    <div className=\"no-gap-grid two-col-sidebar\">\n                                                                        <DragDropContext onDragEnd={res => this.onActivityDragEnd(res, entryIndex)}>\n                                                                            <Droppable droppableId={`activities-${entryIndex}-droppable`}>\n                                                                                {(provided, snapshot) =>\n                                                                                    <div ref={provided.innerRef} style={getListStyle(snapshot.isDraggingOver)}>\n                                                                                        {this.state.newEntries[entryIndex].MinutesActivities && this.state.newEntries[entryIndex].MinutesActivities.map((activity, activityIndex) => {\n                                                                                            if (!this.state.newEntries[entryIndex].showDeleted && activity.DeletionDate) {\n                                                                                                return null;\n                                                                                            } else {\n                                                                                                const inputValue = (this.state.newEntries[entryIndex].MinutesActivities[activityIndex].Description || (this.state.newEntries[entryIndex].MinutesActivities[activityIndex].ActivityReferences && this.state.newEntries[entryIndex].MinutesActivities[activityIndex].ActivityReferences.map((tInput, i) => {\n                                                                                                    if (!tInput.ReferenceText && tInput.ActionReferenceType !== \"Text\") {\n                                                                                                        return `[${tInput.ActionReferenceType}]`\n                                                                                                    }\n                                                                                                    return tInput.ReferenceText\n                                                                                                }).join('')));\n                                                                                                return (<Draggable key={`${activity.MinutesActivityID}-${activity.Sequence}`} draggableId={`${activity.MinutesActivityID}-${activity.Sequence}`} index={activityIndex}>\n                                                                                                    {(provided2, snapshot) =>\n                                                                                                        <div\n                                                                                                            ref={provided2.innerRef}\n                                                                                                            {...provided2.draggableProps}\n                                                                                                            style={getItemStyle(\n                                                                                                                snapshot.isDragging,\n                                                                                                                provided2.draggableProps.style\n                                                                                                            )}>\n                                                                                                            {getIndexOfFirstActivity(this.state.newEntries[entryIndex]) !== activityIndex && <hr className=\"faded-line\" />}\n                                                                                                            <div className=\"no-gap-grid two-col-sidebar-backwards\">\n                                                                                                                <div {...provided2.dragHandleProps}>\n                                                                                                                    <button className=\"button draggable\">Drag and drop</button>\n                                                                                                                </div>\n                                                                                                                <div>\n                                                                                                                    <div className=\"no-gap-grid two-col-sidebar\">\n                                                                                                                        <div>\n                                                                                                                            <div style={{ display: 'flex', alignItems: 'center', gap: '5px' }}>\n                                                                                                                                <span\n                                                                                                                                    style={{ textDecoration: this.state.newEntries[entryIndex].MinutesActivities[activityIndex].DeletionDate ? 'line-through' : 'none' }}\n                                                                                                                                    className=\"small-text\">\n                                                                                                                                    {renderHTML(((this.state.newEntries[entryIndex].MinutesActivities[activityIndex].tempDescription ?? this.state.newEntries[entryIndex].MinutesActivities[activityIndex].Description) || this.state.newEntries[entryIndex].MinutesActivities[activityIndex].ActivityReferences.map(tInput => {\n                                                                                                                                        if (!tInput.ReferenceText && tInput.ActionReferenceType !== \"Text\") {\n                                                                                                                                            return `[${tInput.ActionReferenceType}]`\n                                                                                                                                        }\n                                                                                                                                        return tInput.ReferenceText\n                                                                                                                                    }).join('')) + ((this.state.newEntries[entryIndex].MinutesActivities[activityIndex].tempVoteTally ?? this.state.newEntries[entryIndex].MinutesActivities[activityIndex].VoteTally) ? ' ' + (this.state.newEntries[entryIndex].MinutesActivities[activityIndex].tempVoteTally ?? this.state.newEntries[entryIndex].MinutesActivities[activityIndex].VoteTally) : ''))}\n                                                                                                                                </span>\n                                                                                                                                {this.state.newEntries[entryIndex].MinutesActivities.find(ma => ma.ActivityReferences?.find(ar => ar.ActionReferenceType !== \"Text\")) && (!this.state.editingActivityDescription[entryIndex] || !this.state.editingActivityDescription[entryIndex][activityIndex]) && <a className={`icon edit`} onClick={() => this.toggleEditActivityDescription(entryIndex, activityIndex)} />}\n                                                                                                                            </div>\n                                                                                                                            <div style={{ display: 'flex', alignItems: 'center', gap: '5px' }}>\n                                                                                                                                {this.state.editingActivityDescription[entryIndex] && this.state.editingActivityDescription[entryIndex][activityIndex] &&\n                                                                                                                                    <>\n                                                                                                                                        <div style={{ width: '100%', display: 'flex', gap: '5px' }}>\n                                                                                                                                            <textarea style={{ width: this.state.newEntries[entryIndex].MinutesActivities[activityIndex].VoteTally !== undefined ? '75%' : '100%' }} value={this.state.newEntries[entryIndex].MinutesActivities[activityIndex].tempDescription ?? inputValue} onChange={(e) => this.handleActivityDescriptionChange(e.target.value, \"Description\", entryIndex, activityIndex)} />\n                                                                                                                                            {this.state.newEntries[entryIndex].MinutesActivities[activityIndex].VoteTally !== undefined && <EditVoteTally value={this.state.newEntries[entryIndex].MinutesActivities[activityIndex].tempVoteTally} onChange={(e) => this.handleActivityDescriptionChange(e.target.value, \"VoteTally\", entryIndex, activityIndex)} />}\n                                                                                                                                        </div>\n                                                                                                                                        <div style={{ display: 'flex', gap: '5px' }}>\n                                                                                                                                            <a className={`icon save`} onClick={() => this.handleActivityDescriptionChange(null, null, entryIndex, activityIndex, true)} />\n                                                                                                                                            <a className={`icon delete`} onClick={() => this.toggleEditActivityDescription(entryIndex, activityIndex)} />\n                                                                                                                                        </div>\n                                                                                                                                    </>\n                                                                                                                                }\n                                                                                                                            </div>\n                                                                                                                            <div style={{ position: 'relative', zIndex: '2' }}>\n                                                                                                                                {!this.state.newEntries[entryIndex].MinutesActivities[activityIndex].DeletionDate &&\n                                                                                                                                    <>\n                                                                                                                                        <InputTypes\n                                                                                                                                            style={{ display: \"inline-block\" }}\n                                                                                                                                            committeeList={this.props.committeeList}\n                                                                                                                                            communicationList={this.props.communicationList}\n                                                                                                                                            memberList={this.props.memberList}\n                                                                                                                                            actionTypes={this.props.actionTypes}\n                                                                                                                                            handleChange={this.handleChange}\n                                                                                                                                            entryIndex={entryIndex}\n                                                                                                                                            activityIndex={activityIndex}\n                                                                                                                                            references={this.state.newEntries[entryIndex].MinutesActivities[activityIndex].ActivityReferences || []}\n                                                                                                                                            textList={this.state.textList.filter(text => this.state.newEntries[entryIndex].LegislationID === text.LegislationID)}\n                                                                                                                                        />\n                                                                                                                                        {this.state.newEntries[entryIndex].MinutesActivities[activityIndex].VoteTally !== undefined && !this.state.newEntries[entryIndex].MinutesActivities.find(ma => ma.ActivityReferences?.find(ar => ar.ActionReferenceType !== \"Text\")) && <EditVoteTally value={this.state.newEntries[entryIndex].MinutesActivities[activityIndex].tempVoteTally} onChange={(e) => this.handleActivityDescriptionChange(e.target.value, \"VoteTally\", entryIndex, activityIndex)} />}\n                                                                                                                                    </>\n                                                                                                                                }\n                                                                                                                            </div>\n                                                                                                                        </div>\n                                                                                                                        <div>\n                                                                                                                            {!this.state.newEntries[entryIndex].MinutesActivities[activityIndex].DeletionDate ?\n                                                                                                                                <button onClick={() => this.removeActivity(entryIndex, activityIndex)} title={\"Delete\"} type=\"button\" className=\"button remove\"></button>\n                                                                                                                                :\n                                                                                                                                <button onClick={() => this.addBackActivity(entryIndex, activityIndex)} title={\"Re-add\"} type=\"button\" className=\"button add\"></button>\n                                                                                                                            }\n                                                                                                                        </div>\n                                                                                                                    </div>\n\n                                                                                                                </div>\n                                                                                                            </div>\n                                                                                                        </div>}\n                                                                                                </Draggable>)\n                                                                                            }\n                                                                                        })}\n                                                                                        {provided.placeholder}\n                                                                                    </div>\n                                                                                }\n                                                                            </Droppable>\n                                                                        </DragDropContext>\n                                                                        <div style={{ position: \"relative\" }}>\n                                                                            <div className=\"inline-list bill-grid-actions\" key={entry.MinutesEntryID}>\n                                                                                <button onClick={() => this.saveChange(entryIndex)} title={\"Save\"} type=\"button\" className=\"icon save\"></button>\n                                                                                <button onClick={() => this.toggleEdit(entryIndex)} title={\"Cancel\"} type=\"button\" className=\"icon delete\"></button>\n                                                                            </div>\n                                                                        </div>\n                                                                    </div>\n                                                                </React.Fragment>\n                                                                :\n                                                                <div className=\"flex-row flex-vertical-center\">\n                                                                    <div className=\"flex-row flex-vertical-center inline-list\">\n                                                                        <div>\n                                                                            <span className=\"icon menu\" onClick={(e) => this.toggleMenu(entryIndex)}></span>\n                                                                            {this.state.showMenu === entryIndex &&\n                                                                                <div style={{ marginLeft: '-25px', width: this.state.showSwitchCategory !== entryIndex ? 'auto' : '' }} className=\"info-box blue\" ref={this.menuBoxRef} onBlur={(e) => this.toggleMenu(-1, e)} contentEditable suppressContentEditableWarning={true}>\n                                                                                    <div contentEditable={false}>\n                                                                                        <div>\n                                                                                            <button type=\"button\" disabled={this.props.categoryFormDisabled} onClick={() => this.addEntry(entryIndex, 0)} className=\"button-link\">Add Entry Above</button>\n                                                                                        </div>\n                                                                                        <div>\n                                                                                            <button type=\"button\" disabled={this.props.categoryFormDisabled} onClick={() => this.addEntry(entryIndex, 1)} className=\"button-link\">Add Entry Below</button>\n                                                                                        </div>\n                                                                                        {this.props.categories.filter(c => c.CalendarCategoryTypeID === this.props.formData.CalendarCategoryTypeID && c.MinutesCategoryID !== this.props.formData.MinutesCategoryID).length ?\n                                                                                            <div>\n                                                                                                <button type=\"button\" disabled={this.props.categoryFormDisabled} onClick={() => this.toggleSwitchCategory(entryIndex)} className=\"button-link\">Switch Category</button>\n                                                                                            </div>\n                                                                                            : null\n                                                                                        }\n                                                                                    </div>\n                                                                                    {this.state.showSwitchCategory &&\n                                                                                        <input\n                                                                                            type=\"checkbox\"\n                                                                                            className=\"checkbox\"\n                                                                                            checked={this.state.checkedBills[entryIndex]}\n                                                                                            onChange={(e) => this.toggleSelectEntry(entryIndex, e)}\n                                                                                        />\n                                                                                    }\n                                                                                </div>\n                                                                            }\n                                                                        </div>\n                                                                        <div>\n                                                                            {!entry.MinutesActivities || entry.MinutesActivities.length === 0 &&\n                                                                                <React.Fragment>\n                                                                                    <span>\n                                                                                        {entry.EntryText ? entry.EntryText : (\n                                                                                            this.props.formData.CategoryType === \"Chairmans Report\" && (\n                                                                                                entry.MinutesSummaries && entry.MinutesSummaries.find(ms => ms.CommitteeName) ?\n                                                                                                    <>From {entry.MinutesSummaries.find(ms => ms.CommitteeName).CommitteeName}: <em>No chair's reports included</em></>\n                                                                                                    :\n                                                                                                    <em>No chair's reports included</em>\n                                                                                            )\n                                                                                        )\n                                                                                        }\n                                                                                    </span>\n                                                                                    {this.props.formData.CategoryType === \"Chairmans Report\" && <React.Fragment><i data-tip={`You may choose to include or exclude one or more chair's reports from this committee using the checkboxes and then\\nregenerating the summary using the button that will appear at the top of the category upon interacting with a checkbox.`}\n                                                                                        className={`icon notification`} style={{ marginLeft: '5px' }} />\n                                                                                        <ReactTooltip key={new Date()} />\n                                                                                    </React.Fragment>}\n                                                                                </React.Fragment>\n                                                                            }\n                                                                            {entry.MinutesActivities && entry.MinutesActivities.filter(a => !a.DeletionDate).map((activity, activityIndex) =>\n                                                                                <span key={activityIndex}>\n                                                                                    {activityIndex !== 0 && ', '}{renderHTML(activity.Description)}{activity.VoteTally ? ' ' + activity.VoteTally : null}\n                                                                                </span>\n                                                                            )}\n                                                                        </div>\n                                                                    </div>\n                                                                    <div>\n                                                                        <div className=\"flex-row flex-vertical-center inline-list\">\n                                                                            <button disabled={this.props.disableChanges || this.props.categoryFormDisabled} onClick={() => this.toggleCommentBox(entryIndex)} type=\"button\" className=\"button-link\">{entry.MinutesSummaries && entry.MinutesSummaries.length > 0 ? \"Edit\" : \"Add\"} Comment</button>\n                                                                            {(entry.EntryText || (entry.MinutesActivities && entry.MinutesActivities.length !== 0)) &&\n                                                                                <React.Fragment>\n                                                                                    {!this.state.editing &&\n                                                                                        <button disabled={this.props.disableChanges || this.props.categoryFormDisabled} onClick={() => this.toggleEdit(entryIndex)} type=\"button\" className=\"button-link\">Edit Motions</button>\n                                                                                    }\n                                                                                    <button disabled={this.props.disableChanges || this.props.categoryFormDisabled} type=\"button\" onClick={() => this.props.toggleMoveEntry(true, this.props.currentActivitySequence - 1, entryIndex)} className=\"button\">Move</button>\n                                                                                </React.Fragment>\n                                                                            }\n                                                                        </div>\n                                                                    </div>\n                                                                </div>\n                                                            }\n                                                        </div>\n                                                        <hr className=\"faded-line\" />\n                                                        {/* Hide motion form unless it's reading of the journal if the category is order of business, or if its a chairmans report category */}\n                                                        {(this.props.formData.CalendarCategoryTypeID !== 132 || entry.MinutesActivities.find(x => x.Description === \"Reading of the Journal\")) && this.props.formData.CategoryType !== 'Chairmans Report' &&\n                                                            <div className=\"multi-row one-small-small no-margin\">\n                                                                <div>\n                                                                    <label>{entry.LegislationNumber ? entry.LegislationNumber + \" Motion\" : \"Motion\"}</label>\n                                                                    <Select\n                                                                        options={this.props.formData.CalendarCategoryTypeID !== 132 ? this.state.motionOptions : this.state.motionOptions.filter(x => x.CalendarActionID === 2011)}\n                                                                        value={this.state.selectedMotions[entryIndex]}\n                                                                        onChange={val => this.handleMotionChange(entryIndex, val)}\n                                                                        styles={selectStyle}\n                                                                        isClearable\n                                                                    />\n                                                                </div>\n                                                                <div>\n                                                                    <br />\n                                                                    <button type='button' disabled={!this.state.selectedMotions[entryIndex] || this.props.categoryFormDisabled} className='button' onClick={() => this.insertMotion(entryIndex)}>Add Motion</button>\n                                                                </div>\n                                                            </div>\n                                                        }\n                                                        {this.state.templateInputs[entryIndex] && this.state.templateInputs[entryIndex].length > 0 &&\n                                                            <div>\n                                                                <br />\n                                                                <div>\n                                                                    <div>\n                                                                        <span className='txt-greyed'>\n                                                                            {this.state.templateInputs[entryIndex].map((tInput, tIndex) =>\n                                                                                <React.Fragment key={tIndex}>\n                                                                                    {tInput.ReferenceText ? tInput.ReferenceText : `[${tInput.ActionReferenceType}]`}\n                                                                                </React.Fragment>\n                                                                            )}\n                                                                        </span>\n                                                                    </div>\n                                                                    <InputTypes\n                                                                        memberList={this.props.memberList}\n                                                                        committeeList={this.props.committeeList}\n                                                                        communicationList={this.props.communicationList}\n                                                                        handleChange={this.handleTemplateChange}\n                                                                        entryIndex={entryIndex}\n                                                                        activityIndex={0}\n                                                                        references={this.state.templateInputs[entryIndex] || []}\n                                                                        textList={this.state.textList.filter(text => entry.LegislationID === text.LegislationID ? true : false)}\n                                                                    />\n                                                                </div>\n                                                            </div>\n                                                        }\n                                                        {this.props.formData.CategoryType !== 'Chairmans Report' && <br />}\n                                                        {this.state.templateInputs[entryIndex] ?\n                                                            this.state.templateInputs[entryIndex].MinutesSummaries && this.state.templateInputs[entryIndex].MinutesSummaries.filter(ms => !ms.DeletionDate).map((summary, summaryIndex) =>\n                                                                <div style={{ padding: '5px 0px', fontSize: '0.8em' }}>\n                                                                    {renderHTML(summary.MinutesSummary)}\n                                                                </div>\n                                                            )\n                                                            : this.state.newEntries[entryIndex] ?\n                                                                !this.state.newEntries[entryIndex].DeletionDate && this.state.newEntries[entryIndex].MinutesSummaries && this.state.newEntries[entryIndex].MinutesSummaries.filter(ms => !ms.DeletionDate).map((summary, summaryIndex) =>\n                                                                    <div style={{ padding: '5px 0px', fontSize: '0.8em' }}>\n                                                                        {renderHTML(summary.MinutesSummary)}\n                                                                    </div>\n                                                                )\n                                                                : !entry.DeletionDate && entry.MinutesSummaries && entry.MinutesSummaries.filter(ms => !ms.DeletionDate).map((summary, summaryIndex) =>\n                                                                    <React.Fragment key={summaryIndex}>\n                                                                        {this.props.formData.CategoryType === 'Chairmans Report' ?\n                                                                            <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                                                                <div className=\"toggle-switch\" onClick={() => this.props.toggleChairsReport(this.props.currentActivitySequence - 1, entryIndex, summaryIndex)}>\n                                                                                    <input type=\"checkbox\" checked={summary.IsActive} />\n                                                                                    <span className=\"slider\"></span>\n                                                                                </div>\n                                                                                <label className=\"checkbox-label no-background\">{summary.MinutesDate && moment(summary.MinutesDate).format(\"M/D/yyyy\") + (summary.MinutesNumber ? ' (' + summary.MinutesNumber + ')' : '') + ':'} {renderHTML(summary.MinutesSummary)}</label>\n                                                                            </div>\n                                                                            :\n                                                                            <div style={{ padding: '5px 0px', fontSize: '0.8em' }}>\n                                                                                {renderHTML(summary.MinutesSummary)}\n                                                                            </div>\n                                                                        }\n                                                                        <hr className=\"faded-line\" />\n                                                                    </React.Fragment>\n                                                                )}\n                                                    </div>}\n                                            </Draggable>\n                                        )}\n                                        {provided.placeholder}\n                                    </div>\n                                }\n                            </Droppable>\n                        </DragDropContext>\n                    </div>\n                </div>\n            </div >\n        );\n    }\n}\n\nconst EditVoteTally = props => <textarea style={{ width: '25%' }} value={props.value} onChange={props.onChange} />\n\nexport default connect(\n    (state) => {\n        const { calendar, minutes, bills } = state;\n        return {\n            calendar,\n            minutes,\n            bills\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, calendarActionCreators, minutesActionCreators, billActionCreators), dispatch)\n        }\n    },\n    null,\n    {\n        forwardRef: true\n    }\n)(NonLegislativeForm)","import React from \"react\";\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { voteActionCreators } from '../../../../stores/lis-votes-store';\nimport Select from 'react-select'\nimport { calendarActionCreators } from \"../../../../stores/lis-calendar-store\";\nimport { billActionCreators } from \"../../../../stores/lis-legislation-store\";\nimport InputTypes from \"../input-types\";\nimport { LargeListSelect } from '../../../../lis-shared/lis-layout/components/lis-forms-component';\nimport { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';\nimport CommentBox from './comment-box';\nimport { minutesActionCreators } from \"../../../../stores/lis-minutes-store\";\nimport { Link } from 'react-router-dom';\nimport moment from \"moment\";\n\nconst getItemStyle = (isDragging, draggableStyle, pendingDeletion) => ({\n    // some basic styles to make the items look a bit nicer\n    userSelect: 'none',\n    // change background colour if dragging\n    background: isDragging ? '#34495e' : 'white',\n    color: isDragging ? 'white' : '#34495e',\n    border: pendingDeletion ? 'red' : 'none',\n    // styles we need to apply on draggables\n    ...draggableStyle,\n});\n\nconst getListStyle = isDraggingOver => ({\n    background: isDraggingOver ? '#8b9fb3' : '#666666',\n    width: '100%',\n});\n\nclass LegislativeForm extends React.Component {\n    constructor(props) {\n        super(props)\n        this.state = {\n            selectedMotion: '',\n            insertEntry: [],\n            newEntries: [],\n            references: [],\n            nonLegislativeActionReferences: [],\n            fullEventList: [],\n            votesToBeSaved: [],\n            savingVotes: [],\n            togglingEdit: {},\n            templateInputs: [],\n            templatedEdited: false,\n            smallMotionForm: -1,\n            textList: [],\n            reconsiderationEvents: [],\n            showMenu: -1,\n            selectedBillNumber: [],\n            showCommentBox: false,\n            commentBoxContent: [],\n            showAuxBillForm: false,\n            auxBill: '',\n            savingAuxBill: false,\n            savingNonLegAction: false,\n            checkedBills: [],\n            editingActivityDescription: {},\n            otherBillEventOptions: [],\n            otherEvent: \"\",\n            otherEventSelected: false\n        };\n        this.closeNewEntries = this.closeNewEntries.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n        this.insertMotion = this.insertMotion.bind(this);\n        this.removeMotion = this.removeMotion.bind(this);\n        this.unSelectOtherEvent = this.unSelectOtherEvent.bind(this);\n        this.handleOtherEventChange = this.handleOtherEventChange.bind(this);\n        this.getOtherBillEventOptions = this.getOtherBillEventOptions.bind(this);\n        this.filterBillEventReferences = this.filterBillEventReferences.bind(this);\n        this.handleBillChange = this.handleBillChange.bind(this);\n        this.handleMotionChange = this.handleMotionChange.bind(this);\n        this.handleSelectedMotionDescriptionChange = this.handleSelectedMotionDescriptionChange.bind(this);\n        this.handleTemplateChange = this.handleTemplateChange.bind(this);\n        this.onActivityDragEnd = this.onActivityDragEnd.bind(this);\n        this.onEntryDragEnd = this.onEntryDragEnd.bind(this);\n        this.removeActivity = this.removeActivity.bind(this);\n        this.addBackActivity = this.addBackActivity.bind(this);\n        this.addAllEntries = this.addAllEntries.bind(this);\n        this.getCatActionList = this.getCatActionList.bind(this);\n        this.getNonLegislativeActionList = this.getNonLegislativeActionList.bind(this);\n        this.getTextList = this.getTextList.bind(this);\n        this.toggleSmallMotionForm = this.toggleSmallMotionForm.bind(this);\n        this.toggleMenu = this.toggleMenu.bind(this);\n        this.addEntry = this.addEntry.bind(this);\n        this.handleBillNumberChange = this.handleBillNumberChange.bind(this);\n        this.applyLegislationToEntry = this.applyLegislationToEntry.bind(this);\n        this.handleCommentBoxChange = this.handleCommentBoxChange.bind(this);\n        this.toggleCommentBox = this.toggleCommentBox.bind(this);\n        this.saveComment = this.saveComment.bind(this);\n        this.toggleShowDeleted = this.toggleShowDeleted.bind(this);\n        this.toggleAuxBillAdd = this.toggleAuxBillAdd.bind(this);\n        this.setAuxBill = this.setAuxBill.bind(this);\n        this.addAuxBill = this.addAuxBill.bind(this);\n        this.toggleSwitchCategory = this.toggleSwitchCategory.bind(this);\n        this.handleSwitchCategoryChange = this.handleSwitchCategoryChange.bind(this);\n        this.switchCategory = this.switchCategory.bind(this);\n        this.toggleSelectEntry = this.toggleSelectEntry.bind(this);\n        this.getReconsiderationEvents = this.getReconsiderationEvents.bind(this);\n        this.toggleEditActivityDescription = this.toggleEditActivityDescription.bind(this);\n        this.unSelectOtherEventEdit = this.unSelectOtherEventEdit.bind(this);\n        this.handleOtherActivityDescriptionChange = this.handleOtherActivityDescriptionChange.bind(this);\n\n        this.menuBoxRef = React.createRef();\n        this.motionRef = React.createRef();\n        this.motionDropdownRef = React.createRef();\n    }\n\n    closeNewEntries() {\n        this.setState({\n            newEntries: [],\n            smallMotionForm: -1\n        });\n    }\n\n    saveChange(entryIndex) {\n        let entry = this.state.newEntries[entryIndex];\n        //If this entry has a vote id then the vote description needs to be saved. So put a button on the form for the user to be able to do that\n        if (entry.MinutesActivities && entry.MinutesActivities.find(activity => activity.VoteID)) {\n            let votesToBeSaved = this.state.votesToBeSaved;\n            votesToBeSaved[entryIndex] = true;\n            this.setState({\n                votesToBeSaved: votesToBeSaved\n            });\n        }\n\n        let activitiesToBeSaved = [];\n\n        //Overwrite any activities with their new OtherEvent if present\n        entry.MinutesActivities.forEach((activity, activityIndex) => {\n            if (activity.OtherEvent) {\n                activity.DeletionDate = moment();\n\n                let otherEvent = { ...activity.OtherEvent }\n                otherEvent.MinutesEntryID = entry.MinutesEntryID;\n                otherEvent.InPreview = true;\n                otherEvent.IsPublic = false;\n                otherEvent.IsPassed = true;\n\n                activitiesToBeSaved.push(activity);\n                activitiesToBeSaved.push(otherEvent);\n            } else {\n                activitiesToBeSaved.push(activity)\n            }\n        })\n\n        entry.MinutesActivities = activitiesToBeSaved;\n\n        //save any changes to vote tallies\n        let promises = [];\n        entry.MinutesActivities.forEach((activity, activityIndex) => {\n            if (activity.VoteTally !== undefined && !activity.ActivityReferences.find(ar => ar.ActionReferenceType !== \"Text\")) {\n                promises.push(new Promise(res => {\n                    this.handleActivityDescriptionChange(null, \"VoteTally\", entryIndex, activityIndex, true);\n                    res();\n                }))\n            }\n        })\n        Promise.all(promises).then(() => {\n            //Send the index of the minute entry, the entire minute entries object (so we don't have to save the entire book),\n            //the value of the text input, and the sequence to show which category to update\n            this.props.onEntryChange(entryIndex, entry, this.props.currentActivitySequence);\n            this.props.handleSaveEntry(entry);\n            //Turn it back into a span\n            let newEntries = [...this.state.newEntries];\n            newEntries[entryIndex] = null;\n            let editingActivityDescription = { ...this.state.editingActivityDescription };\n            editingActivityDescription[entryIndex] = {};\n            this.setState({\n                newEntries: newEntries,\n                editingActivityDescription\n            });\n        });\n    }\n\n    handleChange(entryIndex, activityIndex, referenceIndex, reference, _, newMotion) {\n        //Update the input with new text. Save change to this components state so it doesn't update the parent just yet (in case the user clicks the X)\n        let entries = this.state.newEntries;\n        //activities are reversed in display, so reverse here in order to get the indexes aligned\n        let reversedActivities = entries[entryIndex].MinutesActivities.reverse();\n        let activity = reversedActivities[activityIndex];\n\n        if (newMotion && newMotion.value !== \"Other\") {\n            let engrossingActions = [\"S4600\", \"S4601\", \"S4602\", \"S4603\", \"S4604\", \"S4605\", \"S4606\"];\n\n            //Engrossing actions only ever need to say \"Engrossed\" instead of \"Engrossed by Senate\", etc.\n            activity.Description = engrossingActions.includes(newMotion.EventCode)\n                ? newMotion.ActionReferences[0].ReferenceText\n                : newMotion.Description || newMotion.CalendarDescription\n\n            activity.ActivityReferences = newMotion.ActionReferences;\n            activity.EventCode = newMotion.EventCode;\n            activity.CalendarActionID = newMotion.CalendarActionID;\n            activity.CalendarCategoryTypeID = newMotion.CalendarCategoryTypeID;\n\n            if (!activity.ActivityReferences?.length) {\n                const textType = this.props.actionTypes.find(type => type.ActionReferenceType === 'Text');\n                if (textType) {\n                    //Sometimes ActivityReferences is undefined. Make a blank one so the push does not fail\n                    activity.ActivityReferences = [];\n                    activity.ActivityReferences.push({\n                        ActionReferenceTypeID: textType.ActionReferenceTypeID,\n                        ActionReferenceType: textType.ActionReferenceType,\n                        ReferenceText: activity.Description\n                    });\n                }\n            }\n        } else if (newMotion && newMotion.value === \"Other\") {\n            if (this.state.otherBillEventOptions.length === 0) {\n                this.getOtherBillEventOptions();\n            }\n\n            activity.OtherMotionSelected = !activity.OtherMotionSelected ? true : false;\n\n            reversedActivities[activityIndex] = { ...activity };\n            const unreversedActivities = reversedActivities.reverse();\n            entries[entryIndex].MinutesActivities = unreversedActivities;\n\n            this.setState({\n                newEntries: entries\n            });\n\n            return;\n        } else {\n            activity.ActivityReferences[referenceIndex] = reference;\n            const memberListEvents = [\"H6013\", \"S6013\", \"H6113\", \"S6113\", \"H6213\", \"S6213\"];\n            activity.Description = activity.ActivityReferences.map((tInput, i) => {\n                //For events H6013/S6013/H6113/S6113/H6213/S6213 there are sometimes incomplete lists of members. This will prevent the UI from adding blank member dropdown values to the description\n                if (memberListEvents.includes(activity.EventCode) && !tInput.ReferenceText) {\n                    return;\n                }\n\n                if (!tInput.ReferenceText && !activity.ReconsiderationGrammar) {\n                    return `${tInput.ActionReferenceType}`\n                }\n                return activity.ActivityReferences.find(x => x.ActionReferenceType === \"LegislationEvent\") ? this.state.fullEventList.find(e => e.EventCode === activity.ActivityReferences?.find(x => x.ActionReferenceType === \"LegislationEvent\")?.EventCode && e.IsPassed === activity.ActivityReferences?.find(x => x.ActionReferenceType === \"LegislationEvent\")?.IsPassed)?.ReconsiderationDescription : tInput.ReferenceText + (memberListEvents.includes(activity.EventCode) && tInput.ActionReferenceType === \"Member\" && tInput.ReferenceText && activity.ActivityReferences[i + 1] && activity.ActivityReferences[i + 1].ActionReferenceType === \"Member\" && activity.ActivityReferences[i + 1].ReferenceText ? \", \" : \"\")\n            }).join('');\n        }\n        activity.IsPublic = false;\n        //reverse back to original\n        const unreversedActivities = reversedActivities.reverse();\n        entries[entryIndex].MinutesActivities = unreversedActivities;\n\n        this.setState({\n            newEntries: entries\n        });\n    }\n\n    handleOtherChange(entryIndex, activityIndex, referenceIndex, reference, _, newMotion) {\n        //Update the input with new text. Save change to this components state so it doesn't update the parent just yet (in case the user clicks the X)\n        let entries = this.state.newEntries;\n        //activities are reversed in display, so reverse here in order to get the indexes aligned\n        let reversedActivities = entries[entryIndex].MinutesActivities.reverse();\n        let activity = reversedActivities[activityIndex];\n        activity.OtherEvent = {};\n\n        if (newMotion) {\n            let engrossingActions = [\"S4600\", \"S4601\", \"S4602\", \"S4603\", \"S4604\", \"S4605\", \"S4606\"];\n\n            //Engrossing actions only ever need to say \"Engrossed\" instead of \"Engrossed by Senate\", etc.\n            activity.OtherEvent.Description = engrossingActions.includes(newMotion.EventCode)\n                ? newMotion.ActionReferences[0].ReferenceText\n                : newMotion.Description || newMotion.CalendarDescription\n\n            activity.OtherEvent.ActivityReferences = newMotion.ActionReferences;\n            activity.OtherEvent.EventCode = newMotion.EventCode;\n            activity.OtherEvent.CalendarActionID = newMotion.CalendarActionID;\n            activity.OtherEvent.CalendarCategoryTypeID = newMotion.CalendarCategoryTypeID;\n\n            if (!activity.OtherEvent.ActivityReferences?.length) {\n                const textType = this.props.actionTypes.find(type => type.ActionReferenceType === 'Text');\n                if (textType) {\n                    //Sometimes ActivityReferences is undefined. Make a blank one so the push does not fail\n                    activity.OtherEvent.ActivityReferences = [];\n                    activity.OtherEvent.ActivityReferences.push({\n                        ActionReferenceTypeID: textType.ActionReferenceTypeID,\n                        ActionReferenceType: textType.ActionReferenceType,\n                        ReferenceText: activity.OtherEvent.Description\n                    });\n                }\n            }\n        } else {\n            activity.OtherEvent.ActivityReferences[referenceIndex] = reference;\n            const memberListEvents = [\"H6013\", \"S6013\", \"H6113\", \"S6113\", \"H6213\", \"S6213\"];\n            activity.OtherEvent.Description = activity.OtherEvent.ActivityReferences.map((tInput, i) => {\n                //For events H6013/S6013/H6113/S6113/H6213/S6213 there are sometimes incomplete lists of members. This will prevent the UI from adding blank member dropdown values to the description\n                if (memberListEvents.includes(activity.OtherEvent.EventCode) && !tInput.ReferenceText) {\n                    return;\n                }\n\n                if (!tInput.ReferenceText && !activity.OtherEvent.ReconsiderationGrammar) {\n                    return `${tInput.ActionReferenceType}`\n                }\n                return activity.OtherEvent.ActivityReferences.find(x => x.ActionReferenceType === \"LegislationEvent\") ? this.state.fullEventList.find(e => e.EventCode === activity.OtherEvent.ActivityReferences?.find(x => x.ActionReferenceType === \"LegislationEvent\")?.EventCode && e.IsPassed === activity.OtherEvent.ActivityReferences?.find(x => x.ActionReferenceType === \"LegislationEvent\")?.IsPassed)?.ReconsiderationDescription : tInput.ReferenceText + (memberListEvents.includes(activity.OtherEvent.EventCode) && tInput.ActionReferenceType === \"Member\" && tInput.ReferenceText && activity.OtherEvent.ActivityReferences[i + 1] && activity.OtherEvent.ActivityReferences[i + 1].ActionReferenceType === \"Member\" && activity.OtherEvent.ActivityReferences[i + 1].ReferenceText ? \", \" : \"\")\n            }).join('');\n        }\n        activity.OtherEvent.IsPublic = false;\n        reversedActivities[activityIndex] = { ...activity };\n        //reverse back to original\n        const unreversedActivities = reversedActivities.reverse();\n        entries[entryIndex].MinutesActivities = unreversedActivities;\n\n        this.setState({\n            newEntries: entries\n        });\n    }\n\n    toggleOOB(entryIndex) {\n        // IsOOB key is used to tell whether a piece of legislation is out of block\n        let entry = this.props.formData.MinutesEntries[entryIndex];\n        entry.IsOOB = !entry.IsOOB;\n        this.props.onEntryChange(entryIndex, entry, this.props.currentActivitySequence);\n        this.props.handleSaveEntry(entry);\n        this.setState({\n            showMenu: -1\n        });\n    }\n\n    toggleSwitchCategory(entryIndex) {\n        this.setState({\n            showSwitchCategory: !this.state.showSwitchCategory\n        }, () => {\n            if (this.state.showSwitchCategory) {\n                const dropdownOptions = this.props.categories.filter(c => c.CalendarCategoryTypeID === this.props.formData.CalendarCategoryTypeID && c.MinutesCategoryID !== this.props.formData.MinutesCategoryID);\n                if (dropdownOptions.length === 1) {\n                    this.handleSwitchCategoryChange(dropdownOptions[0]);\n                }\n                this.toggleSelectEntry(entryIndex);\n                this.toggleMenu(-1);\n            } else {\n                this.setState({ checkedBills: [] })\n                this.handleSwitchCategoryChange(null);\n            }\n        });\n    }\n\n    handleSwitchCategoryChange(val) {\n        this.setState({\n            selectedSwitchCategory: val\n        });\n    }\n\n    switchCategory() {\n        if (this.state.checkedBills.length && this.state.selectedSwitchCategory) {\n            this.setState({ switchingCategories: true }, () => {\n                const origSequence = this.props.currentActivitySequence;\n                let entries = [...this.props.formData.MinutesEntries].filter((e, i) => this.state.checkedBills[i]);\n                this.props.bulkMoveEntry(entries, origSequence - 1, this.state.selectedSwitchCategory.MinutesCategoryID);\n                this.setState({ checkedBills: [], showSwitchCategory: false, selectedSwitchCategory: null, switchingCategories: false })\n            })\n        }\n    }\n\n    toggleSelectEntry(billIndex, e) {\n        let checkedBills = [...this.state.checkedBills];\n        let lastCheckedBill = this.state.lastCheckedBill;\n        if (e && e.nativeEvent.shiftKey && this.state.lastCheckedBill !== -1) {\n            checkedBills = checkedBills.fill(false);\n            for (let i = 0; i < Math.abs(billIndex - this.state.lastCheckedBill); i++) {\n                const index = this.state.lastCheckedBill + i * (billIndex - this.state.lastCheckedBill) / Math.abs(billIndex - this.state.lastCheckedBill);\n                checkedBills[index] = true;\n            }\n        } else {\n            lastCheckedBill = !checkedBills[billIndex] ? billIndex : this.state.lastCheckedBill;\n        }\n        checkedBills[billIndex] = !checkedBills[billIndex]\n        this.setState({\n            checkedBills: checkedBills,\n            lastCheckedBill: lastCheckedBill\n        });\n    }\n\n    getOtherBillEventOptions() {\n        this.props.actions.getBillEvents(\"\").then(() => {\n            let billEventReferences = [...this.props.bills.billEvents];\n            billEventReferences.forEach(ref => {\n                ref.label = ref.LegislationDescription || ref.CalendarDescription;\n                ref.value = `${ref.EventCode}-${ref.IsPassed}`\n            });\n            billEventReferences = this.filterBillEventReferences(billEventReferences);\n            this.setState({\n                otherBillEventOptions: [...billEventReferences.filter(x => {\n                    return x.EventCode[0] !== \"H\"\n                })]\n            });\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            console.log(err)\n        });\n    }\n\n    unSelectOtherEvent() {\n        this.setState({\n            otherEventSelected: false,\n            templateInputs: [],\n            otherEvent: \"\"\n        })\n    }\n\n    unSelectOtherEventEdit(entryIndex, activityIndex) {\n        let newEntries = [...this.state.newEntries];\n        newEntries[entryIndex].MinutesActivities[activityIndex].OtherMotionSelected = false;\n        delete newEntries[entryIndex].MinutesActivities[activityIndex].OtherEvent;\n\n        this.setState({\n            newEntries: newEntries\n        })\n    }\n\n    handleOtherEventChange(value) {\n        let templateInputs = [];\n        if (value.ActionReferences && value.ActionReferences.length > 0) {\n            templateInputs = JSON.parse(JSON.stringify(value.ActionReferences));\n        }\n        this.setState({\n            otherEvent: value,\n            templateInputs: templateInputs,\n            templateEdited: false\n        });\n    }\n\n    filterBillEventReferences(billEventReferences) {\n        return billEventReferences.filter((value, index, self) =>\n            index === self.findIndex((t) => (\n                t.EventCode === value.EventCode && JSON.stringify(t.ActionReferences) === JSON.stringify(value.ActionReferences) && t.IsPassed === value.IsPassed\n            ))\n        )\n    }\n\n    handleBillChange(value) {\n        //Set the dropdown's value\n        value = value || []\n        this.setState({\n            insertEntry: value\n        }, () => {\n            if (this.motionRef?.current)\n                this.motionRef.current.focus();\n        });\n        if (value.length === 0) {\n            this.setState({\n                selectedMotion: '',\n                templateInputs: [],\n                templatedEdited: false\n            })\n        }\n    }\n\n    handleMotionChange(value) {\n        if (value && value.value !== \"Other\") {\n            this.setState({\n                selectedMotion: value,\n                templateInputs: value ? JSON.parse(JSON.stringify(value.ActionReferences)) : [],\n                templatedEdited: false\n            }, () => {\n                //If the user has selected an event with at least one ActionReferenceType of LegislationEvent then fetch possible events for reconsideration\n                if (this.state.selectedMotion?.ActionReferences && this.state.selectedMotion?.ActionReferences?.find(x => x.ActionReferenceType === \"LegislationEvent\")) {\n                    this.state.insertEntry.forEach(bill => {\n                        this.getReconsiderationEvents(this.state.selectedMotion.EventCode, bill);\n                    })\n                }\n            });\n        } else {\n            this.setState({\n                selectedMotion: value,\n                otherEventSelected: value ? true : false\n            })\n            if (this.state.otherBillEventOptions.length === 0) {\n                this.getOtherBillEventOptions();\n            }\n        }\n    }\n\n    handleSelectedMotionDescriptionChange(e) {\n        let selectedMotion = { ...this.state.selectedMotion };\n        selectedMotion.Description = e.target.value;\n        this.setState({\n            selectedMotion\n        });\n    }\n\n    insertMotion(openMotionEditor) {\n        //A new motion wants to be added so take all this data and send it to the parent div to be added to the state\n        const { insertEntry, templateInputs, templatedEdited } = this.state;\n        let selectedMotion = !this.state.otherEventSelected ? { ... this.state.selectedMotion } : { ... this.state.otherEvent };\n        let entries = [...this.props.formData.MinutesEntries];\n\n        insertEntry.forEach(bill => {\n            //Force all non legislative actions into their own entry by always setting the index to -1\n            let index = bill.label && bill.label === \"No Legislation\" ? -1 : entries.findIndex(entry => entry.MinutesEntryID === bill.MinutesEntryID);\n            let isNewEntry = false;\n            if (index === -1 && bill.label && bill.label === 'No Legislation') {\n                isNewEntry = true;\n                let minutesEntry = {\n                    IsPublic: false,\n                    MinutesActivities: [],\n                    MinutesCategoryID: this.props.formData.MinutesCategoryID,\n                    Sequence: entries.length ? Math.max(...entries.map(e => e.Sequence || 0)) + 1 : 1,\n                }\n                entries.push(minutesEntry);\n                index = entries.length - 1;\n            }\n            if (index !== -1) {\n                let entry = entries[index];\n                //If it is a null then create a new one so the push doesn't fail\n                if (!entry.MinutesActivities) {\n                    entry.MinutesActivities = [];\n                }\n                let desc = selectedMotion.Description || selectedMotion.CalendarDescription;\n                //If the user has changed the value of the action references then use those for the description instead of the existing one.\n                let activityRefs = [];\n                if (templatedEdited || (templateInputs.length && !templateInputs.find(tInput => ![\"Text\", \"HTML\"].includes(tInput.ActionReferenceType)))) {\n                    desc = '';\n                    const memberListEvents = [\"H6013\", \"S6013\", \"H6113\", \"S6113\", \"H6213\", \"S6213\"];\n                    templateInputs.forEach((tInput, actIndex) => {\n                        if (memberListEvents.includes(selectedMotion.EventCode) && !tInput.ReferenceText) {\n                            return;\n                        }\n                        if (!tInput.ReferenceText && !selectedMotion.ReconsiderationGrammar) {\n                            return `${tInput.ActionReferenceType}`\n                        }\n                        desc += templateInputs.find(x => x.ActionReferenceType === \"LegislationEvent\") ? this.state.fullEventList.find(e => e.EventCode === templateInputs.find(x => x.ActionReferenceType === \"LegislationEvent\")?.EventCode && e.IsPassed === templateInputs.find(x => x.ActionReferenceType === \"LegislationEvent\")?.IsPassed)?.ReconsiderationDescription : tInput.ReferenceText + (memberListEvents.includes(selectedMotion.EventCode) && tInput.ActionReferenceType === \"Member\" && tInput.ReferenceText && templateInputs[actIndex + 1] && templateInputs[actIndex + 1].ActionReferenceType === \"Member\" && templateInputs[actIndex + 1].ReferenceText ? \", \" : \"\");\n                        activityRefs[actIndex] = {\n                            ActionReferenceTypeID: tInput.ActionReferenceTypeID,\n                            ActionReferenceType: tInput.ActionReferenceType,\n                            Sequence: tInput.Sequence,\n                            ReferenceText: tInput.ReferenceText,\n                            ReferenceID: tInput.ReferenceID\n                        }\n                    });\n\n                } else {\n                    const textType = this.props.actionTypes.find(type => type.ActionReferenceType === 'Text');\n                    if (textType) {\n                        activityRefs = [{\n                            ActionReferenceTypeID: textType.ActionReferenceTypeID,\n                            ActionReferenceType: textType.ActionReferenceType,\n                            ReferenceText: selectedMotion.Description || selectedMotion.CalendarDescription\n                        }];\n                    }\n                }\n\n                let newActivity = Object.assign(selectedMotion, {\n                    ActivityReferences: activityRefs,\n                    Description: desc,\n                    Sequence: entry.MinutesActivities.length ? Math.max(...entry.MinutesActivities.map(m => m.Sequence || 0)) + 1 : 1\n                })\n\n                //Some [REDACTED] problem where we couldn't set the new activity MinutesEntryID to the parent entry's MinutesEntryID unless we mapped the object a second time\n                let theNewActivity = { ...newActivity };\n                theNewActivity.MinutesEntryID = entry ? entry.MinutesEntryID : entries[index].MinutesEntryID\n\n                entry.MinutesActivities.push(theNewActivity);\n\n                if (isNewEntry) {\n                    //now that this entry is actually going to be in the saved object, remove the temp obj, otherwise it will duplicate (in the UI only, but still not what we want)\n                    entries.splice(index, 1);\n                } else { //if it's not a new entry, call the onEntryChange prop\n                    this.props.onEntryChange(index, entry, this.props.currentActivitySequence);\n                }\n\n                this.props.handleSaveEntry(entry, () => {\n                    if (openMotionEditor === true) {\n                        this.toggleEdit(index)\n                    }\n                });\n            }\n        });\n        this.setState({\n            insertEntry: [],\n            selectedMotion: '',\n            smallMotionForm: -1,\n            showMenu: -1,\n            showSwitchCategory: false,\n            selectedSwitchCategory: null,\n            templateInputs: [],\n            otherEvent: '',\n            otherEventSelected: false\n        });\n    }\n\n    removeMotion(e) {\n        e.preventDefault();\n        //A motion wants to be removed so check each minute entry and remove the motion if it has it\n        const { insertEntry, selectedMotion } = this.state;\n        const entries = this.props.formData.MinutesEntries;\n        insertEntry.forEach(bill => {\n            let needToSave = false;\n            const index = entries.findIndex(entry => entry.MinutesEntryID === bill.MinutesEntryID);\n            if (index !== -1) {\n                let entry = JSON.parse(JSON.stringify(entries[index]));\n                if (!entry.MinutesActivities) {\n                    return;\n                }\n                entry.MinutesActivities.forEach(activity => {\n                    if (selectedMotion.CalendarActionID === activity.CalendarActionID && !activity.DeletionDate) {\n                        activity.DeletionDate = new Date();\n                        needToSave = true;\n                    }\n                });\n                if (needToSave) {\n                    //User cannot remove an entry's activity while they are editing that entry\n                    if (this.state.newEntries[index]) {\n                        let newEntries = [...this.state.newEntries];\n                        newEntries[index] = null;\n                        this.setState({\n                            newEntries: newEntries\n                        });\n                    }\n                    this.props.onEntryChange(index, entry, this.props.currentActivitySequence);\n                    this.props.handleSaveEntry(entry);\n                }\n            }\n        });\n        this.setState({\n            insertEntry: [],\n            selectedMotion: '',\n            templateInputs: [],\n            templatedEdited: false,\n        });\n    }\n\n    toggleEdit(index) {\n        let togglingEdit = { ...this.state.togglingEdit };\n        togglingEdit[index] = true;\n        this.setState({ togglingEdit }, () => {\n            let newEntries = [...this.state.newEntries];\n            let init = [];\n            let promises = [];\n            if (this.state.newEntries[index]) {\n                newEntries[index] = null;\n            } else {\n                if (this.state.newEntries.length === 0) {\n                    newEntries.length = this.props.formData.MinutesEntries.length;\n                }\n                //If the user has multiple edit entries open clicking the X on one doesn't kill the changes to another\n                newEntries[index] = JSON.parse(JSON.stringify(this.props.formData.MinutesEntries[index]));\n\n                //Test to see if the activities have zero activity references. If they have zero then add a blank text one\n                const references = newEntries[index].LegislationNumber ? [...this.state.references] : [...this.state.nonLegislativeActionReferences]\n                newEntries[index].MinutesActivities.forEach(act => {\n                    if (act.EventCode) {\n                        const eventReference = references.find(evt => evt.EventCode === act.EventCode && evt.IsPassed === act.IsPassed);\n                        if (eventReference) {\n                            const actionReferences = eventReference.ActionReferences;\n                            if (actionReferences) {\n                                const missingActivitiyReferences = actionReferences.filter(ref => !act.ActivityReferences || !act.ActivityReferences.map(existingActivities => existingActivities.ActionReferenceType).includes(ref.ActionReferenceType));\n                                if (missingActivitiyReferences.length) {\n                                    act.ActivityReferences = act.ActivityReferences ? act.ActivityReferences.concat(JSON.parse(JSON.stringify(missingActivitiyReferences))) : JSON.parse(JSON.stringify(missingActivitiyReferences));\n                                }\n                            }\n                        }\n                    }\n\n                    if (!act.ActivityReferences || act.ActivityReferences.length === 0) {\n                        const textType = this.props.actionTypes.find(type => type.ActionReferenceType === 'Text');\n                        if (textType) {\n                            //Sometimes ActivityReferences is undefined. Make a blank one so the push does not fail\n                            act.ActivityReferences = [];\n                            act.ActivityReferences.push({\n                                ActionReferenceTypeID: textType.ActionReferenceTypeID,\n                                ActionReferenceType: textType.ActionReferenceType,\n                                ReferenceText: act.Description\n                            });\n                        }\n                    }\n\n                    //If the user has selected an event with at least one ActionReferenceType of LegislationEvent then fetch possible events for reconsideration\n                    const eventReferenceIndex = act.ActivityReferences?.findIndex(x => x.ActionReferenceType === \"LegislationEvent\");\n                    if (eventReferenceIndex > -1) {\n                        promises.push(\n                            new Promise(res => {\n                                this.getReconsiderationEvents(act.EventCode, newEntries[index], (reconsiderationEvents) => {\n                                    if (act.ActivityReferences[eventReferenceIndex].ReferenceID) {\n                                        act.ActivityReferences[eventReferenceIndex].EventCode = act.ActivityReferences[eventReferenceIndex].EventCode || reconsiderationEvents.find(e => e.LegislationEventID === act.ActivityReferences[eventReferenceIndex].ReferenceID)?.EventCode;\n                                        act.ActivityReferences[eventReferenceIndex].IsPassed = act.ActivityReferences[eventReferenceIndex].IsPassed || reconsiderationEvents.find(e => e.LegislationEventID === act.ActivityReferences[eventReferenceIndex].ReferenceID)?.IsPassed;\n                                    }\n                                    res();\n                                })\n                            }));\n                    }\n                });\n            }\n            Promise.all(promises).then(() => {\n                togglingEdit[index] = false;\n                let editingActivityDescription = { ...this.state.editingActivityDescription };\n                editingActivityDescription[index] = {};\n                this.setState({\n                    newEntries: newEntries,\n                    togglingEdit,\n                    editingActivityDescription\n                }, () => {\n                    if (this.state.newEntries[index]) {\n                        newEntries[index].MinutesActivities.forEach((activity, activityIndex) => {\n                            if (activity.VoteTally !== undefined)\n                                this.handleActivityDescriptionChange(null, \"VoteTally\", index, activityIndex)\n                        })\n                    }\n                });\n            });\n        });\n    }\n\n    getReconsiderationEvents(params, bill, cb) {\n        params = '?ReconsiderationAction=' + params + '&LegislationID=' + bill.LegislationID;\n\n        this.props.actions.getLegislationEventsByLegislationId(params)\n            .then(() => {\n                this.setState({\n                    reconsiderationEvents: this.props.bills.legislationEventsById\n                }, () => {\n                    if (cb) cb([...this.state.reconsiderationEvents]);\n                });\n            })\n    }\n\n    toggleEditActivityDescription(entryIndex, activityIndex) {\n        let editingActivityDescription = { ...this.state.editingActivityDescription };\n        if (!editingActivityDescription[entryIndex]) {\n            editingActivityDescription[entryIndex] = {};\n        }\n        editingActivityDescription[entryIndex][activityIndex] = !editingActivityDescription[entryIndex][activityIndex];\n        this.setState({ editingActivityDescription }, () => {\n            this.handleActivityDescriptionChange(null, \"Description\", entryIndex, activityIndex)\n            this.handleActivityDescriptionChange(null, \"VoteTally\", entryIndex, activityIndex)\n        });\n    }\n\n    handleActivityDescriptionChange(value, attr, entryIndex, activityIndex, save) {\n        //Update the input with new text. Save change to this components state so it doesn't update the parent just yet (in case the user clicks the X)\n        let entries = this.state.newEntries;\n        //activities are reversed in display, so reverse here in order to get the indexes aligned\n        let reversedActivities = entries[entryIndex].MinutesActivities.reverse();\n        let activity = reversedActivities[activityIndex];\n\n        if (save) {\n            activity.Description = activity.tempDescription ?? activity.Description;\n            activity.VoteTally = activity.tempVoteTally ?? activity.VoteTally;\n        } else {\n            activity['temp' + attr] = value ?? activity[attr];\n        }\n\n        //reverse back to original\n        let unreversedActivities = reversedActivities.reverse();\n        entries[entryIndex].MinutesActivities = unreversedActivities;\n\n        this.setState({ entries }, () => {\n            if (save) this.toggleEditActivityDescription(entryIndex, activityIndex);\n        });\n    }\n\n    handleOtherActivityDescriptionChange(value, attr, entryIndex, activityIndex, save) {\n        //Update the input with new text. Save change to this components state so it doesn't update the parent just yet (in case the user clicks the X)\n        let entries = this.state.newEntries;\n        //activities are reversed in display, so reverse here in order to get the indexes aligned\n        let reversedActivities = entries[entryIndex].MinutesActivities.reverse();\n        let activity = reversedActivities[activityIndex].OtherEvent;\n\n        if (save) {\n            activity.Description = activity.tempDescription ?? activity.Description;\n            activity.VoteTally = activity.tempVoteTally ?? activity.VoteTally;\n        } else {\n            activity['temp' + attr] = value ?? activity[attr];\n        }\n\n        //reverse back to original\n        let unreversedActivities = reversedActivities.reverse();\n        entries[entryIndex].MinutesActivities = unreversedActivities;\n\n        this.setState({ entries }, () => {\n            if (save) this.toggleEditActivityDescription(entryIndex, activityIndex);\n        });\n    }\n\n    onActivityDragEnd(result, entryIndex) {\n        if (!result.destination) {\n            return;\n        }\n        if (result.destination.index === result.source.index) {\n            return;\n        }\n        let entries = [...this.state.newEntries];\n        //activities are reversed in display, so reverse here in order to get the indexes aligned\n        let reversedActivities = entries[entryIndex].MinutesActivities.reverse();\n        const [removed] = reversedActivities.splice(result.source.index, 1);\n        reversedActivities.splice(result.destination.index, 0, removed);\n        //reverse back to original\n        let unreversedActivities = reversedActivities.reverse();\n        unreversedActivities.forEach((element, index) => {\n            element.Sequence = index + 1\n        });\n        entries[entryIndex].MinutesActivities = unreversedActivities;\n        this.setState({\n            newEntries: entries\n        });\n    }\n\n    onEntryDragEnd(result) {\n        if (!result.destination) {\n            return;\n        }\n        if (result.destination.index === result.source.index) {\n            return;\n        }\n        let entries = [...this.props.formData.MinutesEntries];\n        const [removed] = entries.splice(result.source.index, 1);\n        entries.splice(result.destination.index, 0, removed);\n        entries.forEach((element, index) => {\n            element.Sequence = index + 1;\n        });\n        this.props.onMultipleEntryChange(entries, this.props.currentActivitySequence);\n        this.props.handleSaveEntry(entries);\n        // \n        this.setState({\n            newEntries: []\n        })\n    }\n\n    removeActivity(entryIndex, activityIndex) {\n        let entries = [...this.state.newEntries];\n        //activities are reversed in display, so reverse here in order to get the indexes aligned\n        let reversedActivities = entries[entryIndex].MinutesActivities.reverse()\n        reversedActivities[activityIndex].DeletionDate = new Date();\n        //reverse back to original\n        const unreversedActivities = reversedActivities.reverse();\n        entries[entryIndex].MinutesActivities = unreversedActivities;\n        this.setState({\n            newEntries: entries\n        });\n    }\n\n    addBackActivity(entryIndex, activityIndex) {\n        let entries = [...this.state.newEntries];\n        //activities are reversed in display, so reverse here in order to get the indexes aligned\n        let reversedActivities = entries[entryIndex].MinutesActivities.reverse()\n        reversedActivities[activityIndex].DeletionDate = null;\n        reversedActivities[activityIndex].IsPublic = false;\n        //reverse back to original\n        const unreversedActivities = reversedActivities.reverse();\n        entries[entryIndex].MinutesActivities = unreversedActivities;\n        this.setState({\n            newEntries: entries\n        });\n    }\n\n    addAllEntries(isOOB) {\n        const entries = this.props.formData.MinutesEntries;\n        // Filter out the ones that are already added so they aren't added twice\n        let insertEntry = this.state.insertEntry.filter(entry => Boolean(entry.IsOOB) !== isOOB);\n        let newInserEntries = insertEntry.concat(entries.filter(entry => Boolean(entry.IsOOB) === isOOB));\n        this.setState({\n            insertEntry: newInserEntries\n        });\n    }\n\n    handleTemplateChange(_entryIndex, _activityIndex, referenceIndex, reference) {\n        let templateInputs = [...this.state.templateInputs];\n        templateInputs[referenceIndex] = reference;\n        //Used when adding the motion to know whether to use the existing description or concatenate together the action reference values\n        //If they have change a value it is save to say they want the the description to be the action references stringed together\n        if (!this.state.templatedEdited) {\n            this.setState({\n                templatedEdited: true\n            });\n        }\n        this.setState({\n            templateInputs: templateInputs\n        });\n    }\n\n    componentDidUpdate(prevProps) {\n        if (prevProps.currentActivitySequence !== this.props.currentActivitySequence) {\n            this.setState({\n                insertEntry: [],\n                newEntries: [],\n                selectedMotion: '',\n                votesToBeSaved: [],\n                savingVotes: [],\n                togglingEdit: {},\n                templateInputs: [],\n                templatedEdited: false,\n                smallMotionForm: -1,\n                showMenu: -1,\n                showSwitchCategory: false,\n                selectedSwitchCategory: null,\n                textList: [],\n                checkedBills: []\n            });\n            this.getCatActionList();\n            this.getTextList();\n        } else if (prevProps.formData.MinutesEntries !== this.props.formData.MinutesEntries) {\n            let newEntries = [...this.state.newEntries];\n            this.props.formData.MinutesEntries.forEach((entry, entryIndex) => {\n                if (newEntries[entryIndex] && entry !== newEntries[entryIndex]) {\n                    newEntries[entryIndex] = entry;\n                }\n            });\n            this.setState({\n                newEntries: newEntries\n            });\n        }\n    }\n\n    componentDidMount() {\n        this.getCatActionList();\n        this.getNonLegislativeActionList();\n        this.getTextList();\n    }\n\n    getCatActionList() {\n        //Get the calendar action reference data\n        const catId = this.props.formData.CalendarCategoryTypeID;\n        const referenceParams = `?calendarCategoryTypeID=${catId}&chamberCode=S`;\n        this.props.actions.getReferences(referenceParams)\n            .then(() => {\n                let references = this.props.calendar.references;\n                references.forEach(reference => {\n                    reference.label = `${reference.EventCode} ${reference.Description}`;\n                    reference.value = `${reference.CalendarActionID}-${reference.IsPassed}`;\n                });\n\n                references.push({\n                    label: \"Other\",\n                    value: \"Other\"\n                })\n\n                this.setState({\n                    references: references\n                });\n            });\n    }\n\n    getNonLegislativeActionList() {\n        //Get the non legislative action reference data\n        this.props.actions.getBillEventReferences(\"?isActive=true\").then(() => {\n            let nonLegislativeActionReferences = [...this.props.bills.billEventRef].filter(ref => ref.AdministrativeAction);\n            nonLegislativeActionReferences.forEach(ref => {\n                ref.label = `${ref.EventCode} ${ref.CalendarDescription}`\n                ref.value = `${ref.EventCode}-${ref.IsPassed}`\n            });\n\n            this.setState({\n                nonLegislativeActionReferences: nonLegislativeActionReferences,\n                fullEventList: [...this.props.bills.billEventRef]\n            });\n        });\n    }\n\n    getTextList() {\n        const entries = this.props.formData.MinutesEntries;\n        entries.forEach(entry => {\n            if (entry.LegislationID && !this.state.textList.find(text => text.LegislationID === entry.LegislationID)) {\n                this.props.actions.getTextList('?legislationID=' + entry.LegislationID + '&sessionID=' + this.props.sessionId)\n                    .then(() => {\n                        let textList = [...this.props.bills.textList];\n                        textList.forEach(text => {\n                            text.label = text.DocumentCode;\n                            text.value = text.LegislationTextID;\n                        });\n                        this.setState(state => ({\n                            textList: state.textList.concat(textList)\n                        }));\n                    });\n            }\n        })\n    }\n\n    toggleSmallMotionForm(entryIndex, e) {\n        if (e) {\n            //Do not hide the small motion form if a child of the form is focused\n            if (e.currentTarget.contains(e.relatedTarget)) {\n                return\n            }\n        }\n        let insertEntry = [];\n        insertEntry = this.props.formData.MinutesEntries[entryIndex];\n        this.setState({\n            smallMotionForm: entryIndex,\n            insertEntry: insertEntry ? [insertEntry] : [],\n            selectedMotion: '',\n            templateInputs: [],\n            templatedEdited: false,\n            otherEventSelected: false\n        }, () => {\n            if (this.motionDropdownRef.current) {\n                this.motionDropdownRef.current.focus();\n            }\n        });\n    }\n\n    toggleMenu(entryIndex, e) {\n        if (e) {\n            //Do not hide the small motion form if a child of the form is focused\n            if (e.currentTarget.contains(e.relatedTarget)) {\n                return;\n            }\n        }\n        this.setState({\n            showMenu: entryIndex\n        }, () => {\n            if (this.menuBoxRef.current) {\n                this.menuBoxRef.current.focus();\n            }\n        });\n    }\n\n    addEntry(entryIndex, position, recess) {\n        let entries = [...this.props.formData.MinutesEntries];\n        let newEntry = {\n            IsOOB: entries[entryIndex].IsOOB,\n            IsPublic: false,\n            MinutesCategoryID: entries[entryIndex].MinutesCategoryID,\n        }\n        if (recess && this.state.references.find(ref => ref.Description === 'Recess')) {\n            newEntry.EntryText = \"Recess\";\n            newEntry.MinutesActivities = [{\n                MinutesActivityID: this.state.references.find(ref => ref.Description === 'Recess').MinutesActivityID,\n                Description: \"Recess\"\n            }];\n        }\n        entries.splice(entryIndex + position, 0, newEntry);\n        entries.forEach((entry, idx) => {\n            entry.Sequence = idx + 1\n        });\n        this.props.handleSaveEntry(entries);\n        this.setState({\n            showMenu: -1,\n            smallMotionForm: -1,\n            insertEntry: [],\n            newEntries: []\n        });\n    }\n\n    handleBillNumberChange(entryIndex, value) {\n        let selectedBillNumber = [...this.state.selectedBillNumber];\n        selectedBillNumber[entryIndex] = value\n        this.setState({\n            selectedBillNumber: selectedBillNumber\n        });\n    }\n\n    applyLegislationToEntry(entryIndex) {\n        let entries = [...this.props.formData.MinutesEntries];\n        let entry = entries[entryIndex];\n        entry.LegislationNumber = this.state.selectedBillNumber[entryIndex].LegislationNumber;\n        this.props.handleSaveEntry(entry);\n        this.setState({\n            showMenu: -1,\n            smallMotionForm: -1\n        });\n        this.props.actions.getTextList('?legislationNumber=' + this.state.selectedBillNumber[entryIndex].LegislationNumber + '&sessionID=' + this.props.sessionId)\n            .then(() => {\n                let textList = [...this.props.bills.textList];\n                textList.forEach(text => {\n                    text.label = text.DocumentCode;\n                    text.value = text.LegislationTextID;\n                });\n                this.setState(state => ({\n                    textList: state.textList.concat(textList)\n                }));\n            });\n\n    }\n\n    handleCommentBoxChange(content) {\n        this.setState({\n            commentBoxContent: content\n        });\n    }\n\n    toggleCommentBox(show) {\n        const entries = this.props.formData.MinutesEntries;\n        let commentBoxContent = [];\n        if (entries[show] && entries[show].MinutesSummaries) {\n            if (entries[show].MinutesSummaries.length !== 0) {\n                commentBoxContent = entries[show].MinutesSummaries;\n            }\n        }\n        this.setState({\n            showCommentBox: show,\n            commentBoxContent: commentBoxContent\n        });\n    }\n\n    saveComment() {\n        let entries = [...this.props.formData.MinutesEntries];\n        if (entries[this.state.showCommentBox]) {\n            let entry = entries[this.state.showCommentBox];\n            entry.MinutesSummaries = this.state.commentBoxContent;\n            this.props.handleSaveEntry(entry);\n            this.setState({\n                showCommentBox: false\n            });\n        }\n    }\n\n    toggleShowDeleted(entryIndex) {\n        let entries = [...this.state.newEntries];\n        entries[entryIndex].showDeleted = !entries[entryIndex].showDeleted;\n        this.setState({\n            newEntries: entries\n        });\n    }\n\n    toggleAuxBillAdd() {\n        this.setState({\n            showAuxBillForm: !this.state.showAuxBillForm,\n            auxBill: ''\n        })\n    }\n\n    setAuxBill(value) {\n        this.setState({\n            auxBill: value\n        })\n    }\n\n    addAuxBill() {\n        this.setState({\n            savingAuxBill: true\n        }, () => {\n            let minutesEntry = {\n                MinutesEntryCreate: [\n                    {\n                        IsPublic: false,\n                        LegislationChamberCode: this.state.auxBill.value[0],\n                        LegislationID: this.state.auxBill.LegislationID,\n                        LegislationNumber: this.state.auxBill.value,\n                        MinutesActivities: [],\n                        MinutesCategoryID: this.props.formData.MinutesEntries[0].MinutesCategoryID,\n                        Sequence: this.props.formData.MinutesEntries.length ? Math.max(...this.props.formData.MinutesEntries.map(me => me.Sequence || 0)) + 1 : 1,\n                    }\n                ],\n            }\n\n            this.props.actions.createEntries(minutesEntry)\n                .then(() => {\n                    this.toggleAuxBillAdd();\n                    this.setState({\n                        savingAuxBill: false\n                    })\n                })\n        })\n    }\n\n    onKeyUp(e) {\n        if (e.key === \"Enter\" && !this.state.otherEventSelected) {\n            this.insertMotion();\n        } else if (e.key === \"Enter\" && this.state.otherEventSelected && this.state.otherEvent !== \"\") {\n            this.insertMotion();\n        }\n    }\n\n    formInput(entry, entryIndex, provided = {}) {\n        const memberListEvents = [\"H6013\", \"S6013\", \"H6113\", \"S6113\", \"H6213\", \"S6213\"];\n\n        let inputValue = this.state.templateInputs.map((tInput, i) => {\n            //For events H6013/S6013/H6113/S6113/H6213/S6213 there are sometimes incomplete lists of members. This will prevent the UI from adding blank member dropdown values to the description\n            if (memberListEvents.includes(this.state.selectedMotion?.EventCode) && !tInput.ReferenceText) {\n                return;\n            }\n\n            if (!tInput.ReferenceText && !this.state.selectedMotion?.ReconsiderationGrammar) {\n                return `${tInput.ActionReferenceType}`\n            }\n            return this.state.templateInputs.find(x => x.ActionReferenceType === \"LegislationEvent\") ? this.state.fullEventList.find(e => e.EventCode === this.state.templateInputs.find(x => x.ActionReferenceType === \"LegislationEvent\")?.EventCode && e.IsPassed === this.state.templateInputs.find(x => x.ActionReferenceType === \"LegislationEvent\")?.IsPassed)?.ReconsiderationDescription : tInput.ReferenceText + (memberListEvents.includes(this.state.selectedMotion?.EventCode) && tInput.ActionReferenceType === \"Member\" && tInput.ReferenceText && this.state.templateInputs[i + 1] && this.state.templateInputs[i + 1].ActionReferenceType === \"Member\" && this.state.templateInputs[i + 1].ReferenceText ? \", \" : \"\")\n        }).join('');\n        const showDeletedItemsCheckbox = this.state.newEntries[entryIndex] ? !!this.state.newEntries[entryIndex].MinutesActivities.find(act => act.DeletionDate) : false\n        let reversedActivities = this.state.newEntries[entryIndex] ? [...this.state.newEntries[entryIndex].MinutesActivities].reverse() : []\n        // Sometimes the deleted items are shown and other times they are not. If they are not shown then the first activity might not be the first activity on the screen.\n        // So this variable is used to figure out whether to show the hr or not that seperates activities.\n        const firstActivityIndex = this.state.newEntries[entryIndex] ? reversedActivities.findIndex((act, actIndex) => {\n            if (this.state.newEntries[entryIndex].showDeleted) {\n                return true\n            } else {\n                return !act.DeletionDate;\n            }\n        }) : null\n\n        function extractText(summary) {\n            let doc = document.createElement('div')\n            doc.insertAdjacentHTML(\"afterbegin\", summary);\n            //Bail out and pass back the summary if there is no paragraph tag\n            return doc.getElementsByTagName(\"p\")[0] ? doc.getElementsByTagName(\"p\")[0].innerText : summary\n        }\n\n        return (\n            <div key={entryIndex}>\n                <div className=\"bill-grid\">\n                    <React.Fragment>\n                        <div className={`${this.state.showSwitchCategory ? 'inner-grid half align-center' : ''}`} style={this.state.showSwitchCategory ? { gap: '10px', justifyContent: 'center' } : { textAlign: 'center' }}>\n                            <span {...provided.dragHandleProps} className=\"icon menu\" onClick={(e) => this.toggleMenu(entryIndex)}></span>\n                            {this.state.showMenu === entryIndex &&\n                                <div style={{ textAlign: 'left', marginLeft: '-15px', width: this.state.showSwitchCategory !== entryIndex ? 'auto' : '' }} className=\"info-box blue\" ref={this.menuBoxRef} onBlur={(e) => this.toggleMenu(-1, e)} contentEditable suppressContentEditableWarning={true}>\n                                    <div contentEditable={false}>\n                                        <div>\n                                            <button type=\"button\" className=\"button-link\" disabled={this.props.categoryFormDisabled} onClick={() => this.toggleOOB(entryIndex)}>Place {entry.IsOOB ? \"In\" : \"Out of\"} Block</button>\n                                        </div>\n                                        <div>\n                                            <button type=\"button\" disabled={this.props.categoryFormDisabled} onClick={() => this.addEntry(entryIndex, 0)} className=\"button-link\">Add Entry Above</button>\n                                        </div>\n                                        <div>\n                                            <button type=\"button\" disabled={this.props.categoryFormDisabled} onClick={() => this.addEntry(entryIndex, 1)} className=\"button-link\">Add Entry Below</button>\n                                        </div>\n                                        {this.state.references.find(ref => ref.Description === 'Recess') &&\n                                            <div>\n                                                <button type=\"button\" disabled={this.props.categoryFormDisabled} onClick={() => this.addEntry(entryIndex, 1, true)} className=\"button-link\">Add Recess Below</button>\n                                            </div>\n                                        }\n                                        {this.props.categories.filter(c => c.CalendarCategoryTypeID === this.props.formData.CalendarCategoryTypeID && c.MinutesCategoryID !== this.props.formData.MinutesCategoryID).length ?\n                                            <div>\n                                                <button type=\"button\" disabled={this.props.categoryFormDisabled} onClick={() => this.toggleSwitchCategory(entryIndex)} className=\"button-link\">Switch Category</button>\n                                            </div>\n                                            : null\n                                        }\n                                        {!entry.LegislationNumber &&\n                                            <div>\n                                                <hr />\n                                                <span className=\"small-text\">Apply Legislation</span>\n                                                <LargeListSelect\n                                                    styles={legNumSelectStyle}\n                                                    options={this.props.sessionBills}\n                                                    value={this.state.selectedBillNumber[entryIndex]}\n                                                    onChange={val => this.handleBillNumberChange(entryIndex, val)}\n                                                />\n                                                <button type=\"button\" onClick={() => this.applyLegislationToEntry(entryIndex)} disabled={!this.state.selectedBillNumber[entryIndex] || this.props.categoryFormDisabled} className=\"button small-button\">Apply</button>\n                                            </div>\n                                        }\n                                    </div>\n                                </div>\n                            }\n                            {this.state.showSwitchCategory &&\n                                <input\n                                    type=\"checkbox\"\n                                    className=\"checkbox\"\n                                    checked={this.state.checkedBills[entryIndex]}\n                                    onChange={(e) => this.toggleSelectEntry(entryIndex, e)}\n                                />\n                            }\n                        </div>\n                        <div>\n                            <div className=\"flex-row flex-vertical-center\">\n                                {entry.LegislationNumber\n                                    ? <React.Fragment>\n                                        <Link to={`/bill-details/${this.props.sessionCode}/${entry.LegislationNumber}`} target=\"_blank\" rel=\"noreferrer\">{entry.LegislationNumber}</Link>\n                                        <span onClick={() => this.toggleSmallMotionForm(entryIndex)} className=\"icon add\"></span>\n                                    </React.Fragment>\n                                    : \"No Legislation\"\n                                }\n                            </div>\n                            {\n                                this.state.smallMotionForm === entryIndex &&\n                                /* The contentEditable is so that the element can be focused and the onBlur function is able to run */\n                                <div style={{ width: '900px' }} className=\"info-box blue\" onBlur={(e) => this.toggleSmallMotionForm(-1, e)} contentEditable suppressContentEditableWarning={true}>\n                                    <div contentEditable={false}>\n                                        <div onKeyUp={(e) => this.onKeyUp(e)}>\n                                            <Select\n                                                value={this.state.selectedMotion}\n                                                options={[...this.state.references].filter(r => !r.LegislationChamberCode || !entry.LegislationNumber || entry.LegislationChamberCode === r.LegislationChamberCode)}\n                                                onChange={this.handleMotionChange}\n                                                styles={selectStyle}\n                                                ref={this.motionDropdownRef}\n                                            />\n                                            {this.state.otherEventSelected &&\n                                                <>\n                                                    <button type=\"button\" className='icon delete' onClick={() => this.unSelectOtherEvent()}></button>\n\n                                                    <div className=\"inner-grid bill-history-event-controls\" style={{ marginTop: \"10px\" }}>\n                                                        <Select\n                                                            options={this.state.otherBillEventOptions}\n                                                            styles={selectStyle}\n                                                            value={this.state.otherEvent}\n                                                            getOptionLabel={opt => opt.EventCode ? \"(\" + opt.EventCode + \") \" + opt.label : opt.label}\n                                                            onChange={this.handleOtherEventChange}\n                                                            isDisabled={this.state.otherBillEventOptions.length === 0}\n                                                        />\n                                                    </div>\n                                                </>\n                                            }\n                                        </div>\n                                        <div>\n                                            <button type='button' disabled={!this.state.selectedMotion || this.props.categoryFormDisabled} className='button' onClick={() => this.insertMotion(!this.state.newEntries[entryIndex])}>Add Motion</button>\n                                        </div>\n                                        {this.state.templateInputs.length > 0 &&\n                                            <div className=\"multi-row one-small-small no-margin\">\n                                                <div>\n                                                    <div>\n                                                        <span className='small-text txt-greyed'>{inputValue}</span>\n                                                    </div>\n                                                    <InputTypes\n                                                        newEvent={this.state.selectedMotion}\n                                                        memberList={this.props.memberList}\n                                                        committeeList={this.props.committeeList}\n                                                        communicationList={this.props.communicationList}\n                                                        eventList={this.state.reconsiderationEvents}\n                                                        handleChange={this.handleTemplateChange}\n                                                        entryIndex={0}\n                                                        activityIndex={0}\n                                                        references={this.state.templateInputs}\n                                                        textList={this.state.textList.filter(text => this.state.insertEntry.find(bill => bill.LegislationID === text.LegislationID) ? true : false)}\n                                                    />\n                                                </div>\n                                            </div>\n                                        }\n                                    </div>\n                                </div>\n                            }\n                        </div >\n                        <div>\n                            {this.state.newEntries[entryIndex] ?\n                                <React.Fragment>\n                                    <DragDropContext onDragEnd={res => this.onActivityDragEnd(res, entryIndex)}>\n                                        <Droppable droppableId={`activities-${entryIndex}-droppable`}>\n                                            {(provided, snapshot) =>\n                                                <div\n                                                    ref={provided.innerRef}\n                                                    style={getListStyle(snapshot.isDraggingOver)}>\n                                                    {this.state.newEntries[entryIndex].MinutesActivities && reversedActivities.map((activity, activityIndex) => {\n                                                        if (!this.state.newEntries[entryIndex].showDeleted && activity.DeletionDate) {\n                                                            return null;\n                                                        } else {\n                                                            const inputValue = (reversedActivities[activityIndex].Description || (reversedActivities[activityIndex].ActivityReferences && reversedActivities[activityIndex].ActivityReferences.map((tInput, i) => {\n                                                                //For events H6013/S6013/H6113/S6113/H6213/S6213 there are sometimes incomplete lists of members. This will prevent the UI from adding blank member dropdown values to the description\n                                                                if (memberListEvents.includes(reversedActivities[activityIndex].EventCode) && !tInput.ReferenceText) {\n                                                                    return;\n                                                                }\n\n                                                                if (!tInput.ReferenceText && !reversedActivities[activityIndex].ReconsiderationGrammar) {\n                                                                    return `${tInput.ActionReferenceType}`\n                                                                }\n                                                                return reversedActivities[activityIndex].ActivityReferences.find(x => x.ActionReferenceType === \"LegislationEvent\") ? this.state.fullEventList.find(e => e.EventCode === reversedActivities[activityIndex].ActivityReferences.find(x => x.ActionReferenceType === \"LegislationEvent\")?.EventCode && e.IsPassed === reversedActivities[activityIndex].ActivityReferences.find(x => x.ActionReferenceType === \"LegislationEvent\")?.IsPassed)?.ReconsiderationDescription : tInput.ReferenceText + (memberListEvents.includes(reversedActivities[activityIndex].EventCode) && tInput.ActionReferenceType === \"Member\" && tInput.ReferenceText && reversedActivities[activityIndex].ActivityReferences[i + 1] && reversedActivities[activityIndex].ActivityReferences[i + 1].ActionReferenceType === \"Member\" && reversedActivities[activityIndex].ActivityReferences[i + 1].ReferenceText ? \", \" : \"\")\n                                                            }).join('')));\n                                                            return (\n                                                                <Draggable key={`${activity.MinutesActivityID}-${activity.MinutesActivityID}`} draggableId={`${activity.MinutesActivityID}-${activity.Sequence}`} index={activityIndex}>\n                                                                    {(provided, snapshot) =>\n                                                                        <div\n                                                                            ref={provided.innerRef}\n                                                                            {...provided.draggableProps}\n                                                                            style={getItemStyle(snapshot.isDragging, provided.draggableProps.style)}>\n                                                                            {activityIndex !== firstActivityIndex && <hr className=\"faded-line\" />}\n                                                                            <div className=\"no-gap-grid two-col-sidebar-backwards\">\n                                                                                <div {...provided.dragHandleProps}>\n                                                                                    <button className=\"button draggable\">Drag and drop</button>\n                                                                                </div>\n                                                                                <div>\n                                                                                    <div className=\"no-gap-grid two-col-sidebar\">\n                                                                                        <div>\n                                                                                            {entry.LegislationNumber && !activity.OtherMotionSelected &&\n                                                                                                <Select\n                                                                                                    value={[...this.state.references].find(r => r.EventCode === activity.EventCode && r.IsPassed === activity.IsPassed) ? [...this.state.references].find(r => r.EventCode === activity.EventCode && r.IsPassed === activity.IsPassed) : activity.Description ? { label: activity.Description } : { label: \"Select...\" }}\n                                                                                                    options={[...this.state.references].filter(r => !r.LegislationChamberCode || entry.LegislationNumber[0] === r.LegislationChamberCode)}\n                                                                                                    onChange={(motion) => this.handleChange(entryIndex, activityIndex, null, null, null, motion)}\n                                                                                                    styles={selectStyle}\n                                                                                                    isClearable\n                                                                                                />\n                                                                                            }\n                                                                                            {!activity.OtherMotionSelected &&\n                                                                                                <div style={{ display: 'flex', alignItems: 'center', gap: '5px' }}>\n                                                                                                    <span\n                                                                                                        style={{ textDecoration: reversedActivities[activityIndex].DeletionDate ? 'line-through' : 'none' }}\n                                                                                                        className=\"small-text\">\n                                                                                                        {((reversedActivities[activityIndex].tempDescription ?? reversedActivities[activityIndex].Description) || reversedActivities[activityIndex].ActivityReferences && reversedActivities[activityIndex].ActivityReferences.map((tInput, i) => {\n                                                                                                            //For events H6013/S6013/H6113/S6113/H6213/S6213 there are sometimes incomplete lists of members. This will prevent the UI from adding blank member dropdown values to the description\n                                                                                                            if (memberListEvents.includes(reversedActivities[activityIndex].EventCode) && !tInput.ReferenceText) {\n                                                                                                                return;\n                                                                                                            }\n\n                                                                                                            if (!tInput.ReferenceText && !reversedActivities[activityIndex].ReconsiderationGrammar) {\n                                                                                                                return `${tInput.ActionReferenceType}`\n                                                                                                            }\n                                                                                                            return reversedActivities[activityIndex].ActivityReferences.find(x => x.ActionReferenceType === \"LegislationEvent\") ? this.state.fullEventList.find(e => e.EventCode === reversedActivities[activityIndex].ActivityReferences.find(x => x.ActionReferenceType === \"LegislationEvent\")?.EventCode && e.IsPassed === reversedActivities[activityIndex].ActivityReferences.find(x => x.ActionReferenceType === \"LegislationEvent\")?.IsPassed)?.ReconsiderationDescription : tInput.ReferenceText + (memberListEvents.includes(reversedActivities[activityIndex].EventCode) && tInput.ActionReferenceType === \"Member\" && tInput.ReferenceText && reversedActivities[activityIndex].ActivityReferences[i + 1] && reversedActivities[activityIndex].ActivityReferences[i + 1].ActionReferenceType === \"Member\" && reversedActivities[activityIndex].ActivityReferences[i + 1].ReferenceText ? \", \" : \"\")\n                                                                                                        }).join('')) + ((reversedActivities[activityIndex].tempVoteTally ?? reversedActivities[activityIndex].VoteTally) ? ' ' + (reversedActivities[activityIndex].tempVoteTally ?? reversedActivities[activityIndex].VoteTally) : '')}\n                                                                                                    </span>\n                                                                                                    {(reversedActivities[activityIndex].ActivityReferences && reversedActivities[activityIndex].ActivityReferences.find(ar => ar.ActionReferenceType !== \"Text\")) && (!this.state.editingActivityDescription[entryIndex] || !this.state.editingActivityDescription[entryIndex][activityIndex]) && <a className={`icon edit`} onClick={() => this.toggleEditActivityDescription(entryIndex, activityIndex)} />}\n                                                                                                </div>\n                                                                                            }\n                                                                                            {!activity.OtherMotionSelected &&\n                                                                                                <div style={{ display: 'flex', alignItems: 'center', gap: '5px' }}>\n                                                                                                    {this.state.editingActivityDescription[entryIndex] && this.state.editingActivityDescription[entryIndex][activityIndex] &&\n                                                                                                        <>\n                                                                                                            <div style={{ width: '100%', display: 'flex', gap: '5px' }}>\n                                                                                                                <textarea style={{ width: '75%' }} value={reversedActivities[activityIndex].tempDescription ?? inputValue} onChange={(e) => this.handleActivityDescriptionChange(e.target.value, \"Description\", entryIndex, activityIndex)} />\n                                                                                                                {reversedActivities[activityIndex].VoteTally !== undefined && <EditVoteTally value={reversedActivities[activityIndex].tempVoteTally} onChange={(e) => this.handleActivityDescriptionChange(e.target.value, \"VoteTally\", entryIndex, activityIndex)} />}\n                                                                                                            </div>\n                                                                                                            <div style={{ display: 'flex', gap: '5px' }}>\n                                                                                                                {this.state.editingActivityDescription[entryIndex] && this.state.editingActivityDescription[entryIndex][activityIndex] &&\n                                                                                                                    <a className={`icon save`} onClick={() => this.handleActivityDescriptionChange(null, null, entryIndex, activityIndex, true)} />}\n                                                                                                                <a className={`icon ${this.state.editingActivityDescription[entryIndex] && this.state.editingActivityDescription[entryIndex][activityIndex] ? 'delete' : 'edit'}`} onClick={() => this.toggleEditActivityDescription(entryIndex, activityIndex)} />\n                                                                                                            </div>\n                                                                                                        </>\n                                                                                                    }\n                                                                                                </div>\n                                                                                            }\n                                                                                            {activity.OtherMotionSelected &&\n                                                                                                <>\n                                                                                                    <button type=\"button\" className='button danger' onClick={() => this.unSelectOtherEventEdit(entryIndex, activityIndex)}>Cancel Other Motion</button>\n\n                                                                                                    <div className=\"inner-grid bill-history-event-controls\" style={{ marginTop: \"10px\" }}>\n                                                                                                        <Select\n                                                                                                            options={this.state.otherBillEventOptions}\n                                                                                                            styles={selectStyle}\n                                                                                                            value={activity.OtherEvent ? this.state.otherBillEventOptions.find(x => x.EventCode === activity.OtherEvent.EventCode) : { label: \"Select...\", value: \"\" }}\n                                                                                                            getOptionLabel={opt => opt.EventCode ? \"(\" + opt.EventCode + \") \" + opt.label : opt.label}\n                                                                                                            onChange={(value) => this.handleOtherChange(entryIndex, activityIndex, undefined, undefined, undefined, value)}\n                                                                                                            isDisabled={this.state.otherBillEventOptions.length === 0}\n                                                                                                        />\n                                                                                                    </div>\n\n                                                                                                    {activity.OtherEvent !== undefined &&\n                                                                                                        <>\n                                                                                                            < InputTypes\n                                                                                                                style={{ display: \"inline-block\" }}\n                                                                                                                newEvent={reversedActivities[activityIndex].OtherEvent}\n                                                                                                                memberList={this.props.memberList}\n                                                                                                                committeeList={this.props.committeeList}\n                                                                                                                communicationList={this.props.communicationList}\n                                                                                                                eventList={this.state.reconsiderationEvents}\n                                                                                                                actionTypes={this.props.actionTypes}\n                                                                                                                handleChange={this.handleChange}\n                                                                                                                entryIndex={entryIndex}\n                                                                                                                activityIndex={activityIndex}\n                                                                                                                references={reversedActivities[activityIndex].OtherEvent.ActivityReferences || []}\n                                                                                                                textList={this.state.textList.filter(text => this.state.newEntries[entryIndex].LegislationID === text.LegislationID)}\n                                                                                                            />\n                                                                                                            {reversedActivities[activityIndex].OtherEvent.VoteTally !== undefined && reversedActivities[activityIndex].OtherEvent.ActivityReferences !== undefined && !reversedActivities[activityIndex].OtherEvent.ActivityReferences.find(ar => ar.ActionReferenceType !== \"Text\") && <EditVoteTally value={reversedActivities[activityIndex].OtherEvent.tempVoteTally ?? reversedActivities[activityIndex].OtherEvent.VoteTally} onChange={(e) => this.handleActivityDescriptionChange(e.target.value, \"VoteTally\", entryIndex, activityIndex)} />}\n                                                                                                        </>\n                                                                                                    }\n                                                                                                </>\n                                                                                            }\n                                                                                            <div>\n                                                                                                {!reversedActivities[activityIndex].DeletionDate && !activity.OtherMotionSelected &&\n                                                                                                    <>\n                                                                                                        <InputTypes\n                                                                                                            style={{ display: \"inline-block\" }}\n                                                                                                            newEvent={reversedActivities[activityIndex]}\n                                                                                                            memberList={this.props.memberList}\n                                                                                                            committeeList={this.props.committeeList}\n                                                                                                            communicationList={this.props.communicationList}\n                                                                                                            eventList={this.state.reconsiderationEvents}\n                                                                                                            actionTypes={this.props.actionTypes}\n                                                                                                            handleChange={this.handleChange}\n                                                                                                            entryIndex={entryIndex}\n                                                                                                            activityIndex={activityIndex}\n                                                                                                            references={reversedActivities[activityIndex].ActivityReferences || []}\n                                                                                                            textList={this.state.textList.filter(text => this.state.newEntries[entryIndex].LegislationID === text.LegislationID)}\n                                                                                                        />\n                                                                                                        {reversedActivities[activityIndex].VoteTally !== undefined && reversedActivities[activityIndex].ActivityReferences !== undefined && !reversedActivities[activityIndex].ActivityReferences.find(ar => ar.ActionReferenceType !== \"Text\") && <EditVoteTally value={reversedActivities[activityIndex].tempVoteTally ?? reversedActivities[activityIndex].VoteTally} onChange={(e) => this.handleOtherActivityDescriptionChange(e.target.value, \"VoteTally\", entryIndex, activityIndex)} />}\n                                                                                                    </>\n                                                                                                }\n                                                                                            </div>\n                                                                                        </div>\n                                                                                        <div>\n                                                                                            {!reversedActivities[activityIndex].DeletionDate ?\n                                                                                                <button onClick={() => this.removeActivity(entryIndex, activityIndex)} type=\"button\" className=\"button remove\"></button>\n                                                                                                :\n                                                                                                <button onClick={() => this.addBackActivity(entryIndex, activityIndex)} type=\"button\" className=\"button add\"></button>\n                                                                                            }\n\n                                                                                        </div>\n                                                                                    </div>\n                                                                                </div>\n                                                                            </div>\n                                                                        </div>}\n                                                                </Draggable>\n                                                            )\n                                                        }\n\n                                                    })}\n                                                    {provided.placeholder}\n                                                </div>\n                                            }\n                                        </Droppable></DragDropContext>\n                                </React.Fragment>\n                                :\n                                <React.Fragment>\n                                    {entry.MinutesActivities && entry.MinutesActivities.length > 0\n                                        ? entry.MinutesActivities.filter(a => !a.DeletionDate).map((activity, activityIndex) =>\n                                            <span key={activityIndex}>\n                                                {activityIndex !== 0 && ', '}{activity.Description}{activity.VoteTally ? ' ' + activity.VoteTally : ''}\n                                            </span>\n                                        )\n                                        //find way to insert summary into document and extract innertext to take substring of\n                                        : <span>{entry.MinutesSummaries && entry.MinutesSummaries[0] && entry.MinutesSummaries[0].MinutesSummary.length > 215 ? extractText(entry.MinutesSummaries[0].MinutesSummary).substr(0, 215) + \"...\" : entry.MinutesSummaries && entry.MinutesSummaries[0] && extractText(entry.MinutesSummaries[0].MinutesSummary)}</span>\n                                    }\n                                </React.Fragment>\n                            }\n\n                        </div>\n                        {\n                            this.state.newEntries[entryIndex] ? (\n                                <div style={{ position: \"relative\" }}>\n                                    <div className=\"bill-grid-actions\" key={entry.MinutesEntryID}>\n                                        <button onClick={() => this.saveChange(entryIndex)} type=\"button\" className=\"icon save\"></button>\n                                        <button onClick={() => this.toggleEdit(entryIndex)} type=\"button\" className=\"icon delete\"></button>\n                                    </div>\n                                    {showDeletedItemsCheckbox &&\n                                        <div style={!this.state.newEntries[entryIndex].MinutesActivities || !this.state.newEntries[entryIndex].MinutesActivities.filter(ma => !ma.DeletionDate).length ? { width: '105%' } : { width: '105%', position: 'absolute', bottom: '1px' }} className=\"flex-row flex-vertical-center flex-start\">\n                                            <div className=\"toggle-switch\" onClick={() => this.toggleShowDeleted(entryIndex)}>\n                                                <input type=\"checkbox\" checked={this.state.newEntries[entryIndex].showDeleted} />\n                                                <span className=\"slider\"></span>\n                                            </div>\n                                            <label style={{ fontSize: \"12px\" }} className=\"checkbox-label\">Show Deleted</label>\n                                        </div>}\n                                </div>\n                            ) : (\n                                <div className=\"bill-grid-actions\" key={entry.MinutesEntryID}>\n                                    {this.state.savingVotes[entryIndex] || this.state.togglingEdit[entryIndex] ? <span className=\"small-spinner\"></span> :\n                                        <React.Fragment>\n                                            <button onClick={() => this.toggleCommentBox(entryIndex)} type=\"button\" disabled={this.props.categoryFormDisabled} className=\"button-link\">{entry.MinutesSummaries && entry.MinutesSummaries.length > 0 ? \"Edit\" : \"Add\"} Comment</button>\n                                            {entry.MinutesActivities && entry.MinutesActivities.length > 0 && <button onClick={() => this.toggleEdit(entryIndex)} type=\"button\" className=\"button-link\" disabled={this.props.categoryFormDisabled}>Edit Motions</button>}\n                                        </React.Fragment>}\n                                </div>\n                            )\n                        }\n                    </React.Fragment >\n                </div >\n            </div >\n        );\n    }\n\n    render() {\n        const { insertEntry, selectedMotion, references, nonLegislativeActionReferences, showAuxBillForm } = this.state;\n        //Seperate the entries that are in block and out of block\n        //Use map instead of filter so that the index is preserved\n        const entries = this.props.formData.MinutesEntries;\n        const outOfBlockEntries = entries.map(entry => {\n            return entry.IsOOB ? entry : null\n        });\n        let inBlockEntries = entries.map(entry => {\n            return !entry.IsOOB ? entry : null\n        });\n        const billNumbers = [\n            {\n                options: [{ label: 'No Legislation' }]\n            },\n            {\n                button: <button type=\"button\" onClick={() => this.addAllEntries(false)} className=\"button small-button\">Select All In Block</button>,\n                options: inBlockEntries.filter(opt => opt && opt.LegislationNumber),\n            },\n            {\n                button: <button type=\"button\" onClick={() => this.addAllEntries(true)} className=\"button small-button\">Select All Out of Block</button>,\n                options: outOfBlockEntries.filter(opt => opt && opt.LegislationNumber),\n            }\n        ];\n        const auxOptions = this.props.sessionBills.filter(bill => {\n            //If the bill is not already in the minutes entries then add it to the aux list            \n            if (!this.props.formData.MinutesEntries.find(x => x.LegislationID === bill.LegislationID)) {\n                return bill;\n            }\n        })\n        const memberListEvents = [\"H6013\", \"S6013\", \"H6113\", \"S6113\", \"H6213\", \"S6213\"];\n\n        let inputValue = this.state.templateInputs.map((tInput, i) => {\n            //For events H6013/S6013/H6113/S6113/H6213/S6213 there are sometimes incomplete lists of members. This will prevent the UI from adding blank member dropdown values to the description\n            if (memberListEvents.includes(this.state.selectedMotion?.EventCode) && !tInput.ReferenceText) {\n                return;\n            }\n\n            if (!tInput.ReferenceText && !this.state.selectedMotion?.ReconsiderationGrammar) {\n                return `${tInput.ActionReferenceType}`\n            }\n            return this.state.templateInputs.find(x => x.ActionReferenceType === \"LegislationEvent\") ? this.state.fullEventList.find(e => e.EventCode === this.state.templateInputs.find(x => x.ActionReferenceType === \"LegislationEvent\")?.EventCode && e.IsPassed === this.state.templateInputs.find(x => x.ActionReferenceType === \"LegislationEvent\")?.IsPassed)?.ReconsiderationDescription : tInput.ReferenceText + (memberListEvents.includes(this.state.selectedMotion?.EventCode) && tInput.ActionReferenceType === \"Member\" && tInput.ReferenceText && this.state.templateInputs[i + 1] && this.state.templateInputs[i + 1].ActionReferenceType === \"Member\" && this.state.templateInputs[i + 1].ReferenceText ? \", \" : \"\")\n        }).join('');\n        return (\n            <div>\n                <div className=\"user-forms motion-form\">\n                    <div className=\"dlas-forms\">\n                        {this.state.showCommentBox !== false &&\n                            <CommentBox\n                                toggleBox={this.toggleCommentBox}\n                                handleCommentBoxChange={this.handleCommentBoxChange}\n                                comments={this.state.commentBoxContent}\n                                saveComment={this.saveComment}\n                            />\n                        }\n                        <div className=\"inner-grid one-and-eight\">\n                            <p className=\"small-header\">Motion</p>\n                            <div className=\"dlas-forms\">\n                                {showAuxBillForm\n                                    ? <div className=\"inner-grid\" style={{ gridTemplateColumns: \"25px 1fr 150px 150px\", marginTop: \"19px\" }}>\n                                        <a className=\"icon delete\" onClick={this.toggleAuxBillAdd} />\n                                        <span style={{ fontSize: \"14px\" }}>This form may be used to make any bill in the session available to add to this minutes category. Use with caution.</span>\n                                        <Select\n                                            options={auxOptions}\n                                            onChange={this.setAuxBill}\n                                            isSearchable={true}\n                                        />\n                                        <button type=\"button\" className=\"button\" onClick={this.addAuxBill} disabled={this.state.savingAuxBill || this.props.categoryFormDisabled}>Add Bill to List</button>\n                                    </div>\n                                    : <div className=\"inner-grid\" style={{ gridTemplateColumns: \"25px 8fr 225px\", marginTop: \"19px\" }}>\n                                        <a className=\"icon warning\" onClick={this.toggleAuxBillAdd} style={{ marginTop: \"19px\" }} />\n                                        <div />\n                                    </div>\n                                }\n                            </div>\n                        </div>\n                        <form>\n                            <div className=\"multi-row small-three-one-alt no-margin\">\n                                <div>\n                                    <label>Bill #</label>\n                                    <Select\n                                        value={insertEntry}\n                                        isMulti\n                                        onChange={this.handleBillChange}\n                                        options={billNumbers}\n                                        styles={selectStyle}\n                                        formatGroupLabel={data => <div>{data.button}</div>}\n                                        getOptionLabel={option => option.LegislationNumber || option.label || \"Entry\"}\n                                        getOptionValue={option => option.MinutesEntryID}\n                                        isDisabled={this.state.smallMotionForm !== -1}\n                                    />\n                                </div>\n                                <div onKeyUp={(e) => this.onKeyUp(e)}>\n                                    <label>Motion</label>\n                                    <Select\n                                        value={selectedMotion}\n                                        options={insertEntry && insertEntry.length && insertEntry.find(x => x.label === \"No Legislation\") ? nonLegislativeActionReferences : [...references].filter(r => !r.LegislationChamberCode || !insertEntry || insertEntry.find(b => b.LegislationChamberCode === r.LegislationChamberCode))}\n                                        isDisabled={this.state.otherEventSelected || insertEntry.length === 0 || this.state.smallMotionForm !== -1 || insertEntry.find(x => x.LegislationNumber === \"No Legislation\")}\n                                        onChange={(value) => this.handleMotionChange(value)}\n                                        styles={selectStyle}\n                                        isClearable\n                                        ref={this.motionRef}\n                                    />\n                                    {this.state.otherEventSelected &&\n                                        <>\n                                            <button type=\"button\" className='icon delete' onClick={() => this.unSelectOtherEvent()}></button>\n\n                                            <div className=\"inner-grid bill-history-event-controls\" style={{ marginTop: \"10px\" }}>\n                                                <Select\n                                                    options={this.state.otherBillEventOptions}\n                                                    styles={selectStyle}\n                                                    value={this.state.otherEvent}\n                                                    getOptionLabel={opt => opt.EventCode ? \"(\" + opt.EventCode + \") \" + opt.label : opt.label}\n                                                    onChange={this.handleOtherEventChange}\n                                                    isDisabled={this.state.otherBillEventOptions.length === 0}\n                                                />\n                                            </div>\n                                        </>\n                                    }\n                                </div>\n                                <div>\n                                    <label>Description</label>\n                                    <input\n                                        value={this.state.templateInputs.length > 0 ? '' : selectedMotion?.Description || selectedMotion?.CalendarDescription || ''}\n                                        placeholder={selectedMotion ? this.state.templateInputs.length > 0 ? \"See below...\" : \"\" : \"Select motion...\"}\n                                        disabled={!selectedMotion || this.state.templateInputs.length > 0}\n                                        onChange={this.handleSelectedMotionDescriptionChange}\n                                    />\n                                </div>\n                                <div className=\"inner-grid two\">\n                                    <div>\n                                        <br />\n                                        <button type='button' disabled={(!this.state.selectedMotion && !this.state.insertEntry.find(x => x.LegislationNumber === \"No Legislation\")) || this.state.smallMotionForm !== -1 || this.props.categoryFormDisabled} className='button' onClick={this.insertMotion}>Add Motion</button>\n                                    </div>\n                                    <div>\n                                        <br />\n                                        <button type='button' disabled={!this.state.selectedMotion || this.state.smallMotionForm !== -1 || this.props.categoryFormDisabled} onClick={this.removeMotion} className='button danger'>Remove Motion</button>\n                                    </div>\n                                </div>\n                            </div>\n                            {this.state.templateInputs.length > 0 &&\n                                <div className=\"multi-row small-two-one-alt no-margin\">\n                                    <br />\n                                    <div>\n                                        <div>\n                                            <span className='small-text txt-greyed'>{inputValue}</span>\n                                        </div>\n                                        <InputTypes\n                                            newEvent={this.state.selectedMotion}\n                                            memberList={this.props.memberList}\n                                            committeeList={this.props.committeeList}\n                                            communicationList={this.props.communicationList}\n                                            eventList={this.state.reconsiderationEvents}\n                                            handleChange={this.handleTemplateChange}\n                                            entryIndex={0}\n                                            activityIndex={0}\n                                            references={this.state.templateInputs}\n                                            textList={this.state.textList.filter(text => this.state.insertEntry.find(bill => bill.LegislationID === text.LegislationID) ? true : false)}\n                                        />\n                                    </div>\n                                </div>\n                            }\n                        </form>\n                    </div>\n                </div>\n                {entries.length ?\n                    <div className=\"flex-row flex-end\" style={{ marginBottom: '5px' }}>\n                        {this.state.showSwitchCategory &&\n                            <div className=\"inner-grid\" style={{ gap: '5px', gridTemplateColumns: '20px 4fr .1fr' }}>\n                                <div className=\"inner-grid align-center\">\n                                    <button onClick={this.toggleSwitchCategory} type=\"button\" className=\"icon delete\"></button>\n                                </div>\n                                <Select\n                                    value={this.state.selectedSwitchCategory}\n                                    options={this.props.categories.filter(c => c.CalendarCategoryTypeID === this.props.formData.CalendarCategoryTypeID && c.MinutesCategoryID !== this.props.formData.MinutesCategoryID)}\n                                    getOptionLabel={opt => this.props.getCategoryDescriptionText(opt)}\n                                    onChange={this.handleSwitchCategoryChange}\n                                    styles={selectStyle}\n                                />\n                                <button onClick={this.switchCategory} disabled={!this.state.checkedBills.length || this.state.switchingCategories || !this.state.selectedSwitchCategory} type=\"button\" className=\"button float-right\">{this.state.switchingCategories ? <div className=\"small-spinner\" /> : 'Switch'}</button>\n                            </div>\n                        }\n                    </div>\n                    : null\n                }\n                <div>\n                    <div className=\"bill-grid\">\n                        <div className=\"bill-grid-header\">\n                            <span></span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>Bill #</span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>Bill Action</span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>&nbsp;</span>\n                        </div>\n                    </div>\n                    <div>\n                        <DragDropContext onDragEnd={this.onEntryDragEnd}>\n                            <Droppable droppableId={`entries-droppable`}>\n                                {(provided, snapshot) =>\n                                    <div ref={provided.innerRef} style={getListStyle(snapshot.isDraggingOver)}>\n                                        {inBlockEntries.map((entry, entryIndex) => {\n                                            if (entry) {\n                                                return (\n                                                    <Draggable isDragDisabled={this.props.categoryFormDisabled} key={`${entry.MinutesEntryID}-${entry.Sequence}`} draggableId={`${entry.MinutesEntryID}-${entry.Sequence}`} index={entryIndex}>\n                                                        {(provided, snapshot) =>\n                                                            <div\n                                                                ref={provided.innerRef}\n                                                                {...provided.draggableProps}>\n                                                                {this.formInput(entry, entryIndex, provided)}\n                                                            </div>}\n                                                    </Draggable>\n                                                );\n                                            }\n                                        })}\n                                        {provided.placeholder}\n                                    </div>\n                                }\n                            </Droppable>\n                        </DragDropContext>\n                        {outOfBlockEntries.find(ent => ent !== null) &&\n                            <div className=\"bill-grid\" style={{ gridTemplateColumns: 'none' }}>\n                                <div className=\"bold\">\n                                    Out Of Block\n                                </div>\n                            </div>\n                        }\n                        {outOfBlockEntries.map((entry, entryIndex) => {\n                            if (entry) {\n                                return (this.formInput(entry, entryIndex));\n                            }\n                        })}\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n\nconst EditVoteTally = props => <textarea style={{ width: '25%' }} value={props.value} onChange={props.onChange} />\n\n//react-select default style makes the element too tall and the font too large\nconst fontSize = '0.8em'\nconst selectStyle = {\n    control: styles => ({\n        ...styles,\n        minHeight: '0px',\n        padding: '0.12em 0.6em !important',\n    }),\n    valueContainer: styles => ({\n        ...styles,\n        padding: 0,\n    }),\n    input: styles => ({\n        ...styles,\n        fontSize: fontSize,\n        lineHeight: 'normal',\n    }),\n    singleValue: styles => ({\n        ...styles,\n        fontSize: fontSize,\n    }),\n    placeholder: styles => ({\n        ...styles,\n        fontSize: fontSize\n    }),\n    option: styles => ({\n        ...styles,\n        fontSize: fontSize\n    }),\n}\nconst legNumSelectStyle = {\n    ...selectStyle,\n    dropdownIndicator: styles => ({\n        ...styles,\n        padding: 0,\n    }),\n    container: styles => ({\n        ...styles,\n        width: '100%'\n    }),\n    control: styles => ({\n        ...styles,\n        padding: 0,\n        minHeight: 'auto'\n    })\n\n}\n\nexport default connect(\n    (state) => {\n        const { calendar, votes, bills, minutes } = state;\n        return {\n            calendar,\n            votes,\n            bills,\n            minutes\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, voteActionCreators, calendarActionCreators, billActionCreators, minutesActionCreators), dispatch)\n        }\n    },\n    null,\n    {\n        forwardRef: true\n    }\n)(LegislativeForm)","import React from 'react';\n\nimport renderHTML from 'react-render-html';\n\nclass MinutesDetails extends React.Component {\n\n    render() {\n        const { categories, publicPage } = this.props;\n        return (\n            <div>\n                {categories.filter(c => c.MinutesEntries && c.MinutesEntries.length).map((category, index) => {\n                    //Used to grey out the categories that have no published entries\n                    const nonPublicEntries = category.MinutesEntries.find(entry => !entry.IsPublic);\n                    return (<div key={index} className={!publicPage && \"preview-entry\"}>\n                        {!publicPage &&\n                            <div className=\"entry-index\">\n                                <p>{index + 1}</p>\n                            </div>\n                        }\n                        <div className=\"entry-text\">\n                            <ul>\n                                {!category.CategoryDescription.toLowerCase().includes('communication') && category.CategoryDescription.toLowerCase() !== 'order of business' ?\n                                    category.CategoryText ?\n                                        category.CategoryText.split(/%+/).map((categoryTextPiece, idx) =>\n                                            categoryTextPiece.toLowerCase().includes(\"supplemental\") && index > 0 && categoryTextPiece === categories.filter(c => c.MinutesEntries && c.MinutesEntries.length)[index - 1]?.CategoryText?.split(/%+/)[idx] ? null : <li key={idx} className={`${(nonPublicEntries || category.MinutesEntries.length === 0) && !publicPage ? \"inactive \" : \"\"}category-heading`}>{categoryTextPiece}</li>\n                                        )\n                                        :\n                                        <React.Fragment>\n                                            {category.DisplayType && <li className={`${(nonPublicEntries || category.MinutesEntries.length === 0) && !publicPage ? \"inactive \" : \"\"}category-heading`}>{category.CategoryType}</li>}\n                                            <li className={`${(nonPublicEntries || category.MinutesEntries.length === 0) && !publicPage ? \"inactive \" : \"\"}category-heading`}>{category.CategoryDescription}</li>\n                                        </React.Fragment>\n                                    : null\n                                }\n                                {[...category.MinutesEntries].sort((a, b) => (a.IsOOB === b.IsOOB ? 0 : a.IsOOB ? 1 : -1) || a.Sequence - b.Sequence).filter(entry => !entry.DeletionDate).map((entry, i) => (\n                                    <React.Fragment key={i}>\n                                        <li className={!entry.IsPublic && !publicPage ? \"inactive\" : \"\"} key={i} style={!entry.EntryText ? entry.CommunicationID && category.CategoryType !== 'Chairmans Report' && !category.MinutesEntries[i - 1] ? {} : { padding: \"0px\" } : {}}>\n                                            {entry.MinutesActivities && entry.MinutesActivities.filter(activity => !activity.DeletionDate && (activity.InPreview || !entry.LegislationNumber)).length > 0 ?\n                                                <React.Fragment>\n                                                    {entry.MinutesActivities.filter(activity => !activity.DeletionDate && (activity.InPreview || !entry.LegislationNumber)).map((act, actIndex) =>\n                                                        <span key={actIndex} className={!act.IsPublic && !publicPage ? \"inactive\" : \"\"}>\n                                                            {actIndex === 0 ?\n                                                                <>\n                                                                    {(entry.LegislationNumber ? `${entry.LegislationNumber} - ` : '')}\n                                                                    {renderHTML(act.Description?.replace(/COMMUNICATION FROM (HOUSE|SENATE) \\((HN|SN)\\d{4,8}\\):/g, function (match, p1) {\n                                                                        return `<b>${match}</b>`;\n                                                                    }) || \"\")}\n                                                                    {(act.VoteTally ? ' ' + act.VoteTally : '')}</>\n                                                                :\n                                                                <>\n                                                                    {`, `}\n                                                                    {renderHTML(act.Description?.replace(/COMMUNICATION FROM (HOUSE|SENATE) \\((HN|SN)\\d{4,8}\\):/g, function (match, p1) {\n                                                                        return `<b>${match}</b>`;\n                                                                    }) || \"\")}\n                                                                    {act.VoteTally ? ' ' + act.VoteTally : ''}\n                                                                </>\n                                                            }\n                                                        </span>\n                                                    )}\n                                                </React.Fragment>\n                                                :\n                                                <React.Fragment>\n                                                    {(entry.LegislationNumber || category.CategoryType === \"Chairmans Report\" || category.CategoryType === \"Miscellaneous\") && entry.EntryText &&\n                                                        <React.Fragment>{entry.LegislationNumber ? entry.LegislationNumber + ' - ' : ''}{renderHTML(entry.EntryText)}</React.Fragment>\n                                                    }\n                                                </React.Fragment>\n                                            }\n                                        </li>\n                                        {!entry.EntryText && (!entry.MinutesActivities || entry.MinutesActivities.filter(activity => !activity.DeletionDate && (activity.InPreview || !entry.LegislationNumber)).length === 0) &&\n                                            <React.Fragment>{entry.MinutesSummaries && entry.MinutesSummaries.length > 0 && entry.LegislationNumber &&\n                                                <li className={!entry.IsPublic && !publicPage ? \"inactive\" : \"\"}>{entry.LegislationNumber}</li>}\n                                            </React.Fragment>\n                                        }\n                                        {category.CategoryType !== 'Chairmans Report' && entry.MinutesSummaries && entry.MinutesSummaries.map((summary, summaryIndex) =>\n                                            <li key={summaryIndex} className={!entry.IsPublic && !publicPage ? \"inactive\" : \"\"}>\n                                                {renderHTML(summary.MinutesSummary || '')}\n                                            </li>\n                                        )}\n                                    </React.Fragment>\n                                ))}\n                            </ul>\n                        </div>\n                    </div>);\n                })}\n            </div>\n        )\n    }\n}\n\nexport default MinutesDetails;\n","import { partnerRequest, publicRequest } from '../services/request.service'\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst commListSuccess = 'COMM_LIST_SUCCESS';\nconst commListFailure = 'COMM_LIST_FAILURE';\n\nconst commGetSuccess = 'COMM_GET_SUCCESS';\nconst commGetFailure = 'COMM_GET_FAILURE';\n\nconst commSaveSuccess = 'COMM_SAVE_SUCCESS';\nconst commSaveFailure = 'COMM_SAVE_FAILURE';\n\nconst commFileSaveSuccess = 'COMM_FILE_SAVE_SUCCESS';\nconst commFileSaveFailure = 'COMM_FILE_SAVE_FAILURE';\n\nconst commCreateSuccess = 'COMM_CREATE_SUCCESS';\nconst commCreateFailure = 'COMM_CREATE_FAILURE';\n\nconst commCategoriesSuccess = \"COMM_CATEGORIES_SUCCESS\";\nconst commCategoriesFailure = \"COMM_CATEGORIES_FAILURE\";\n\nconst getCommunicationAssignmentsSuccess = \"GET_COMMUNICATION_MAPPINGS_SUCCESS\";\nconst getCommunicationAssignmentsFailure = \"GET_COMMUNICATION_MAPPINGS_FAILURE\";\n\nconst getCommunicationSummaryListSuccess = \"GET_COMMUNICATION_SUMMARY_LIST_SUCCESS\";\nconst getCommunicationSummaryListFailure = \"GET_COMMUNICATION_SUMMARY_LIST_FAILURE\";\n\nconst getAdminCommunicationAssignmentsSuccess = \"GET_ADMIN_COMMUNICATION_MAPPINGS_SUCCESS\";\nconst getAdminCommunicationAssignmentsFailure = \"GET_ADMIN_COMMUNICATION_MAPPINGS_FAILURE\";\n\nconst saveCommunicationAssignmentSuccess = \"SAVE_COMMUNICATION_MAPPING_SUCCESS\";\nconst saveCommunicationAssignmentFailure = \"SAVE_COMMUNICATION_MAPPING_FAILURE\";\n\nconst joinCommFileSuccess = \"JOIN_COMM_FILE_SUCCESS\";\nconst joinCommFileFailure = \"JOIN_COMM_FILE_FAILURE\";\n\nconst toggleChamber = \"COMM_TOGGLE_CHAMBER\";\n\nconst initialState = {\n    commList: [],\n    commListError: '',\n    commCreate: '',\n    commCreateError: '',\n    commGet: '',\n    commGetError: '',\n    commSave: '',\n    commSaveError: '',\n    commFileSave: '',\n    commFileSaveError: '',\n    commCategories: [],\n    commCategoriesError: '',\n    commChamber: '',\n    joinCommFile: '',\n    joinCommFileError: '',\n    communicationSummaryList: [],\n    communicationSummaryListError: '',\n    communicationAssignments: [],\n    getCommunicationAssignmentsError: '',\n    adminCommunicationAssignments: [],\n    getAdminCommunicationAssignmentsError: '',\n    communicationAssignmentSave: [],\n    saveCommunicationAssignmentsError: ''\n};\n\nexport const communicationsActionCreators = {\n\n    receiveCommList: (result) => ({\n        type: commListSuccess,\n        commList: result\n    }),\n\n    commListError: (message) => ({\n        type: commListFailure,\n        commList: [],\n        commListError: message\n    }),\n\n    getCommList: (params, partner) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            let request = '';\n            if (partner) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_COMMUNICATIONS_API_URL) + '/LegislationCommunications/api/GetPartnerLegislationCommunicationsListAsync', 'GET', headers, '', params)\n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_COMMUNICATIONS_API_URL) + '/LegislationCommunications/api/GetLegislationCommunicationsListAsync', 'GET', headers, '', params)\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(communicationsActionCreators.commListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(communicationsActionCreators.receiveCommList(result[1].CommunicationsList))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(communicationsActionCreators.receiveCommList([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveCommSummaryList: (result) => ({\n        type: getCommunicationSummaryListSuccess,\n        communicationSummaryList: result\n    }),\n\n    commSummaryListError: (message) => ({\n        type: getCommunicationSummaryListFailure,\n        communicationSummaryList: [],\n        communicationSummaryListError: message\n    }),\n\n    getCommunicationSummaryList: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_COMMUNICATIONS_API_URL) + '/LegislationCommunications/api/GetPartnerLegislationCommunicationSummaryListAsync?', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(communicationsActionCreators.commSummaryListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(communicationsActionCreators.receiveCommSummaryList(result[1].CommunicationSummariesResponse))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(communicationsActionCreators.receiveCommSummaryList([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveCommGet: (result) => ({\n        type: commGetSuccess,\n        commGet: result\n    }),\n\n    commGetError: (message) => ({\n        type: commGetFailure,\n        commGetError: message\n    }),\n\n    getComm: (params, partner) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            let request = '';\n            if (partner) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_COMMUNICATIONS_API_URL) + '/LegislationCommunications/api/GetPartnerLegislationCommunicationsByIDAsync', 'GET', headers, '', params);\n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_COMMUNICATIONS_API_URL) + '/LegislationCommunications/api/GetLegislationCommunicationsByIDAsync', 'GET', headers, '', params);\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(communicationsActionCreators.commGetError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(communicationsActionCreators.receiveCommGet(result[1].CommunicationResponse[0]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(communicationsActionCreators.commGetError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveCommCategories: (result) => ({\n        type: commCategoriesSuccess,\n        commCategories: result\n    }),\n\n    commCategoriesError: (message) => ({\n        type: commCategoriesFailure,\n        commCategoriesError: message\n    }),\n\n    getCommCategories: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_COMMUNICATIONS_API_URL) + '/LegislationCommunications/api/GetCommunicationCategoryReferencesAsync', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(communicationsActionCreators.commCategoriesError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(communicationsActionCreators.receiveCommCategories(result[1].CommunicationCategoryTypesReference));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(communicationsActionCreators.commCategoriesError('No Content'))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveCommunicationAssignments: (responseObj) => ({\n        type: getCommunicationAssignmentsSuccess,\n        communicationAssignments: responseObj.CommunicationAssignments\n    }),\n\n    getCommunicationAssignmentsError: error => ({\n        type: getCommunicationAssignmentsFailure,\n        getCommunicationAssignmentsError: error\n    }),\n\n    getCommunicationAssignments: () => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_COMMUNICATIONS_API_URL) + '/LegislationCommunications/api/GetCommunicationAssignmentsAsync', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(communicationsActionCreators.getCommunicationAssignmentsError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(communicationsActionCreators.receiveCommunicationAssignments(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(communicationsActionCreators.getCommunicationAssignmentsError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveAdminCommunicationAssignments: (responseObj) => ({\n        type: getAdminCommunicationAssignmentsSuccess,\n        adminCommunicationAssignments: responseObj.CommunicationAssignments\n    }),\n\n    getAdminCommunicationAssignmentsError: error => ({\n        type: getAdminCommunicationAssignmentsFailure,\n        getAdminCommunicationAssignmentsError: error\n    }),\n\n    getAdminCommunicationAssignments: () => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_COMMUNICATIONS_API_URL) + '/LegislationCommunications/api/GetAdminCommunicationAssignmentsAsync', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(communicationsActionCreators.getAdminCommunicationAssignmentsError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(communicationsActionCreators.receiveAdminCommunicationAssignments(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(communicationsActionCreators.getAdminCommunicationAssignmentsError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveCommunicationAssignmentSave: (responseObj) => ({\n        type: saveCommunicationAssignmentSuccess,\n        communicationAssignmentSave: responseObj\n    }),\n\n    saveCommunicationAssignmentError: error => ({\n        type: saveCommunicationAssignmentFailure,\n        saveCommunicationAssignmentsError: error\n    }),\n\n    saveCommunicationAssignment: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_COMMUNICATIONS_API_URL) + '/LegislationCommunications/api/SaveCommunicationAssignmentAsync', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(communicationsActionCreators.saveCommunicationAssignmentError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(communicationsActionCreators.receiveCommunicationAssignmentSave(JSON.parse(result[1].Message)))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(communicationsActionCreators.saveCommunicationAssignmentError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveCommSave: (result) => ({\n        type: commSaveSuccess,\n        commSave: result\n    }),\n\n    commSaveError: (message) => ({\n        type: commSaveFailure,\n        commSaveError: message\n    }),\n\n    saveComm: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_COMMUNICATIONS_API_URL) + '/LegislationCommunications/api/SaveLegislationCommunicationAsync', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(communicationsActionCreators.saveCommError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        try {\n                            const saveCommunicationResponse = JSON.parse(result[1].Message);\n                            dispatch(communicationsActionCreators.receiveCommSave(saveCommunicationResponse[0]));\n                        } catch {\n                            // Message does not contain json. \n                            dispatch(communicationsActionCreators.receiveCommSave(result[1].Message));\n                        }\n                        // The save can go fine but the failure message can contain information about the minutes save failing\n                        if (result[1].FailureMessage) {\n                            return result[1].FailureMessage;\n                        }\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(communicationsActionCreators.saveCommError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveCommFileSave: (result) => ({\n        type: commFileSaveSuccess,\n        commFileSave: result\n    }),\n\n    commFileSaveError: (message) => ({\n        type: commFileSaveFailure,\n        commFileSaveError: message\n    }),\n\n    saveCommFile: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_COMMUNICATIONS_FILE_GEN_API_URL) + '/CommunicationFileGeneration/api/ProcessCommunicationFilesAsync', 'POST', headers, '', params, true)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(communicationsActionCreators.commFileSaveError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(communicationsActionCreators.receiveCommFileSave(result[1]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(communicationsActionCreators.commFileSaveError('No Content'));\n                        return Promise.reject('No Content')\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveJoinCommFile: (result) => ({\n        type: joinCommFileSuccess,\n        joinCommFile: result\n    }),\n\n    joinCommFileError: (message) => ({\n        type: joinCommFileFailure,\n        joinCommFileError: message\n    }),\n\n    joinCommFile: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_FILE_GEN_API_URL) + '/LegislationFileGeneration/api/JoinLegislationCommunicationsAsync', 'POST', headers, body, '', true)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(communicationsActionCreators.joinCommFileError(result[1]));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(communicationsActionCreators.receiveJoinCommFile(result[1]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(communicationsActionCreators.joinCommFileError('No Content'));\n                        return Promise.reject('No Content');\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveCommCreate: (result) => ({\n        type: commCreateSuccess,\n        commCreate: result\n    }),\n\n    commCreateError: (message) => ({\n        type: commCreateFailure,\n        commCreateError: message\n    }),\n\n    createComm: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_COMMUNICATIONS_API_URL) + '/LegislationCommunications/api/CreateLegislationCommunicationAsync', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(communicationsActionCreators.commCreateError(result[1]));\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        const createCommunicationResponse = JSON.parse(result[1].Message);\n                        dispatch(communicationsActionCreators.receiveCommCreate(createCommunicationResponse[0]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(communicationsActionCreators.commCreateError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    toggleChamber: (value) => ({\n        type: toggleChamber,\n        commChamber: value\n    })\n}\n\nexport const reducer = (state, action) => {\n\n    state = state || initialState;\n\n    switch (action.type) {\n        case commListSuccess:\n            return Object.assign({}, state, {\n                commList: action.commList,\n                commListError: ''\n            })\n        case commListFailure:\n            return Object.assign({}, state, {\n                commListError: action.commListError\n            })\n        case getCommunicationSummaryListSuccess:\n            return Object.assign({}, state, {\n                communicationSummaryList: action.communicationSummaryList,\n                communicationSummaryListError: ''\n            })\n        case getCommunicationSummaryListFailure:\n            return Object.assign({}, state, {\n                communicationSummaryListError: action.communicationSummaryListError\n            })\n        case commGetSuccess:\n            return Object.assign({}, state, {\n                commGet: action.commGet,\n                commGetError: ''\n            })\n        case commGetFailure:\n            return Object.assign({}, state, {\n                commGetError: action.commGetError\n            })\n        case commCategoriesSuccess:\n            return Object.assign({}, state, {\n                commCategories: action.commCategories,\n                commCategoriesError: ''\n            })\n        case commCategoriesFailure:\n            return Object.assign({}, state, {\n                commCategoriesError: action.commCategoriesError\n            })\n        case getCommunicationAssignmentsFailure:\n            return Object.assign({}, state, {\n                getCommunicationAssignmentsError: action.getCommunicationAssignmentsError\n            });\n        case getCommunicationAssignmentsSuccess:\n            return Object.assign({}, state, {\n                communicationAssignments: action.communicationAssignments,\n                getCommunicationAssignmentsError: ''\n            });\n        case getAdminCommunicationAssignmentsFailure:\n            return Object.assign({}, state, {\n                getAdminCommunicationAssignmentsError: action.getAdminCommunicationAssignmentsError\n            });\n        case getAdminCommunicationAssignmentsSuccess:\n            return Object.assign({}, state, {\n                adminCommunicationAssignments: action.adminCommunicationAssignments,\n                getAdminCommunicationAssignmentsError: ''\n            });\n        case saveCommunicationAssignmentFailure:\n            return Object.assign({}, state, {\n                saveCommunicationAssignmentsError: action.saveCommunicationAssignmentsError\n            });\n        case saveCommunicationAssignmentSuccess:\n            return Object.assign({}, state, {\n                communicationAssignmentSave: action.communicationAssignmentSave,\n                saveCommunicationAssignmentsError: ''\n            });\n        case commSaveSuccess:\n            return Object.assign({}, state, {\n                commSave: action.commSave,\n                commSaveError: ''\n            })\n        case commSaveFailure:\n            return Object.assign({}, state, {\n                commSaveError: action.commSaveError\n            })\n        case commFileSaveSuccess:\n            return Object.assign({}, state, {\n                commFileSave: action.commFileSave,\n                commFileSaveError: ''\n            })\n        case commFileSaveFailure:\n            return Object.assign({}, state, {\n                commFileSaveError: action.commFileSaveError\n            })\n        case joinCommFileSuccess:\n            return Object.assign({}, state, {\n                joinCommFile: action.joinCommFile,\n                joinCommFileError: ''\n            })\n        case joinCommFileFailure:\n            return Object.assign({}, state, {\n                joinCommFileError: action.joinCommFileError\n            })\n        case commCreateSuccess:\n            return Object.assign({}, state, {\n                commCreate: action.commCreate,\n                commCreateError: ''\n            })\n        case commCreateFailure:\n            return Object.assign({}, state, {\n                commCreateError: action.commCreateError\n            })\n        case toggleChamber:\n            return Object.assign({}, state, {\n                commChamber: action.commChamber\n            })\n        default:\n            return state\n    }\n};","import React from \"react\";\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';\nimport { minutesActionCreators } from '../../../stores/lis-minutes-store';\nimport { calendarActionCreators } from '../../../stores/lis-calendar-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport * as signalR from \"@microsoft/signalr\";\nimport moment from 'moment-timezone'\nimport LoaderComponent from '../../../lis-shared/lis-layout/components/lis-loader-component';\nimport Misc from './forms/misc';\nimport NonLegislativeForm from './forms/non-legislative-form';\nimport LegislativeForm from './forms/legislative-form';\nimport MinutesDetails from '../../../lis-shared/lis-minutes/lis-minutes-details';\nimport { memberActionCreators } from \"../../../stores/lis-members-store\";\nimport Select from 'react-select';\nimport ReactTable from 'react-table';\nimport DatePicker from 'react-datepicker';\nimport { billActionCreators } from \"../../../stores/lis-legislation-store\";\nimport { committeeActionCreators } from \"../../../stores/lis-committee-store\";\nimport { sessionActionCreators } from \"../../../stores/lis-session-store\";\nimport { communicationsActionCreators } from \"../../../stores/lis-communications-store\";\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\n\nclass MinutesManagementForm extends React.Component {\n\n    constructor(props) {\n        super(props)\n        this.state = {\n            buildingCategoryConnection: true,\n            buildingEntryConnection: true,\n            activity: '',\n            minutesBook: {},\n            currentActivitySequence: 0,\n            isPendingChange: false,\n            lastSavedTime: '',\n            lastPublishedTime: '',\n            entryHubConnection: null,\n            categoryHubConnection: null,\n            isLoaded: false,\n            disableChanges: false,\n            //Fieldsets\n            indexFieldsetIsActive: true,\n            activityFieldsetIsActive: false,\n            previewFieldsetIsActive: false,\n            memberList: [],\n            committeeList: [],\n            communicationList: [],\n            actionTypes: [],\n            calendarCategories: [],\n            categoriesToMove: [],\n            selectedCategoryToMoveTo: -1,\n            sessionBills: [],\n            publishing: false,\n            committeeMinutesBooks: [],\n            chairReportCategoriesSetForRegeneration: [],\n            regeneratingCategories: [],\n            fetchedMinutesBookIDs: [],\n            categoryFormDisabled: {}\n        }\n\n        //Ref used to scroll down to activity section\n        this.activityRef = React.createRef();\n        this.entryFormRef = React.createRef();\n\n        this.getCategoryDescriptionText = this.getCategoryDescriptionText.bind(this);\n        this.entryChange = this.entryChange.bind(this);\n        this.multipleEntryChange = this.multipleEntryChange.bind(this);\n        this.toggleMoveEntry = this.toggleMoveEntry.bind(this);\n        this.moveEntry = this.moveEntry.bind(this);\n        this.bulkMoveEntry = this.bulkMoveEntry.bind(this);\n        this.handleSequenceChange = this.handleSequenceChange.bind(this);\n        this.saveCategory = this.saveCategory.bind(this);\n        this.saveEntry = this.saveEntry.bind(this);\n        this.publishAllEntries = this.publishAllEntries.bind(this);\n        this.saveMinutesBook = this.saveMinutesBook.bind(this);\n        this.showPreview = this.showPreview.bind(this);\n        this.showActivity = this.showActivity.bind(this);\n        this.createCategory = this.createCategory.bind(this);\n        this.duplicateChairmansCategory = this.duplicateChairmansCategory.bind(this);\n        this.receiveEntryByWebsocket = this.receiveEntryByWebsocket.bind(this);\n        this.receiveCategoryByWebsocket = this.receiveCategoryByWebsocket.bind(this);\n        this.toggleFetchChairs = this.toggleFetchChairs.bind(this);\n        this.handleChairsReportDateChange = this.handleChairsReportDateChange.bind(this);\n        this.fetchChairsReports = this.fetchChairsReports.bind(this);\n        this.toggleChairsReport = this.toggleChairsReport.bind(this);\n        this.regenerateChairsReportCategory = this.regenerateChairsReportCategory.bind(this);\n        this.toggleEditCategoryText = this.toggleEditCategoryText.bind(this);\n        this.setTempCategoryText = this.setTempCategoryText.bind(this);\n        this.toggleMinutesStatus = this.toggleMinutesStatus.bind(this);\n        this.getMinutes = this.getMinutes.bind(this);\n    }\n\n    toggleFieldsetCollapse(isActive) {\n        this.setState(state => ({\n            [isActive]: !state[isActive]\n        }));\n    }\n\n    //Some categories get the type pre-pended to the description while other do not\n    getCategoryDescriptionText(item) {\n        if (!item) return;\n\n        if (item.CategoryType === 'Motion') {\n            return item.CategoryDescription + \" to \" + item.MinutesEntries[0].value + \" by \" + item.MinutesEntries[1].value.label + item.MinutesEntries[2].value;\n        } else if (item.CategoryText) {\n            if (item.CategoryText.startsWith('%')) {\n                item.CategoryText = item.CategoryText.substr(1);\n            }\n            return item.CategoryText.replaceAll(/%+/g, \" - \")\n        } else {\n            return (item.DisplayType ? item.CategoryType + ' - ' : '') + item.CategoryDescription;\n        }\n    }\n\n    toggleEditCategoryText(save) {\n        this.setState({ editingCategoryText: !this.state.editingCategoryText }, () => {\n            if (save) {\n                let minutesBook = { ...this.state.minutesBook };\n                minutesBook.MinutesCategories[this.state.currentActivitySequence - 1].CategoryText = this.state.tempCategoryText.replaceAll(\" - \", \"%\");\n                this.saveCategory(minutesBook.MinutesCategories[this.state.currentActivitySequence - 1]);\n            } else if (this.state.editingCategoryText) {\n                this.setState({ tempCategoryText: this.getCategoryDescriptionText(this.state.minutesBook.MinutesCategories[this.state.currentActivitySequence - 1]) })\n            }\n        })\n    }\n\n    setTempCategoryText(val) {\n        this.setState({ tempCategoryText: val })\n    }\n\n    entryChange(index, entry, sequence) {\n        //Takes the sequence, which is always one more than the index, and change the values for that MinutesEntry\n        let newFormData = JSON.parse(JSON.stringify(this.state.minutesBook));\n        newFormData.MinutesCategories[sequence - 1].MinutesEntries[index] = entry;\n        this.setState({\n            minutesBook: newFormData,\n            isPendingChange: true\n        });\n    }\n\n    multipleEntryChange(entries, sequence) {\n        let newFormData = JSON.parse(JSON.stringify(this.state.minutesBook));\n        newFormData.MinutesCategories[sequence - 1].MinutesEntries = entries;\n        this.setState({\n            minutesBook: newFormData,\n            isPendingChange: true\n        });\n    }\n\n    toggleMoveEntry(open, categoryIndex, entryIndex) {\n        if (open) {\n            const currentCategory = this.state.minutesBook.MinutesCategories[categoryIndex];\n            const applicableCategories = this.state.minutesBook.MinutesCategories.filter(cat => cat.CategoryType === currentCategory.CategoryType && cat.MinutesCategoryID !== currentCategory.MinutesCategoryID);\n            this.setState({\n                movingCategorySource: categoryIndex,\n                movingEntrySource: entryIndex,\n                categoriesToMove: applicableCategories,\n                showMoveEntryDialog: open\n            });\n        } else {\n            this.setState({\n                showMoveEntryDialog: false,\n                categoriesToMove: [],\n                selectedCategoryToMoveTo: -1,\n                movingCategorySource: -1,\n                movingEntrySource: -1,\n            });\n        }\n    }\n\n    moveEntry(destinationCategoryIndex) {\n        let sourceCategory = { ...this.state.minutesBook.MinutesCategories[this.state.movingCategorySource] }\n        let sourceEntry = { ...sourceCategory.MinutesEntries[this.state.movingEntrySource] };\n        let destinationCategory = this.state.minutesBook.MinutesCategories.find(cat => cat.MinutesCategoryID === this.state.categoriesToMove[destinationCategoryIndex].MinutesCategoryID);\n        if (destinationCategory) {\n            let newEntry = {\n                ...sourceEntry,\n                MinutesCategoryID: destinationCategory.MinutesCategoryID,\n                Sequence: destinationCategory.MinutesEntries?.length ? Math.max(...destinationCategory.MinutesEntries.map(e => e.Sequence || 0)) + 1 : 1\n            };\n            this.saveEntry(newEntry);\n            this.showActivity(destinationCategory);\n            this.toggleMoveEntry(false);\n\n            //Remove the old entry from the state variable\n            let minutesBook = { ...this.state.minutesBook };\n            minutesBook.MinutesCategories[this.state.movingCategorySource].MinutesEntries.splice(this.state.movingEntrySource, 1);\n            this.setState({\n                minutesBook: minutesBook\n            });\n        }\n    }\n\n    bulkMoveEntry(entries, sourceCategoryIdx, destinationCategoryID) {\n        const destinationCategory = this.state.minutesBook.MinutesCategories.find(mc => mc.MinutesCategoryID === destinationCategoryID)\n        if (destinationCategory) {\n            let minutesBook = { ...this.state.minutesBook };\n            entries.forEach((entry, idx) => {\n                entry.MinutesCategoryID = destinationCategoryID;\n                entry.Sequence = destinationCategory.MinutesEntries && destinationCategory.MinutesEntries.length > 0 ? destinationCategory.MinutesEntries[destinationCategory.MinutesEntries.length - 1].Sequence + idx + 1 : 1;\n                //Remove the old entries from the state variable\n                const sourceEntryIdx = minutesBook.MinutesCategories[sourceCategoryIdx].MinutesEntries.findIndex(me => me.MinutesEntryID === entry.MinutesEntryID);\n                minutesBook.MinutesCategories[sourceCategoryIdx].MinutesEntries.splice(sourceEntryIdx, 1);\n            });\n            this.saveEntry(entries);\n\n            this.setState({\n                minutesBook: minutesBook\n            });\n        }\n    }\n\n    saveEntry(entry, callback) {\n        //Find any MinutesActivities' MinutesActions where there is no reference info and discard\n        let theEntry = {... entry};\n\n        for (let i = 0; i < theEntry.MinutesActivities.length; i++) {\n            theEntry.MinutesActivities[i].Description = theEntry.MinutesActivities[i].Description.replace(\"undefined\", \"\");\n            if(theEntry.MinutesActivities[i].ActivityReferences) {\n                for (let j = 0; j < theEntry.MinutesActivities[i].ActivityReferences.length; j++) {\n                    if (!theEntry.MinutesActivities[i].ActivityReferences[j].ActionReferenceTypeID) {\n                        theEntry.MinutesActivities[i].ActivityReferences.splice(j, 1);\n                    }\n                }\n            }\n        }\n\n        //Request model has to look like this\n        const entryObject = { MinutesEntrySave: Array.isArray(theEntry) ? theEntry : [theEntry] };\n        //Save by Websocket. Sends the jwt for auth purposes\n        const self = this;\n        this.state.entryHubConnection.invoke(\"SaveEntry\", entryObject, localStorage.getItem('LIS_ID_TOKEN'))\n            .then(() => {\n                if (callback) { callback(); }\n            }).catch(function (err) {\n                console.error(err.toString());\n                if (err.toString().toLowerCase().includes(\"connection closed\")) {\n                    self.props.actions.makeToast([{ message: \"Entry Connection Disconnected\", type: \"failure\" }])\n                }\n            });\n    }\n\n    publishAllEntries() {\n        this.setState({ publishing: true }, () => {\n            //make sure the minutes book itself is public\n            let promise = Promise.resolve();\n            if (!this.state.minutesBook.IsPublic) {\n                promise = this.saveMinutesBook(true);\n            }\n            let activitesForClerksCopy = [];\n\n            promise.then(() => {\n                if (!this.state.minutesBook.MinutesCategories || !this.state.minutesBook.MinutesCategories.length) {\n                    this.setState({ publishing: false })\n                } else {\n                    let promises = []\n\n                    this.state.minutesBook.MinutesCategories.forEach((category, categoryIdx) => {\n                        if (category.ReleaseToPreview) {\n                            this.setState({ publishing: true }, () => {\n                                category.MinutesEntries.forEach((entry, entryIdx) => {\n                                    let newEntry = JSON.parse(JSON.stringify(entry));\n                                    let publishEntry = false;\n\n                                    if (!newEntry.IsPublic) {\n                                        publishEntry = true;\n                                    }\n\n                                    newEntry.IsPublic = true;\n                                    newEntry.IsReleased = true;\n\n                                    if (newEntry.MinutesActivities) {\n                                        newEntry.MinutesActivities.forEach(activity => {\n                                            if (!activity.IsPublic && this.props.bills.billEventRef && this.props.bills.billEventRef.find(x => x.EventCode === activity.EventCode) && this.props.bills.billEventRef.find(x => x.EventCode === activity.EventCode).IsPassage === true) {\n                                                activitesForClerksCopy.push(activity.MinutesActivityID)\n                                            }\n\n                                            if (!activity.IsPublic) {\n                                                publishEntry = true;\n                                                activity.IsPublic = true;\n                                            }\n                                        });\n                                    }\n\n                                    if (publishEntry) {\n                                        promises.push(\n                                            this.saveEntry(newEntry, () => {\n                                                if (entryIdx === category.MinutesEntries.length - 1) {\n                                                    this.setState({ publishing: false })\n                                                }\n                                            })\n                                        )\n                                    }\n                                });\n                            })\n                        } else if (categoryIdx === this.state.minutesBook.MinutesCategories.length - 1) {\n                            this.setState({ publishing: false })\n                        }\n                    })\n\n                    Promise.all(promises).then(() => {\n                        if (activitesForClerksCopy.length > 0) {\n                            this.props.actions.genClerksCopy(activitesForClerksCopy);\n                        }\n                    })\n\n                    this.setState({ publishing: false })\n                }\n                // If a user is editing an activity then clicks publish the save will update the mod dates\n                // Meaning that once the user tries to save their activity it will fail because the mod dates are not correct\n                // So get rid of all edits\n                if (this.entryFormRef.current) {\n                    this.entryFormRef.current.closeNewEntries();\n                }\n                this.setState({\n                    lastPublishedTime: moment()\n                });\n            }).catch(() => {\n                this.setState({ publishing: false })\n            })\n        })\n    }\n\n    handleSequenceChange(categories) {\n        //The sequence change has been handled by the MinutesIndex class. So the new list of Minute Categories is sent here to modify the minutesBook\n        let minutesBook = this.state.minutesBook;\n        //Check and see if the currently opened activity has been affected by the sequence change. If so, then update the current activity state item \n        let newCategoryIndex = this.state.currentActivitySequence - 1;\n        if (categories[this.state.currentActivitySequence - 1] !== this.state.minutesBook.MinutesCategories[this.state.currentActivitySequence - 1]) {\n            newCategoryIndex = categories.findIndex(category => category === this.state.minutesBook.MinutesCategories[this.state.currentActivitySequence - 1])\n        }\n        minutesBook.MinutesCategories = categories;\n        //currentActivitySequence is 0 by default so we don't want to set currentActivitySequence to an undefined value. \n        //So make a check to see if the user has clicked on a category item yet. If not then leave it at zero\n        this.setState({\n            minutesBook: minutesBook,\n            currentActivitySequence: categories[newCategoryIndex] ? categories[newCategoryIndex].Sequence : 0\n        }, async function () {\n            await this.saveMinutesBook()\n        });\n    }\n\n    showPreview(index) {\n        let minutesBook = JSON.parse(JSON.stringify(this.state.minutesBook));\n        let category = minutesBook.MinutesCategories[index];\n        //flips the 'show' key. this will be used in the Preview class to dictate whether a section will be shown or not\n        const show = !category.ReleaseToPreview;\n        category.ReleaseToPreview = show;\n        this.setState({\n            minutesBook: minutesBook\n        }, () => {\n            this.saveCategory(category);\n        });\n    }\n\n    showActivity(category, e) {\n        //Check to see if the checkbox was clicked so the activity doesn't open on checkbox click\n        if (!e || e.target.type !== \"checkbox\") {\n            let minutesBook = JSON.parse(JSON.stringify(this.state.minutesBook));\n            category.ReleaseToPreview = true;\n            //Open the activity drawer\n            this.setState({\n                activityFieldsetIsActive: true,\n                currentActivitySequence: category.Sequence,\n                activity: category.CategoryType,\n                minutesBook: minutesBook,\n                editingCategoryText: false\n            }, () => {\n                //Get the size and position of the activity form and scroll down to it\n                const activityRect = this.activityRef.current.getBoundingClientRect();\n                const windowY = window.scrollY;\n                window.scrollTo({\n                    top: activityRect.top + windowY,\n                    behavior: 'smooth'\n                });\n\n                this.saveCategory(category);\n            });\n        }\n    }\n\n    saveCategory(category) {\n        let categoryFormDisabled = { ...this.state.categoryFormDisabled };\n        categoryFormDisabled[category.Sequence] = true;\n        this.setState({ categoryFormDisabled }, () => {\n            const self = this;\n            this.state.categoryHubConnection.invoke(\"SaveCategory\", category, localStorage.getItem('LIS_ID_TOKEN'))\n                .catch(function (err) {\n                    console.error(err.toString());\n                    categoryFormDisabled[category.Sequence] = false;\n                    self.setState({\n                        categoryFormDisabled\n                    })\n                    if (err.toString().toLowerCase().includes(\"connection closed\")) {\n                        self.props.actions.makeToast([{ message: \"Category Connection Disconnected\", type: \"failure\" }])\n                    }\n                });\n        })\n    }\n\n    async saveMinutesBook(publish) {\n        //Save the new sequence\n        let minutesBook = JSON.parse(JSON.stringify(this.state.minutesBook));\n        if (publish) { minutesBook.IsPublic = true; }\n        //Remove the minute entries so the request doesn't take as long\n        minutesBook.MinutesCategories.forEach(category => delete category.MinutesEntries);\n        delete minutesBook.MinutesFiles;\n        //Disable changes so the user doesn't try to save something else while this is being saved\n        this.setState({ disableChanges: true })\n        await this.props.actions.saveMinutesBook(minutesBook)\n            .then(() => {\n                let minutesBook = { ...this.state.minutesBook };\n                const newMinutesBook = this.props.minutes.minutesBookSave;\n                minutesBook.ModificationDate = newMinutesBook.ModificationDate;\n                minutesBook.MinutesCategories.forEach((category, index) => {\n                    category.ModificationDate = newMinutesBook.MinutesCategories[index].ModificationDate;\n                });\n                this.setState({\n                    minutesBook: minutesBook,\n                    disableChanges: false\n                })\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err);\n                this.props.actions.makeToast([{ message: 'Save Failed', type: \"failure\" }])\n            });\n    }\n\n    async createCategory(newCategory, callback) {\n        this.setState({\n            creatingCategory: true\n        });\n        //Save a blank entry to the category if there isn't one already\n        newCategory.MinutesEntries = newCategory.MinutesEntries && newCategory.MinutesEntries.length ? newCategory.MinutesEntries : [{\n            EntryText: '',\n            Sequence: 1\n        }];\n        //Add motion button clicked, create a blank motion onto the list of categories\n        newCategory.MinutesBookID = parseInt(this.props.match.params.minutesbookid, 10);\n        await this.props.actions.createCategory(newCategory)\n            .then(() => {\n                let categoryCreate = this.props.minutes.categoryCreate;\n                if (!categoryCreate) {\n                    throw 'Category Creation Failed';\n                }\n                if (callback) {\n                    callback(categoryCreate.MinutesCategoryID)\n                }\n                // Once the category is saved then scroll down to it\n                // The new category is added to the book by the websocket connection so we do not have to add it here\n                this.setState({\n                    activity: categoryCreate.CategoryType,\n                    activityFieldsetIsActive: true,\n                    currentActivitySequence: categoryCreate.Sequence,\n                    creatingCategory: false\n                }, () => {\n                    //Get the size and position of the activity form and scroll down to it\n                    const activityRect = this.activityRef.current.getBoundingClientRect();\n                    const windowY = window.scrollY;\n                    window.scrollTo({\n                        top: activityRect.top + windowY,\n                        behavior: 'smooth'\n                    });\n                });\n            })\n            .catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    creatingCategory: false,\n                    fetchingChairsReports: false\n                });\n                console.log(err)\n                this.props.actions.makeToast([{ message: 'Failed to Create', type: \"failure\" }])\n            });\n    }\n\n    async duplicateChairmansCategory(calendarCategoryTypeID) {\n        let minutesBook = { ...this.state.minutesBook };\n        let categoryToDuplicate = JSON.parse(JSON.stringify(minutesBook.MinutesCategories.find(mc => mc.CalendarCategoryTypeID === calendarCategoryTypeID)));\n        //set sequence\n        categoryToDuplicate.Sequence = minutesBook.MinutesCategories.length + 1;\n        //delete mod dates, IDs, etc\n        delete categoryToDuplicate.MinutesCategoryID;\n        delete categoryToDuplicate.ModificationDate;\n        categoryToDuplicate.MinutesEntries.forEach(entry => {\n            delete entry.MinutesEntryID;\n            delete entry.MinutesCategoryID;\n            delete entry.ModificationDate;\n            entry.MinutesSummaries.forEach(summary => {\n                delete summary.MinutesSummaryID;\n                delete summary.MinutesEntryID;\n                delete summary.ModificationDate;\n            })\n            entry.MinutesActivities.forEach(act => {\n                delete act.MinutesSummaryID;\n                delete act.MinutesEntryID;\n                delete act.ModificationDate;\n            })\n        })\n\n        await this.createCategory(categoryToDuplicate);\n    }\n\n    receiveEntryByWebsocket(result) {\n        let minutesBook = JSON.parse(JSON.stringify(this.state.minutesBook));\n        result.forEach(entryFromResult => {\n            let categoryIndex = -1;\n            let entryIndex = -1;\n            categoryIndex = minutesBook.MinutesCategories.findIndex(category => category.MinutesCategoryID === entryFromResult.MinutesCategoryID);\n            //If an object is not found in the array then don't continue. The entry is probably in another book.\n            if (categoryIndex !== -1) {\n                entryIndex = minutesBook.MinutesCategories[categoryIndex].MinutesEntries.findIndex(entry => entry.MinutesEntryID === entryFromResult.MinutesEntryID);\n                entryFromResult.MinutesActivities = entryFromResult.MinutesActivities || [];\n                if (entryIndex !== -1) {\n                    minutesBook.MinutesCategories[categoryIndex].MinutesEntries[entryIndex].MinutesActivities = minutesBook.MinutesCategories[categoryIndex].MinutesEntries[entryIndex].MinutesActivities || [];\n                    entryFromResult.MinutesActivities.forEach(act => {\n                        if (!act.Sequence && !minutesBook.MinutesCategories[categoryIndex].MinutesEntries[entryIndex].MinutesActivities.find(ma => ma.MinutesActivityID === act.MinutesActivityID)) {\n                            act.Sequence = minutesBook.MinutesCategories[categoryIndex].MinutesEntries[entryIndex].MinutesActivities.length ? Math.max(...minutesBook.MinutesCategories[categoryIndex].MinutesEntries[entryIndex].MinutesActivities.filter(ma => ma.MinutesActivityID).map(e => e.Sequence || 0)) + 1 : 1;\n                        }\n                    })\n                    minutesBook.MinutesCategories[categoryIndex].MinutesEntries[entryIndex] = entryFromResult;\n                    minutesBook.MinutesCategories[categoryIndex].MinutesEntries[entryIndex].MinutesActivities.sort((a, b) => a.Sequence - b.Sequence);\n                } else {\n                    let minuteEntries = minutesBook.MinutesCategories[categoryIndex].MinutesEntries || [];\n                    entryFromResult.Sequence = entryFromResult.Sequence || (minuteEntries.length ? Math.max(...minuteEntries.map(e => e.Sequence || 0)) + 1 : 1);\n                    minuteEntries.push(entryFromResult);\n                    minuteEntries.sort((a, b) => a.Sequence - b.Sequence);\n                }\n            }\n        })\n        this.setState({\n            minutesBook: minutesBook\n        });\n    }\n\n    receiveCategoryByWebsocket(result) {\n        //Sometimes we'll receive a category that hasn't been updated that has the wrong sequence values    \n        //Also sometimes we'll get null responses\n        if (result[0].MinutesEntries) {\n            result[0].MinutesEntries.sort((a, b) => a.Sequence - b.Sequence);\n        }\n\n        let categoryFormDisabled = { ...this.state.categoryFormDisabled };\n        let minutesBook = JSON.parse(JSON.stringify(this.state.minutesBook));\n        result.forEach(categoryFromResult => {\n            // If these are not equal then the message is for another book\n            if (categoryFromResult.MinutesBookID === minutesBook.MinutesBookID) {\n                let categoryIndex = -1;\n                //Sometimes these arrays can be undefined if they have no data. Make sure that they are arrays so they don't cause problems down the line.\n                categoryFromResult.MinutesEntries = categoryFromResult.MinutesEntries || [];\n                categoryFromResult.MinutesEntries.forEach(entry => entry.MinutesActivities = entry.MinutesActivities || []);\n\n                categoryIndex = minutesBook.MinutesCategories.findIndex(category => category.MinutesCategoryID === categoryFromResult.MinutesCategoryID);\n                if (categoryIndex !== -1) {\n                    categoryFormDisabled[minutesBook.MinutesCategories[categoryIndex].Sequence] = false;\n                    minutesBook.MinutesCategories[categoryIndex] = categoryFromResult;\n                } else {\n                    minutesBook.MinutesCategories.push(categoryFromResult);\n                    minutesBook.MinutesCategories.sort((a, b) => a.Sequence - b.Sequence);\n                }\n            }\n        })\n        this.setState({\n            minutesBook: minutesBook,\n            categoryFormDisabled\n        });\n    }\n\n    componentDidMount() {\n        this.getMinutes();\n\n        this.props.actions.getCalendarCategoriesReferences('?Chambercode=S', true)\n            .then(() => {\n                this.setState({\n                    calendarCategories: this.props.calendar.calendarCategoriesReferences\n                });\n            });\n\n        const getConnectionId = (conn, connectionName) => {\n            //This connection ID might be used later\n            conn.invoke('getConnectionId')\n                .then(connectionId => {\n                    console.log(`${connectionName}: ${connectionId}`);\n                    this.setState({\n                        [connectionName]: connectionId\n                    });\n                });\n        }\n        //When a WebSocket message comes across with this label then the minutesbook object needs to be updated with new values\n        const handleMessage = (message, functionToRun) => {\n            try {\n                //the Value key holds error info when a save has failed\n                if (message.StatusCode > 399) throw 'Server Error: ' + JSON.stringify(message);\n                //Some reason the Value key doesn't parse. So I do it again here\n                let result;\n                if (message.Value)\n                    result = JSON.parse(message.Value);\n                else\n                    result = message;\n                functionToRun(result)\n                this.setState({\n                    lastSaveErr: '',\n                    lastSavedTime: moment(),\n                    isPendingChange: false\n                });\n            } catch (err) {\n                console.log(err);\n                this.setState({\n                    lastSaveErr: err.toString(),\n                    isPendingChange: false\n                });\n            }\n        };\n\n        //A second function is used because the JSON will look different depending on whether the data was\n        //originally saved by Websocket or by HTTP\n        const handleMessageOriginatedFromWebsocket = (message, functionToRun) => {\n            try {\n                //the Value key holds error info when a save has failed\n                if (!message.Success) throw 'Server Error: ' + JSON.stringify(message);\n                //Some reason the Value key doesn't parse. So I do it again here\n                let result;\n                if (message.Message)\n                    result = JSON.parse(message.Message);\n                else\n                    result = message;\n                functionToRun(result)\n                this.setState({\n                    lastSaveErr: '',\n                    lastSavedTime: moment(),\n                    isPendingChange: false\n                });\n            } catch (err) {\n                console.log(err);\n                this.setState({\n                    lastSaveErr: 'Error: save failed',\n                    isPendingChange: false\n                });\n            }\n\n        };\n\n        let entryConnection = new signalR.HubConnectionBuilder()\n            .withUrl((API_URL || process.env.REACT_APP_MINUTES_ENTRY_API_URL) + '/MinuteEntries/entries')\n            .withAutomaticReconnect([0, 0, 10000])\n            .build();\n        //Will change to a more reasonable timeout later\n        entryConnection.serverTimeoutInMilliseconds = 5000000000;\n        this.setState({\n            entryHubConnection: entryConnection\n        }, () => {\n            this.startConn(this.state.entryHubConnection, \"Entry\", () => getConnectionId(this.state.entryHubConnection, 'entryConnectionId'));\n            this.state.entryHubConnection.on(\"ReceiveMinuteEntry\", message => handleMessage(message, this.receiveEntryByWebsocket));\n            this.state.entryHubConnection.on(\"ReceiveEntry\", message => handleMessage(message, this.receiveEntryByWebsocket));\n            this.state.entryHubConnection.on(\"Receive\", message => handleMessageOriginatedFromWebsocket(message, this.receiveEntryByWebsocket));\n        });\n\n        let categoryConnection = new signalR.HubConnectionBuilder()\n            .withUrl((API_URL || process.env.REACT_APP_MINUTES_API_URL) + '/MinutesBook/categories')\n            .withAutomaticReconnect([0, 0, 10000])\n            .build();\n        //Will change to a more reasonable timeout later\n        categoryConnection.serverTimeoutInMilliseconds = 5000000000;\n        this.setState({\n            categoryHubConnection: categoryConnection\n        }, () => {\n            this.startConn(this.state.categoryHubConnection, \"Category\", () => getConnectionId(this.state.categoryHubConnection, 'categoryConnectionId'));\n            this.state.categoryHubConnection.on(\"ReceiveCategory\", message => handleMessage(message, this.receiveCategoryByWebsocket));\n            this.state.categoryHubConnection.on(\"Receive\", message => handleMessageOriginatedFromWebsocket(message, this.receiveCategoryByWebsocket))\n        });\n\n        // These are the different form inputs that the user can pick from when picking a motion\n        this.props.actions.getActionTypes()\n            .then(() => {\n                let actionTypes = [...this.props.minutes.actionTypes];\n                actionTypes.forEach(type => {\n                    type.label = type.ActionReferenceType;\n                    type.value = type.ActionReferenceTypeID;\n                })\n                this.setState({\n                    actionTypes: actionTypes\n                });\n            });\n    }\n\n    getMinutes() {\n        this.props.actions.getMinutesBook('?minutesbookID=' + this.props.match.params.minutesbookid, true)\n            .then(() => {\n                let minutesBook = this.props.minutes.minutesBook;\n                if (minutesBook.MinutesCategories) {\n                    //Check if the Sequence for each category is linear\n                    const sequences = minutesBook.MinutesCategories.map(mc => mc.Sequence);\n                    if (minutesBook.MinutesCategories.length > 0 && (minutesBook.MinutesCategories[0].Sequence !== 1 || !sequences.every((seq, i) => i === sequences.length - 1 || seq + 1 === sequences[i + 1]))) {\n                        //Get the sequence right. Sometimes the result back from the server has a lot of skipped indices\n                        minutesBook.MinutesCategories.forEach((category, index) => {\n                            category.Sequence = index + 1;\n                        });\n                        this.setState({\n                            minutesBook: minutesBook,\n                            isLoaded: true,\n                            previewFieldsetIsActive: true\n                        }, //Save the new sequence so we don't have to do this process again for this minutesbook\n                            async () => { await this.saveMinutesBook(); });\n                    } else { //It is in order so display the book\n                        this.setState({\n                            minutesBook: minutesBook,\n                            isLoaded: true,\n                            previewFieldsetIsActive: true\n                        });\n                    }\n                    // set fetchedMinutesBookIDs for the chairs report logic (see the fetchChairsReports method)\n                    let fetchedMinutesBookIDs = [];\n                    minutesBook.MinutesCategories.forEach(category => {\n                        if (category.CategoryType === \"Chairmans Report\" && category.MinutesEntries) {\n                            category.MinutesEntries.forEach(entry => {\n                                if (entry.MinutesSummaries) {\n                                    fetchedMinutesBookIDs = fetchedMinutesBookIDs.concat(entry.MinutesSummaries.filter(ms => ms.ReferenceID).flatMap(ms => ms.ReferenceID));\n                                }\n                            })\n                        }\n                    })\n                    fetchedMinutesBookIDs = [...new Set(fetchedMinutesBookIDs)];\n                    this.setState({ fetchedMinutesBookIDs });\n                } else {\n                    this.setState({\n                        minutesBook: '',\n                        isLoaded: true,\n                        previewFieldsetIsActive: false\n                    });\n                    this.props.actions.makeToast([{ message: \"Loading Failed\", type: \"failure\" }])\n                }\n                // This is used to add members to the motion forms\n                this.props.actions.getMemberList('sessionID=' + minutesBook.SessionID + '&chamberCode=S').then(() => {\n                    let memberList = [...this.props.members.memberList];\n                    memberList.forEach(member => {\n                        member.label = member.PatronDisplayName;\n                        member.value = member.MemberID;\n                    });\n                    this.setState({\n                        memberList: memberList\n                    });\n                });\n                // Have to get the session info in order to get the effective date for the committee list\n                this.props.actions.getSessionById(minutesBook.SessionID)\n                    .then(() => {\n                        this.props.actions.getCommitteeList('sessionID=' + this.props.session.selectedSession.SessionID + \"&includeSubCommittees=true\").then(() => {\n                            let committeeList = this.props.committee.committeeList;\n                            committeeList.forEach(committee => {\n                                committee.label = committee.Name;\n                                committee.value = committee.CommitteeID;\n                            });\n                            this.setState({\n                                committeeList: committeeList\n                            });\n                        });\n                        //get communication summary list for communication action reference pickers\n                        this.props.actions.getCommunicationSummaryList('sessionID=' + this.props.session.selectedSession.SessionID + \"&communicationTypeID=1&chamberCode=H\").then(() => {\n                            let communicationList = this.props.communications.communicationSummaryList;\n                            //summaries that have already been selected/used will not be returned from this endpoint, but they need to be in the dropdown in order for that selected option to appear as selected, so add these manually to the list\n                            const usedCommunicationSummaries = [...this.state.minutesBook.MinutesCategories].filter(mc => mc.MinutesEntries && mc.MinutesEntries.find(me => me.MinutesActivities && me.MinutesActivities.find(ma => ma.ActivityReferences && ma.ActivityReferences.find(ar => ar.ActionReferenceType === \"Communication\" && ar.ReferenceID)))).flatMap(mc => mc.MinutesEntries.filter(me => me.MinutesActivities && me.MinutesActivities.find(ma => ma.ActivityReferences && ma.ActivityReferences.find(ar => ar.ActionReferenceType === \"Communication\" && ar.ReferenceID)))).flatMap(me => me.MinutesActivities.filter(ma => ma.ActivityReferences && ma.ActivityReferences.find(ar => ar.ActionReferenceType === \"Communication\" && ar.ReferenceID))).flatMap(ma => ma.ActivityReferences.filter(ar => ar.ActionReferenceType === \"Communication\" && ar.ReferenceID));\n                            usedCommunicationSummaries.forEach(usedCommunicationSummary => {\n                                if (!communicationList.find(communication => communication.CommunicationID === usedCommunicationSummary.ReferenceID)) {\n                                    const minutesEntry = [...this.state.minutesBook.MinutesCategories].find(mc => mc.MinutesEntries && mc.MinutesEntries.find(me => me.MinutesActivities && me.MinutesActivities.find(ma => ma.MinutesActivityID === usedCommunicationSummary.MinutesActivityID))).MinutesEntries.find(me => me.MinutesActivities && me.MinutesActivities.find(ma => ma.MinutesActivityID === usedCommunicationSummary.MinutesActivityID));\n                                    const communicationSummaries = minutesEntry.MinutesSummaries ? minutesEntry.MinutesSummaries.filter(ms => ms.ReferenceID === usedCommunicationSummary.ReferenceID).map(ms => ({ ...ms, CommunicationID: ms.ReferenceID })) : [];\n                                    communicationList.push({ ReferenceNumber: usedCommunicationSummary.ReferenceText, CommunicationID: usedCommunicationSummary.ReferenceID, CommunicationSummaries: communicationSummaries, CommunicationDate: minutesEntry.CommunicationDate, CommunicationNumber: minutesEntry.CommunicationNumber })\n                                    //sort list by CommunicationDate and CommunicationNumber, if not present then use the ReferenceNumber to determine the Date/Number\n                                    communicationList.sort((a, b) => a.CommunicationDate && b.CommunicationDate ?\n                                        moment(b.CommunicationDate).isAfter(moment(a.CommunicationDate), 'day') ? 1 :\n                                            moment(b.CommunicationDate).isBefore(moment(a.CommunicationDate), 'day') ? -1 :\n                                                Number(a.CommunicationNumber) - Number(b.CommunicationNumber)\n                                        : a.ReferenceNumber && b.ReferenceNumber && a.ReferenceNumber.length >= 7 && b.ReferenceNumber.length >= 7 ?\n                                            Number(b.ReferenceNumber.substring(b.ReferenceNumber.length - 4)) - Number(a.ReferenceNumber.substring(a.ReferenceNumber.length - 4))\n                                            : b.ReferenceNumber - a.ReferenceNumber)\n                                }\n                            })\n                            communicationList.forEach(communication => {\n                                communication.label = communication.ReferenceNumber;\n                                communication.value = communication.CommunicationID;\n                            });\n                            this.setState({\n                                communicationList: communicationList\n                            });\n                        });\n                    })\n                // Used to apply a legislation number to an entry\n                this.props.actions.getBillNumbers('?sessionID=' + minutesBook.SessionID).then(() => {\n                    let billNumbers = this.props.bills.billNumbers;\n                    billNumbers.forEach(bill => {\n                        bill.label = bill.LegislationNumber;\n                        bill.value = bill.LegislationNumber;\n                    })\n                    this.setState({\n                        sessionBills: billNumbers\n                    });\n                })\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return\n                }\n                console.log(err);\n                this.setState({\n                    minutesBook: '',\n                    isLoaded: true,\n                });\n            });\n    }\n\n    startConn(conn, type, cb) {\n        conn\n            .start({ withCredentials: false })\n            .then(() => {\n                this.setState({\n                    ['building' + type + 'Connection']: false\n                })\n                conn.onreconnecting((e) => {\n                    if (e) console.log(e);\n                    this.props.actions.makeToast([{ message: type + \" Connection Reconnecting\", type: \"warning\" }])\n                    console.log(type + \" connection reconnecting\")\n                    this.setState({ ['reconnecting' + type]: true })\n                })\n                conn.onreconnected((e) => {\n                    if (e) console.log(e);\n                    this.props.actions.makeToast([{ message: type + \" Connection Reconnected\", type: \"success\" }])\n                    console.log(type + \" connection reconnected\")\n                    this.setState({ ['reconnecting' + type]: false })\n                })\n                conn.onclose((e) => {\n                    this.props.actions.makeToast([{ message: type + \" Connection Closed\", type: \"failure\" }])\n                    console.log(type + \" connection closed\", e ?? \"\");\n                    this.setState({ ['closed' + type]: true, ['reconnecting' + type]: false })\n                })\n                if (cb) cb();\n            }).catch(err => {\n                console.log('Error while establishing connection :( ' + err)\n                this.props.actions.makeToast([{ message: type + \" Connection Failed\", type: \"failure\" }])\n            });\n    }\n\n    toggleFetchChairs() {\n        this.setState({ fetchChairsReports: !this.state.fetchChairsReports })\n    }\n\n    handleChairsReportDateChange(date, key) {\n        if (date) {\n            if (key === \"START\") {\n                this.setState({\n                    chairsReportStartDate: moment(date).startOf('day'),\n                    chairsReportEndDate: this.state.chairsReportEndDate || moment(date).endOf('day')\n                })\n            } else {\n                this.setState({\n                    chairsReportEndDate: moment(date).endOf('day')\n                })\n            }\n        }\n    }\n\n    fetchChairsReports() {\n        this.setState({ fetchingChairsReports: true, disableChanges: true }, () => {\n            this.props.actions.getMinutesList('sessionID=' + this.state.minutesBook.SessionID + '&startDate=' + moment(this.state.chairsReportStartDate).format(\"MM/DD/yyyy\") + '&endDate=' + this.state.chairsReportEndDate.format(\"MM/DD/yyyy\"), false).then(() => {\n                if (this.props.minutes.minutesList) {\n                    const committeeMinutesBooks = this.props.minutes.minutesList.filter(c => c.ChamberCode === 'S' && c.CommitteeID && c.MinutesStatus && c.MinutesStatus.toLowerCase() === 'closed');\n                    if (committeeMinutesBooks.length) {\n                        //combine the minutes books from this date range with the minutes books already fetched from previous date ranges\n                        const committeeMinutesBookIDs = committeeMinutesBooks.map(c => c.MinutesBookID);\n                        const combinedMinutesBookIDs = committeeMinutesBookIDs.concat([...this.state.fetchedMinutesBookIDs]);\n                        const uniqueCombinedMinutesBookIDs = [...new Set(combinedMinutesBookIDs)];\n                        this.props.actions.getCommitteeMinutesSummary('?' + uniqueCombinedMinutesBookIDs.map((id, idx) => (idx ? '&' : '') + 'minutesBookIDs=' + id).join('')).then(async () => {\n                            this.setState({ fetchedMinutesBookIDs: uniqueCombinedMinutesBookIDs })\n                            let minutesBook = { ...this.state.minutesBook };\n                            minutesBook.MinutesCategories = minutesBook.MinutesCategories || [];\n                            let committeeMinutesSummary = this.props.minutes.committeeMinutesSummary;\n                            let totalIterations = 0;\n                            let newIterations = 0;\n                            let idx = 0;\n                            for (const category of committeeMinutesSummary) {\n                                if (minutesBook.MinutesCategories.find(mc => mc.CalendarCategoryTypeID === category.CalendarCategoryTypeID)) {\n                                    let matchingIterations = 0;\n                                    //update the existing categories that are of this same type\n                                    minutesBook.MinutesCategories.filter(mc => mc.CalendarCategoryTypeID === category.CalendarCategoryTypeID).forEach((existingMatchingCategory, matchingCategoryIdx) => {\n                                        const existingCategoryIndex = minutesBook.MinutesCategories.findIndex(mc => mc.MinutesCategoryID === existingMatchingCategory.MinutesCategoryID);\n                                        minutesBook.MinutesCategories[existingCategoryIndex].CategoryText = category.CategoryDescription;\n                                        minutesBook.MinutesCategories[existingCategoryIndex].CategoryDescription = category.CategoryDescription;\n                                        category.MinutesEntries.forEach(entry => {\n                                            //for each entry (i.e. cmte) of this category from the response, check if the entry (i.e. committee) already exists\n                                            const cmte = entry.MinutesSummaries && entry.MinutesSummaries.find(ms => ms.CommitteeID);\n                                            if (cmte) {\n                                                const existingMatchingEntryIndex = existingMatchingCategory.MinutesEntries.findIndex(me => me.MinutesSummaries && me.MinutesSummaries.find(ms => ms.CommitteeID && ms.CommitteeID === cmte.CommitteeID));\n                                                if (existingMatchingEntryIndex > -1) {\n                                                    //entry/cmte already exists - add new summaries/ignore existing ones, and update the entrytext regardless\n                                                    //iterate over each summary returned from the response, check to see if the summary's ReferenceID (minutes book) is already in this entry.\n                                                    //if it is, we already have this summary, so just update the MinutesSummary text attr since it may have new bills in it. If we don't have this summary at all, add it\n                                                    entry.MinutesSummaries.forEach(summary => {\n                                                        const existingMatchingSummaryIndex = existingMatchingCategory.MinutesEntries[existingMatchingEntryIndex].MinutesSummaries.findIndex(ms => ms.ReferenceID === summary.ReferenceID);\n                                                        if (existingMatchingSummaryIndex > -1) {\n                                                            minutesBook.MinutesCategories[existingCategoryIndex].MinutesEntries[existingMatchingEntryIndex].MinutesSummaries[existingMatchingSummaryIndex].MinutesSummary = summary.MinutesSummary\n                                                        } else {\n                                                            minutesBook.MinutesCategories[existingCategoryIndex].MinutesEntries[existingMatchingEntryIndex].MinutesSummaries.push(summary);\n                                                        }\n                                                    })\n                                                    minutesBook.MinutesCategories[existingCategoryIndex].MinutesEntries[existingMatchingEntryIndex].EntryText = entry.EntryText;\n                                                } else {\n                                                    //entry/cmte is new/doesn't already exist - add the new entry/cmte\n                                                    minutesBook.MinutesCategories[existingCategoryIndex].MinutesEntries.push(entry);\n                                                }\n                                            }\n                                        })\n                                        //save category with updated/new entries\n                                        this.state.categoryHubConnection.invoke(\"SaveCategory\", minutesBook.MinutesCategories[existingCategoryIndex], localStorage.getItem('LIS_ID_TOKEN'))\n                                            .then(() => {\n                                                //the EntryText of all the entries for each of these categories will now include even the excluded chairs reports again. Use the regenerate endpt since this will take that into account\n                                                this.regenerateChairsReportCategory(minutesBook.MinutesCategories[existingCategoryIndex].Sequence - 1, () => {\n                                                    matchingIterations++;\n                                                    if (matchingIterations === minutesBook.MinutesCategories.filter(mc => mc.CalendarCategoryTypeID === category.CalendarCategoryTypeID).length) {\n                                                        totalIterations++;\n                                                    }\n                                                    if (totalIterations === committeeMinutesSummary.length && matchingIterations === minutesBook.MinutesCategories.filter(mc => mc.CalendarCategoryTypeID === category.CalendarCategoryTypeID).length) {\n                                                        this.setState({ fetchingChairsReports: false, disableChanges: false })\n                                                    }\n                                                });\n                                            }).catch(function (err) {\n                                                console.error(err.toString());\n                                                if (idx === committeeMinutesSummary.length - 1) {\n                                                    this.setState({ fetchingChairsReports: false, disableChanges: false })\n                                                }\n                                            });\n                                    })\n                                } else {\n                                    //no existing categories are of this same type, create the category as new\n                                    newIterations++;\n                                    category.ReleaseToPreview = true;\n                                    category.CategoryText = category.CategoryDescription;\n                                    category.Sequence = minutesBook.MinutesCategories.length + newIterations;\n                                    await this.createCategory(category, () => {\n                                        if (idx === committeeMinutesSummary.length - 1) {\n                                            this.setState({ fetchingChairsReports: false, disableChanges: false })\n                                        }\n                                    });\n                                }\n                                idx++;\n                            }\n                        }).catch(err => {\n                            if (err === 'Aborted') {\n                                return;\n                            }\n                            console.log(err);\n                            this.setState({\n                                fetchingChairsReports: false,\n                                disableChanges: false\n                            })\n                            this.props.actions.makeToast([{ message: 'Failed to get chairs report summary', type: \"failure\" }])\n                        });\n                    } else {\n                        this.setState({ fetchingChairsReports: false, disableChanges: false })\n                    }\n                } else {\n                    this.setState({ fetchingChairsReports: false, disableChanges: false })\n                }\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err);\n                this.setState({ fetchingChairsReports: false, disableChanges: false })\n                this.props.actions.makeToast([{ message: 'Failed to get Chairs Reports', type: \"failure\" }])\n            });\n        })\n    }\n\n    toggleChairsReport(activitySequence, entryIndex, summaryIndex) {\n        let minutesBook = { ...this.state.minutesBook };\n        minutesBook.MinutesCategories[activitySequence].MinutesEntries[entryIndex].MinutesSummaries[summaryIndex].IsActive = !minutesBook.MinutesCategories[activitySequence].MinutesEntries[entryIndex].MinutesSummaries[summaryIndex].IsActive\n\n        let chairReportCategoriesSetForRegeneration = [...this.state.chairReportCategoriesSetForRegeneration];\n        if (!chairReportCategoriesSetForRegeneration.find(c => c === minutesBook.MinutesCategories[activitySequence].MinutesCategoryID)) {\n            chairReportCategoriesSetForRegeneration.push(minutesBook.MinutesCategories[activitySequence].MinutesCategoryID);\n        }\n\n        this.setState({ minutesBook, chairReportCategoriesSetForRegeneration })\n    }\n\n    regenerateChairsReportCategory(activitySequence, callback) {\n        let minutesBook = { ...this.state.minutesBook };\n        let chairReportCategoriesSetForRegeneration = [...this.state.chairReportCategoriesSetForRegeneration];\n        let regeneratingCategories = [...this.state.regeneratingCategories];\n        regeneratingCategories.push(minutesBook.MinutesCategories[activitySequence].MinutesCategoryID);\n        this.setState({ regeneratingCategories }, () => {\n            const committeeMinutesBookIDs = minutesBook.MinutesCategories[activitySequence].MinutesEntries.flatMap(me => me.MinutesSummaries).filter(ms => ms?.IsActive && ms?.ReferenceID).map(ms => ms.ReferenceID);\n            if (committeeMinutesBookIDs.length) {\n                this.props.actions.getCommitteeMinutesSummary('?' + committeeMinutesBookIDs.map((id, idx) => (idx ? '&' : '') + 'minutesBookIDs=' + id).join('')).then(() => {\n                    let committeeMinutesSummary = this.props.minutes.committeeMinutesSummary.find(c => c.CalendarCategoryTypeID === minutesBook.MinutesCategories[activitySequence].CalendarCategoryTypeID);\n                    minutesBook.MinutesCategories[activitySequence].MinutesEntries.forEach((entry, idx) => {\n                        const associatedCommitteeMinutesEntry = committeeMinutesSummary.MinutesEntries.find(me => me.MinutesSummaries?.find(ms => ms.CommitteeID && entry.MinutesSummaries?.find(existingMs => existingMs?.IsActive && ms?.CommitteeID === existingMs?.CommitteeID)))\n                        if (associatedCommitteeMinutesEntry) {\n                            minutesBook.MinutesCategories[activitySequence].MinutesEntries[idx].EntryText = associatedCommitteeMinutesEntry.EntryText;\n                        } else {\n                            minutesBook.MinutesCategories[activitySequence].MinutesEntries[idx].EntryText = '';\n                        }\n                    })\n                    this.state.categoryHubConnection.invoke(\"SaveCategory\", minutesBook.MinutesCategories[activitySequence], localStorage.getItem('LIS_ID_TOKEN'))\n                        .catch(function (err) {\n                            console.error(err.toString());\n                        }).finally(() => {\n                            //refresh these since the method can be run multiple times at once\n                            chairReportCategoriesSetForRegeneration = [...this.state.chairReportCategoriesSetForRegeneration];\n                            regeneratingCategories = [...this.state.regeneratingCategories];\n                            chairReportCategoriesSetForRegeneration.splice(chairReportCategoriesSetForRegeneration.indexOf(minutesBook.MinutesCategories[activitySequence].MinutesCategoryID), 1);\n                            regeneratingCategories.splice(regeneratingCategories.indexOf(minutesBook.MinutesCategories[activitySequence].MinutesCategoryID), 1);\n                            this.setState({ regeneratingCategories, chairReportCategoriesSetForRegeneration })\n                            if (callback) {\n                                callback();\n                            }\n                        });\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    console.log(err);\n                    //refresh these since the method can be run multiple times at once\n                    chairReportCategoriesSetForRegeneration = [...this.state.chairReportCategoriesSetForRegeneration];\n                    regeneratingCategories = [...this.state.regeneratingCategories];\n                    chairReportCategoriesSetForRegeneration.splice(chairReportCategoriesSetForRegeneration.indexOf(minutesBook.MinutesCategories[activitySequence].MinutesCategoryID), 1);\n                    regeneratingCategories.splice(regeneratingCategories.indexOf(minutesBook.MinutesCategories[activitySequence].MinutesCategoryID), 1);\n                    this.setState({\n                        regeneratingCategories,\n                        chairReportCategoriesSetForRegeneration\n                    })\n                    this.props.actions.makeToast([{ message: 'Failed to get chairs report summary', type: \"failure\" }])\n                    if (callback)\n                        callback();\n                });\n            } else {\n                minutesBook.MinutesCategories[activitySequence].MinutesEntries.forEach(entry => {\n                    entry.EntryText = '';\n                })\n                //refresh these since the method can be run multiple times at once\n                chairReportCategoriesSetForRegeneration = [...this.state.chairReportCategoriesSetForRegeneration];\n                regeneratingCategories = [...this.state.regeneratingCategories];\n                chairReportCategoriesSetForRegeneration.splice(chairReportCategoriesSetForRegeneration.indexOf(minutesBook.MinutesCategories[activitySequence].MinutesCategoryID), 1);\n                regeneratingCategories.splice(regeneratingCategories.indexOf(minutesBook.MinutesCategories[activitySequence].MinutesCategoryID), 1);\n                this.setState({ regeneratingCategories, chairReportCategoriesSetForRegeneration })\n                if (callback)\n                    callback();\n            }\n        })\n    }\n\n    toggleMinutesStatus() {\n        let minutesBook = { ... this.state.minutesBook };\n\n        minutesBook.MinutesStatusId = minutesBook.MinutesStatusID === 4 ? 2 : 4;\n        delete minutesBook.MinutesCategories;\n        delete minutesBook.MinutesFiles;\n        delete minutesBook.MinutesCalendars;\n\n        this.props.actions.saveMinutesBook(minutesBook)\n            .then(() => {\n                this.getMinutes();\n            })\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        if (this.state.isLoaded) {\n            return (\n                <div className=\"user-forms dlas-forms\">\n                    <h2>{moment(this.state.minutesBook.MinutesDate).format(\"LL\")}</h2>\n                    <div style={{ marginBottom: \"20px\" }}>\n                        <div style={{ height: '30px', display: \"grid\", gridTemplateColumns: \"275px 1fr 475px\" }}>\n                            <div style={{ float: \"left\", display: \"inline-flex\" }}>\n                                <button type=\"button\" className=\"button primary\" onClick={() => this.toggleMinutesStatus()}>{(this.state.minutesBook.MinutesStatusID === 4 ? \"Open\" : \"Close\") + \" Minutes\"}</button>\n                                <label style={{ marginLeft: \"10px\" }}>Minutes Status: <span className={this.state.minutesBook.MinutesStatusID === 4 ? \"fail\" : \"txt-green\"}>{this.state.minutesBook.MinutesStatusID === 4 ? \"Closed\" : \"Open\"}</span></label>\n                            </div>\n                            <div />\n                            {this.state.fetchChairsReports ?\n                                <div className=\"flex-vertical-center\" style={{ display: \"grid\", gridTemplateColumns: \"20px 200px 200px 80px\", height: \"30px\", alignItems: \"end\", marginTop: \"-20px\" }}>\n                                    <button className=\"icon delete\" style={{ flexShrink: '0', marginBottom: \"10px\" }} onClick={this.toggleFetchChairs} />\n                                    <div style={{ width: '165px' }}>\n                                        <label>Start Date</label>\n                                        <DatePicker\n                                            selected={this.state.chairsReportStartDate}\n                                            onChange={(val) => this.handleChairsReportDateChange(val, \"START\")}\n                                            className='event-date-picker'\n                                        />\n                                    </div>\n                                    <div style={{ width: '165px' }}>\n                                        <label>End Date</label>\n                                        <DatePicker\n                                            selected={this.state.chairsReportEndDate}\n                                            onChange={(val) => this.handleChairsReportDateChange(val, \"END\")}\n                                            className='event-date-picker'\n                                        />\n                                    </div>\n                                    <div style={{ display: 'flex', alignItems: 'end' }}>\n                                        <button className=\"button\" disabled={!this.state.chairsReportStartDate || !this.state.chairsReportEndDate || this.state.fetchingChairsReports || this.state.regeneratingCategories.length} onClick={this.fetchChairsReports}>{this.state.fetchingChairsReports ? <div className=\"small-spinner\" /> : 'Go'}</button>\n                                    </div>\n                                </div>\n                                :\n                                <button className=\"button\" style={{ width: \"200px\", marginLeft: \"275px\" }} onClick={this.toggleFetchChairs}>Fetch Chair's Reports</button>\n                            }\n                        </div>\n                    </div>\n                    {this.state.showMoveEntryDialog &&\n                        <div className='popup' onClick={() => this.toggleMoveEntry(false)}>\n                            <div className='popup-inner tall-content' onClick={e => e.stopPropagation()}>\n                                {this.state.categoriesToMove.length === 0 ?\n                                    <p>There are no categories where you can move this entry</p>\n                                    :\n                                    <p>Choose a category to move the entry to</p>\n                                }\n                                <div style={{ paddingBottom: '10px' }}>\n                                    <ReactTable\n                                        data={this.state.categoriesToMove}\n                                        getTrProps={(_state, rowInfo) => {\n                                            return {\n                                                style: {\n                                                    background: rowInfo && rowInfo.index === this.state.selectedCategoryToMoveTo ? '#89ff89' : '',\n                                                    cursor: rowInfo ? 'pointer' : 'default'\n                                                },\n                                                onClick: () => this.setState({ selectedCategoryToMoveTo: rowInfo.index })\n                                            }\n                                        }}\n                                        noDataText=\"\"\n                                        columns={[\n                                            {\n                                                id: \"checkbox\",\n                                                accessor: \"\",\n                                                className: \"checkbox-column\",\n                                                Cell: ({ index }) => {\n                                                    return <span className={index === this.state.selectedCategoryToMoveTo ? \"icon checkmark\" : \"\"}></span>;\n                                                },\n                                                sortable: false,\n                                                filterable: false,\n                                                width: 45\n                                            },\n                                            {\n                                                Header: \"Sequence\",\n                                                accessor: \"Sequence\",\n                                                width: 50\n                                            },\n                                            {\n                                                Header: \"Type\",\n                                                accessor: \"CategoryType\"\n                                            },\n                                            {\n                                                Header: \"Description\",\n                                                accessor: \"CategoryDescription\"\n                                            }\n                                        ]}\n                                        defaultPageSize={5}\n                                        className=\"-striped -highlight\"\n                                    />\n                                </div>\n                                <div className=\"flex-row\" sty>\n                                    <button className=\"button secondary\" onClick={() => this.toggleMoveEntry(false)}>Cancel</button>\n                                    {this.state.categoriesToMove.length > 0 &&\n                                        <button disabled={this.state.selectedCategoryToMoveTo === -1} onClick={() => this.moveEntry(this.state.selectedCategoryToMoveTo)} className=\"button\">Move</button>\n                                    }\n                                </div>\n                            </div>\n                        </div>\n                    }\n                    <fieldset className={this.state.indexFieldsetIsActive ? 'fieldset-collapse fieldset-open' : 'fieldset-collapse fieldset-closed'} >\n                        <legend onClick={this.toggleFieldsetCollapse.bind(this, 'indexFieldsetIsActive')}>Index</legend>\n                        <div>\n                            <MinutesIndex\n                                categories={this.state.minutesBook.MinutesCategories ? this.state.minutesBook.MinutesCategories : []}\n                                onSequenceChange={this.handleSequenceChange}\n                                showPreview={this.showPreview}\n                                showActivity={this.showActivity}\n                                createCategory={this.createCategory}\n                                duplicateChairmansCategory={this.duplicateChairmansCategory}\n                                getCategoryDescriptionText={this.getCategoryDescriptionText}\n                                creatingCategory={this.state.creatingCategory}\n                                calendarCategories={this.state.calendarCategories}\n                                currentActivitySequence={this.state.currentActivitySequence}\n                                disableChanges={this.state.disableChanges || this.state.buildingCategoryConnection || this.state.buildingEntryConnection || this.state.reconnectingCategory || this.state.closedCategory}\n                                categoryFormDisabled={this.state.categoryFormDisabled} />\n                        </div>\n                    </fieldset>\n                    <fieldset ref={this.activityRef} className={this.state.activityFieldsetIsActive ? 'fieldset-collapse fieldset-open' : 'fieldset-collapse fieldset-closed'} >\n                        <legend onClick={this.toggleFieldsetCollapse.bind(this, 'activityFieldsetIsActive')}>Activity</legend>\n                        <div className=\"flex-row\">\n                            <div style={{ display: 'flex', alignItems: 'center', width: '100%' }}>\n                                {!this.state.editingCategoryText ?\n                                    <>\n                                        <p className=\"small-header\">{this.state.currentActivitySequence !== 0 && this.getCategoryDescriptionText(this.state.minutesBook.MinutesCategories[this.state.currentActivitySequence - 1])}</p>\n                                        {this.state.currentActivitySequence !== 0 && !this.state.categoryFormDisabled[this.state.currentActivitySequence] && <a className=\"icon edit\" style={{ marginLeft: '7px' }} onClick={() => this.toggleEditCategoryText()} />}\n                                    </>\n                                    :\n                                    <>\n                                        <input style={{ width: '50%' }} value={this.state.tempCategoryText} onChange={(e) => this.setTempCategoryText(e.target.value)} />\n                                        <a className=\"icon save\" style={{ marginLeft: '7px' }} onClick={() => this.toggleEditCategoryText(true)} />\n                                        <a className=\"icon delete\" style={{ marginLeft: '7px' }} onClick={() => this.toggleEditCategoryText()} />\n                                    </>\n                                }\n                            </div>\n                            {this.state.currentActivitySequence && this.state.currentActivitySequence !== 0 && this.state.minutesBook.MinutesCategories && this.state.chairReportCategoriesSetForRegeneration.find(categoryID => categoryID === this.state.minutesBook.MinutesCategories[this.state.currentActivitySequence - 1].MinutesCategoryID) ?\n                                <div className=\"flex-row flex-vertical-center\">\n                                    <button disabled={this.state.fetchingChairsReports || this.state.regeneratingCategories.find(categoryID => categoryID === this.state.minutesBook.MinutesCategories[this.state.currentActivitySequence - 1].MinutesCategoryID)}\n                                        onClick={() => this.regenerateChairsReportCategory(this.state.currentActivitySequence - 1)}\n                                        type=\"button\" className=\"button\">{this.state.regeneratingCategories.find(categoryID => categoryID === this.state.minutesBook.MinutesCategories[this.state.currentActivitySequence - 1].MinutesCategoryID) ? <div className=\"small-spinner\" /> : \"Regenerate Summary\"}</button>\n                                </div>\n                                : null}\n                        </div>\n                        {this.state.currentActivitySequence && this.state.currentActivitySequence !== 0 ?\n                            <TypeSwitcher\n                                type={this.state.activity}\n                                ref={this.entryFormRef}\n                                onEntryChange={this.entryChange}\n                                onMultipleEntryChange={this.multipleEntryChange}\n                                currentActivitySequence={this.state.currentActivitySequence}\n                                handleSaveEntry={this.saveEntry}\n                                sessionId={this.state.minutesBook.SessionID}\n                                sessionCode={this.state.minutesBook.SessionCode}\n                                memberList={this.state.memberList}\n                                committeeList={this.state.committeeList}\n                                communicationList={this.state.communicationList}\n                                actionTypes={this.state.actionTypes}\n                                toggleMoveEntry={this.toggleMoveEntry}\n                                bulkMoveEntry={this.bulkMoveEntry}\n                                sessionBills={this.state.sessionBills}\n                                toggleChairsReport={this.toggleChairsReport}\n                                chairReportCategoriesSetForRegeneration={this.state.chairReportCategoriesSetForRegeneration}\n                                formData={this.state.minutesBook.MinutesCategories ? this.state.minutesBook.MinutesCategories[this.state.currentActivitySequence - 1] : {}}\n                                categories={this.state.minutesBook.MinutesCategories || []}\n                                getCategoryDescriptionText={this.getCategoryDescriptionText}\n                                createCategory={this.createCategory}\n                                disableChanges={this.state.disableChanges}\n                                categoryFormDisabled={this.state.categoryFormDisabled[this.state.currentActivitySequence] || this.state.reconnectingCategory || this.state.reconnectingEntry || this.state.closedCategory || this.state.closedEntry} />\n                            : null}\n                    </fieldset>\n                    <fieldset className={this.state.previewFieldsetIsActive ? 'fieldset-collapse fieldset-open' : 'fieldset-collapse fieldset-closed'} >\n                        <legend onClick={this.toggleFieldsetCollapse.bind(this, 'previewFieldsetIsActive')}>Preview</legend>\n                        <Preview\n                            categories={this.state.minutesBook.MinutesCategories ? this.state.minutesBook.MinutesCategories : []}\n                            isPendingChange={this.state.isPendingChange}\n                            lastSaveErr={this.state.lastSaveErr}\n                            lastSavedTime={this.state.lastSavedTime}\n                            buildingCategoryConnection={this.state.buildingCategoryConnection}\n                            buildingEntryConnection={this.state.buildingEntryConnection}\n                            reconnectingCategory={this.state.reconnectingCategory}\n                            reconnectingEntry={this.state.reconnectingEntry}\n                            closedCategory={this.state.closedCategory}\n                            closedEntry={this.state.closedEntry}\n                            lastPublishedTime={this.state.lastPublishedTime}\n                            publishAllEntries={this.publishAllEntries}\n                            publishing={this.state.publishing} />\n                    </fieldset>\n                </div>\n\n            )\n        } else {\n            return (\n                <div className=\"user-forms dlas-forms\">\n                    <LoaderComponent className=\"center-spinner\" data={this.state.isLoaded} />\n                </div>\n            )\n        }\n    }\n}\n\nconst getItemStyle = (isDisabled, isDragging, draggableStyle, pendingDeletion) => ({\n    userSelect: 'none',\n    background: isDisabled ? '#c7c7c7' : isDragging ? '#34495e' : 'white',\n    color: isDisabled ? 'black' : isDragging ? 'white' : '#34495e',\n    border: pendingDeletion ? 'red' : 'none',\n    ...draggableStyle,\n});\n\nconst getListStyle = isDraggingOver => ({\n    background: isDraggingOver ? '#8b9fb3' : '#666666',\n    width: '100%',\n});\n\nclass MinutesIndex extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            selectedCalendarCategory: ''\n        }\n\n        this.handleCalendarCategoryChange = this.handleCalendarCategoryChange.bind(this);\n        this.createCategory = this.createCategory.bind(this);\n    }\n    handleCalendarCategoryChange(value) {\n        this.setState({\n            selectedCalendarCategory: value\n        });\n    }\n\n    async createCategory() {\n        if (this.state.selectedCalendarCategory.CategoryType === \"Chairmans Report\" && this.props.categories.find(c => c.CalendarCategoryTypeID === this.state.selectedCalendarCategory.CalendarCategoryTypeID)) {\n            await this.props.duplicateChairmansCategory(this.state.selectedCalendarCategory.CalendarCategoryTypeID);\n            this.setState({\n                selectedCalendarCategory: ''\n            });\n        } else {\n            const newCategory = {\n                ...this.state.selectedCalendarCategory,\n                CategoryDescription: this.state.selectedCalendarCategory.Description,\n                ReleaseToPreview: true,\n                Sequence: this.props.categories.length + 1\n            };\n            this.setState({\n                selectedCalendarCategory: ''\n            });\n            await this.props.createCategory(newCategory);\n        }\n    }\n\n    onDragEnd(result) {\n        // dropped outside the list\n        if (!result.destination) {\n            return;\n        }\n        const items = (() => {\n            const list = Array.from(this.props.categories);\n            const [removed] = list.splice(result.source.index, 1);\n\n            list.splice(result.destination.index, 0, removed);\n            // Reorder the Sequence value too because the sequence value is used to show what order the preview is in\n            list.forEach(function (element, index) {\n                element.Sequence = index + 1\n            });\n            return list;\n        })();\n        //Send the new values up to the parent to be set in the parent's state\n        this.props.onSequenceChange(items);\n    }\n\n\n    render() {\n        if (this.props.categories) {\n            return (\n                <div className={this.props.disableChanges ? 'dnd-disabled' : ''}>\n                    <DragDropContext onDragEnd={this.onDragEnd.bind(this)}>\n                        <Droppable droppableId=\"droppable\">\n                            {(provided, snapshot) => (\n                                <table\n                                    className=\"dnd-grid-table minutes-categories-grid\"\n                                    ref={provided.innerRef}\n                                    style={getListStyle(snapshot.isDraggingOver)}\n                                >\n                                    <thead className=\"dnd-grid-header\" style={getListStyle(snapshot.isDraggingOver)}>\n                                        <tr>\n                                            <th scope=\"col\" id={'-grabber-column'}></th>\n                                            <th scope=\"col\" id={'-display-column'}>Display #</th>\n                                            <th scope=\"col\" id={'-display-column'}>Include</th>\n                                            <th scope=\"col\" id={'-display-column'}>Section</th>\n                                            <th scope=\"col\" id={'-actions-column'}>Actions</th>\n                                        </tr>\n                                    </thead>\n                                    <tbody>\n                                        {this.props.categories.map((item, index) => (\n                                            <Draggable isDragDisabled={this.props.disableChanges || this.props.categoryFormDisabled[item.Sequence]} key={`${item.Sequence}-${item.MinutesCategoryID}`} draggableId={`${item.Sequence}-${item.MinutesCategoryID}`} index={index}>\n                                                {(provided, snapshot) => (\n                                                    <tr\n                                                        ref={provided.innerRef}\n                                                        {...provided.draggableProps}\n                                                        {...provided.dragHandleProps}\n                                                        className={this.props.categories[this.props.currentActivitySequence - 1] === item ? 'selected' : 'not-selected'}\n                                                        style={getItemStyle(\n                                                            this.props.disableChanges || this.props.categoryFormDisabled[item.Sequence],\n                                                            snapshot.isDragging,\n                                                            provided.draggableProps.style\n                                                        )} >\n                                                        <td><button id={item.MinutesCategoryID + '-grabber-button'} className=\"button draggable\">Drag and drop</button></td>\n                                                        <td>{index + 1}</td>\n                                                        <td><input type=\"checkbox\" disabled={this.props.disableChanges || this.props.categoryFormDisabled[item.Sequence]} checked={this.props.categories[index].ReleaseToPreview === true} onChange={() => this.props.showPreview(index)} /></td>\n                                                        <td className='category-desc' style={this.props.disableChanges || this.props.categoryFormDisabled[item.Sequence] ? { pointerEvents: 'none' } : {}} onClick={(e) => this.props.showActivity(this.props.categories[index], e)}>\n                                                            {this.renderCategoryDescription(item)}\n                                                        </td>\n                                                        <td>\n                                                            <button\n                                                                type=\"button\"\n                                                                style={this.props.disableChanges || this.props.categoryFormDisabled[item.Sequence] ? { pointerEvents: 'none' } : {}}\n                                                                onClick={(e) => this.props.showActivity(this.props.categories[index], e)}\n                                                                className={this.props.categories[this.props.currentActivitySequence - 1] === item\n                                                                    ? 'icon edit-alt'\n                                                                    : 'icon edit'}>\n                                                            </button>\n                                                        </td>\n                                                    </tr>\n                                                )}\n                                            </Draggable>\n                                        ))}\n                                        {provided.placeholder}\n                                        <tr style={getItemStyle(false)} >\n                                            <td></td>\n                                            <td></td>\n                                            <td></td>\n                                            <td className=\"category-desc\">\n                                                <div style={{ width: '80%' }}>\n                                                    <Select\n                                                        value={this.state.selectedCalendarCategory}\n                                                        onChange={this.handleCalendarCategoryChange}\n                                                        options={this.props.calendarCategories}\n                                                        getOptionLabel={option => (option.DisplayType ? option.CategoryType + ' - ' : '') + option.Description}\n                                                        getOptionValue={option => option.CalendarCategoryTypeID}\n                                                    />\n                                                </div>\n                                            </td>\n                                            <td><button disabled={this.props.creatingCategory || !this.state.selectedCalendarCategory} onClick={async () => await this.createCategory()} type=\"button\" className=\"button small-button\">{this.props.creatingCategory ? 'Adding' : 'Add'}</button></td>\n                                        </tr>\n                                    </tbody>\n                                </table>\n                            )}\n                        </Droppable>\n                    </DragDropContext>\n                </div>\n            )\n        } else {\n            return (<div></div>)\n        }\n    }\n\n    //Some categories get the type pre-pended to the description while other do not\n    renderCategoryDescription(item) {\n        //The reason why buttons are in here is because the form saves when an input is blurred. The only way to blur something is to put focus on something else\n        // and td elements are not \"focus-able\", but buttons are.\n        return (<button type=\"button\">{this.props.getCategoryDescriptionText(item)}</button>);\n    }\n}\n\nclass Preview extends React.Component {\n    render() {\n        const previewLengthStyle = { height: '500px', overflowY: 'scroll', backgroundColor: 'white' }\n        const newPreviewArray = this.props.categories.filter(\n            entryObj => entryObj.ReleaseToPreview\n        );\n        return (\n            <React.Fragment>\n                <div className=\"floating-button-bar align-right inline-list\">\n                    {this.props.isPendingChange ?\n                        <span className=\"pending-label\">'Pending...'</span>\n                        :\n                        <React.Fragment>\n                            <div style={{ display: \"grid\", gridTemplateRows: \"1fr 1fr\" }}>\n                                <span className=\"last-saved-label\">{this.props.lastSavedTime ? 'Last saved at ' + this.props.lastSavedTime.format(\"HH:mm:ss\") : ''}</span>\n                                <span className=\"last-saved-label\">{this.props.lastPublishedTime && !this.props.lastSaveErr && 'Last published at ' + this.props.lastPublishedTime.format(\"HH:mm:ss\")}</span>\n                            </div>\n                            {this.props.lastSaveErr && <span className=\"pending-label\">{this.props.lastSaveErr}</span>}\n                            {this.props.buildingCategoryConnection ? <span className=\"pending-label\">Establishing category connection...</span> :\n                                this.props.buildingEntryConnection ? <span className=\"pending-label\">Establishing entry connection...</span> :\n                                    this.props.closedCategory ? <span className=\"pending-label\">Category connection closed</span> :\n                                        this.props.closedEntry ? <span className=\"pending-label\">Entry connection closed</span> :\n                                            this.props.reconnectingCategory ? <span className=\"pending-label\">Category connection reconnecting...</span> :\n                                                this.props.reconnectingEntry ? <span className=\"pending-label\">Entry connection reconnecting...</span> : \"\"}\n\n                        </React.Fragment>\n                    }\n                    <button type=\"button\" disabled={this.props.publishing || this.props.buildingCategoryConnection || this.props.buildingEntryConnection || this.props.reconnectingCategory || this.props.reconnectingEntry || this.props.closedCategory || this.props.closedEntry} className=\"button\" onClick={this.props.publishAllEntries}>Publish</button>\n                </div>\n                <div style={previewLengthStyle}>\n                    <MinutesDetails\n                        categories={newPreviewArray}\n                        publicPage={false}\n                    />\n                </div>\n            </React.Fragment>\n        )\n    }\n}\n\nconst TypeSwitcher = React.forwardRef((props, ref) => {\n    switch (props.type) {\n        case ('Order'):\n        case ('Communication'):\n        case ('General'):\n            //The following should be treated as a legislative category:\n            // - Unfinished Business (61, 62, 63)\n            // - For Immediate Consideration (151)\n            // - Bills in Conference (72)\n            // - Senate Bills with Governor's Recommendation (111)\n            // - House Bills with Governor's Recommendation (112)\n            // - Senate Bills Vetoed by Governor (109)\n            // - House Bills Vegoed by Governor (110)\n            if ([61, 62, 63, 151, 72, 109, 110, 111, 112].includes(props.formData.CalendarCategoryTypeID)) {\n                return (<div><LegislativeForm ref={ref} {...props} /></div>);\n            }\n        case ('Chairmans Report'):\n            return (<div><NonLegislativeForm ref={ref} {...props} /></div>);\n        case ('Regular Calendar'):\n        case ('Uncontested Calendar'):\n        case ('Notification'):\n            return (<div><LegislativeForm ref={ref} {...props} /></div>);\n        default:\n            return (<div><Misc ref={ref} {...props} /></div>);\n    }\n});\n\nexport default connect(\n    (state) => {\n        const { minutes, calendar, nav, members, committee, communications, bills, session } = state;\n        return {\n            minutes,\n            calendar,\n            nav,\n            members,\n            committee,\n            communications,\n            bills,\n            session\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, minutesActionCreators, calendarActionCreators, navActionCreators, memberActionCreators, committeeActionCreators, communicationsActionCreators, billActionCreators, sessionActionCreators), dispatch)\n        }\n    }\n)(MinutesManagementForm)","import React from 'react';\nimport { Route } from 'react-router';\nimport MinutesManagementGrid from './lis-minutes-grid';\nimport MinutesManagementForm from './lis-minutes-form';\n\nclass MinutesManagement extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            selectedSession: '',\n        };\n        this.handleSessionChange = this.handleSessionChange.bind(this);\n    }\n\n    handleSessionChange(value, callback) {\n        this.setState({\n            selectedSession: value\n        }, () => callback());\n    }\n\n    render() {\n        return (\n            <div>\n                <Route exact path={this.props.match.path} render={props => <MinutesManagementGrid\n                    {...props}\n                    selectedSession={this.state.selectedSession}\n                    handleSessionChange={this.handleSessionChange}\n                />} />\n                <Route path={`${this.props.match.path}/edit-minutes/:minutesbookid`} component={MinutesManagementForm} />\n            </div>\n        )\n    }\n}\n\nexport default MinutesManagement;","import React from 'react';\nimport DatePicker from 'react-datepicker';\nimport { LargeListSelect } from '../../../lis-shared/lis-layout/components/lis-forms-component';\nimport InputType from '../../lis-minutes-management/components/input-types';\nimport moment from 'moment-timezone';\n\nclass EventControls extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            eventDate: moment().utcOffset(0).set({ hour: 0, minute: 0, second: 0, millisecond: 0 }),\n            eventSequence: '',\n            event: \"\",\n            otherEvent: \"\",\n            templateInputs: [],\n            templateEdited: false,\n            otherEventSelected: false\n        };\n\n        this.handleDateChange = this.handleDateChange.bind(this);\n        this.handleSequenceChange = this.handleSequenceChange.bind(this);\n        this.handleEventChange = this.handleEventChange.bind(this);\n        this.handleOtherEventChange = this.handleOtherEventChange.bind(this);\n        this.handleTemplateChange = this.handleTemplateChange.bind(this);\n        this.addEvent = this.addEvent.bind(this);\n        this.removeEvent = this.removeEvent.bind(this);\n        this.unSelectOtherEvent = this.unSelectOtherEvent.bind(this);\n    }\n\n    handleDateChange(val) {\n        let value = moment(val).set({ hour: 0, minute: 0, second: 0, millisecond: 0 });\n        this.setState({\n            eventDate: value\n        });\n    }\n\n    handleSequenceChange(val) {\n        if (val || val === '') {\n            val = val.trim(); // ' ' (i.e. space) gets treated as a number in isNaN (below), so trim here since '' does not\n            if (val && !isNaN(val)) {\n                val = Number(val)\n                this.setState({ eventSequence: val })\n            } else if (val === '') {\n                this.setState({ eventSequence: val })\n            }\n        }\n    }\n\n    handleEventChange(val) {\n        let templateInputs = [];\n        if (val.value != \"Other\") {\n            if (val.ActionReferences && val.ActionReferences.length > 0) {\n                templateInputs = JSON.parse(JSON.stringify(val.ActionReferences));\n            }\n            this.setState({\n                event: val,\n                templateInputs: templateInputs,\n                templateEdited: false\n            });\n        } else {\n            this.setState({\n                event: val,\n                otherEventSelected: true\n            })\n            if (this.props.otherBillEventOptions.length === 0) {\n                this.props.getOtherBillEventOptions();\n            }\n        }\n    }\n\n    handleOtherEventChange(val) {\n        let templateInputs = [];\n        if (val.ActionReferences && val.ActionReferences.length > 0) {\n            templateInputs = JSON.parse(JSON.stringify(val.ActionReferences));\n        }\n        this.setState({\n            otherEvent: val,\n            templateInputs: templateInputs,\n            templateEdited: false\n        });\n    }\n\n    handleTemplateChange(_a, _b, referenceIndex, reference) {\n        let templateInputs = [...this.state.templateInputs];\n        templateInputs[referenceIndex] = reference;\n        this.setState({\n            templateInputs: templateInputs,\n            templateEdited: true\n        });\n    }\n\n    addEvent() {\n        let eventObj = this.state.event.value != \"Other\" ? { ...this.state.event } : { ...this.state.otherEvent };\n        if (eventObj.ActionReferences && eventObj.ActionReferences.length > 0 && this.state.templateInputs.length > 0 && this.state.templateEdited) {\n            eventObj.EventReferences = this.state.templateInputs;\n            eventObj.Description = this.state.templateInputs.map(tInput => {\n                if (!tInput.ReferenceText) {\n                    return `${tInput.ActionReferenceType}`\n                }\n                return tInput.ReferenceText\n            }).join('');\n        } else {\n            eventObj.Description = eventObj.label;\n        }\n        let actorType = '';\n        switch (eventObj.EventCode ? eventObj.EventCode[0].toUpperCase() : eventObj.LegislationChamberCode) {\n            case 'H':\n                actorType = 'House';\n                break;\n            case 'S':\n                actorType = 'Senate';\n                break;\n            case 'C':\n                actorType = 'Conference';\n                break;\n            case 'G':\n                actorType = 'Governor';\n                break;\n        }\n        eventObj.ActorType = actorType;\n        this.props.addEvent(this.state.eventDate, this.state.eventSequence, eventObj);\n        //Reset the selectors after adding the event\n        this.unSelectOtherEvent();\n        this.setState({\n            eventAdded: true,\n            eventSequence: ''\n        });\n        setTimeout(() => {\n            this.setState({\n                eventAdded: false\n            })\n        }, 2000)\n    }\n\n    removeEvent() {\n        this.props.removeEvent(this.state.eventDate, this.state.event, this.state.eventSequence || null)\n        this.setState({\n            eventRemoved: true\n        });\n        setTimeout(() => {\n            this.setState({\n                eventRemoved: false\n            })\n        }, 2000)\n    }\n\n    unSelectOtherEvent() {\n        this.setState({\n            otherEventSelected: false,\n            event: \"\",\n            templateInputs: [],\n            templateEdited: false,\n            otherEvent: \"\"\n        })\n    }\n\n    render() {\n        const { billEventOptions, otherBillEventOptions } = this.props;\n        const fontSize = '0.8em';\n        const selectStyle = {\n            control: styles => ({\n                ...styles,\n                minHeight: '0px',\n                padding: '0.12em 0.6em !important',\n            }),\n            valueContainer: styles => ({\n                ...styles,\n                padding: 0,\n            }),\n            input: styles => ({\n                ...styles,\n                fontSize: fontSize,\n                lineHeight: 'normal',\n            }),\n            singleValue: styles => ({\n                ...styles,\n                fontSize: fontSize,\n            }),\n            placeholder: styles => ({\n                ...styles,\n                fontSize: fontSize\n            }),\n            option: styles => ({\n                ...styles,\n                fontSize: fontSize\n            }),\n            dropdownIndicator: styles => ({\n                ...styles,\n                padding: '4px'\n            }),\n        }\n        const buttonDisabled = !this.state.event\n            || !this.state.eventDate\n            || this.props.checkedBills.every(c => !c)\n            || this.state.eventAdded\n            || this.state.eventRemoved;\n        return (\n            <div>\n                <span style={{ fontSize: '12px' }}>* indicates required field</span>\n                <div className=\"extra-spacing dlas-forms inner-grid\" style={{ gridTemplateColumns: '1fr 0.5fr 3fr' }}>\n                    <div>\n                        <label>Event Date*</label>\n                        <DatePicker\n                            required\n                            selected={this.state.eventDate}\n                            onChange={this.handleDateChange}\n                            className='event-date-picker'\n                        />\n                    </div>\n                    <div>\n                        <label>Sequence</label>\n                        <input min={0} style={{ width: '80%' }} maxLength={3} value={this.state.eventSequence} onChange={(e) => this.handleSequenceChange(e.target.value)} />\n                    </div>\n                    <div style={{ width: '100%' }}>\n                        <label>Event*</label>\n                        <div className=\"inner-grid bill-history-event-controls\">\n                            <LargeListSelect\n                                required\n                                options={billEventOptions}\n                                styles={selectStyle}\n                                value={this.state.event}\n                                getOptionLabel={opt => opt.EventCode ? \"(\" + opt.EventCode + \") \" + opt.label : opt.label}\n                                onChange={this.handleEventChange}\n                                isDisabled={this.state.otherEventSelected}\n                            />\n                            {this.state.otherEventSelected &&\n                                <button type=\"button\" className='icon delete' onClick={() => this.unSelectOtherEvent()}></button>\n                            }\n                        </div>\n                        {this.state.otherEventSelected &&\n                            <div className=\"inner-grid bill-history-event-controls\" style={{ marginTop: \"10px\" }}>\n                                <LargeListSelect\n                                    options={otherBillEventOptions}\n                                    styles={selectStyle}\n                                    value={this.state.otherEvent}\n                                    getOptionLabel={opt => opt.EventCode ? \"(\" + opt.EventCode + \") \" + opt.label : opt.label}\n                                    onChange={this.handleOtherEventChange}\n                                />\n                            </div>\n                        }\n                    </div>\n                </div>\n                {this.state.templateInputs.length > 0 &&\n                    <div >\n                        <InputType\n                            memberList={this.props.patronList}\n                            comitteeList={this.props.committeeList}\n                            textList={this.props.textList}\n                            actionTypes={this.props.actionTypes}\n                            handleChange={this.handleTemplateChange}\n                            entryIndex={0}\n                            activityIndex={0}\n                            references={this.state.templateInputs}\n                        />\n                    </div>\n                }\n                <br />\n                <div>\n                    <div></div>\n                    <div className=\"align-right inline-list\">\n                        <button disabled={buttonDisabled} type=\"button\" className=\"button\" onClick={this.addEvent}>{this.state.eventAdded ? \"Event Added\" : \"Add Event\"}</button>\n                        <button disabled={buttonDisabled} type=\"button\" className=\"button danger\" onClick={this.removeEvent}>{this.state.eventRemoved ? \"Event Removed\" : \"Remove Event\"}</button>\n                    </div>\n                </div>\n                <br />\n                <hr className=\"faded-line\" />\n            </div>\n        )\n    }\n}\n\n\nexport default EventControls;\n","import React from 'react';\nimport Select from 'react-select';\nimport DatePicker from 'react-datepicker';\nimport { Link } from 'react-router-dom';\nimport { authActionCreators } from '../../stores/lis-auth-store';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\n\nconst singleStyles = {\n    menuList: (base, state) => ({\n        ...base,\n        paddingTop: '0px',\n    }),\n    group: (base, state) => ({\n        ...base,\n        paddingTop: '0px',\n    }),\n    groupHeading: (base, state) => ({\n        ...base,\n        paddingTop: '7px',\n        paddingBottom: '7px',\n        marginBottom: '0px',\n        position: 'sticky',\n        top: '0px',\n        backgroundColor: 'hsl(0,0%,100%)'\n    }),\n}\n\nclass BillCategories extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            selectedPatron: '',\n            selectedCommittee: '',\n            selectedSubject: '',\n            selectedDate: null\n        };\n        this.handlePatronChange = this.handlePatronChange.bind(this);\n        this.handleCommitteeChange = this.handleCommitteeChange.bind(this);\n        this.handleSubjectChange = this.handleSubjectChange.bind(this);\n        this.handleDateChange = this.handleDateChange.bind(this);\n    }\n\n    handlePatronChange(val) {\n        this.setState({\n            selectedPatron: val\n        }, () => {\n            //The next step is done after the state change to make sure the user sees what member was selected before going to the advanced search page\n            const param = {\n                selectedPatron: this.state.selectedPatron.MemberID,\n                selectedSession: this.props.session.SessionID\n            };\n            const link = window.btoa(JSON.stringify(param));\n            this.props.history.push(this.props.history.location.pathname + '?q=' + link);\n        });\n    }\n\n    handleCommitteeChange(val) {\n        this.setState({\n            selectedCommittee: val\n        }, () => {\n            const param = {\n                selectedCommittee: this.state.selectedCommittee.CommitteeID,\n                selectedSession: this.props.session.SessionID,\n                selectedBillStatusCategory: this.props.statusCategoriesList.find(category => category.Name === \"In Committee\").LegislationCategoryID\n            };\n            const link = window.btoa(JSON.stringify(param));\n            this.props.history.push(this.props.history.location.pathname + '?q=' + link);\n        });\n    }\n\n    handleSubjectChange(val) {\n        this.setState({\n            selectedSubject: val\n        }, () => {\n            //The next step is done after the state change to make sure the user sees what member was selected before going to the advanced search page\n            const param = {\n                selectedSubject: this.state.selectedSubject.SubjectIndexID,\n                selectedSession: this.props.session.SessionID\n            }\n            const link = window.btoa(JSON.stringify(param));\n            this.props.history.push(this.props.history.location.pathname + '?q=' + link);\n        });\n    }\n\n    handleDateChange(val) {\n        this.setState({\n            selectedDate: val\n        }, () => {\n            const introDate = this.state.selectedDate.clone();\n            introDate.hour(0);\n            const param = {\n                introductionDate: introDate.format(),\n            };\n            const link = window.btoa(JSON.stringify(param));\n            this.props.history.push(this.props.history.location.pathname + '?q=' + link);\n        });\n    }\n\n    makeLink(statusCategoryName, currentStatus, honorExcludeFailed) {\n        let statusCategoryId;\n        //try to find a status category with the name provided, if there is one (if there isn't one, it returns all legislation)\n        if (statusCategoryName) {\n            const statusCategory = this.props.statusCategoriesList.find(category => category.Name.toLowerCase() === statusCategoryName.toLowerCase());\n            //if we do not find a status category, default to Id 99 - this makes it so no results are returned; clean, but also tells the user that something is wrong\n            statusCategoryId = statusCategory ? statusCategory.LegislationCategoryID : 99;\n        }\n\n        const params = {\n            selectedSession: this.props.session ? this.props.session.SessionID : '',\n            selectedBillStatusCategory: statusCategoryId,\n            currentStatus: currentStatus || false,\n            excludeFailed: honorExcludeFailed ? this.props.excludeFailed : false,\n            allLegislation: !statusCategoryName ? true : false,\n            //This is used so if the user clicks a link and goes back to the bill categories screen and clicks the same link another search will be made\n            //If this was omitted then the url wouldn't change and a new search wouldn't be made\n            uniqueSearch: Math.random(),\n        };\n        const json = JSON.stringify(params);\n        const query = window.btoa(json);\n        return this.props.history.location.pathname + '?q=' + query;\n    }\n\n    render() {\n        const { session } = this.props;\n        const sessionHeader = <h2 id=\"search-selections-header\">{session ? session.SessionYear + ' ' + session.DisplayName : ''}<span className=\"mobile-newline\">:</span> Bills by Category</h2>;\n        //The frequent link is a little different from the rest. MostFrequent needs to be true and there is not a status id\n        const frequentParams = {\n            selectedSession: session ? session.SessionID : '',\n            mostFrequent: true,\n            uniqueSearch: Math.random(),\n            excludeFailed: this.props.excludeFailed\n        }\n        const frequentJson = JSON.stringify(frequentParams);\n        const frequentQuery = window.btoa(frequentJson);\n        const frequentLink = this.props.history.location.pathname + '?q=' + frequentQuery;\n\n        return (\n            <div className=\"lis-search-categories\">\n                <div>\n                    {sessionHeader}\n                    <hr className=\"faded-line\" />\n                </div>\n                <div className=\"dlas-forms inner-grid four\" style={{ marginBottom: '1em' }}>\n                    <div>\n                        <label htmlFor=\"sr-member\" className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Bills by Member</label>\n                        <Select\n                            id=\"sr-member\"\n                            options={this.props.patronList}\n                            placeholder=\"Choose a Member\"\n                            value={this.state.selectedMember}\n                            onChange={this.handlePatronChange}\n                            className=\"grid-selector-dropdown\"\n                            classNamePrefix=\"grid-selector-dropdown\"\n                        />\n                    </div>\n                    <div>\n                        <label htmlFor=\"sr-committee\" className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Bills by Committee</label>\n                        <Select\n                            id=\"sr-committee\"\n                            styles={singleStyles}\n                            options={this.props.committeeList}\n                            placeholder=\"Choose a Committee\"\n                            value={this.state.selectedCommittee}\n                            onChange={this.handleCommitteeChange}\n                            className=\"grid-selector-dropdown\"\n                            classNamePrefix=\"grid-selector-dropdown\"\n                        />\n                    </div>\n                    <div>\n                        <label htmlFor=\"sr-subject\" className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Bills by Subject</label>\n                        <Select\n                            id=\"sr-subject\"\n                            options={this.props.subjectList}\n                            placeholder=\"Choose a Subject\"\n                            value={this.state.selectedSubject}\n                            onChange={this.handleSubjectChange}\n                            className=\"grid-selector-dropdown\"\n                            classNamePrefix=\"grid-selector-dropdown\"\n                        />\n                    </div>\n                    <div>\n                        <label htmlFor=\"sr-introduced\" className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Bills Introduced by Day</label>\n                        <DatePicker\n                            id=\"sr-introduced\"\n                            includeDates={this.props.introDateList}\n                            selected={this.state.selectedDate}\n                            onChange={this.handleDateChange}\n                        />\n                    </div>\n                </div>\n                <hr className=\"faded-line\" />\n                {\n                    this.props.isLoading ?\n                        <div className=\"spinner center-spinner\"></div>\n                        :\n                        <div>\n                            <div className=\"inner-grid four\">\n                                <div className=\"homepage-links\">\n                                    <h3 className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Introduced</h3>\n                                    <div>\n                                        <Link to={this.makeLink(\"\", false, true)}>All legislation</Link>\n                                    </div>\n                                    <div>\n                                        <Link to={frequentLink}>Most frequently accessed</Link>\n                                    </div>\n                                </div>\n                                <div className=\"homepage-links\">\n                                    <h3 className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Passed</h3>\n                                    <div>\n                                        <Link to={this.makeLink(\"Passed House\", false, true)}>Passed the House</Link>\n                                    </div>\n                                    <div>\n                                        <Link to={this.makeLink(\"Passed Senate\", false, true)}>Passed the Senate</Link>\n                                    </div>\n                                    <div>\n                                        <Link to={this.makeLink(\"Passed\", false, true)}>Passed</Link>\n                                    </div>\n                                    <div>\n                                        <Link to={this.makeLink(\"Enrolled\", false, true)}>Enrolled</Link>\n                                    </div>\n                                    <div>\n                                        <Link to={this.makeLink(\"Signed by Speaker & President\", false, true)}>Signed by Speaker &amp; President</Link>\n                                    </div>\n                                </div>\n                                <div className=\"homepage-links\">\n                                    <h3 className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Sent to Conference</h3>\n                                    <div>\n                                        <Link to={this.makeLink(\"In Conference\", true, false)}>In Conference</Link>\n                                    </div>\n                                    <div>\n                                        <Link to={this.makeLink(\"Conference Report Agreed to\", false, true)}>Conference Report Agreed to</Link>\n                                    </div>\n                                    <div>\n                                        <Link to={this.makeLink(\"Failed in Conference\", false, false)}>Failed in Conference</Link>\n                                    </div>\n                                </div>\n                                <div className=\"homepage-links\">\n                                    <h3 className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Governor</h3>\n                                    <div>\n                                        <Link to={this.makeLink(\"Governor's Recommendations\", false, true)}>Governor's recommendations</Link>\n                                    </div>\n                                    <div>\n                                        <Link to={this.makeLink(\"Governor's Recommendation Adopted\", false, true)}>Governor's recommendation adopted</Link>\n                                    </div>\n                                    <div>\n                                        <Link to={this.makeLink(\"Approved or Enacted\", false, false)}>Approved or enacted</Link>\n                                    </div>\n                                    <div>\n                                        <Link to={this.makeLink(\"Vetoed\", false, false)}>Vetoed</Link>\n                                    </div>\n                                    <div>\n                                        <Link to={this.makeLink(\"Acts of Assembly chapters\", false, false)}>Acts of Assembly chapters</Link>\n                                    </div>\n                                </div>\n                            </div>\n                            <div className=\"inner-grid four\">\n                                <div className=\"homepage-links\">\n                                    <h3 className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Failed/Awaiting Action</h3>\n                                    <div>\n                                        <Link to={this.makeLink(\"Failed\", false, false)}>Failed</Link>\n                                    </div>\n                                    <div>\n                                        <Link to={this.makeLink(\"Pending\", true, false)}>Pending</Link>\n                                    </div>\n                                    <div>\n                                        <Link to={this.makeLink(\"Continued to next session\", true, true)}>Continued to next session</Link>\n                                    </div>\n                                    <div>\n                                        <Link to={this.makeLink(\"Continued from last session\", false, true)}>Continued from last session</Link>\n                                    </div>\n                                </div>\n                                <div className=\"homepage-links\">\n                                    <h3 className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Incorporated</h3>\n                                    <div>\n                                        <Link to={this.makeLink(\"Incorporated\", false, true)}>Incorporated</Link>\n                                    </div>\n                                </div>\n                                {this.props.location.includes('bill-search') && this.props.login.userClaims.roles.find((x) => x === \"Admin\") &&\n                                    <div className=\"homepage-links\">\n                                        <h3 className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Parallel</h3>\n                                        <div>\n                                            <Link to={this.makeLink(\"Parallel\", false, true)}>Parallel</Link>\n                                        </div>\n                                    </div>\n                                }\n                            </div>\n                        </div>\n                }\n            </div>\n        )\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { login } = state;\n        return {\n            login,\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, authActionCreators), dispatch)\n        }\n    }\n)(BillCategories)\n","import React from 'react';\nimport moment from 'moment-timezone';\nimport Select from 'react-select';\nimport DatePicker from 'react-datepicker';\nimport * as Fields from '../../lis-shared/lis-layout/components/lis-forms-component';\n\n// The parent component is in charge of gathering all the data for the form's dropdowns\n// The paren't state object is updated with the ID of whatever the user selects\n// Normally, the state object is updated with the entire object that the user selects.\n// But, to be able to make a query from another page either the whole object needs to be passed in the url\n// Or just the ID. Since it is easier to pass just the ID in the url to the advanced search page\n// the dropdowns find the object that has the ID that was passed.\n\n// As an example, a session ID of 47 is in the url.\n// So the dropdown selects its value by searching through the available sessions and finding the one that has an ID of 47\n\nconst singleStyles = {\n    menuList: (base, state) => ({\n        ...base,\n        paddingTop: '0px',\n    }),\n    group: (base, state) => ({\n        ...base,\n        paddingTop: '0px',\n    }),\n    groupHeading: (base, state) => ({\n        ...base,\n        paddingTop: '7px',\n        paddingBottom: '7px',\n        marginBottom: '0px',\n        position: 'sticky',\n        top: '0px',\n        backgroundColor: 'hsl(0,0%,100%)'\n    }),\n    option: (base, state) => ({\n        ...base,\n        fontSize: '0.8em',\n    }),\n    control: (base) => ({\n        ...base,\n        padding: '1px',\n        margin: 0,\n        minHeight: 0,\n        fontSize: '0.8em',\n    }),\n    dropdownIndicator: (base) => ({\n        ...base,\n        padding: '0px 8px'\n    }),\n    clearIndicator: (base) => ({\n        ...base,\n        padding: '0px 8px'\n    }),\n    singleValue: (base, state) => {\n        return { ...base, };\n    }\n}\n\nclass AdvancedSearchBoxComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            billStatusDateError: false,\n            showFindSection: false,\n            showCategorySection: false,\n            showTooltip: false\n        };\n\n        this.toggleFindSection = this.toggleFindSection.bind(this);\n        this.toggleCategorySection = this.toggleCategorySection.bind(this);\n        this.handleSubmit = this.handleSubmit.bind(this);\n        this.toggleTooltip = this.toggleTooltip.bind(this);\n        this.setOpenSection = this.setOpenSection.bind(this);\n    }\n\n    toggleFindSection() {\n        this.setState(state => ({\n            showFindSection: !state.showFindSection,\n            showCategorySection: !state.showCategorySection\n        }), () => {\n            this.props.toggleShowCategories(!this.props.showCategories)\n        });\n    }\n\n    toggleCategorySection() {\n        this.setState(state => ({\n            showCategorySection: !state.showCategorySection,\n            showFindSection: !state.showFindSection\n        }), () => {\n            this.props.toggleShowCategories(!this.props.showCategories)\n        });\n    }\n\n    toggleTooltip(state) {\n        let showTooltip = { ...this.state.showTooltip };\n\n        //Close all open tooltips\n        if (typeof showTooltip === \"object\") {\n            for (const x in showTooltip) {\n                if (x !== state)\n                    showTooltip[x] = false;\n            };\n        }\n\n        showTooltip[state] = showTooltip[state] ? false : true;\n\n        this.setState({\n            showTooltip: showTooltip\n        })\n    }\n\n    handleSubmit() {\n        if (this.props.failedToGetSessions) { return; }\n        // If the status start date and end date are just the session start and end date then just send the session ID. The database query is a little quicker with just the session ID\n        let { billStatusStartDate, billStatusEndDate } = this.props;\n        if (!this.props.currentStatus && this.props.selectedBillStatusCategory) {\n            if (this.props.selectedSession) {\n                const adjournmentEvent = this.props.selectedSession.SessionEvents.find(event => event.DisplayName === 'Adjournment');\n                if (this.props.selectedSession.SessionEvents.find(event => event.DisplayName === \"Session Start\") && moment(this.props.selectedSession.SessionEvents.find(event => event.DisplayName === \"Session Start\").ActualDate).isSame(billStatusStartDate) &&\n                    (adjournmentEvent ? moment(adjournmentEvent.ActualDate) : moment().endOf('day')).isSame(billStatusEndDate)) {\n                    billStatusStartDate = null;\n                    billStatusEndDate = null;\n                }\n            }\n        }\n        //Create an object to be encoded to base64 and stuck in the url\n        let queryObj = {\n            selectedBillNumbers: this.props.selectedBillNumbers,\n            selectedBillRangeBeginning: this.props.selectedBillRangeBeginning,\n            selectedBillRangeEnd: this.props.selectedBillRangeEnd,\n            selectedChapterNumber: this.props.selectedChapterNumber,\n            selectedKeywords: this.props.selectedKeywords,\n            selectedLocation: this.props.selectedLocation,\n            selectedSummaryVersion: this.props.selectedSummaryVersion,\n            selectedBillVersion: this.props.selectedBillVersion,\n            selectedSession: this.props.selectedSession.SessionID,\n            selectedBillStatusCategory: this.props.selectedBillStatusCategory,\n            billStatusStartDate: billStatusStartDate,\n            billStatusEndDate: billStatusEndDate,\n            selectedCommittee: this.props.selectedCommittee,\n            selectedSubcommittee: this.props.selectedSubcommittee,\n            selectedPatron: this.props.selectedPatron,\n            selectedSubject: this.props.selectedSubject,\n            selectedPatronType: this.props.selectedPatronType,\n            selectedChamber: this.props.selectedChamber,\n            selectedBillType: this.props.selectedBillType,\n            selectedBillEvent: this.props.selectedBillEvent,\n            billEventStartDate: this.props.billEventStartDate,\n            billEventEndDate: this.props.billEventEndDate,\n            billActionStartDate: this.props.billActionStartDate,\n            billActionEndDate: this.props.billActionEndDate,\n            keywordUseGlobalSessionSearch: this.props.keywordUseGlobalSessionSearch,\n            currentStatus: this.props.currentStatus,\n            excludeFailed: this.props.excludeFailed\n        }\n        this.props.handleSubmit(queryObj)\n    }\n\n    setOpenSection() {\n        //900px is when mobile layout is used (set in mobile.scss); collapse by default : false\n        this.setState({\n            showCategorySection: this.props.showCategories || this.props.searchParam.length === 0 ? window.innerWidth <= 900 ? false : true : false,\n            showFindSection: this.props.showCategories || this.props.searchParam.length === 0 ? false : window.innerWidth <= 900 ? false : true\n        })\n    }\n\n    componentDidMount() {\n        this.setOpenSection();\n    }\n\n    componentDidUpdate(prevProps) {\n        if (this.props.searchParam !== prevProps.searchParam) {\n            if (this.props.searchParam === \"\") {\n                this.setState({\n                    showCategorySection: true,\n                    showFindSection: false\n                })\n            } else {\n                this.setState({\n                    showCategorySection: false,\n                    showFindSection: true\n                })\n            }\n        }\n    }\n\n    render() {\n        const getSelectedCommitteeLabel = (val) => {\n            if (!val) return null;\n            let newCmte = { ...val } //don't modify existing committee values stored at state level & used in dropdown\n            if (newCmte && newCmte.label) {\n                newCmte.label = '(' + newCmte.ChamberCode + ') ' + newCmte.label;\n            }\n            return newCmte;\n        }\n        return (\n            <React.Fragment>\n                <div className={this.props.location.includes('bill-management') ? \"dlas-forms side-form advanced-search management\" : \"dlas-forms side-form advanced-search\"}>\n                    <div className=\"header flex-row flex-vertical-center\" style={!this.state.showCategorySection ? { marginBottom: \"20px\" } : {}}>\n                        <h3 className=\"center category-header\">View Bills By Category</h3>\n                        <button type=\"button\" aria-expanded={this.state.showCategorySection} onClick={this.toggleCategorySection} className={this.state.showCategorySection ? \"arrow-up white-chevron\" : \"arrow-down white-chevron\"}></button>\n                    </div>\n                    {this.state.showCategorySection &&\n                        <div style={{ marginBottom: \"20px\" }}>\n                            <div>\n                                <div onClick={() => { this.props.showCategories ? null : this.props.toggleShowCategories(!this.props.showCategories) }} className=\"side-form-group advanced-search-fieldset-header\" style={this.props.showCategories ? { cursor: 'pointer', backgroundColor: '#e0e0e0' } : { cursor: 'pointer' }}>\n                                    <span className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Bills by Category</span>\n                                    <a onClick={(e) => { e.stopPropagation(e); this.toggleTooltip(\"billCategories\") }} className=\"button info\">Info</a>\n                                    {this.state.showTooltip[\"billCategories\"] &&\n                                        <div className=\"info-box search-tooltip\">\n                                            <p>This is a view where we provide easy to access, common categories of legislation.</p>\n                                        </div>\n                                    }\n                                </div>\n                            </div>\n                            <div>\n                                <div className=\"side-form-group advanced-search-fieldset-header\">\n                                    <label htmlFor=\"exclude-failed-button\" className={(this.props.location.includes('bill-search') ? \"txt-dark-blue \" : \"\") + `no-background${this.props.keywordUseGlobalSessionSearch ? ' txt-greyed' : ''}`} style={{ whiteSpace: \"no-wrap\", marginTop: '0px', fontSize: \"17px\" }}>Exclude Failed Legislation</label>\n                                    <a onClick={(e) => { e.stopPropagation(e); this.toggleTooltip(\"excludeFailed\") }} className=\"button info\">Info</a>\n                                    {this.state.showTooltip[\"excludeFailed\"] &&\n                                        <div className=\"info-box search-tooltip\">\n                                            <p>{\"Turning this switch on will exclude all failed bills from your search results.\"}</p>\n                                            <p>{\"This option will not be honored for the following category searches:\"}\n                                                <ul>\n                                                    <li>In Conference</li>\n                                                    <li>Failed in Conference</li>\n                                                    <li>Approved or enacted</li>\n                                                    <li>Vetoed</li>\n                                                    <li>Acts of Assembly chapters</li>\n                                                    <li>Failed</li>\n                                                    <li>Pending</li>\n                                                </ul>\n                                            </p>\n                                            <p>{\"This option will be disabled if you are performing a keyword search across all sessions.\"}</p>\n                                        </div>\n                                    }\n                                    <div className=\"flex-row flex-vertical-center flex-start\" style={{ marginBottom: '3%' }}>\n                                        <div className=\"toggle-switch\" disabled={this.props.keywordUseGlobalSessionSearch} onClick={() => this.props.handleExcludeFailedChange()}>\n                                            <input id=\"exclude-failed-button\" checked={this.props.excludeFailed} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                            <span className=\"slider\"></span>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    }\n                </div>\n                <div className={this.props.location.includes('bill-management') ? \"dlas-forms side-form advanced-search management\" : \"dlas-forms side-form advanced-search\"}>\n                    <div className=\"header flex-row flex-vertical-center\">\n                        <h3 className=\"center category-header\">Find a Bill</h3>\n                        <button type=\"button\" aria-expanded={this.state.showFindSection} onClick={this.toggleFindSection} className={this.state.showFindSection ? \"arrow-up white-chevron\" : \"arrow-down white-chevron\"}></button>\n                    </div>\n                    {this.state.showFindSection &&\n                        <div className=\"content\">\n                            <div>\n                                <div className=\"side-form-group advanced-search-fieldset-header\">\n                                    <label htmlFor=\"exclude-failed-button\" className={(this.props.location.includes('bill-search') ? \"txt-dark-blue \" : \"\") + `no-background${this.props.keywordUseGlobalSessionSearch ? ' txt-greyed' : ''}`} style={{ whiteSpace: \"no-wrap\", marginTop: '0px', fontSize: \"17px\" }}>Exclude Failed Legislation</label>\n                                    <a onClick={(e) => { e.stopPropagation(e); this.toggleTooltip(\"excludeFailed\") }} className=\"button info\">Info</a>\n                                    {this.state.showTooltip[\"excludeFailed\"] &&\n                                        <div className=\"info-box search-tooltip\">\n                                            <p>{\"Turning this switch on will exclude all failed bills from your search results.\"}</p>\n                                            <p>{\"This option will be disabled if you are performing a keyword search across all sessions.\"}</p>\n                                        </div>\n                                    }\n                                    <div className=\"flex-row flex-vertical-center flex-start\" style={{ marginBottom: '3%' }}>\n                                        <div className=\"toggle-switch\" disabled={this.props.keywordUseGlobalSessionSearch} onClick={() => this.props.handleExcludeFailedChange()}>\n                                            <input id=\"exclude-failed-button\" checked={this.props.excludeFailed} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                            <span className=\"slider\"></span>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                            <div style={{ cursor: 'pointer' }} onClick={() => this.props.toggleGroup(\"billFieldset\")} className=\"advanced-search-fieldset-header\">\n                                <span className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Bill Number</span>\n                                <a onClick={(e) => { e.stopPropagation(e); this.toggleTooltip(\"billNumber\") }} className=\"button info\">Info</a>\n                                {this.state.showTooltip[\"billNumber\"] &&\n                                    <div className=\"info-box search-tooltip\">\n                                        <p>{\"Use > to search for all legislation with a number after the one entered (HB5> returns all house bills with a number after 5)\"}</p>\n                                        <p>{\"Use < to search for all legislation with a number before the one entered (HB5< returns all house bills with a number before 5)\"}</p>\n                                        <p>{\"Use a comma to search for a list of two or more bills (HB53, HB98)\"}</p>\n                                    </div>\n                                }\n                                <button aria-expanded={this.props.billFieldset} type=\"button\" className={this.props.billFieldset ? \"arrow-up\" : \"arrow-down\"}></button>\n                            </div>\n                            {this.props.billFieldset &&\n                                <fieldset>\n                                    <div>\n                                        <Fields.TextInput\n                                            type=\"text\"\n                                            id=\"se-bill-numbers\"\n                                            label=\"Bill Number(s)\"\n                                            onChange={(evt) => this.props.handleTextChange(evt, 'selectedBillNumbers')}\n                                            value={this.props.selectedBillNumbers}\n                                            placeholder=\"ex. hb1\"\n                                        />\n                                    </div>\n                                    <div className=\"multi-row two two-mobile no-margin\">\n                                        <div>\n                                            <Fields.TextInput\n                                                type=\"text\"\n                                                id=\"se-bill-range-start\"\n                                                label=\"Bill Range\"\n                                                onChange={(evt) => this.props.handleTextChange(evt, 'selectedBillRangeBeginning')}\n                                                value={this.props.selectedBillRangeBeginning}\n                                                placeholder=\"ex. hb1\"\n                                            />\n                                        </div>\n                                        <div>\n                                            <br />\n                                            <label htmlFor=\"se-bill-range-end\" className=\"screen-reader-only\">Bill range end</label>\n                                            <input\n                                                type=\"text\"\n                                                id=\"se-bill-range-end\"\n                                                onChange={(evt) => this.props.handleTextChange(evt, 'selectedBillRangeEnd')}\n                                                value={this.props.selectedBillRangeEnd}\n                                                placeholder=\"ex. hb10\"\n                                            />\n                                        </div>\n                                    </div>\n                                    <div>\n                                        <Fields.TextInput\n                                            type=\"text\"\n                                            id=\"se-chapter-numbers\"\n                                            label=\"Chapter Number\"\n                                            onChange={(evt) => this.props.handleTextChange(evt, 'selectedChapterNumber')}\n                                            value={this.props.selectedChapterNumber}\n                                            placeholder={\"ex. ch3\"}\n                                        />\n                                    </div>\n                                </fieldset>\n                            }\n                            <div style={{ cursor: 'pointer' }} onClick={() => this.props.toggleGroup(\"keywordFieldset\")} className=\"advanced-search-fieldset-header\">\n                                <span className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Keyword</span>\n                                <a onClick={(e) => { e.stopPropagation(e); this.props.toggleHelpModal() }} title=\"Search Help\" className=\"button info\">Info</a>\n                                <button aria-expanded={this.props.keywordFieldset} type=\"button\" className={this.props.keywordFieldset ? \"arrow-up\" : \"arrow-down\"}></button>\n                            </div>\n                            {this.props.keywordFieldset &&\n                                <fieldset>\n                                    {!this.props.billManagement &&\n                                        <React.Fragment>\n                                            <div className=\"multi-row two-max\" >\n                                                <div className=\"label-and-radio\">\n                                                    <label htmlFor=\"selected-session-button\" className={`label radio-label`}>{this.props.selectedSession ? this.props.selectedSession.SessionYear + \" \" + this.props.selectedSession.DisplayName : 'Selected Session'}</label>\n                                                    <input id=\"selected-session-button\" checked={this.props.keywordUseGlobalSessionSearch === false} onChange={() => this.props.handleRadioChange()} type=\"radio\" />\n                                                </div>\n                                                <div className=\"label-and-radio\">\n                                                    <label htmlFor=\"all-sessions-button\" className={`label radio-label`}>All Sessions</label>\n                                                    <input id=\"all-sessions-button\" checked={this.props.keywordUseGlobalSessionSearch === true} onChange={() => this.props.handleRadioChange()} type=\"radio\" />\n                                                </div>\n                                            </div>\n                                        </React.Fragment>\n                                    }\n                                    <div>\n                                        <label htmlFor=\"se-keywords\" className=\"screen-reader-only\">Keywords</label>\n                                        <Fields.TextInput\n                                            type=\"text\"\n                                            id=\"se-keywords\"\n                                            onChange={(evt) => this.props.handleTextChange(evt, 'selectedKeywords')}\n                                            value={this.props.selectedKeywords}\n                                            placeholder={this.props.selectedLocation === \"Caption\" ? \"A brief description of the bill\" : \"Keyword\"}\n                                        />\n                                    </div>\n                                    <div>\n                                        <div>\n                                            <label>Search within</label>\n                                        </div>\n                                        <div className=\"checkbox-container\">\n                                            <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                                <div className=\"toggle-switch\" onClick={() => this.props.handleSelectChange({ value: this.props.selectedLocation !== 'Caption' ? 'Caption' : '' }, 'selectedLocation')}>\n                                                    <input id=\"se-caption\" checked={this.props.selectedLocation === 'Caption'} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                                    <span className=\"slider\"></span>\n                                                </div>\n                                                <label htmlFor=\"se-caption\" className=\"checkbox-label no-background\" style={{ whiteSpace: \"no-wrap\", marginTop: '0px' }}>Caption</label>\n                                            </div>\n                                            <hr className=\"faded-line\" />\n                                            <div className=\"checkbox\">\n                                                <div className=\"flex-row flex-vertical-center flex-start\">\n                                                    <div className=\"toggle-switch\" onClick={() => this.props.handleSelectChange({ value: this.props.selectedLocation !== 'Bill Text' ? 'Bill Text' : '' }, 'selectedLocation')}>\n                                                        <input id=\"se-bill-text\" checked={this.props.selectedLocation === 'Bill Text'} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                                        <span className=\"slider\"></span>\n                                                    </div>\n                                                    <label htmlFor=\"se-bill-text\" className=\"checkbox-label no-background\" style={{ whiteSpace: \"no-wrap\", marginTop: '0px' }}>Bill Text</label>\n                                                </div>\n                                                <label htmlFor=\"sr-bill-text-type\" className=\"screen-reader-only\" >Bill text type</label>\n                                                <Select\n                                                    id=\"sr-bill-text-type\"\n                                                    isDisabled={this.props.selectedLocation !== 'Bill Text'}\n                                                    styles={singleStyles}\n                                                    options={this.props.billVersionList}\n                                                    value={this.props.billVersionList.find(ver => ver.value === this.props.selectedBillVersion)}\n                                                    onChange={opt => this.props.handleSelectChange(opt, 'selectedBillVersion')} />\n                                            </div>\n                                            <hr className=\"faded-line\" />\n                                            <div className=\"checkbox\">\n                                                <div className=\"flex-row flex-vertical-center flex-start\">\n                                                    <div className=\"toggle-switch\" onClick={() => this.props.handleSelectChange({ value: this.props.selectedLocation !== 'Summary' ? 'Summary' : '' }, 'selectedLocation')}>\n                                                        <input id=\"se-bill-summary\" checked={this.props.selectedLocation === 'Summary'} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                                        <span className=\"slider\"></span>\n                                                    </div>\n                                                    <label htmlFor=\"se-bill-summary\" className=\"checkbox-label no-background\" style={{ whiteSpace: \"no-wrap\", marginTop: '0px' }}>Bill Summary</label>\n                                                </div>\n                                                <label htmlFor=\"sr-bill-summary-type\" className=\"screen-reader-only\" >Bill summary type</label>\n                                                <Select\n                                                    id=\"sr-bill-summary-type\"\n                                                    isDisabled={this.props.selectedLocation !== 'Summary'}\n                                                    styles={singleStyles}\n                                                    options={this.props.billSummaryList}\n                                                    value={this.props.billSummaryList.find(ver => ver.value === this.props.selectedSummaryVersion)}\n                                                    onChange={opt => this.props.handleSelectChange(opt, 'selectedSummaryVersion')} />\n                                            </div>\n                                        </div>\n                                    </div>\n                                </fieldset>\n                            }\n                            <div style={{ cursor: 'pointer' }} onClick={() => this.props.toggleGroup(\"statusFieldset\")} className=\" advanced-search-fieldset-header\">\n                                <span className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Legislation Status</span>\n                                <a onClick={(e) => { e.stopPropagation(e); this.toggleTooltip(\"status\") }} className=\"button info\">Info</a>\n                                {this.state.showTooltip[\"status\"] &&\n                                    <div className=\"info-box search-tooltip\">\n                                        <p>Status - Where the bill is in the legislative process.</p>\n                                        <p>If you do not input dates or check currently, the search will be executed for that session.</p>\n                                    </div>\n                                }\n                                <button aria-expanded={this.props.statusFieldset} type=\"button\" className={this.props.statusFieldset ? \"arrow-up\" : \"arrow-down\"}></button>\n                            </div>\n                            {this.props.statusFieldset &&\n                                <fieldset>\n                                    <div>\n                                        <div className=\"inner-grid one-and-two two-mobile\">\n                                            <label htmlFor=\"se-bill-status-select\">Status</label><div className=\"flex-row flex-vertical-center flex-end\">\n                                                <div className=\"toggle-switch\" disabled={this.props.billStatusCategoryList.find(status => status.LegislationCategoryID === this.props.selectedBillStatusCategory)?.Name === \"Continued to next session\"} onClick={() => this.props.handleCurrentStatusChange()}>\n                                                    <input id=\"current-status-button\" checked={this.props.currentStatus} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                                    <span className=\"slider\"></span>\n                                                </div>\n                                                <label htmlFor=\"current-status-button\" className=\"checkbox-label no-background\">{this.props.selectedSession && !this.props.selectedSession.IsActive ? 'Final Status' : 'Currently'}</label>\n                                            </div>\n                                        </div>\n                                        <Select\n                                            id=\"se-bill-status-select\"\n                                            isClearable\n                                            key={this.props.selectedBillStatusCategory}\n                                            styles={singleStyles}\n                                            options={this.props.billStatusCategoryList}\n                                            placeholder=\"All\"\n                                            onChange={(opt) => this.props.handleSelectChange(opt, 'selectedBillStatusCategory')}\n                                            value={this.props.billStatusCategoryList.find(status => status.LegislationCategoryID === this.props.selectedBillStatusCategory)}\n                                        />\n                                    </div>\n                                    <div className=\"inner-grid two two-mobile\">\n                                        <div>\n                                            <label htmlFor=\"se-bill-status-start-date\">Start Date</label>\n                                            <DatePicker\n                                                id=\"se-bill-status-start-date\"\n                                                selected={this.props.billStatusStartDate ? moment(this.props.billStatusStartDate) : null}\n                                                onChange={(opt) => {\n                                                    opt.startOf('day');\n                                                    this.props.handleDateChange(opt, 'billStatusStartDate')\n                                                }}\n                                                disabled={!this.props.selectedBillStatusCategory || this.props.currentStatus}\n                                            />\n                                        </div>\n                                        <div>\n                                            <label htmlFor=\"se-bill-status-end-date\">End Date</label>\n                                            <DatePicker\n                                                id=\"se-bill-status-end-date\"\n                                                selected={this.props.billStatusEndDate ? moment(this.props.billStatusEndDate) : null}\n                                                onChange={(opt) => {\n                                                    opt.endOf('day');\n                                                    this.props.handleDateChange(opt, 'billStatusEndDate')\n                                                }}\n                                                disabled={!this.props.selectedBillStatusCategory || this.props.currentStatus}\n                                            />\n                                        </div>\n                                    </div>\n                                    <div>\n                                        <label htmlFor=\"se-selected-chamber\">Originating Chamber</label>\n                                        <Select\n                                            styles={singleStyles}\n                                            id=\"se-selected-chamber\"\n                                            options={Fields.originatingChamberOptions}\n                                            onChange={this.props.chamberChange}\n                                            value={this.props.selectedChamber}\n                                            placeholder=\"Both\"\n                                            isClearable={true}\n                                        />\n                                    </div>\n                                </fieldset>\n                            }\n                            <div style={{ cursor: 'pointer' }} onClick={() => this.props.toggleGroup(\"committeesFieldset\")} className=\"advanced-search-fieldset-header\">\n                                <span className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Committees</span>\n                                {/* <a onClick={(e) => { e.stopPropagation(e); this.toggleTooltip(\"committee\") }} className=\"button info\">Info</a>\n                                {this.state.showTooltip[\"committee\"] &&\n                                    <div className=\"info-box search-tooltip\">\n                                        <p></p>\n                                    </div>\n                                } */}\n                                <div />\n                                <button aria-expanded={this.props.committeesFieldset} type=\"button\" className={this.props.committeesFieldset ? \"arrow-up\" : \"arrow-down\"}></button>\n                            </div>\n                            {this.props.committeesFieldset &&\n                                <fieldset>\n                                    <div>\n                                        <label htmlFor=\"se-selected-committee\">Committees</label>\n                                        <Select\n                                            styles={singleStyles}\n                                            isClearable\n                                            key={this.props.selectedCommittee}\n                                            id=\"se-selected-committee\"\n                                            options={this.props.committeeList}\n                                            onChange={this.props.committeeChange}\n                                            value={getSelectedCommitteeLabel(this.props.committeeList.flatMap(x => x.options || x).find(committee => committee.CommitteeID == this.props.selectedCommittee))}\n                                        />\n                                    </div>\n                                    <div>\n                                        <label htmlFor=\"se-selected-subcommittee\">Subcommittees</label>\n                                        <Select\n                                            styles={singleStyles}\n                                            isClearable\n                                            key={this.props.selectedSubcommittee}\n                                            id=\"se-selected-subcommittee\"\n                                            isDisabled={!this.props.selectedCommittee}\n                                            options={this.props.subcommitteeList}\n                                            onChange={(opt) => this.props.handleSelectChange(opt, 'selectedSubcommittee')}\n                                            value={this.props.subcommitteeList.find(subcommittee => subcommittee.CommitteeID === this.props.selectedSubcommittee)}\n                                        />\n                                    </div>\n                                </fieldset>\n                            }\n                            <div style={{ cursor: 'pointer' }} onClick={() => this.props.toggleGroup(\"membersFieldset\")} className=\"advanced-search-fieldset-header\">\n                                <span className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Members</span>\n                                <a onClick={(e) => { e.stopPropagation(e); this.toggleTooltip(\"members\") }} className=\"button info\">Info</a>\n                                {this.state.showTooltip[\"members\"] &&\n                                    <div className=\"info-box search-tooltip\">\n                                        <p>Chief Patron - The member(s) that originated the bill.</p>\n                                    </div>\n                                }\n                                <button aria-expanded={this.props.membersFieldset} type=\"button\" className={this.props.membersFieldset ? \"arrow-up\" : \"arrow-down\"}></button>\n                            </div>\n                            {this.props.membersFieldset &&\n                                <fieldset>\n                                    <div>\n                                        <label htmlFor=\"se-selected-patron\">Patrons</label>\n                                        <Select\n                                            styles={singleStyles}\n                                            id=\"se-selected-patron\"\n                                            isClearable\n                                            key={this.props.selectedPatron}\n                                            options={this.props.patronList}\n                                            placeholder=\"All\"\n                                            onChange={this.props.handlePatronChange}\n                                            value={this.props.patronList.find(patron => patron.MemberID === this.props.selectedPatron)}\n                                        />\n                                    </div>\n                                    <div>\n                                        <label htmlFor=\"se-selected-patron-type\">Patron Type</label>\n                                        <Select\n                                            isClearable\n                                            styles={singleStyles}\n                                            key={this.props.selectedPatronType}\n                                            id=\"se-selected-patron-type\"\n                                            isDisabled={!this.props.selectedPatron}\n                                            value={this.props.patronRoles.filter(role => this.props.selectedPatronType.includes(role.PatronTypeID))}\n                                            onChange={this.props.handlePatronTypeChange}\n                                            options={this.props.patronList.find(x => x.MemberID === this.props.selectedPatron) ? this.props.patronList.find(x => x.MemberID === this.props.selectedPatron).ChamberCode === \"S\" ? this.props.patronRoles.filter(x => x.PatronTypeID !== 5) : this.props.patronRoles.filter(x => x.PatronTypeID !== 3 && x.PatronTypeID !== 5) : []}\n                                            isSearchable={false}\n                                            isMulti={true}\n                                        />\n                                    </div>\n                                </fieldset>\n                            }\n                            <div style={{ cursor: 'pointer' }} onClick={() => this.props.toggleGroup(\"subjectFieldset\")} className=\"advanced-search-fieldset-header\">\n                                <span className={this.props.location.includes('bill-search') ? \"txt-dark-blue\" : \"\"}>Subject</span>\n                                <a onClick={(e) => { e.stopPropagation(e); this.toggleTooltip(\"subject\") }} className=\"button info\">Info</a>\n                                {this.state.showTooltip[\"subject\"] &&\n                                    <div className=\"info-box search-tooltip\">\n                                        <p>Bills listed by subject.</p>\n                                    </div>\n                                }\n                                <button aria-expanded={this.props.subjectFieldset} type=\"button\" className={this.props.subjectFieldset ? \"arrow-up\" : \"arrow-down\"}></button>\n                            </div>\n                            {this.props.subjectFieldset &&\n                                <fieldset>\n                                    <div>\n                                        <label htmlFor=\"se-selected-subject\">Subjects</label>\n                                        <Select\n                                            styles={singleStyles}\n                                            id=\"se-selected-subject\"\n                                            isClearable\n                                            key={this.props.selectedSubject}\n                                            options={this.props.subjectList}\n                                            placeholder=\"All Subjects\"\n                                            onChange={(opt) => this.props.handleSelectChange(opt, 'selectedSubject')}\n                                            value={this.props.subjectList.find(subject => subject.SubjectIndexID === this.props.selectedSubject)}\n                                        />\n                                    </div>\n                                </fieldset>\n                            }\n                            <div style={{ padding: '10px' }} className=\"center flex-row\">\n                                <button id=\"se-clear-form\" className=\"button secondary\" type=\"button\" onClick={() => this.props.clearForm(true, true)}>\n                                    Clear\n                                </button>\n                                <button id=\"se-submit-form\" className=\"button\" type=\"button\"\n                                    disabled={\n                                        !this.props.showUpdateSearchButton &&\n                                        (!this.props.selectedChamber && !this.props.selectedBillEvent && !this.props.selectedBillType && !this.props.selectedCommittee && !this.props.selectedSubcommittee && !this.props.selectedPatron && !this.props.selectedSubject && !this.props.selectedKeywords && !this.props.selectedBillNumbers && !this.props.selectedBillRangeBeginning && !this.props.selectedBillRangeEnd && !this.props.selectedSubject && !this.props.selectedChapterNumber && !this.props.selectedBillStatusCategory)\n                                        || this.props.isFetching || this.props.failedToGetSessions}\n                                    title={!this.props.showUpdateSearchButton && !this.props.selectedChamber && !this.props.selectedBillEvent && !this.props.selectedBillType && !this.props.selectedCommittee && !this.props.selectedSubcommittee && !this.props.selectedPatron && !this.props.selectedSubject && !this.props.selectedKeywords && !this.props.selectedBillNumbers && !this.props.selectedBillRangeBeginning && !this.props.selectedBillRangeEnd && !this.props.selectedSubject && !this.props.selectedChapterNumber && !this.props.selectedBillStatusCategory && 'Please provide a parameter upon which to search.'}\n                                    onClick={() => this.handleSubmit()}>\n                                    Search\n                                </button>\n                            </div>\n                        </div>\n                    }\n                </div>\n            </React.Fragment>\n        )\n    }\n}\n\n\nexport default AdvancedSearchBoxComponent;\n","import React from 'react';\nimport moment from 'moment-timezone';\n\n\nclass SearchSelections extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n        };\n    };\n\n    render() {\n        return (\n            <div className=\"search-selections\">\n                <span className=\"txt-greyed small-text\">Your Search</span>\n                <div>\n                    <Selection\n                        value={this.props.selectedBillNumbers}\n                        name={\"selectedBillNumbers\"}\n                        clear={this.props.handleSelectionClear}\n                    />\n                    <Selection\n                        value={this.props.selectedBillRangeBeginning}\n                        name={\"selectedBillRangeBeginning\"}\n                        title=\"Bill Range Start\"\n                        clear={this.props.handleSelectionClear}\n                    />\n                    <Selection\n                        value={this.props.selectedBillRangeEnd}\n                        name={\"selectedBillRangeEnd\"}\n                        title=\"Bill Range End\"\n                        clear={this.props.handleSelectionClear}\n                    />\n                    <Selection\n                        value={this.props.selectedChapterNumber}\n                        name={\"selectedChapterNumber\"}\n                        clear={this.props.handleSelectionClear}\n                    />\n                    <Selection\n                        value={this.props.selectedKeywords}\n                        name={\"selectedKeywords\"}\n                        clear={this.props.handleSelectionClear}\n                    />\n                    <Selection\n                        value={this.props.currentStatus && this.props.selectedBillStatusCategory ? this.props.selectedSession && !this.props.selectedSession.IsActive ? 'Final Status' : 'Current Status' : null}\n                        name={\"currentStatus\"}\n                        clear={this.props.handleSelectionClear}\n                    />\n                    <Selection\n                        value={this.props.selectedBillStatusCategory ? this.props.selectedBillStatusCategory.label : null}\n                        name={\"selectedBillStatusCategory\"}\n                        clear={this.props.handleSelectionClear}\n                    />\n                    <Selection\n                        value={this.props.billStatusStartDate ? moment(this.props.billStatusStartDate).format(\"MM/DD/YYYY\") : null}\n                        name={\"billStatusStartDate\"}\n                        title=\"Status Start Date\"\n                        clear={null}\n                    />\n                    <Selection\n                        value={this.props.billStatusEndDate ? moment(this.props.billStatusEndDate).format(\"MM/DD/YYYY\") : null}\n                        name={\"billStatusEndDate\"}\n                        title=\"Status End Date\"\n                        clear={null}\n                    />\n                    <Selection\n                        value={this.props.selectedCommittee ? this.props.selectedCommittee.label : null}\n                        name={\"selectedCommittee\"}\n                        clear={this.props.handleSelectionClear}\n                    />\n                    <Selection\n                        value={this.props.selectedSubcommittee ? this.props.selectedSubcommittee.label : null}\n                        name={\"selectedSubcommittee\"}\n                        clear={this.props.handleSelectionClear}\n                    />\n                    <Selection\n                        value={this.props.selectedPatron ? this.props.selectedPatron.label : null}\n                        name={\"selectedPatron\"}\n                        clear={this.props.handleSelectionClear}\n                    />\n                    {this.props.selectedPatronType.map((type, typeIndex) =>\n                        <Selection\n                            key={typeIndex}\n                            index={typeIndex}\n                            value={type.label}\n                            name={\"selectedPatronType\"}\n                            clear={this.props.handleMultiSelectionClear}\n                        />\n                    )}\n                    <Selection\n                        value={this.props.selectedChamber ? this.props.selectedChamber.label : null}\n                        name={\"selectedChamber\"}\n                        clear={this.props.handleSelectionClear}\n                    />\n                    <Selection\n                        value={this.props.selectedBillType ? this.props.selectedBillType.label : null}\n                        name={\"selectedBillType\"}\n                        clear={this.props.handleSelectionClear}\n                    />\n                    <Selection\n                        value={this.props.selectedSubject ? this.props.selectedSubject.label : null}\n                        name={\"selectedSubject\"}\n                        clear={this.props.handleSelectionClear}\n                    />\n                    <Selection\n                        value={this.props.excludeFailed ? \"Exclude Failed\" : null}\n                        name={\"excludeFailed\"}\n                        clear={this.props.handleSelectionClear}\n                    />\n                    {this.props.updateSearch &&\n                        <UpdateSearch\n                            updateSearch={this.props.updateSearch}\n                        />\n                    }\n                </div>\n                <hr className=\"faded-line\" />\n            </div>\n        )\n    }\n}\n\nconst Selection = props => {\n    const { title, value, name, index, clear } = props;\n    if (value) {\n        return (<div className=\"selection-bubble\">\n            <div className=\"flex-row\">\n                <span>{title ? `${title}: ${value.length > 100 ? value.substring(0, 100) + '...' : value}` : value.length > 100 ? value.substring(0, 100) + '...' : value}</span>\n                {clear && <button aria-label=\"remove item\" onClick={() => clear(name, index)} className=\"icon cross-blue\"></button>}\n            </div>\n        </div>);\n    } else {\n        return (false);\n    }\n\n}\n\nconst UpdateSearch = props => {\n    const { updateSearch } = props;\n    return (\n        <div className=\"selection-bubble button\">\n            <div className=\"flex-row\" onClick={() => updateSearch()}>\n                <button className=\"button small\">Update Search</button>\n            </div>\n        </div>);\n}\n\nexport default SearchSelections;\n","import React from 'react';\nimport ReactDOM from 'react-dom'\nimport moment from 'moment-timezone';\nimport { connect } from 'react-redux';\nimport DatePicker from 'react-datepicker';\nimport { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';\nimport { LargeListSelect } from '../../../lis-shared/lis-layout/components/lis-forms-component';\nimport InputTypes from '../../../lis-admin/lis-minutes-management/components/input-types';\nimport { HubConnectionBuilder } from \"@microsoft/signalr\";\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { billActionCreators } from '../../../stores/lis-legislation-store';\nimport { bindActionCreators } from 'redux';\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NEW_EVENT = \"NEW_EVENT\";\n\nconst selectStyle = () => {\n    const fontSize = '0.8em';\n    return {\n        container: styles => ({\n            ...styles,\n            minWidth: '90%'\n        }),\n        control: styles => ({\n            ...styles,\n            minHeight: '0px',\n            padding: '0.12em 0.6em !important',\n        }),\n        valueContainer: styles => ({\n            ...styles,\n            padding: 0,\n        }),\n        input: styles => ({\n            ...styles,\n            fontSize: fontSize,\n            lineHeight: 'normal',\n        }),\n        singleValue: styles => ({\n            ...styles,\n            fontSize: fontSize,\n        }),\n        placeholder: styles => ({\n            ...styles,\n            fontSize: fontSize\n        }),\n        option: styles => ({\n            ...styles,\n            fontSize: fontSize\n        }),\n        dropdownIndicator: styles => ({\n            ...styles,\n            padding: '0px 8px'\n        }),\n    };\n}\n\nconst getItemStyle = (isDragging, draggableStyle, historyItem) => ({\n    // some basic styles to make the items look a bit nicer\n    userSelect: 'none',\n    // change background colour if dragging\n    background: isDragging ? '#34495e' : 'white',\n    color: isDragging ? 'white' : '#34495e',\n    border: 'none',\n    background: historyItem.isNewlyAdded ? 'rgba(91, 178, 114, 0.8)' : historyItem.isNewlyDeleted ? 'rgba(255, 151, 151, 0.8)' : historyItem.dateChanged || historyItem.sequenceChanged || historyItem.descriptionChanged || historyItem.eventCodeChanged ? 'rgba(252, 250, 97, 0.8)' : 'white',\n    // styles we need to apply on draggables\n    ...draggableStyle,\n});\n\nconst getListStyle = (isDraggingOver) => ({\n    background: isDraggingOver ? '#8b9fb3' : '#9e9e9e',\n    width: '100%',\n});\n\nconst getDivStyle = (latestEvent, hideAllEvents) => ({\n    display: !latestEvent && hideAllEvents ? \"none\" : \"block\"\n})\n\nclass BillHistoryForm extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            organizedEvents: [],\n            newEventDate: moment().utcOffset(0).set({ hour: 0, minute: 0, second: 0, millisecond: 0 }),\n            newEvent: '',\n            editingEvents: [],\n            currentInput: { eventGroupIndex: 0, itemIndex: 0, inputNumber: '' },\n            changeToBill: '',\n            templateInputs: [],\n            incompleteInputs: []\n        };\n        this.handleEventInputChange = this.handleEventInputChange.bind(this);\n        this.changeEvent = this.changeEvent.bind(this);\n        this.changeDate = this.changeDate.bind(this);\n        this.toggleEventGroup = this.toggleEventGroup.bind(this);\n        this.bulkToggleEventGroup = this.bulkToggleEventGroup.bind(this);\n        this.toggleEditDescription = this.toggleEditDescription.bind(this);\n        this.changeDescription = this.changeDescription.bind(this);\n        this.formDescription = this.formDescription.bind(this);\n        this.setDescription = this.setDescription.bind(this);\n        this.handleTemplateChange = this.handleTemplateChange.bind(this);\n        this.handleBillNumberChange = this.handleBillNumberChange.bind(this);\n        this.onDragEnd = this.onDragEnd.bind(this);\n        this.handleNewEventChange = this.handleNewEventChange.bind(this);\n        this.handleNewEventDateChange = this.handleNewEventDateChange.bind(this);\n        this.addEvent = this.addEvent.bind(this);\n        this.saveEvents = this.saveEvents.bind(this);\n        this.handleMovingFocus = this.handleMovingFocus.bind(this);\n        this.handleMovingFocusFromBillChanger = this.handleMovingFocusFromBillChanger.bind(this);\n        this.receiveEventByWebsocket = this.receiveEventByWebsocket.bind(this);\n        this.getSessionLegislation = this.getSessionLegislation.bind(this);\n\n        this._inputRefs = [];\n        this._containerRefs = [];\n        this._billSwitcherRef = React.createRef();\n        this._addEventRef = React.createRef();\n    }\n\n    static getConnectionId = (conn, functionToRun) => {\n        //This connection ID might be used later\n        conn.invoke('getConnectionId')\n            .then(connectionId => {\n                functionToRun(connectionId);\n            });\n    }\n\n    //When a WebSocket message comes across with this label then the event list needs to be updated with new values\n    static handleEvent = (message, functionToRun) => {\n        try {\n            if (message.statusCode > 399) throw 'Server Error: ' + JSON.stringify(message);\n            functionToRun(message)\n        } catch (err) {\n            console.log(err);\n        }\n    };\n\n    componentDidMount() {\n        if (this.props.switchedToBill) {\n            this.setState({ changeToBill: this.props.legislationNumber })\n        }\n        let organizedEvents = this.props.organizedEvents;\n        if (organizedEvents.length === 0 || this.props.switchedToBill) {\n            organizedEvents = BillHistoryForm.organizeEvents([...this.props.historyList]);\n            this.props.handleEventChange(organizedEvents);\n        }\n        //try to focus on the add event dropdown/input\n        if (this._addEventRef.current) {\n            var addEventNode = ReactDOM.findDOMNode(this._addEventRef.current);\n            if (addEventNode && addEventNode.getElementsByTagName('input').length) {\n                addEventNode.getElementsByTagName('input')[0].focus();\n            }\n        }\n        const numberOfEvents = organizedEvents.length;\n        //Hide all the events except the last day. This is most likely what the user will be editing\n        organizedEvents.forEach((evt, i) => {\n            if (i !== numberOfEvents - 1) {\n                evt.hidden = true;\n            } else {\n                evt.hidden = false;\n                if (this.props.isBillManagement) {\n                    //set the display sequence for all the events in this group that is going to be automatically displayed\n                    evt.events.forEach(e => {\n                        e.DisplaySequence = e.Sequence * 10;\n                    });\n                }\n            }\n        })\n\n        //Scroll to the bottom so they can see the events of the last day\n        if (!this.props.isBillManagement) {\n            window.scrollTo(0, document.body.scrollHeight);\n        }\n\n        if (!this.props.isBillManagement) {\n            let entryConnection = new HubConnectionBuilder() //in bill mgmt, use one central entryConnection from props rather than a separate connection for each bill\n                .withUrl((API_URL || process.env.REACT_APP_LEGISLATION_EVENT_API_URL) + '/LegislationEvent/events')\n                .build();\n            entryConnection.serverTimeoutInMilliseconds = 60000;\n\n            this.setState({\n                entryHubConnection: entryConnection\n            }, () => {\n                const self = this;\n                this.state.entryHubConnection\n                    .start({ withCredentials: false })\n                    .then(() => {\n                        BillHistoryForm.getConnectionId(this.state.entryHubConnection, (connectionId) => {\n                            console.log(`entryConnectionId: ${connectionId}`);\n                            this.setState({\n                                entryConnectionId: connectionId\n                            });\n                        });\n                    }).catch(err => {\n                        console.log('Error establishing connection' + err)\n                        this.props.actions.makeToast([{ message: \"History Connection Failed\", type: \"failure\" }])\n                    });\n                this.state.entryHubConnection.on(\"ReceiveEvent\", message => BillHistoryForm.handleEvent(message, this.receiveEventByWebsocket));\n            });\n        }\n    }\n\n    receiveEventByWebsocket(message) {\n        let historyList = [...this.props.historyList];\n\n        //If the LegislationID for the list of new events doesn't match the open bill then throw it out\n        if (this.props.billData.LegislationID !== message[0].LegislationID) {\n            return;\n        } else {\n            for (let i = 0; i < message.length; i++) {\n                //If we don't find an event from the websocket message in the already-loaded list of events then add it to the local history list\n                if (!historyList.find(x => x.LegislationEventID === message[i].LegislationEventID)) {\n                    historyList.push(message[i])\n                }\n            }\n\n            //Send the updated local history list to be reorganized and displayed\n            let organizedEvents = BillHistoryForm.organizeEvents(historyList);\n            this.props.handleEventChange(organizedEvents);\n        }\n    }\n\n    // Events can only be re-organized within the day that the event occured\n    // So each day's events needs to be moved into their own group so they can each have their own drag and drop interface\n    // Events can be moved to a different group by the user by selecting a different date for the event\n    static organizeEvents(events) {\n        let organizedEvents = [];\n        let previousDate = '';\n        let currentDate = '';\n        let eventSequence = 1;\n        let eventsInADay = [];\n        events.sort((a, b) => moment(a.EventDate).startOf('day').valueOf() - moment(b.EventDate).startOf('day').valueOf())\n        events.forEach(event => {\n            //first off, set originallyDeleted which is used to figure out if events are newly deleted or not and highlight in bill mgmt\n            event.originallyDeleted = Boolean(event.DeletionDate);\n            currentDate = moment(event.EventDate)\n            if (previousDate && !currentDate.isSame(previousDate, 'day')) {\n                organizedEvents.push({\n                    events: eventsInADay,\n                    date: previousDate\n                });\n                eventsInADay = [];\n                eventSequence = 1;\n            }\n            eventsInADay.push({ ...event, Sequence: eventSequence, origSequence: eventSequence });\n            eventSequence++;\n            previousDate = currentDate;\n        });\n        if (eventsInADay.length > 0) {\n            organizedEvents.push({\n                events: eventsInADay,\n                date: previousDate\n            });\n        }\n\n        return organizedEvents;\n    }\n\n    handleEventInputChange(inputValue, legislationEventID) {\n        let eventInputValue = { ...this.state.eventInputValue };\n        eventInputValue[legislationEventID.toString()] = inputValue;\n        this.setState({ eventInputValue });\n    }\n\n    changeEvent(val, eventGroupIndex, index) {\n        let organizedEvents = [...this.props.organizedEvents];\n        organizedEvents[eventGroupIndex].events[index].origEventCode = organizedEvents[eventGroupIndex].events[index].origEventCode ?? organizedEvents[eventGroupIndex].events[index].EventCode;\n        organizedEvents[eventGroupIndex].events[index].EventCode = val.EventCode;\n        organizedEvents[eventGroupIndex].events[index].IsPassed = val.IsPassed;\n        organizedEvents[eventGroupIndex].events[index].Description = val.LegislationDescription;\n        //The event type is referenced from the EventCode. Delete this so the correct event is set\n        delete organizedEvents[eventGroupIndex].events[index].LegislationEventTypeID;\n        organizedEvents[eventGroupIndex].events[index].hasChanged = true;\n        if (val.ActionReferences && val.ActionReferences.length > 0) {\n            organizedEvents[eventGroupIndex].events[index].EventReferences = [...val.ActionReferences];\n        }\n        this.props.handleEventChange(organizedEvents, () => {\n            this.saveEvents();\n\n            // When selecting a new event the container does not properly focus so it is done here.\n            if (this._containerRefs[eventGroupIndex] && this._containerRefs[eventGroupIndex][`${index}-${1}`]) {\n                // The timeout is because react-select messes with the focus after changing the event.\n                // It guarantees that react-select will finish its opertions before the focus is set.\n                setTimeout(() => this._containerRefs[eventGroupIndex][`${index}-${1}`].current.focus(), 10)\n            }\n\n        });\n        this.handleEventInputChange(null, organizedEvents[eventGroupIndex].events[index].LegislationEventID);\n    }\n\n    changeDate(val, eventGroupIndex, index) {\n        if (val === null) {\n            return;\n        }\n        let organizedEvents = [...this.props.organizedEvents];\n        let lEvent = {\n            ...organizedEvents[eventGroupIndex].events[index],\n            EventDate: val.format(\"LLLL\"),\n            origDate: organizedEvents[eventGroupIndex].events[index].origDate ?? organizedEvents[eventGroupIndex].events[index].EventDate,\n            hasChanged: true\n        };\n        let newEventGroupIndex = organizedEvents.findIndex(eventGroup => eventGroup.date.isSame(val, 'day'));\n        organizedEvents[eventGroupIndex].events.splice(index, 1);\n        if (newEventGroupIndex > -1) {\n            // If the selected date already has events that occured on that date then the event is moved into the existing group\n            lEvent.Sequence = organizedEvents[newEventGroupIndex].events.length + 1;\n            organizedEvents[newEventGroupIndex].events.push(lEvent)\n            //expand this new event day\n            organizedEvents[newEventGroupIndex].hidden = false;\n        } else {\n            // If the selected date does not have any events then a new event group needs to be created for this date\n            lEvent.Sequence = 1;\n            const newEventGroup = {\n                date: val,\n                events: [lEvent],\n                hidden: false\n            };\n            // Gotta find where it goes in the list of groups\n            organizedEvents.some((eventGroup, i) => {\n                if (eventGroup.date.isAfter(val, 'day')) {\n                    newEventGroupIndex = i;\n                    organizedEvents.splice(i, 0, newEventGroup)\n                    return true;\n                }\n                if (i === organizedEvents.length - 1) {\n                    newEventGroupIndex = i + 1;\n                    organizedEvents.push(newEventGroup);\n                }\n            });\n        }\n        //If the old day is now empty then remove it from the array\n        if (organizedEvents[eventGroupIndex].events.length === 0) {\n            organizedEvents.splice(eventGroupIndex, 1);\n            if (newEventGroupIndex > eventGroupIndex) {\n                newEventGroupIndex -= 1\n            }\n        }\n\n        // After setting the new events make sure that focus is applied to the container of the event's new position\n        this.props.handleEventChange(organizedEvents, () => {\n            this.saveEvents();\n            if (this._containerRefs[newEventGroupIndex] && this._containerRefs[newEventGroupIndex][`${organizedEvents[newEventGroupIndex].events.length - 1}-${0}`]) {\n                this._containerRefs[newEventGroupIndex][`${organizedEvents[newEventGroupIndex].events.length - 1}-${0}`].current.focus();\n            }\n        });\n\n        if (this.props.hideAllEvents) {\n            this.props.togglehideAllEvents(this.props.idx);\n        }\n\n        this.setState({\n            editingEvents: [],\n        });\n    }\n\n    toggleEventGroup(eventGroupIndex, expand) {\n        let organizedEvents = this.props.organizedEvents;\n        //if display sequences haven't already been set for this group of events, set it now\n        if (this.props.isBillManagement && organizedEvents[eventGroupIndex].events.find(e => !e.DisplaySequence)) {\n            organizedEvents[eventGroupIndex].events.forEach(evt => {\n                evt.DisplaySequence = evt.Sequence * 10;\n            })\n        }\n        organizedEvents[eventGroupIndex].hidden = expand !== undefined ? !expand : organizedEvents[eventGroupIndex].hidden === undefined ? false : !organizedEvents[eventGroupIndex].hidden;\n        this.forceUpdate();\n    }\n\n    bulkToggleEventGroup(expand) {\n        let organizedEvents = this.props.organizedEvents;\n        organizedEvents.forEach((eventGroup, idx) => {\n            this.toggleEventGroup(idx, expand)\n        })\n    }\n\n    toggleEditDescription(eventGroupIndex, index) {\n        let editingEvents = [...this.state.editingEvents];\n        if (editingEvents[eventGroupIndex] === undefined || editingEvents[eventGroupIndex] === null) {\n            editingEvents[eventGroupIndex] = [];\n        }\n        // Marking it as null will remove the event from 'edit description mode'\n        if (editingEvents[eventGroupIndex][index]) {\n            editingEvents[eventGroupIndex][index] = null;\n        } else {\n            const currentEvent = JSON.parse(JSON.stringify(this.props.organizedEvents[eventGroupIndex].events[index]));\n            const eventReference = this.props.billEvents.find(evt => evt.EventCode === currentEvent.EventCode && evt.IsPassed === currentEvent.IsPassed);\n            if (eventReference) {\n                const actionReferences = eventReference.ActionReferences;\n                if (actionReferences) {\n                    const missingActionReferences = actionReferences.filter(ref => !currentEvent.EventReferences.map(existingEvt => existingEvt.ActionReferenceType).includes(ref.ActionReferenceType));\n                    if (missingActionReferences.length) {\n                        currentEvent.EventReferences = currentEvent.EventReferences.concat(JSON.parse(JSON.stringify(missingActionReferences)));\n                    }\n                }\n            }\n            //If the user has selected an event with at least one ActionReferenceType of LegislationEvent then fetch possible events for reconsideration\n            if (currentEvent.EventReferences && currentEvent.EventReferences.find(x => x.ActionReferenceType === \"LegislationEvent\")) {\n                this.props.getReconsiderationEvents(currentEvent.EventCode)\n            } else if (currentEvent.EventReferences && currentEvent.EventReferences.find(x => x.ActionReferenceType === \"Legislation\") && this.props.billData && this.props.billData.SessionID) {\n                this.getSessionLegislation(this.props.billData.SessionID);\n            }\n            editingEvents[eventGroupIndex][index] = { ...currentEvent };\n        }\n        this.setState({\n            editingEvents: editingEvents\n        });\n    }\n\n    changeDescription(eventGroupIndex, eventIndex, referenceIndex, reference, descEdit) {\n        let editingEvents = [...this.state.editingEvents];\n        let event = editingEvents[eventGroupIndex][eventIndex];\n        event.origDescription = event.origDescription ?? event.Description;\n        //If the event has event references then concatinate them to get the event description\n        //If it doesn't then this function was ran by a text input so just set the value of 'reference' to the description\n        if (event.EventReferences && event.EventReferences.length > 0 && !descEdit) {\n            event.EventReferences[referenceIndex] = reference;\n            event.Description = this.formDescription(event, event.EventReferences);\n        } else {\n            event.Description = reference;\n        }\n        this.setState({\n            editingEvents: editingEvents\n        });\n    }\n\n    setDescription(eventGroupIndex, index) {\n        let organizedEvents = [...this.props.organizedEvents];\n        organizedEvents[eventGroupIndex].events[index] = this.state.editingEvents[eventGroupIndex][index];\n        organizedEvents[eventGroupIndex].events[index].hasChanged = true;\n        this.props.handleEventChange(organizedEvents, () => {\n            this.saveEvents();\n        });\n        this.toggleEditDescription(eventGroupIndex, index);\n    }\n\n    handleTemplateChange(_a, _b, referenceIndex, reference) {\n        let templateInputs = [...this.state.templateInputs];\n        templateInputs[referenceIndex] = reference;\n        this.setState({\n            templateInputs: templateInputs\n        });\n    }\n\n    handleBillNumberChange(e) {\n        this.setState({\n            changeToBill: e.target.value\n        });\n    }\n\n    onDragEnd(result, eventGroupIndex) {\n        if (!result.destination) {\n            return;\n        }\n        let organizedEvents = [...this.props.organizedEvents];\n        const [removed] = organizedEvents[eventGroupIndex].events.splice(result.source.index, 1);\n        organizedEvents[eventGroupIndex].events.splice(result.destination.index, 0, removed);\n        organizedEvents[eventGroupIndex].events.forEach((element, index) => {\n            element.Sequence = index + 1\n            if (this.props.isBillManagement) {\n                element.DisplaySequence = element.Sequence * 10;\n            }\n            element.hasChanged = true;\n        });\n        // Remove any events out of edit description mode\n        let editingEvents = [...this.state.editingEvents];\n        editingEvents[eventGroupIndex] = null;\n        this.setState({\n            editingEvents: editingEvents\n        });\n        this.props.handleEventChange(organizedEvents, () => {\n            this.saveEvents();\n        });\n    }\n\n    handleNewEventChange(val) {\n        let templateInputs = [];\n        if (val.ActionReferences && val.ActionReferences.length > 0) {\n            //Remove all object references to val\n            templateInputs = JSON.parse(JSON.stringify(val.ActionReferences));\n        }\n        this.setState({\n            newEvent: {\n                ...val,\n                value: `${val.EventCode}-${val.IsPassed}`\n            },\n            templateInputs: templateInputs\n        }, () => {\n            this.handleEventInputChange(null, NEW_EVENT);\n            //If the user has selected an event with at least one ActionReferenceType of LegislationEvent then fetch possible events for reconsideration\n            if (val.ActionReferences.find(x => x.ActionReferenceType === \"LegislationEvent\")) {\n                this.props.getReconsiderationEvents(val.EventCode)\n            } else if (val.ActionReferences.find(x => x.ActionReferenceType === \"Legislation\") && this.props.billData && this.props.billData.SessionID) {\n                this.getSessionLegislation(this.props.billData.SessionID);\n            }\n        });\n    }\n\n    handleNewEventDateChange(val) {\n        let value = moment(val).set({ hour: 0, minute: 0, second: 0, millisecond: 0 });\n        this.setState({\n            newEventDate: value\n        });\n    }\n\n    addEvent(e) {\n        e.preventDefault();\n\n        let incompleteInputs = [];\n        for (let i = 0; i < this.state.templateInputs.length; i++) {\n            if ((this.state.templateInputs[i].IsMandatory && !this.state.templateInputs[i].ReferenceText)\n                || (this.state.templateInputs[i].IsMandatory && this.state.templateInputs[i].ActionReferenceTypeID == 14 && !this.state.templateInputs[i].ReferenceID)) {\n                incompleteInputs.push(i);\n            }\n        }\n\n        this.setState({\n            incompleteInputs: incompleteInputs\n        })\n\n        if (incompleteInputs.length > 0) {\n            return;\n        }\n\n        const { newEvent, newEventDate } = this.state;\n        let organizedEvents = [...this.props.organizedEvents];\n        let actorType = '';\n        switch (newEvent.EventCode ? newEvent.EventCode[0].toUpperCase() : newEvent.LegislationChamberCode) {\n            case 'H':\n                actorType = 'House';\n                break;\n            case 'S':\n                actorType = 'Senate';\n                break;\n            case 'C':\n                actorType = 'Conference';\n                break;\n            case 'G':\n                actorType = 'Governor';\n                break;\n        }\n\n        let eventObj = {\n            ...newEvent,\n            ActorType: actorType,\n            IsPublic: true,\n            Description: newEvent.label,\n            LegislationID: this.props.billData.LegislationID,\n            EventDate: moment(newEventDate).utcOffset(0).set({ hour: 0, minute: 0, second: 0, millisecond: 0 }).toISOString(),\n            hasChanged: true,\n            hidden: false\n        };\n\n        if (newEvent.ActionReferences && newEvent.ActionReferences.length > 0 && this.state.templateInputs.length > 0) {\n            eventObj.EventReferences = this.state.templateInputs;\n            eventObj.Description = this.formDescription(eventObj);\n        }\n\n        //Check to see if there is are events with the same date already\n        let newEventGroupIndex = organizedEvents.findIndex(eventGroup => eventGroup.date.isSame(newEventDate, 'day'));\n        if (newEventGroupIndex > -1) {\n            // If the selected date already has events that occured on that date then the event is moved into the existing group\n            organizedEvents[newEventGroupIndex].events.push(eventObj);\n        } else {\n            // If the selected date does not have any events then a new event group needs to be created for this date\n            const newEventGroup = {\n                date: newEventDate,\n                events: [eventObj]\n            };\n            // Gotta find where it goes in the list of groups\n            if (organizedEvents.length === 0) {\n                newEventGroupIndex = 0;\n                organizedEvents.splice(0, 0, newEventGroup);\n            } else {\n                organizedEvents.some((eventGroup, i) => {\n                    if (eventGroup.date.isAfter(newEventDate, 'day')) {\n                        newEventGroupIndex = i\n                        organizedEvents.splice(i, 0, newEventGroup);\n                        return true;\n                    }\n                    if (i === organizedEvents.length - 1) {\n                        newEventGroupIndex = i + 1;\n                        organizedEvents.push(newEventGroup)\n                    }\n                });\n            }\n        }\n        this.setState({\n            newEvent: '',\n            templateInputs: []\n        });\n        // After adding the new event, auto-save the event\n        this.props.handleEventChange(organizedEvents, () => {\n            this.saveEvents();\n        })\n    }\n\n    formDescription(eventObj, eventReferences) {\n        const inputs = eventReferences || this.state.templateInputs\n        const memberListEvents = [\"H6013\", \"S6013\", \"H6113\", \"S6113\", \"H6213\", \"S6213\"];\n        const substitueRejectedEvents = [\"S5432\", \"S5433\", \"H5432\", \"H5433\"];\n        let overrideSet = false;\n\n        const description = inputs.map((tInput, i) => {\n            //For events H6013/S6013/H6113/S6113/H6213/S6213 there are sometimes incomplete lists of members. This will prevent the UI from adding blank member dropdown values to the description\n            if (memberListEvents.includes(eventObj.EventCode) && !tInput.ReferenceText) {\n                return;\n            }\n\n            //Drop in canned language for opposing chamber substitute or substitue with amendment rejected\n            if (substitueRejectedEvents.includes(eventObj.EventCode)) {\n                if (!overrideSet) {\n                    overrideSet = true;\n                    return eventObj.LegislationDescription ?? this.props.billEvents?.find(e => e.EventCode === eventObj.EventCode && e.IsPassed === eventObj.IsPassed)?.LegislationDescription;\n                } else {\n                    return \"\";\n                }\n            }\n\n            if (!tInput.ReferenceText && !eventObj.EventReferences[0].ReconsiderationGrammar) {\n                return `${tInput.ActionReferenceType}`\n            }\n\n            //Set the Description to the canned description if it's a reconsideration, otherwise just drop in the reference text\n            return eventObj.EventReferences.find(x => x.ActionReferenceType === \"LegislationEvent\") ? this.props.billEvents?.find(e => e.EventCode === eventObj.EventReferences?.find(x => x.ActionReferenceType === \"LegislationEvent\")?.EventCode && e.IsPassed === eventObj.EventReferences?.find(x => x.ActionReferenceType === \"LegislationEvent\")?.IsPassed)?.ReconsiderationDescription : (tInput.ReferenceText + (memberListEvents.includes(eventObj.EventCode) && tInput.ActionReferenceType === \"Member\" && tInput.ReferenceText && inputs[i + 1] && inputs[i + 1].ActionReferenceType === \"Member\" && inputs[i + 1].ReferenceText ? \", \" : \"\"))\n        }).join('')\n\n        return description;\n    }\n\n    deleteEvent(eventGroupIndex, index) {\n        let organizedEvents = [...this.props.organizedEvents];\n        let event = organizedEvents[eventGroupIndex].events[index];\n        event.hasChanged = true;\n        if (event.DeletionDate) {\n            delete event.DeletionDate\n        }\n        //if deleting an event that didn't already exist/hasn't been saved at all, just remove it entirely\n        else if (!event.LegislationEventID) {\n            //if there is only one event in this day, just remove the day\n            if (organizedEvents[eventGroupIndex].events.length === 1) {\n                const wasLastEventGroup = eventGroupIndex === organizedEvents.length - 1;\n                organizedEvents.splice(eventGroupIndex, 1);\n                //if it was the last event day that got removed, expand the now-last event day\n                if (wasLastEventGroup) {\n                    organizedEvents[organizedEvents.length - 1].hidden = false;\n                }\n            } else {\n                //There is more than just this event in the day, only remove this event from the group and move on\n                organizedEvents[eventGroupIndex].events.splice(index, 1);\n                //recalculate sequences of events\n                for (let idx = index; idx < organizedEvents[eventGroupIndex].events.length; idx++) {\n                    organizedEvents[eventGroupIndex].events[idx].Sequence--\n                }\n            }\n        } else {\n            //this event existed to begin with, we need to set the deletion date and save it\n            event.DeletionDate = moment().toISOString();\n        }\n        // After soft deleting the new event, auto-save the event\n        this.props.handleEventChange(organizedEvents, () => {\n            this.saveEvents(() => {\n                if (event.DeletionDate && [\"8500\", \"8501\", \"8503\"].includes(event.EventCode.match(/\\d+/)[0]) && event.ReferenceID && event.ReferenceNumber) {\n                    this.props.actions.deleteBlobFileStatement('?ownerID=' + event.ReferenceID + '&referenceNumber=' + event.ReferenceNumber).catch(() => {\n                        this.props.actions.makeToast([{ message: \"Failed to delete impact statement file\", type: \"failure\" }])\n                    })\n                }\n            });\n        })\n    }\n\n    saveEvents(callback) {\n        let eventsToSave = [];\n        let eventGroupsToSave = []\n        this.props.organizedEvents.forEach(eventGroup => {\n            eventGroup.events.forEach(event => {\n                // Do not save the events that have been deleted and lack a event id. These events to do not need to be created\n                // Do not  save events that have not been changed at all\n                if (!event.LegislationEventID && event.DeletionDate) {\n                    return\n                } else if (!event.hasChanged) {\n                    return\n                } else {\n                    eventsToSave.push(event);\n                    if (!eventGroupsToSave.find(group => group.date === eventGroup.date)) {\n                        eventGroupsToSave.push(eventGroup)\n                    }\n                }\n            })\n\n        });\n        this.setState({ isSaving: true });\n        this.props.saveEvents(eventsToSave, (success) => {\n            this.setState({ isSaving: false });\n            if (success) {\n                let orgEvents = BillHistoryForm.organizeEvents([...this.props.historyList]);\n                orgEvents.forEach(group => {\n                    if (eventGroupsToSave.find(g => g.date.isSame(group.date, 'day'))) { group.hidden = false; }\n                })\n                this.props.handleEventChange(orgEvents, () => {\n                    // Try to focus on the last input in the list\n                    const lastSavedEventGroup = eventGroupsToSave.length && this.props.organizedEvents.findIndex(group => group.date.isSame(eventGroupsToSave[eventGroupsToSave.length - 1].date, 'day')) > -1 ? this.props.organizedEvents.findIndex(group => group.date.isSame(eventGroupsToSave[eventGroupsToSave.length - 1].date, 'day')) : this.props.organizedEvents.length - 1;\n                    const savedEventsInLastSavedEventGroup = eventsToSave.filter(evt => moment(evt.EventDate).isSame(this.props.organizedEvents[lastSavedEventGroup].date, 'day'));\n                    const lastSavedEvent = savedEventsInLastSavedEventGroup[savedEventsInLastSavedEventGroup.length - 1];\n                    const lastSavedEventIndex = lastSavedEvent ? this.props.organizedEvents[lastSavedEventGroup].events.findIndex(evt => evt.LegislationEventID === lastSavedEvent.LegislationEventID || (evt.Sequence === lastSavedEvent.Sequence && evt.EventCode === lastSavedEvent.EventCode)) : this.props.organizedEvents[lastSavedEventGroup].length - 1\n                    if (this._containerRefs[lastSavedEventGroup]) {\n                        if (this._containerRefs[lastSavedEventGroup][`${lastSavedEventIndex}-${1}`]) {\n                            this._containerRefs[lastSavedEventGroup][`${lastSavedEventIndex}-${1}`].current.focus();\n                        }\n                    }\n                });\n            } else {\n                //refresh events using the list returned from the GET which was called after the save failed\n                let orgEvents = BillHistoryForm.organizeEvents([...this.props.historyList]);\n                orgEvents.forEach(group => {\n                    if (eventGroupsToSave.find(g => g.date.isSame(group.date, 'day'))) { group.hidden = false; }\n                })\n                this.props.handleEventChange(orgEvents, () => { })\n            }\n            if (callback) callback();\n        });\n    }\n\n    getSessionLegislation(sessionID) {\n        if (!this.state.sessionLegislation) {\n            this.setState({ fetchingSessionLegislation: true }, () => {\n                this.props.actions.getSessionBills('?sessionID= ' + sessionID).then(() => {\n                    let billList = [...this.props.bills.sessionBills];\n                    billList.forEach(bill => {\n                        const chiefPatrons = bill.Patrons && bill.Patrons.length && bill.Patrons.filter(p => p.PatronTypeID === 1);\n                        bill.label = chiefPatrons && chiefPatrons.length ? ' (' + bill.LegislationNumber + '-' + chiefPatrons[0].PatronDisplayName + ')' : bill.LegislationNumber;\n                        bill.value = bill.LegislationID\n                    });\n                    this.setState({\n                        sessionLegislation: billList,\n                        fetchingSessionLegislation: false\n                    })\n                }).catch(err => {\n                    if (err === \"Aborted\") {\n                        return;\n                    }\n                    console.error(err)\n                    this.setState({ fetchingSessionLegislation: false })\n                });\n            })\n        }\n    }\n\n    focusOnInputContainer(eventGroupIndex, index, inputNumber, e) {\n        e.stopPropagation();\n        if (e.key === 'Enter' || e.key === 'Escape') {\n            this._containerRefs[eventGroupIndex][`${index}-${inputNumber}`].current.focus();\n        }\n    }\n\n    checkForScrollUp = (node) => {\n        // Scroll up a bit more if the element is barely on screen\n        const conNodeRect = node.getBoundingClientRect();\n        if (conNodeRect.top < conNodeRect.height * 2) {\n            this.scrollToEvent(node);\n        }\n    }\n\n    checkForScrollDown = (node) => {\n        // Scroll down a bit more if the element is barely on screen\n        const conNodeRect = node.getBoundingClientRect();\n        if (conNodeRect.bottom > window.innerHeight - conNodeRect.height * 2) {\n            this.scrollToEvent(node);\n        }\n    }\n\n    handleMovingFocus(eventGroupIndex, eventIndex, inputNumber, e) {\n        const key = e.key;\n        e.preventDefault();\n        switch (key) {\n            case 'ArrowLeft':\n                if (this._containerRefs[eventGroupIndex] && this._containerRefs[eventGroupIndex][`${eventIndex}-${inputNumber - 1}`]) {\n                    this._containerRefs[eventGroupIndex][`${eventIndex}-${inputNumber - 1}`].current.focus()\n                }\n                break;\n            case 'ArrowRight':\n                if (this._containerRefs[eventGroupIndex] && this._containerRefs[eventGroupIndex][`${eventIndex}-${inputNumber + 1}`]) {\n                    this._containerRefs[eventGroupIndex][`${eventIndex}-${inputNumber + 1}`].current.focus()\n                }\n                break;\n            case 'ArrowDown':\n                if (this._containerRefs[eventGroupIndex] && this._containerRefs[eventGroupIndex][`${eventIndex + 1}-${inputNumber}`]) {\n                    const conNode = this._containerRefs[eventGroupIndex][`${eventIndex + 1}-${inputNumber}`].current;\n                    conNode.focus();\n                    this.checkForScrollDown(conNode);\n                } else if (this._containerRefs[eventGroupIndex + 1] && this._containerRefs[eventGroupIndex + 1][`${0}-${inputNumber}`]) {\n                    let organizedEvents = this.props.organizedEvents;\n                    organizedEvents[eventGroupIndex + 1].hidden = false;\n                    const conNode = this._containerRefs[eventGroupIndex + 1][`${0}-${inputNumber}`].current\n                    conNode.focus();\n                    this.checkForScrollDown(conNode);\n                } else if (this._billSwitcherRef.current) {\n                    this._billSwitcherRef.current.focus();\n                }\n                break;\n            case 'ArrowUp':\n                if (this._containerRefs[eventGroupIndex] && this._containerRefs[eventGroupIndex][`${eventIndex - 1}-${inputNumber}`]) {\n                    const conNode = this._containerRefs[eventGroupIndex][`${eventIndex - 1}-${inputNumber}`].current\n                    conNode.focus();\n                    this.checkForScrollUp(conNode);\n                } else if (this._containerRefs[eventGroupIndex - 1]) {\n                    const lastItemIndexInEventGroup = this.props.organizedEvents[eventGroupIndex - 1].events.length - 1\n                    if (this._containerRefs[eventGroupIndex - 1][`${lastItemIndexInEventGroup}-${inputNumber}`]) {\n                        let organizedEvents = this.props.organizedEvents;\n                        organizedEvents[eventGroupIndex - 1].hidden = false;\n                        const conNode = this._containerRefs[eventGroupIndex - 1][`${lastItemIndexInEventGroup}-${inputNumber}`].current\n                        conNode.focus();\n                        this.checkForScrollUp(conNode);\n                    }\n                }\n                break;\n            case 'Tab':\n                const changer = e.shiftKey ? -1 : 1\n                // First check if there is one to the right.\n                if (this._containerRefs[eventGroupIndex] && this._containerRefs[eventGroupIndex][`${eventIndex}-${inputNumber + changer}`]) {\n                    this._containerRefs[eventGroupIndex][`${eventIndex}-${inputNumber + changer}`].current.focus()\n                }\n                // If not, check if there is one underneath in the same group\n                else if (this._containerRefs[eventGroupIndex] && this._containerRefs[eventGroupIndex][`${eventIndex + changer}-${changer === 1 ? 0 : 1}`]) {\n                    const conNode = this._containerRefs[eventGroupIndex][`${eventIndex + changer}-${changer === 1 ? 0 : 1}`].current;\n                    conNode.focus();\n                    this.checkForScrollDown(conNode);\n                }\n                // Finally, check if there is one underneath in a different group\n                else if (this._containerRefs[eventGroupIndex + changer] && this._containerRefs[eventGroupIndex + changer][`${changer === 1 ? 0 : this.props.organizedEvents[eventGroupIndex + changer].events.length - 1}-${changer === 1 ? 0 : 1}`]) {\n                    let organizedEvents = this.props.organizedEvents;\n                    organizedEvents[eventGroupIndex + changer].hidden = false;\n                    const conNode = this._containerRefs[eventGroupIndex + changer][`${`${changer === 1 ? 0 : this.props.organizedEvents[eventGroupIndex + changer].events.length - 1}-${changer === 1 ? 0 : 1}`}`].current\n                    conNode.focus();\n                    this.checkForScrollDown(conNode);\n                }\n                // If none of these are the case then the user is at the very bottom and they need to focus on the bill switcher\n                else if (this._billSwitcherRef.current && changer === 1) {\n                    this._billSwitcherRef.current.focus();\n                }\n                break;\n            case 'Enter':\n                if (this._inputRefs[eventGroupIndex] && this._inputRefs[eventGroupIndex][`${eventIndex}-${inputNumber}`]) {\n                    // The ref doesn't have a click function so turn it into a node\n                    const inputNodeContainer = ReactDOM.findDOMNode(this._inputRefs[eventGroupIndex][`${eventIndex}-${inputNumber}`].current);\n                    const inputNode = inputNodeContainer.querySelector('input');\n                    if (inputNode) {\n                        inputNode.focus();\n                        inputNode.click();\n                    }\n                }\n                break;\n        }\n    }\n\n    handleMovingFocusFromBillChanger(e) {\n        const key = e.key;\n        if (key === 'ArrowUp' || e.key === 'Tab' && e.shiftKey) {\n            e.preventDefault();\n            const lastEventGroup = this.props.organizedEvents.length - 1;\n            // Focus on the last input ref\n            if (this._containerRefs[lastEventGroup]) {\n                const lastEvent = this.props.organizedEvents[lastEventGroup].events.length - 1;\n                if (this._containerRefs[lastEventGroup][`${lastEvent}-${1}`]) {\n                    this._containerRefs[lastEventGroup][`${lastEvent}-${1}`].current.focus();\n                }\n            }\n        } else if (key == 'Enter') {\n            e.preventDefault();\n            this.props.changeToNewBillHistoryForm(this.state.changeToBill);\n        }\n    }\n\n    scrollToEvent(node) {\n        const nodeRect = node.getBoundingClientRect();\n        const windowY = window.pageYOffset;\n        const windowHeight = window.innerHeight;\n        window.scrollTo({\n            top: nodeRect.top + windowY - windowHeight / 2,\n            behavior: 'smooth'\n        });\n    }\n\n    render() {\n        // Create a ref for every datepicker and dropdown in the form. This is so when hitting enter focus can be applied to the input\n        // Also create a ref for the parent element of the input. This is so the user can use arrow keys to move focus from container to container\n        // React acts out of the ordinary with a multi-dimensional array of refs, so a 1 dimensional array is used containing an object\n        let inputRefs = [];\n        let containerRefs = [];\n        this.props.organizedEvents.forEach((eventGroup, eventGroupIndex) => {\n            let inputs = {};\n            let containers = {};\n            eventGroup.events.forEach((_historyItem, index) => {\n                inputs[`${index}-0`] = React.createRef(),\n                    inputs[`${index}-1`] = React.createRef();\n                containers[`${index}-0`] = React.createRef(),\n                    containers[`${index}-1`] = React.createRef();\n            });\n            inputRefs[eventGroupIndex] = inputs;\n            containerRefs[eventGroupIndex] = containers;\n        });\n        this._inputRefs = inputRefs;\n        this._containerRefs = containerRefs;\n        return (\n            <React.Fragment>\n                {!this.props.isBillManagement && <button type=\"button\" className=\"button-link\" style={{ fontSize: '0.8em' }} onClick={this.props.toggleEditContent}>(Close)</button>}\n                <div className=\"dlas-forms history-event-form\" style={{ paddingBottom: !this.props.isBillManagement ? '100px' : '15px' }}>\n                    {!this.props.isBillManagement &&\n                        <div>\n                            <div>\n                                <label className=\"label\">Switch To Bill</label>\n                                <div>\n                                    <input\n                                        ref={this._billSwitcherRef}\n                                        onKeyDown={this.handleMovingFocusFromBillChanger}\n                                        type=\"text\"\n                                        placeholder=\"Bill Number\"\n                                        onChange={this.handleBillNumberChange}\n                                        value={this.state.changeToBill}\n                                    />\n                                </div>\n                            </div>\n                            <br />\n                            <AddEventForm\n                                addEventRef={this._addEventRef}\n                                newEvent={this.state.newEvent}\n                                handleNewEventChange={this.handleNewEventChange}\n                                handleEventInputChange={this.handleEventInputChange}\n                                eventInputValue={this.state.eventInputValue}\n                                newEventDate={this.state.newEventDate}\n                                handleNewEventDateChange={this.handleNewEventDateChange}\n                                billEvents={this.props.billEvents}\n                                addEvent={this.addEvent}\n                                isSaving={this.state.isSaving}\n                                memberList={this.state.newEvent && this.state.newEvent.EventCode.startsWith(\"H\") ? this.props.memberList.filter(m => m.ChamberCode === \"H\") : this.state.newEvent && this.state.newEvent.EventCode.startsWith(\"S\") ? this.props.memberList.filter(m => m.ChamberCode === \"S\") : this.props.memberList}\n                                committeeList={this.props.committeeList}\n                                legislationList={this.state.sessionLegislation}\n                                fetchingSessionLegislation={this.state.fetchingSessionLegislation}\n                                actionTypes={this.props.actionTypes}\n                                templateInputs={this.state.templateInputs}\n                                textList={this.props.versionsList}\n                                handleTemplateChange={this.handleTemplateChange}\n                                eventList={this.props.reconsiderationEvents}\n                                reconsiderationEvents={this.props.reconsiderationEvents}\n                                reconsiderationActionReference={this.state.newEvent && this.state.newEvent.ActionReferences.find(x => x.ActionReferenceType === \"LegislationEvent\") ? true : false}\n                                incompleteInputs={this.state.incompleteInputs}\n                            />\n                        </div>\n                    }\n                    <div style={{ marginBottom: \"10px\", display: 'flex', gap: '25px' }}>\n                        <div>\n                            <button onClick={() => this.props.idx !== undefined ? this.props.togglehideAllEvents(this.props.idx) : this.props.togglehideAllEvents()} type=\"button\" className={this.props.hideAllEvents ? \"arrow-up\" : \"arrow-down\"} />\n                            <label>{!this.props.hideAllEvents ? \"Hide All Event Days\" : \"Show All Event Days\"}</label>\n                        </div>\n                        {!this.props.hideAllEvents &&\n                            <div>\n                                <button onClick={() => this.bulkToggleEventGroup(Boolean(this.props.organizedEvents.find(eg => eg.hidden)))} type=\"button\" className={this.props.organizedEvents.find(eg => eg.hidden) ? \"arrow-up\" : \"arrow-down\"} />\n                                <label>{!this.props.organizedEvents.find(eg => eg.hidden) ? \"Collapse All Event Days\" : \"Expand All Event Days\"}</label>\n                            </div>\n                        }\n                    </div>\n                    {this.props.organizedEvents.map((eventGroup, eventGroupIndex) =>\n                        <div key={eventGroupIndex} id={this.props.idx !== undefined && eventGroupIndex === this.props.organizedEvents.length - 1 ? `last-${this.props.idx}` : null} style={getDivStyle(eventGroupIndex === this.props.organizedEvents.length - 1, this.props.hideAllEvents)} className=\"event-day\" >\n                            {eventGroup.events.length > 0 &&\n                                <React.Fragment>\n                                    <DragDropContext onDragEnd={result => this.onDragEnd(result, eventGroupIndex)}>\n                                        <Droppable droppableId=\"droppable\">\n                                            {(provided, snapshot) => (\n                                                <table\n                                                    className=\"dnd-grid-table bill-history-grid\"\n                                                    ref={provided.innerRef}\n                                                    style={getListStyle(snapshot.isDraggingOver)}\n                                                >\n                                                    <thead className=\"dnd-grid-header\" style={getListStyle(snapshot.isDraggingOver)}>\n                                                        <div className='inner-grid forty-six-and-one'>\n                                                            <div className=\"bill-history-grid-header-cell\"><button onClick={() => this.toggleEventGroup(eventGroupIndex)} type=\"button\" className={`${eventGroup.hidden || (eventGroup.hidden === undefined && eventGroupIndex !== this.props.organizedEvents.length - 1) ? \"arrow-down\" : \"arrow-up\"}`}></button></div>\n                                                            <div className=\"bill-history-grid-header-cell\">{moment(eventGroup.date).format('L')}</div>\n                                                        </div>\n                                                    </thead>\n                                                    <tbody style={{ display: !this.props.expandAllEvents && (eventGroup.hidden || (eventGroup.hidden === undefined && eventGroupIndex !== this.props.organizedEvents.length - 1)) ? 'none' : 'block' }}>\n                                                        {eventGroup.events.map((historyItem, index) => (\n                                                            // All of these values in the key are required to make it unique\n                                                            <Draggable isDragDisabled={this.state.isSaving} key={`${historyItem.EventCode}-${historyItem.IsPassed}-${historyItem.Sequence}`} draggableId={`${historyItem.EventCode}-${historyItem.IsPassed}-${historyItem.Sequence}`} index={index}>\n                                                                {(provided, snapshot) => (\n                                                                    <tr\n                                                                        className={!historyItem.isNewlyDeleted && historyItem.DeletionDate ? 'pending-delete' : ''}\n                                                                        ref={provided.innerRef}\n                                                                        {...provided.draggableProps}\n                                                                        {...provided.dragHandleProps}\n                                                                        style={getItemStyle(\n                                                                            snapshot.isDragging,\n                                                                            provided.draggableProps.style,\n                                                                            historyItem\n                                                                        )}\n                                                                    >\n                                                                        <td><button className=\"button draggable\">Drag and drop</button></td>\n                                                                        <td>{this.props.isBillManagement ? historyItem.DisplaySequence : index + 1}</td>\n                                                                        <td onKeyDown={e => this.handleMovingFocus(eventGroupIndex, index, 0, e)} ref={this._containerRefs[eventGroupIndex][`${index}-0`]} tabIndex=\"-1\">\n                                                                            <DatePicker\n                                                                                selected={moment(historyItem.EventDate)}\n                                                                                onChange={val => this.changeDate(val, eventGroupIndex, index)}\n                                                                                disabled={Boolean(historyItem.DeletionDate)}\n                                                                                ref={this._inputRefs[eventGroupIndex][`${index}-0`]}\n                                                                                onKeyDown={e => this.focusOnInputContainer(eventGroupIndex, index, 0, e)}\n                                                                            />\n                                                                        </td>\n                                                                        <td>{historyItem.ActorType}</td>\n                                                                        <td onKeyDown={e => this.handleMovingFocus(eventGroupIndex, index, 1, e)} ref={this._containerRefs[eventGroupIndex][`${index}-1`]} tabIndex=\"-1\">\n                                                                            {this.state.editingEvents[eventGroupIndex] && this.state.editingEvents[eventGroupIndex][index] !== null && this.state.editingEvents[eventGroupIndex][index] !== undefined ?\n                                                                                <React.Fragment>\n                                                                                    <div onKeyDown={e => e.stopPropagation()} style={{ minWidth: '90%' }}>\n                                                                                        {this.state.editingEvents[eventGroupIndex][index].EventReferences && this.state.editingEvents[eventGroupIndex][index].EventReferences.length > 0 ?\n                                                                                            <React.Fragment>\n                                                                                                <InputTypes\n                                                                                                    memberList={this.state.editingEvents[eventGroupIndex][index].EventCode.startsWith(\"H\") ? this.props.memberList.filter(m => m.ChamberCode === \"H\") : this.state.editingEvents[eventGroupIndex][index].EventCode.startsWith(\"S\") ? this.props.memberList.filter(m => m.ChamberCode === \"S\") : this.props.memberList}\n                                                                                                    committeeList={this.props.committeeList}\n                                                                                                    legislationList={this.state.sessionLegislation}\n                                                                                                    fetchingSessionLegislation={this.state.fetchingSessionLegislation}\n                                                                                                    actionTypes={this.props.actionTypes}\n                                                                                                    handleChange={this.changeDescription}\n                                                                                                    textList={this.props.versionsList}\n                                                                                                    entryIndex={eventGroupIndex}\n                                                                                                    activityIndex={index}\n                                                                                                    references={this.state.editingEvents[eventGroupIndex][index].EventReferences}\n                                                                                                    eventList={this.props.reconsiderationEvents}\n                                                                                                    newEvent={this.state.editingEvents[eventGroupIndex][index]}\n                                                                                                    autoselect\n                                                                                                    billHistory\n                                                                                                />\n                                                                                                <input\n                                                                                                    type=\"text\"\n                                                                                                    style={{ width: '100%' }}\n                                                                                                    value={this.state.editingEvents[eventGroupIndex][index].Description}\n                                                                                                    onChange={(e) => this.changeDescription(eventGroupIndex, index, 0, e.target.value, true)}\n                                                                                                />\n                                                                                            </React.Fragment>\n                                                                                            :\n                                                                                            <input\n                                                                                                type=\"text\"\n                                                                                                style={{ width: '100%' }}\n                                                                                                value={this.state.editingEvents[eventGroupIndex][index].Description}\n                                                                                                onChange={(e) => this.changeDescription(eventGroupIndex, index, 0, e.target.value)}\n                                                                                            />\n                                                                                        }\n                                                                                    </div>\n                                                                                    <div>\n                                                                                        <span style={{ marginLeft: '10px' }} className=\"icon save\" onClick={() => this.state.isSaving ? null : this.setDescription(eventGroupIndex, index)}></span>\n                                                                                        <span style={{ marginLeft: '10px' }} className=\"icon delete\" onClick={() => this.toggleEditDescription(eventGroupIndex, index)}></span>\n                                                                                    </div>\n                                                                                </React.Fragment>\n                                                                                :\n                                                                                <React.Fragment>\n                                                                                    <LargeListSelect\n                                                                                        options={this.props.billEvents}\n                                                                                        styles={selectStyle()}\n                                                                                        onChange={val => this.changeEvent(val, eventGroupIndex, index)}\n                                                                                        value={{\n                                                                                            ...historyItem,\n                                                                                            label: historyItem.Description,\n                                                                                            value: `${historyItem.EventCode}-${historyItem.IsPassed}`\n                                                                                        }}\n                                                                                        getOptionLabel={opt => `(${opt.EventCode}) ${opt.label}`}\n                                                                                        isDisabled={historyItem.DeletionDate}\n                                                                                        ref={this._inputRefs[eventGroupIndex][`${index}-1`]}\n                                                                                        onKeyDown={e => this.focusOnInputContainer(eventGroupIndex, index, 1, e)}\n                                                                                        inputValue={this.state.eventInputValue && this.state.eventInputValue[historyItem.LegislationEventID] ? this.state.eventInputValue[historyItem.LegislationEventID].toString() : ''}\n                                                                                        onInputChange={inputValue => this.handleEventInputChange(inputValue, historyItem.LegislationEventID)}\n                                                                                        onMenuClose={() => this.handleEventInputChange(this.state.eventInputValue ? this.state.eventInputValue[historyItem.LegislationEventID] : null, historyItem.LegislationEventID)} //hacky way to persist the input text after the user clicks away with the dropdown open                                                                    \n                                                                                    />\n                                                                                    <span style={{ marginLeft: '10px' }} onClick={() => this.state.isSaving ? null : this.toggleEditDescription(eventGroupIndex, index)} className=\"icon edit\" title=\"Change Description\"></span>\n                                                                                    {historyItem.MinutesActivityID && <span style={{ marginLeft: '10px', cursor: \"default\" }} className=\"icon paper\" title=\"Minutes Activity\"></span>}\n                                                                                </React.Fragment>\n                                                                            }\n                                                                        </td>\n                                                                        <td><button type=\"button\" disabled={this.state.isSaving} style={{ backgroundColor: 'transparent' }} onClick={() => this.deleteEvent(eventGroupIndex, index)} className={`button ${historyItem.DeletionDate ? 'add' : 'remove'}`}>{historyItem.DeletionDate ? 'Add' : 'Delete'}</button></td>\n                                                                    </tr>\n                                                                )}\n                                                            </Draggable>\n                                                        ))}\n                                                        {provided.placeholder}\n                                                    </tbody>\n                                                </table>\n                                            )}\n                                        </Droppable>\n                                    </DragDropContext>\n                                </React.Fragment>\n                            }\n                        </div>\n                    )}\n                    {!this.props.isBillManagement &&\n                        <div>\n                            <div className=\"floating-button-bar invisible-bar\" style={{ opacity: \".9\", zIndex: \"0\" }}>\n                                <div className=\"flex-row flex-vertical-center\" style={{ width: '100%' }}>\n                                    <div />\n                                    <div className=\"align-right inline-list\">\n                                        <button disabled={this.state.isSaving} type=\"button\" onClick={this.props.toggleEditContent} className=\"button secondary\">Close</button>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    }\n                </div>\n            </React.Fragment>)\n    }\n}\n\nfunction AddEventForm(props) {\n    return (\n        <React.Fragment>\n            <h4>Add History Event</h4>\n            <form onSubmit={(e) => props.addEvent(e)} className=\"inner-grid small-one-small\">\n                <DatePicker\n                    selected={props.newEventDate}\n                    onChange={props.handleNewEventDateChange}\n                />\n                <LargeListSelect\n                    ref={props.addEventRef}\n                    options={props.billEvents}\n                    styles={selectStyle()}\n                    value={props.newEvent}\n                    inputId={`add-new-event-react-create`}\n                    getOptionLabel={opt => `(${opt.EventCode}) ${opt.label}`}\n                    onChange={props.handleNewEventChange}\n                    inputValue={props.eventInputValue && props.eventInputValue[NEW_EVENT] ? props.eventInputValue[NEW_EVENT] : ''}\n                    onInputChange={inputValue => props.handleEventInputChange(inputValue, NEW_EVENT)}\n                    onMenuClose={() => props.handleEventInputChange(props.eventInputValue && props.eventInputValue[NEW_EVENT], NEW_EVENT)} //hacky way to persist the input text after the user clicks away with the dropdown open\n                />\n                <button className=\"button\" type=\"submit\" onClick={props.addEvent} disabled={props.isSaving || !props.newEvent || !props.newEventDate || (props.reconsiderationActionReference && (!props.reconsiderationEvents || props.reconsiderationEvents.length === 0))}>Add</button>\n            </form>\n            {props.templateInputs.length > 0 &&\n                <div >\n                    <InputTypes\n                        memberList={props.memberList}\n                        committeeList={props.committeeList}\n                        legislationList={props.legislationList}\n                        fetchingSessionLegislation={props.fetchingSessionLegislation}\n                        textList={props.textList}\n                        actionTypes={props.actionTypes}\n                        handleChange={props.handleTemplateChange}\n                        entryIndex={0}\n                        activityIndex={0}\n                        references={props.templateInputs}\n                        eventList={props.eventList}\n                        newEventDate={props.newEventDate}\n                        newEvent={props.newEvent}\n                        incompleteInputs={props.incompleteInputs}\n                        autoselect\n                        isNewEvent\n                    />\n                </div>\n            }\n            <br />\n        </React.Fragment>\n    )\n}\n\nconst HistoryForm = connect(\n    (state) => {\n        const { nav, bills } = state;\n        return {\n            nav,\n            bills,\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, navActionCreators, billActionCreators), dispatch)\n        }\n    }\n)(BillHistoryForm)\n\nexport default HistoryForm;","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nimport moment from 'moment-timezone';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { authActionCreators } from '../../stores/lis-auth-store';\n\nclass LegislationProfiles extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            showSection: window.innerWidth <= 900 ? false : true, //900px is when mobile layout is used (set in mobile.scss); collapse by default\n            name: '',\n            filteredWatchlists: [],\n            filteredWatchlistsValue: ''\n        };\n        this.toggleSection = this.toggleSection.bind(this);\n        this.handleTextChange = this.handleTextChange.bind(this);\n        this.createCollection = this.createCollection.bind(this);\n        this.filterWatchlist = this.filterWatchlist.bind(this);\n    }\n\n    toggleSection() {\n        this.setState(state => ({\n            showSection: !state.showSection\n        }));\n    }\n\n    handleTextChange(key, val) {\n        this.setState({\n            [key]: val\n        });\n    }\n\n    createCollection() {\n        let collection = {\n            Name: this.state.name,\n            Description: \"Created on \" + moment().format('MM/DD/YYYY HH:mm'),\n            WatchListLegislation: []\n        };\n        this.props.createCollection(collection);\n        this.setState({\n            name: ''\n        });\n    }\n\n    filterWatchlist(e) {\n        const val = e.target.value.toLowerCase();\n        this.setState({\n            // Map is used to preserve the original index\n            filteredWatchlists: this.props.collections.map(coll => {\n                if ((coll.Description && coll.Description.toLowerCase().includes(val)) || (coll.Name && coll.Name.toLowerCase().includes(val))) {\n                    return coll;\n                } else {\n                    return null;\n                }\n            }),\n            filteredWatchlistsValue: val\n        })\n    }\n\n    render() {\n        const watchlists = this.state.filteredWatchlistsValue ? this.state.filteredWatchlists : this.props.collections;\n        const selectedWatchlistIndex = this.props.collections[this.props.selectedCollectionIndex] ? watchlists.findIndex(w => w && w.WatchListID === this.props.collections[this.props.selectedCollectionIndex].WatchListID) : -1\n        return (\n            <div className={this.props.isBillManagement ? \"dlas-forms side-form advanced-search management\" : \"dlas-forms side-form advanced-search\"}>\n                <div className=\"header flex-row flex-vertical-center\">\n                    <h3 className=\"center category-header\">Lobbyist-in-a-Box</h3>\n                    <button onClick={this.toggleSection} type=\"button\" className={this.state.showSection ? \"arrow-up white-chevron\" : \"arrow-down white-chevron\"}></button>\n                </div>\n                {this.state.showSection &&\n                    <div className=\"content my-watchlist-content\">\n                        {this.props.isAuthor ?\n                            <div>\n                                <fieldset>\n                                    <div>\n                                        <label htmlFor=\"sr-watchlist-name\" className=\"txt-dark-blue small-text\">Create New Watchlist</label>\n                                        <div className=\"inner-grid three-and-one\">\n                                            {!this.props.isBillManagement &&\n                                                <>\n                                                    <input\n                                                        aria-label=\"Name\"\n                                                        id=\"sr-watchlist-name\"\n                                                        type=\"text\"\n                                                        placeholder=\"Name\"\n                                                        value={this.state.name}\n                                                        onChange={e => this.handleTextChange(\"name\", e.target.value)}\n                                                    />\n                                                    <button aria-label=\"create watchlist\" className=\"button\" disabled={this.props.collectionIsSaving || !this.state.name} onClick={this.createCollection} type=\"button\">Create</button>\n                                                    <hr className=\"faded-line\" />\n                                                </>\n                                            }\n                                        </div>\n                                        {watchlists.length ?\n                                            <div style={{ marginBottom: \"10px\", marginTop: \"-5px\" }}>\n                                                <label htmlFor=\"sr-watchlist-find\" className=\"screen-reader-only\">Find a watchlist</label>\n                                                <input\n                                                    id=\"sr-watchlist-find\"\n                                                    type=\"text\"\n                                                    placeholder=\"Find a watchlist\"\n                                                    value={this.state.filteredWatchlistsValue}\n                                                    onChange={this.filterWatchlist} />\n                                            </div>\n                                            : null\n                                        }\n                                    </div>\n                                    {this.props.error && <span className=\"small-text fail\">{this.props.error}</span>}\n                                    {this.props.isLoading ?\n                                        <div className=\"spinner center-spinner\"></div>\n                                        :\n                                        watchlists.length ?\n                                            <div className=\"checkbox-container watchlist-collection-list\">\n                                                {watchlists.map((list, listIndex) =>\n                                                    <React.Fragment key={listIndex}>\n                                                        {list &&\n                                                            <div role=\"button\" disabled={(list.IsPaid && !Boolean(this.props.login.userClaims.claims.find(claim => claim.Scope === \"Paid\" && claim.Resource === \"LegislationCollections\" && claim.RoleName === \"PaidLegislationCollectionsAuthor\")) && !Boolean(this.props.login.userClaims.resources.find(resource => resource === \"PaidLegislationCollectionsAuthor\" || resource === \"All\")))} onClick={() => !this.props.collectionIsSaving && this.props.selectCollection(this.props.selectedCollectionIndex === listIndex ? -1 : listIndex)} className=\"watchlist-collection-item\">\n                                                                <div className={this.props.selectedCollectionIndex === listIndex ? 'selected-collection' : ''}>\n                                                                    <div className=\"small-text\">{list.Name}{(list.IsPaid && !Boolean(this.props.login.userClaims.claims.find(claim => claim.Scope === \"Paid\" && claim.Resource === \"LegislationCollections\" && claim.RoleName === \"PaidLegislationCollectionsAuthor\")) && !Boolean(this.props.login.userClaims.resources.find(resource => resource === \"PaidLegislationCollectionsAuthor\" || resource === \"All\"))) ? \" (PAID)\" : \"\"}</div>\n                                                                    <div className=\"small-text txt-greyed\">Last Modified {list.ModificationDate ? moment(list.ModificationDate.replace(' +', '+')).format('MM/DD/YYYY hh:mm a') : moment().format('MM/DD/YYYY hh:mm a')}</div>\n                                                                </div>\n                                                                {listIndex !== watchlists.length - 1 && <hr className=\"faded-line\" />}\n                                                            </div>\n                                                        }\n                                                    </React.Fragment>\n                                                )}\n                                            </div> : null\n                                    }\n                                    <div className=\"homepage-links\" style={{ textAlign: \"center\", marginTop: watchlists.length ? '10px' : '0px' }}>\n                                        <Link to=\"/watchlists\">Your Lobbyist-in-a-Box Watchlists</Link>\n                                    </div>\n                                </fieldset>\n                            </div>\n                            :\n                            <div className=\"watchlist-login-wrapper homepage-links\">\n                                <Link style={{ marginLeft: \"auto\", marginRight: \"auto\", paddingTop: \"5px\", display: \"table\" }} to=\"/login?redirect=/bill-search\">Log in to View Watchlists</Link>\n                            </div>\n                        }\n                    </div>\n\n                }\n            </div>\n        )\n    }\n}\n\n\nexport default connect(\n    (state) => {\n        const { login } = state;\n        return {\n            login,\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, authActionCreators), dispatch)\n        }\n    }\n)(LegislationProfiles)\n","import React from 'react';\nimport CreatableSelect from 'react-select/creatable';\n\nconst MERGE = \"MERGE\";\nconst DELETE = \"DELETE\";\n\nclass CollectionControls extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            showPopup: { DELETE: false, MERGE: false },\n            selectedWatchlists: [],\n            selectedMergeWatchlists: [],\n            editWatchlistName: false,\n            newName: '',\n            newDescription: ''\n        };\n        this.togglePopup = this.togglePopup.bind(this);\n        this.handleTextChange = this.handleTextChange.bind(this);\n        this.deleteCollection = this.deleteCollection.bind(this);\n        this.handleWatchlistChange = this.handleWatchlistChange.bind(this);\n        this.handleMergeWatchlistChange = this.handleMergeWatchlistChange.bind(this);\n        this.handleToggleCompositeView = this.handleToggleCompositeView.bind(this);\n        this.toggleEditWatchlistName = this.toggleEditWatchlistName.bind(this);\n        this.saveWatchlistName = this.saveWatchlistName.bind(this);\n        this.addToWatchlists = this.addToWatchlists.bind(this);\n    }\n\n\n    togglePopup(type) {\n        let showPopup = { ...this.state.showPopup };\n        showPopup[type] = !showPopup[type];\n        this.setState({\n            showPopup\n        });\n    }\n\n    handleTextChange(key, val) {\n        this.setState({\n            [key]: val\n        })\n    }\n\n    deleteCollection() {\n        let showPopup = { ...this.state.showPopup };\n        showPopup[DELETE] = !showPopup[DELETE];\n        this.setState({\n            showPopup\n        });\n        this.props.deleteCollection();\n    }\n\n    handleWatchlistChange(val) {\n        this.setState({\n            selectedWatchlists: val\n        });\n    }\n\n    handleMergeWatchlistChange(val) {\n        this.setState({\n            selectedMergeWatchlists: val\n        });\n    }\n\n    handleToggleCompositeView() {\n        this.props.handleToggleCompositeView()\n    }\n\n    toggleEditWatchlistName() {\n        this.setState(state => ({\n            editWatchlistName: !state.editWatchlistName,\n            newName: this.props.selectedCollection.Name || '',\n            newDescription: this.props.selectedCollection.Description || ''\n        }));\n    }\n\n    saveWatchlistName() {\n        let selectedCollection = { ...this.props.selectedCollection };\n        selectedCollection.Name = this.state.newName;\n        selectedCollection.Description = this.state.newDescription;\n        this.props.handleCollectionChange(selectedCollection);\n        this.setState({\n            editWatchlistName: false\n        });\n    }\n\n    addToWatchlists(merge) {\n        let watchlists = merge ? JSON.parse(JSON.stringify(this.state.selectedMergeWatchlists)) : JSON.parse(JSON.stringify(this.state.selectedWatchlists));\n        this.props.addToWatchlists(watchlists, merge, (saveResultCollections) => {\n            let showPopup = { ...this.state.showPopup };\n            if (!merge) {\n                // they are adding bills to one or more watchlist(s) - we need to update the selectedWatchlists state values because their mod dates have now changed\n                for (let i = 0; i < watchlists.length; i++) {\n                    const associatedWatchlist = saveResultCollections.find(c => c.WatchListID === watchlists[i].WatchListID);\n                    if (associatedWatchlist && associatedWatchlist.ModificationDate !== watchlists[i].ModificationDate) {\n                        watchlists[i] = associatedWatchlist\n                    };\n                }\n            } else {\n                // they are merging - we need to close the popup, and we also set the selectedMergeWatchlists state value to empty array because --\n                // there's no need to go through the above loop just to be able to keep the same watchlists selected considering they've already been merged and it's pointless to do it again\n                showPopup[MERGE] = !showPopup[MERGE];\n            }\n            this.setState({ selectedWatchlists: !merge ? watchlists : [], selectedMergeWatchlists: [], showPopup })\n        });\n    }\n\n    componentDidUpdate(prevProps) {\n        if (this.props.selectedCollection.WatchListID !== prevProps.selectedCollection.WatchListID) {\n            this.setState({\n                editWatchlistName: false\n            });\n        }\n    }\n\n    render() {\n        const { selectedCollection, selectedCollectionIndex, calendarHeader, collections, searchMade } = this.props;\n        const { selectedWatchlists, selectedMergeWatchlists } = this.state;\n        if (!selectedCollection && !calendarHeader && (this.props.isBillManagement || !searchMade)) {\n            return null;\n        }\n        const buttonDisabled = !selectedWatchlists || !selectedWatchlists.length || this.props.checkedBills.every(c => !c || this.props.collectionIsSaving);\n        const mergeButtonDisabled = !selectedMergeWatchlists || !selectedMergeWatchlists.length;\n        if (!selectedCollection && !calendarHeader) {\n            return (\n                <div className=\"dlas-forms collection-controls\" style={{ marginBottom: \"5px\" }}>\n                    <h4 style={{ margin: 0 }}>Add bills from search results to one or more watchlists</h4>\n                    <div className=\"inner-grid two\">\n                        <div>\n                            <label htmlFor=\"sr-watchlist-name-control\">Watchlist Name</label>\n                            <CreatableSelect\n                                id=\"sr-watchlist-name-control\"\n                                styles={selectStyle}\n                                options={collections}\n                                getOptionLabel={opt => opt.label || `${opt.Name} ${opt.Description && `- ${opt.Description}`}`}\n                                getOptionValue={opt => opt.value || opt.WatchListID}\n                                value={selectedWatchlists}\n                                onChange={this.handleWatchlistChange}\n                                createOptionPosition=\"first\"\n                                formatCreateLabel={input => <span>Create new: {input}</span>}\n                                isMulti\n                            />\n                        </div>\n                        <div className=\"inline-list\">\n                            <br />\n                            {this.props.collectionIsSaving ?\n                                <div><span className=\"small-spinner\"></span></div>\n                                :\n                                <React.Fragment>\n                                    <button disabled={buttonDisabled} style={{ marginLeft: \"0px\" }} className=\"button\" type=\"button\" onClick={() => this.addToWatchlists(false)}>Add</button>\n                                </React.Fragment>\n                            }\n                        </div>\n                    </div>\n                </div>\n            );\n        }\n        return (\n            <div>\n                {this.state.showPopup[DELETE] &&\n                    <div className='popup'>\n                        <div className='popup-inner'>\n                            <p>Are you sure you want to delete? Once a Watchlist is deleted it cannot be restored.</p>\n                            <div className=\"inline-list\">\n                                <button className=\"button danger\" disabled={this.props.collectionIsSaving} onClick={this.deleteCollection}>Yes</button>\n                                <button className=\"button secondary\" disabled={this.props.collectionIsSaving} onClick={() => this.togglePopup(DELETE)}>No</button>\n                            </div>\n                        </div>\n                    </div>\n                }\n                {this.state.showPopup[MERGE] &&\n                    <div className='popup'>\n                        <div className='popup-inner'>\n                            <p>Select the watchlist(s) into which you want to merge the current watchlist.</p>\n                            <div className=\"inner-grid\" style={{ gridTemplateColumns: '50% 50%' }}>\n                                <div>\n                                    <CreatableSelect\n                                        id=\"sr-watchlist-name-control\"\n                                        styles={selectStyle}\n                                        options={collections.filter(c => c.WatchListID !== selectedCollection.WatchListID)}\n                                        getOptionLabel={opt => opt.label || `${opt.Name}`}\n                                        getOptionValue={opt => opt.value || opt.WatchListID}\n                                        value={selectedMergeWatchlists}\n                                        onChange={this.handleMergeWatchlistChange}\n                                        createOptionPosition=\"first\"\n                                        formatCreateLabel={input => <span>Create new: {input}</span>}\n                                        isMulti\n                                    />\n                                </div>\n                                <div className=\"inline-list\">\n                                    {this.props.collectionIsSaving ?\n                                        <div><span className=\"small-spinner\"></span></div>\n                                        :\n                                        <React.Fragment>\n                                            <button disabled={mergeButtonDisabled} style={{ marginLeft: \"0px\" }} className=\"button\" type=\"button\" onClick={() => this.addToWatchlists(true)}>Merge</button>\n                                            <button className=\"button secondary\" onClick={() => this.togglePopup(MERGE)}>Cancel</button>\n                                        </React.Fragment>\n                                    }\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                }\n                <div className=\"collection-controls inner-grid\" style={{ gridTemplateColumns: 'auto max-content' }}>\n                    {this.state.editWatchlistName ?\n                        <div className=\"dlas-forms flex-row flex-start inline-list edit-watchlist-name\">\n                            <div className=\"label-above-input\">\n                                <label htmlFor=\"sr-selected-watchlist-name\" className=\"label\">Name {!this.state.newName && <span className=\"fail\">required</span>}</label>\n                                <input\n                                    id=\"sr-selected-watchlist-name\"\n                                    value={this.state.newName}\n                                    placeholder=\"Name\"\n                                    onChange={e => this.handleTextChange('newName', e.target.value)}\n                                />\n                            </div>\n                            <div className=\"label-above-input\">\n                                <label htmlFor=\"sr-selected-watchlist-desc\" className=\"label\">Description</label>\n                                <input\n                                    id=\"sr-selected-watchlist-desc\"\n                                    value={this.state.newDescription}\n                                    placeholder=\"Description\"\n                                    onChange={e => this.handleTextChange('newDescription', e.target.value)}\n                                />\n                            </div>\n                            {this.props.collectionIsSaving ?\n                                <div className=\"small-spinner\"></div>\n                                :\n                                <div className=\"inline-list save-or-delete\">\n                                    <button aria-label=\"save\" onClick={this.saveWatchlistName} disabled={!this.state.newName} type=\"button\" className=\"icon save\"></button>\n                                    <button aria-label=\"cancel\" onClick={this.toggleEditWatchlistName} type=\"button\" className=\"icon delete\"></button>\n                                </div>\n                            }\n                        </div>\n                        :\n                        <div className=\"watchlist-info\">\n                            <div className=\"inline-list\">\n                                <span className=\"name\">{selectedCollection ? selectedCollection.Name : calendarHeader ? calendarHeader.Name : ''}</span>\n                                {!this.props.isBillManagement && <div role=\"button\" aria-label=\"edit watchlist name and description\" className=\"icon edit\" onClick={() => !this.props.collectionIsSaving && this.toggleEditWatchlistName()}></div>}\n                            </div>\n                            <span className=\"description\">{selectedCollection ? selectedCollection.Description : calendarHeader ? calendarHeader.Description : ''}</span>\n                        </div>\n                    }\n                    <div className=\"close-or-delete-watchlist align-right inline-list\" style={this.state.editWatchlistName ? { display: 'none' } : {}}>\n                        <br />\n                        {!this.props.isBillManagement && !searchMade &&\n                            <React.Fragment>\n                                {this.props.billListLength ? <button type='button' disabled={this.props.collectionIsSaving} onClick={() => this.handleToggleCompositeView()} className='button primary'>Composite View</button> : null}\n                                <button type=\"button\" disabled={this.props.collectionIsSaving} onClick={() => this.togglePopup(MERGE)} className=\"button primary\">Merge</button>\n                                <button type=\"button\" disabled={this.props.collectionIsSaving} onClick={() => this.togglePopup(DELETE)} className=\"button danger\">Delete</button>\n                            </React.Fragment>\n                        }\n                        {searchMade && !calendarHeader ?\n                            <button type=\"button\" disabled={this.props.collectionIsSaving} onClick={() => this.props.selectCollection(selectedCollectionIndex, true)} className=\"button secondary\">Back to watchlist</button>\n                            :\n                            <button type=\"button\" disabled={this.props.collectionIsSaving} onClick={() => this.props.selectCollection(-1)} className=\"button secondary\" style={{ marginRight: '0px' }}>Close</button>\n                        }\n                    </div>\n                </div>\n                <br />\n            </div>\n        )\n    }\n}\n\nconst selectStyle = {\n    control: styles => ({\n        ...styles,\n        minHeight: '0px',\n        padding: '0.12em 0.6em !important',\n    }),\n    valueContainer: styles => ({\n        ...styles,\n        padding: 0,\n    }),\n    input: styles => ({\n        ...styles,\n        fontSize: '0.8em',\n        lineHeight: 'normal',\n    }),\n    singleValue: styles => ({\n        ...styles,\n        fontSize: '0.8em'\n    }),\n    placeholder: styles => ({\n        ...styles,\n        fontSize: '0.8em'\n    }),\n    option: styles => ({\n        ...styles,\n        fontSize: '0.8em'\n    }),\n    dropdownIndicator: styles => ({\n        ...styles,\n        padding: '1px'\n    }),\n}\n\nexport default CollectionControls;\n","import { partnerRequest, publicRequest } from '../services/request.service'\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst getCollectionFailure = \"GET_COLLECTION_FAILURE\"\nconst getCollectionSuccess = \"GET_COLLECTION_SUCCESS\"\n\nconst getCollectionsFailure = \"GET_COLLECTIONS_FAILURE\"\nconst getCollectionsSuccess = \"GET_COLLECTIONS_SUCCESS\"\n\nconst saveCollectionsFailure = \"SAVE_COLLECTIONS_FAILURE\"\nconst saveCollectionsSuccess = \"SAVE_COLLECTIONS_SUCCESS\"\n\nconst getCriteriaTypesSuccess = \"GET_CRITERIA_TYPES_SUCCESS\"\nconst getCriteriaTypesFailure = \"GET_CRITERIA_TYPES_FAILURE\"\n\nconst notificationListSuccess = \"NOTIFICATIONS_LIST_SUCCESS\"\nconst notificationListFailure = \"NOTIFICATIONS_LIST_FAILURE\"\n\nconst messageListSuccess = \"MESSAGES_LIST_SUCCESS\"\nconst messageListFailure = \"MESSAGES_LIST_FAILURE\"\n\nconst adminMessageListSuccess = \"ADMIN_MESSAGES_LIST_SUCCESS\"\nconst adminMessageListFailure = \"ADMIN_MESSAGES_LIST_FAILURE\"\n\nconst createMessageSuccess = \"CREATE_MESSAGES_SUCCESS\"\nconst createMessageFailure = \"CREATE_MESSAGES_FAILURE\"\n\nconst saveMessageSuccess = \"SAVE_MESSAGES_SUCCESS\"\nconst saveMessageFailure = \"SAVE_MESSAGES_FAILURE\"\n\nconst initialState = {\n    collection: '',\n    collections: [],\n    collectionsError: '',\n    collectionSave: '',\n    collectionSaveError: '',\n    criteriaTypes: [],\n    criteriaTypesError: '',\n    notifications: [],\n    notificationsError: '',\n    messages: [],\n    messagesError: '',\n    adminMessages: [],\n    adminMessagesError: '',\n    messageCreate: [],\n    messageCreateError: '',\n    messageSave: [],\n    messageSaveError: ''\n};\n\nexport const collectionActionCreators = {\n\n    receiveCollection: resObj => ({\n        type: getCollectionSuccess,\n        collection: resObj\n    }),\n\n    collectionError: message => ({\n        type: getCollectionFailure,\n        collectionError: message\n    }),\n\n    getCollection: (params) => {\n        return dispatch => {\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_COLLECTION_API_URL) + '/LegislationCollections/api/GetLegislationCollectionByIdAsync', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(collectionActionCreators.collectionError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(collectionActionCreators.receiveCollection(result[1].WatchLists))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(collectionActionCreators.receiveCollection([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveCollections: resObj => ({\n        type: getCollectionsSuccess,\n        collections: resObj\n    }),\n\n    collectionsError: message => ({\n        type: getCollectionsFailure,\n        collectionsError: message\n    }),\n\n    getCollections: (params) => {\n        return dispatch => {\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_COLLECTION_API_URL) + '/LegislationCollections/api/GetLegislationCollectionsAsync', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(collectionActionCreators.collectionsError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(collectionActionCreators.receiveCollections(result[1].WatchLists.sort((a, b) => new Date(b.ModificationDate) - new Date(a.ModificationDate))))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(collectionActionCreators.receiveCollections([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveCollectionSave: resObj => ({\n        type: saveCollectionsSuccess,\n        collectionSave: resObj\n    }),\n\n    collectionSaveError: message => ({\n        type: saveCollectionsFailure,\n        collectionSaveError: message\n    }),\n\n    saveCollections: (body, useCreate) => {\n        return dispatch => {\n            let request = '';\n            if (useCreate) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_COLLECTION_API_URL) + '/LegislationCollections/api/CreateLegislationCollectionAsync', 'POST', '', body, '')\n            } else {\n                request = partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_COLLECTION_API_URL) + '/LegislationCollections/api/SaveLegislationCollectionAsync', 'PUT', '', body, '')\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(collectionActionCreators.collectionSaveError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(collectionActionCreators.receiveCollectionSave(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(collectionActionCreators.collectionSaveError('No Content'));\n                        Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveCriteriaTypes: resObj => ({\n        type: getCriteriaTypesSuccess,\n        criteriaTypes: resObj\n    }),\n\n    criteriaTypesError: message => ({\n        type: getCriteriaTypesFailure,\n        criteriaTypesError: message\n    }),\n\n    getCriteriaTypes() {\n        return dispatch => {\n            return partnerRequest((API_URL || process.env.REACT_APP_LEGISLATION_COLLECTION_API_URL) + '/LegislationCollections/api/GetCriteriaTypesAsync', 'GET', '', '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(collectionActionCreators.criteriaTypesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(collectionActionCreators.receiveCriteriaTypes(result[1].CriteriaTypes))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(collectionActionCreators.criteriaTypesError('No Content'))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveNotifications: resObj => ({\n        type: notificationListSuccess,\n        notifications: resObj\n    }),\n\n    notificationsError: message => ({\n        type: notificationListFailure,\n        notificationsError: message\n    }),\n\n    getNotifications(params) {\n        return dispatch => {\n            return partnerRequest((API_URL || process.env.REACT_APP_NOTIFICATIONS_API_URL) + '/Notification/api/GetNotificationsAsync', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(collectionActionCreators.notificationsError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(collectionActionCreators.receiveNotifications(result[1].Notifications))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(collectionActionCreators.receiveNotifications([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveMessages: resObj => ({\n        type: messageListSuccess,\n        messages: resObj\n    }),\n\n    messagesError: message => ({\n        type: messageListFailure,\n        messagesError: message\n    }),\n\n    getMessages() {\n        return dispatch => {\n            return publicRequest((API_URL || process.env.REACT_APP_NOTIFICATIONS_API_URL) + '/Notification/api/GetPublicMessagesAsync', 'GET', '', '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(collectionActionCreators.messagesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(collectionActionCreators.receiveMessages(result[1].Messages))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(collectionActionCreators.receiveMessages([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveAdminMessages: resObj => ({\n        type: adminMessageListSuccess,\n        adminMessages: resObj\n    }),\n\n    adminMessagesError: message => ({\n        type: adminMessageListFailure,\n        adminMessagesError: message\n    }),\n\n    getAdminMessages() {\n        return dispatch => {\n            return partnerRequest((API_URL || process.env.REACT_APP_NOTIFICATIONS_API_URL) + '/Notification/api/GetMessagesAsync', 'GET', '', '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(collectionActionCreators.adminMessagesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(collectionActionCreators.receiveAdminMessages(result[1].Messages))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(collectionActionCreators.receiveAdminMessages([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveMessageCreate: resObj => ({\n        type: createMessageSuccess,\n        messageCreate: resObj\n    }),\n\n    messageCreateError: message => ({\n        type: createMessageFailure,\n        messageCreateError: message\n    }),\n\n    createMessage(body) {\n        return dispatch => {\n            return partnerRequest((API_URL || process.env.REACT_APP_NOTIFICATIONS_API_URL) + '/Notification/api/CreateMessageAsync', 'POST', '', body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(collectionActionCreators.messageCreateError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(collectionActionCreators.receiveMessageCreate(result[1].Messages))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(collectionActionCreators.receiveMessageCreate([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveMessageSave: resObj => ({\n        type: saveMessageSuccess,\n        messageSave: resObj\n    }),\n\n    messageSaveError: message => ({\n        type: saveMessageFailure,\n        messageSaveError: message\n    }),\n\n    saveMessage(body) {\n        return dispatch => {\n            return partnerRequest((API_URL || process.env.REACT_APP_NOTIFICATIONS_API_URL) + '/Notification/api/SaveMessageAsync', 'POST', '', body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(collectionActionCreators.messageSaveError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(collectionActionCreators.receiveMessageSave(result[1].Messages))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(collectionActionCreators.receiveMessageSave([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    }\n\n};\n\n\nexport const reducer = (state, action) => {\n\n    state = state || initialState;\n\n    switch (action.type) {\n        case getCollectionSuccess:\n            return Object.assign({}, state, {\n                collection: action.collection,\n                collectionError: ''\n            });\n        case getCollectionFailure:\n            return Object.assign({}, state, {\n                collectionError: action.collectionError\n            });\n        case getCollectionsSuccess:\n            return Object.assign({}, state, {\n                collections: action.collections,\n                collectionsError: ''\n            });\n        case getCollectionsFailure:\n            return Object.assign({}, state, {\n                collectionsError: action.collectionError\n            });\n        case saveCollectionsSuccess:\n            return Object.assign({}, state, {\n                collectionSave: action.collectionSave,\n                collectionSaveError: ''\n            })\n        case saveCollectionsFailure:\n            return Object.assign({}, state, {\n                collectionSaveError: action.collectionSaveError\n            })\n        case getCriteriaTypesSuccess:\n            return Object.assign({}, state, {\n                criteriaTypes: action.criteriaTypes,\n                criteriaTypesError: ''\n            })\n        case getCriteriaTypesFailure:\n            return Object.assign({}, state, {\n                criteriaTypesError: action.criteriaTypesError\n            })\n        case notificationListSuccess:\n            return Object.assign({}, state, {\n                notifications: action.notifications,\n                notificationsError: ''\n            })\n        case notificationListFailure:\n            return Object.assign({}, state, {\n                notificationsError: action.notificationsError\n            })\n        case messageListSuccess:\n            return Object.assign({}, state, {\n                messages: action.messages,\n                messagesError: ''\n            })\n        case messageListFailure:\n            return Object.assign({}, state, {\n                messagesError: action.messagesError\n            })\n        case adminMessageListSuccess:\n            return Object.assign({}, state, {\n                adminMessages: action.adminMessages,\n                adminMessagesError: ''\n            })\n        case adminMessageListFailure:\n            return Object.assign({}, state, {\n                adminMessagesError: action.adminMessagesError\n            })\n        case createMessageSuccess:\n            return Object.assign({}, state, {\n                messageCreate: action.messageCreate,\n                messageCreateError: ''\n            })\n        case createMessageFailure:\n            return Object.assign({}, state, {\n                messageCreateError: action.messageCreateError\n            })\n        case saveMessageSuccess:\n            return Object.assign({}, state, {\n                messageSave: action.messageSave,\n                messageSaveError: ''\n            })\n        case saveMessageFailure:\n            return Object.assign({}, state, {\n                messageSaveError: action.messageSaveError\n            })\n        default:\n            return state\n    }\n};","import React, { useState } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport renderHTML from 'react-render-html';\nimport { Link } from 'react-router-dom';\nimport { billActionCreators } from '../../stores/lis-legislation-store';\nimport moment from 'moment-timezone';\nimport { voteActionCreators } from '../../stores/lis-votes-store';\nimport VersionList from '../lis-bills/lis-bill-version-list';\nimport { committeeActionCreators } from '../../stores/lis-committee-store';\n\nconst HistoryList = props => {\n    const [filterAmount, setFilterAmount] = useState(5);\n    const filteredBillHistory = props.billHistory.slice(Math.max(props.billHistory.length - (parseInt(filterAmount) || 0), 0))\n    const filterOptions = () => {\n        let options = []\n        // Allow the user to show a variable amount of bill history items\n        for (let i = 5; i < props.billHistory.length; i = i + 5) {\n            options.push(<option key={i} value={i}>Show Last {i}</option>)\n        }\n        return options;\n    }\n    return (\n        <div>\n            {props.billHistory.length > 5 &&\n                <div className=\"align-right\">\n                    <select value={filterAmount} onChange={e => setFilterAmount(e.target.value)}>\n                        {filterOptions()}\n                        <option value={props.billHistory.length}>Show All</option>\n                    </select>\n                </div>\n            }\n            <table className=\"line-table\">\n                <tbody>\n                    {filteredBillHistory.filter(item => !item.DeletionDate).map((item, hIndex) => (\n                        <tr key={hIndex} className='parent-tr bill-details-table-row'>\n                            <td className=\"left\">{moment(item.EventDate).format('l')}</td>\n                            <td className=\"left\">{item.ChamberCode === 'H' ? 'House' : 'Senate'}</td>\n                            <td className=\"left\">\n                                {item.Description}\n                                {item.VoteLinks && item.opened &&\n                                    <div className=\"link-row\">\n                                        {item.VoteLinks.map((link, vIndex) =>\n                                            <div key={vIndex}>\n                                                {link.VoteID ? link.IsPublic ? <Link to={`/vote-details/${props.bill.LegislationNumber}/${item.SessionCode}/${link.VoteNumber}`}>Vote</Link> : <span>Vote Detail Pending</span> : ''}\n                                                {link.CommitteeNumber ? <Link to={`/session-details/${item.SessionCode}/committee-information/${link.CommitteeNumber}/committee-details`}>{link.ParentCommitteeID ? 'Subcommittee' : 'Committee'}</Link> : ''}\n                                                {link.LegislationNumber && link.SessionCode ? <Link to={`/bill-details/${link.SessionCode}/${link.LegislationNumber}`}>Legislation</Link> : ''}\n                                            </div>\n                                        )}\n                                    </div>\n                                }\n                            </td>\n                            <td className=\"button-container\">\n                                {item.ReferenceID &&\n                                    <React.Fragment>\n                                        {item.isLoading ?\n                                            <span className=\"small-spinner\"></span>\n                                            :\n                                            <button aria-expanded={item.opened} className={item.opened ? 'arrow-up' : 'arrow-down'} onClick={() => props.toggleShowLinks(item)}></button>\n                                        }\n                                    </React.Fragment>\n                                }\n                            </td>\n                        </tr>\n                    ))}\n                </tbody>\n            </table>\n        </div>\n    );\n}\n\nclass BillInfoComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            bill: [],\n            billHistoryIsLoading: false,\n            showInfo: props.isBillManagement ? false : true,\n            billHistory: [],\n            showBillHistory: false,\n            showBillVersions: false,\n            newBillNote: '',\n            showBillNote: false\n        };\n        this.handleNoteChange = this.handleNoteChange.bind(this);\n        this.toggleShowInfo = this.toggleShowInfo.bind(this);\n        this.getHistory = this.getHistory.bind(this);\n        this.toggleShowLinks = this.toggleShowLinks.bind(this);\n        this.toggleVersions = this.toggleVersions.bind(this);\n        this.toggleBillNote = this.toggleBillNote.bind(this);\n        this.toggleBillNotesFromParent = this.toggleBillNotesFromParent.bind(this);\n        this.saveNote = this.saveNote.bind(this);\n    }\n\n    componentDidMount() {\n        if (this.props.selectedLocation === \"Bill Text\" && this.props.selectedKeywords)\n            this.props.toggleShowData(this.props.bill.LegislationID, true)\n    }\n\n    handleNoteChange(e) {\n        this.setState({\n            newBillNote: e.target.value\n        })\n    }\n\n\n    toggleShowInfo() {\n        this.setState(prevState => ({\n            showInfo: !prevState.showInfo\n        }));\n    }\n\n    getHistory() {\n        //Bill history is already loaded so just toggle the view\n        if (this.state.billHistory.length > 0) {\n            this.setState(state => ({\n                showBillHistory: !state.showBillHistory\n            }));\n            return;\n        }\n        this.setState({\n            billHistoryIsLoading: true\n        });\n        this.props.actions.getBillHistoryByBillID(\"?legislationID=\" + this.props.bill.LegislationID)\n            .then(() => {\n                let billHistory = [...this.props.bills.billHistory];\n                if (billHistory.length === 0) {\n                    throw 'No Bill History Found'\n                }\n                this.setState({\n                    billHistory: this.props.bills.billHistory,\n                    billHistoryIsLoading: false,\n                    showBillHistory: true\n                });\n            }).catch(err => {\n                if (err === \"Aborted\") {\n                    return;\n                }\n                this.setState({\n                    billHistoryMessage: err.toString(),\n                    billHistoryIsLoading: false\n                });\n            });\n    }\n\n    toggleShowLinks(vote) {\n        let billHistory = [...this.state.billHistory];\n        const historyIndex = billHistory.findIndex(item => item.LegislationEventID == vote.LegislationEventID);\n        billHistory[historyIndex].opened = !billHistory[historyIndex].opened;\n\n        if (vote.VoteLinks) {\n            this.setState({\n                billHistory: billHistory\n            });\n        } else {\n            billHistory[historyIndex].isLoading = true;\n            this.setState({ billHistory: billHistory });\n            let params = '?legislationEventID=' + vote.LegislationEventID;\n            this.props.actions.getVoteLink(params).then(() => {\n                let links = [...this.props.votes.voteLinkResponse];\n                let linkPromises = [];\n                links.forEach(link => {\n                    if (link.CommitteeID) {\n                        const cmtePromise = this.props.actions.getCommitteeById(\"?id=\" + link.CommitteeID + \"&sessionCode=\" + vote.SessionCode)\n                            .then(() => {\n                                link.CommitteeNumber = this.props.committee.committeeByIdData.CommitteeNumber;\n                            }).catch((err) => {\n                                console.error(err);\n                                // Don't care if it fails. That committee won't be visible\n                                return Promise.resolve();\n                            })\n                        linkPromises.push(cmtePromise);\n                    }\n                    // If there are any vote links of type 'Legislation' then the legislation ID needs to be turned into a legislation number to form the link\n                    if (link.ReferenceType === \"Legislation\") {\n                        const promise = this.props.actions.getBill(link.ReferenceID)\n                            .then(() => {\n                                link.LegislationNumber = this.props.bills.bill.LegislationNumber;\n                                link.SessionCode = link.SessionCode || vote.SessionCode;\n                                return Promise.resolve();\n                            }).catch(err => {\n                                console.error(err);\n                                // Don't care if it fails. That legislation won't be visible\n                                return Promise.resolve();\n                            });\n                        linkPromises.push(promise);\n                    }\n                });\n                Promise.all(linkPromises)\n                    .then(() => {\n                        billHistory[historyIndex].isLoading = false;\n                        billHistory[historyIndex].VoteLinks = this.props.votes.voteLinkResponse;\n                        this.setState({\n                            billHistory: billHistory\n                        });\n                    });\n            });\n        }\n    }\n\n    toggleVersions() {\n        this.setState({\n            showBillVersions: !this.state.showBillVersions\n        })\n    }\n\n    toggleBillNote() {\n        const { bill, selectedCollection } = this.props;\n        const collectionBillIndex = selectedCollection.WatchListLegislation.findIndex(cBill => bill.LegislationID === cBill.LegislationID && !cBill.DeletionDate);\n        this.setState(state => ({\n            newBillNote: selectedCollection.WatchListLegislation[collectionBillIndex].Note || '',\n            showBillNote: !state.showBillNote\n        }));\n    }\n\n    toggleBillNotesFromParent(show) {\n        // This function is called by the parent to show/hide all the notes in a watchlist.\n        const { bill, selectedCollection } = this.props;\n        const collectionBillIndex = selectedCollection.WatchListLegislation.findIndex(cBill => bill.LegislationID === cBill.LegislationID && !cBill.DeletionDate);\n        if (selectedCollection.WatchListLegislation[collectionBillIndex].Note) {\n            this.setState({\n                newBillNote: selectedCollection.WatchListLegislation[collectionBillIndex].Note || '',\n                showBillNote: show\n            });\n        }\n    }\n\n    saveNote() {\n        const bill = this.props.bill;\n        let selectedCollection = { ...this.props.selectedCollection };\n        const collectionBillIndex = selectedCollection.WatchListLegislation.findIndex(cBill => bill.LegislationID === cBill.LegislationID && !cBill.DeletionDate);\n        selectedCollection.WatchListLegislation[collectionBillIndex].Note = this.state.newBillNote;\n        this.props.handleCollectionChange(selectedCollection, () => {\n            this.setState({\n                showBillNote: false\n            });\n        });\n    }\n\n    render() {\n        const { bill, billIndex, selectedCollection, userCanUseCollections, checked, selectedKeywords, sessionCode, selectedLocation, session, displayCrossSession, newSession } = this.props;\n        const { showInfo, billHistoryIsLoading, billHistory, showBillHistory, billHistoryMessage, showBillVersions, showBillNote, newBillNote } = this.state;\n        let collectionBillIndex = -1;\n        if (selectedCollection && !this.props.isBillManagement && !this.props.searchMade) {\n            collectionBillIndex = selectedCollection.WatchListLegislation.findIndex(cBill => bill.LegislationID === cBill.LegislationID && !cBill.DeletionDate);\n        }\n        return (\n            <div className=\"flex-row flex-start bill-info\" style={{ paddingTop: '0.5em' }}>\n                <div className='parent-li se-bill-search-result'>\n                    <div className=\"toggle-row description legislation-search-results\" style={bill.eventsChanged ? { background: '#f1f1f1', fontStyle: 'italic' } : {}}>\n                        <div>\n                            {userCanUseCollections || this.props.isBillManagement ?\n                                <div className=\"collection-buttons\">\n                                    <label className=\"screen-reader-only\" htmlFor={`sr-select-bill${billIndex}`}>Select bill</label>\n                                    <input type=\"checkbox\"\n                                        id={`sr-select-bill${billIndex}`}\n                                        checked={checked || false}\n                                        onChange={this.props.handleBillCheckbox} />\n                                </div>\n                                :\n                                <div></div>\n                            }\n                            <div className=\"bill-result-link\">\n                                <Link to={`/bill-details/${sessionCode}/${bill.LegislationNumber}`} style={{ pointerEvents: sessionCode ? null : 'none' }} target=\"_blank\">{bill.LegislationNumber}</Link>\n                                {this.props.displayChapterNumber && bill.ChapterNumber &&\n                                    <div className=\"bill-additional-info\">\n                                        <p className={`${this.props.isBillManagement || userCanUseCollections ? 'margin-left' : ''}`}>({bill.ChapterNumber})</p>\n                                    </div>\n                                }\n                                {displayCrossSession &&\n                                    <div className=\"bill-additional-info\">\n                                        <p className={`${userCanUseCollections ? ' margin-left' : ''}`}>{session.SessionYear + \" \" + session.DisplayName}</p>\n                                    </div>\n                                }\n                                {collectionBillIndex !== -1 &&\n                                    <div\n                                        role=\"button\"\n                                        aria-label={!selectedCollection.WatchListLegislation[collectionBillIndex].Note ? \"Edit notes\" : 'Add notes'}\n                                        className={`icon bubble${!selectedCollection.WatchListLegislation[collectionBillIndex].Note ? \"-hollow\" : ''}`}\n                                        onClick={() => !this.props.collectionIsSaving && this.toggleBillNote()}\n                                        title={selectedCollection.WatchListLegislation[collectionBillIndex].Note ? \"Edit notes\" : \"Add notes\"}>\n                                    </div>\n                                }\n                            </div>\n                        </div>\n                        <span style={{ paddingRight: '25px' }}>{renderHTML(bill.Description || '')}</span>\n                        <div className=\"button-container\">\n                            <span>{bill.LegislationStatus}</span>\n                            <button aria-expanded={!!this.props.expanded} className={this.props.expanded ? 'arrow-up' : 'arrow-down'} onClick={() => this.props.toggleShowData(bill.LegislationID)}>More info</button>\n                        </div>\n                    </div>\n                    {(this.state[bill.LegislationID] || this.props.expanded) &&\n                        <div className=\"list-desc\">\n                            {!this.props.isBillManagement && (selectedLocation != \"Bill Text\" || !selectedKeywords) &&\n                                <div style={{ paddingBottom: showInfo ? '20px' : '0px', position: 'relative', overflow: 'hidden', height: showInfo ? 'auto' : '100px' }}>\n                                    {bill.Patrons &&\n                                        <span>Introduced by: {bill.Patrons.map((patron, patronIndex) => <React.Fragment key={patronIndex}>{patron.PatronDisplayName}{patronIndex !== bill.Patrons.length - 1 && \", \"}</React.Fragment>)}</span>\n                                    }\n                                    <div><strong>{bill.SummaryVersion}:</strong>{renderHTML(bill.LegislationSummary)}</div>\n                                    <div className=\"content-blocker\" style={showInfo ? { background: 'none' } : {}}>\n                                        <button onClick={this.toggleShowInfo} className=\"expander button-link\" type=\"button\">Show {showInfo ? \"Less\" : \"\"} Info</button>\n                                    </div>\n                                </div>\n                            }\n                            {this.props.children || null}\n                            {billHistoryIsLoading ?\n                                <div><span className=\"small-spinner\"></span></div>\n                                :\n                                bill.SearchText.length > 0 && (selectedLocation != \"Bill Text\" || !selectedKeywords) &&\n                                <div className=\"bill-search-bill-history\">\n                                    {billHistoryMessage &&\n                                        <div className=\"fail small-text\">{billHistoryMessage}</div>\n                                    }\n                                    {billHistory.length > 0 && showBillHistory &&\n                                        <div>\n                                            <HistoryList\n                                                billHistory={billHistory}\n                                                toggleShowLinks={this.toggleShowLinks}\n                                                bill={bill}\n                                            />\n                                        </div>\n                                    }\n                                    {!this.props.isBillManagement && <button onClick={this.getHistory} className=\"bill-history-button button-link\" type=\"button\">{showBillHistory ? 'Hide' : 'Show'} Latest History</button>}\n                                </div>\n                            }\n                            {bill.SearchText.length > 0 && selectedLocation === \"Bill Text\" && selectedKeywords &&\n                                <div>\n                                    <VersionList\n                                        version={bill.SearchText}\n                                        legislationNumber={bill.LegislationNumber}\n                                        legislationClass={bill.LegislationClass}\n                                        sessionCode={sessionCode}\n                                        selectedKeywords={selectedKeywords}\n                                        descriptionEditable={false}\n                                    />\n                                </div>\n                            }\n                        </div>\n                    }\n                    {showBillNote &&\n                        <div className=\"dlas-forms flex-row note-area-container\">\n                            <label className=\"screen-reader-only\" htmlFor={`sr-bill-note${billIndex}`}>Bill note</label>\n                            <textarea\n                                id={`sr-bill-note${billIndex}`}\n                                value={newBillNote}\n                                onChange={this.handleNoteChange}\n                                style={{ width: '90%', marginBottom: '5px', fontSize: '1em', resize: \"vertical\" }}\n                                placeholder={`${bill.LegislationNumber} Note`}\n                                className=\"note-area-input\"\n                            />\n                            {this.props.collectionIsSaving ?\n                                <div className=\"small-spinner\"></div>\n                                :\n                                <div className=\"inline-list\">\n                                    <button aria-label=\"save\" onClick={this.saveNote} type=\"button\" className=\"icon save\"></button>\n                                    <button aria-label=\"cancel\" onClick={this.toggleBillNote} type=\"button\" className=\"icon delete\"></button>\n                                </div>\n                            }\n                        </div>\n                    }\n                    {!newSession && <hr className=\"faded-line\" style={{ marginBlockEnd: '0px' }} />}\n                </div>\n            </div>\n        )\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { bills, votes, committee } = state;\n        return {\n            bills,\n            votes,\n            committee\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, billActionCreators, voteActionCreators, committeeActionCreators), dispatch)\n        }\n    },\n    null,\n    {\n        forwardRef: true\n    }\n)(BillInfoComponent);","import React from 'react';\nimport renderHTML from 'react-render-html';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\nimport { memberActionCreators } from '../../../stores/lis-members-store';\nimport { billActionCreators } from '../../../stores/lis-legislation-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { patronActionCreators } from '../../../stores/lis-patron-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport moment from 'moment-timezone';\nimport queryString from 'query-string';\nimport '../../../stylesheets/lis-public-view/public-view.css';\nimport EventControls from './event-controls';\nimport BillCategories from '../../../lis-shared/lis-search/lis-search-categories';\nimport AdvancedSearchBox from '../../../lis-shared/lis-search/lis-advanced-search-box';\nimport SearchSelections from '../../../lis-shared/lis-search/lis-search-selections';\nimport BillHistoryForm from '../../../lis-public/components/lis-bill-details/lis-history-form';\nimport LegislationWatchlists from '../../../lis-shared/lis-search/lis-legislation-watchlists';\nimport CollectionControls from '../../../lis-shared/lis-search/lis-collection-controls'\nimport { cancelRequest } from '../../../services/request.service';\nimport { collectionActionCreators } from '../../../stores/lis-collection-store';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\nimport { minutesActionCreators } from '../../../stores/lis-minutes-store';\nimport BillInfoComponent from '../../../lis-shared/lis-search/lis-bill-info';\nimport { HubConnectionBuilder } from '@microsoft/signalr';\n\nconst BILL_COLLECTION_AUTHOR = \"LegislationCollections\";\nconst API_URL = window.env ? window.env.API_SERVER : '';\n\nclass BillManagement extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            showCategories: false,\n            billList: [],\n            billStatusCategoryList: [],\n            billStatusCategoryListIsLoading: true,\n            billEventOptions: [],\n            selectedBillEvent: '',\n            showOverlay: false,\n            selectedBill: '',\n            selectedKeywords: '',\n            selectedBillAction: '',\n            billEventStartDate: null,\n            billEventEndDate: null,\n            selectedBillSession: '',\n            selectedBillType: '',\n            previousSearch: '',\n            searchType: { value: 'all', label: 'All' },\n            selectedChamber: '',\n            patronList: [],\n            patronRoles: [],\n            selectedBillNumbers: '',\n            selectedBillRangeBeginning: '',\n            selectedBillRangeEnd: '',\n            selectedChapterNumber: '',\n            filteredPatronList: [],\n            selectedPatron: '',\n            selectedPatronType: [],\n            selectedBillStatusCategory: '',\n            sessionOptions: [],\n            billStatusStartDate: null,\n            billStatusEndDate: null,\n            committeeList: [],\n            fullCommitteeList: [],\n            groupedCommitteeList: [],\n            filteredCommitteeList: [],\n            selectedCommittee: '',\n            selectedSubcommittee: '',\n            subcommitteeList: [],\n            subjectList: [],\n            selectedSubject: '',\n            introDateList: [],\n            collections: [],\n            selectedCollection: '',\n            selectedCollectionIndex: -1,\n            checkedBills: [],\n            lastCheckedBill: -1,\n            selectAllBills: false,\n            billVersionList: [],\n            selectedBillVersion: 'All',\n            billSummaryList: [],\n            selectedSummaryVersion: 'All',\n            selectedLocation: 'Caption',\n            actionTypes: [],\n            otherBillEventOptions: [],\n            currentStatus: true,\n            legislationIDs: [],\n            showSidebar: true,\n            hideAllEvents: [true],\n            height: 1,\n            showModal: false,\n            introductionDate: null,\n            excludeFailed: false,\n            showUpdateSearchButton: false\n        };\n        this.searchOnEnterPress = this.searchOnEnterPress.bind(this);\n        this.toggleGroup = this.toggleGroup.bind(this);\n        this.toggleShowCategories = this.toggleShowCategories.bind(this);\n        this.clearForm = this.clearForm.bind(this);\n        this.handleSubmit = this.handleSubmit.bind(this);\n        this.handleSearch = this.handleSearch.bind(this);\n        this.getBillsResults = this.getBillsResults.bind(this);\n        this.chamberChange = this.chamberChange.bind(this);\n        this.sessionChange = this.sessionChange.bind(this);\n        this.committeeChange = this.committeeChange.bind(this);\n        this.handlePatronChange = this.handlePatronChange.bind(this);\n        this.handlePatronTypeChange = this.handlePatronTypeChange.bind(this);\n        this.handleDateChange = this.handleDateChange.bind(this);\n        this.handleSelectionClear = this.handleSelectionClear.bind(this);\n        this.handleMultiSelectionClear = this.handleMultiSelectionClear.bind(this);\n        this.getCollections = this.getCollections.bind(this);\n        this.selectCollection = this.selectCollection.bind(this);\n        this.handleBillCheckbox = this.handleBillCheckbox.bind(this);\n        this.handleEventChange = this.handleEventChange.bind(this);\n        this.addEvent = this.addEvent.bind(this);\n        this.removeEvent = this.removeEvent.bind(this);\n        this.saveForm = this.saveForm.bind(this);\n        this.getOtherBillEventOptions = this.getOtherBillEventOptions.bind(this);\n        this.handleCurrentStatusChange = this.handleCurrentStatusChange.bind(this);\n        this.toggleSidebar = this.toggleSidebar.bind(this);\n        this.toggleShowData = this.toggleShowData.bind(this);\n        this.togglehideAllEvents = this.togglehideAllEvents.bind(this);\n        this.toggleAllBills = this.toggleAllBills.bind(this);\n        this.handleEditedBills = this.handleEditedBills.bind(this);\n        this.getSessions = this.getSessions.bind(this);\n        this.executeSearch = this.executeSearch.bind(this);\n        this.toggleModal = this.toggleModal.bind(this);\n        this.handleExcludeFailedChange = this.handleExcludeFailedChange.bind(this);\n        this.toggleExpandAllLegislation = this.toggleExpandAllLegislation.bind(this);\n        this.receiveEventByWebsocket = this.receiveEventByWebsocket.bind(this);\n\n        // The div that sorrounds the page is in this component but the function that needs to run to be able to make a search is in the child component.\n        // This ref is used to call the child component's function.\n        this.searchBox = React.createRef();\n    }\n\n    componentDidMount() {\n        // IF A SEARCH QUERY EXISTS\n        let queryObj = '';\n        const parsed = queryString.parse(this.props.location.search);\n        if (parsed.q) {\n            const base64 = parsed.q;\n            const decodedSearch = window.atob(base64);\n            queryObj = JSON.parse(decodedSearch);\n            this.setState(state => ({\n                ...state,\n                ...queryObj\n            }), () => {\n                //If we haven't arrived here to edit history then go ahead with the search\n                if (queryObj.calendarCategoryTypeID) {\n                    this.setState({\n                        calendarHeader: {\n                            Name: 'Calendar on ' + moment(queryObj.calendarDate).format(\"MM/DD/YYYY\"),\n                            Description: queryObj.calendarCategoryDescription\n                        }\n                    })\n                    this.getSessions(queryObj);\n                } else {\n                    this.getSessions();\n                }\n            });\n        } else {\n            this.getSessions();\n        }\n\n        let entryConnection = new HubConnectionBuilder() //in bill mgmt, use one central entryConnection from props rather than a separate connection for each bill\n            .withUrl((API_URL || process.env.REACT_APP_LEGISLATION_EVENT_API_URL) + '/LegislationEvent/events')\n            .build();\n        entryConnection.serverTimeoutInMilliseconds = 60000;\n        this.setState({\n            entryHubConnection: entryConnection\n        }, () => {\n            this.state.entryHubConnection\n                .start({ withCredentials: false })\n                .then(() => {\n                    BillHistoryForm.getConnectionId(this.state.entryHubConnection, (connectionId) => {\n                        console.log(`entryConnectionId: ${connectionId}`);\n                        this.setState({\n                            entryConnectionId: connectionId\n                        })\n                    });\n                }).catch(err => {\n                    console.log('Error establishing connection' + err)\n                    this.props.actions.makeToast([{ message: \"Entry Connection Failed\", type: \"failure\" }])\n                });\n            this.state.entryHubConnection.on(\"ReceiveEvent\", message => BillHistoryForm.handleEvent(message, this.receiveEventByWebsocket));\n        });\n\n        this.getBillStatusCategoryOptions();\n        this.getBillVersionOptions();\n        this.getBillSummaryOptions();\n        this.getBillEventOptions(queryObj.calendarCategoryTypeID);\n        this.getPatronRoles();\n\n        this.props.actions.getActionTypes()\n            .then(() => {\n                let actionTypes = [...this.props.minutes.actionTypes];\n                actionTypes.forEach(type => {\n                    type.label = type.ActionReferenceType;\n                    type.value = type.ActionReferenceTypeID;\n                })\n                this.setState({\n                    actionTypes: actionTypes\n                });\n            });\n    }\n\n    receiveEventByWebsocket(message) {\n        let billList = [...this.state.billList];\n        message.forEach(msg => {\n            //If the LegislationID for the list of new events doesn't match any bills in the result set then keep it moving\n            const billIndex = billList.findIndex(b => b.LegislationID === msg.LegislationID);\n            if (billIndex > -1) {\n                let updated = false;\n                //If we don't find an event from the websocket message in the already-loaded list of events then add it to the local history list\n                if (!billList[billIndex].historyList?.find(x => x.LegislationEventID === msg.LegislationEventID)) {\n                    updated = true;\n                    billList[billIndex].historyList = billList[billIndex].historyList || [];\n                    billList[billIndex].historyList.push(msg)\n                }\n                if (updated) {\n                    //Send the updated local history list to be reorganized and displayed\n                    const organizedEvents = BillHistoryForm.organizeEvents(billList[billIndex].historyList);\n                    this.handleEventChange(billIndex, organizedEvents);\n                }\n            }\n        });\n\n        this.setState({ billList })\n    }\n\n    getSessions(queryObj) {\n        let sessions = ''\n        if (!this.state.sessionOptions.length) {\n            sessions = this.props.actions.getSessionList()\n                .then(() => {\n                    this.setState({\n                        sessionOptions: this.props.session.sessionList\n                    })\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    console.log(err)\n                });\n        } else {\n            sessions = () => Promise.resolve();\n        }\n\n        Promise.all([sessions]).then(() => {\n            let selectedSession = '';\n            let defaultSession = '';\n            this.state.sessionOptions.forEach(session => {\n                if (queryObj && session.SessionID === queryObj.selectedSession) {\n                    selectedSession = session;\n                    this.props.actions.changeSession(session.SessionCode);\n                } else if (session.SessionCode === this.props.nav.session && !selectedSession) {\n                    selectedSession = session;\n                }\n                if (session.IsDefault) {\n                    defaultSession = session;\n                }\n            });\n            //Only set the session to default if the queryObj doesn't have a sessionID and the the session selector doesn't have a sessionID\n            if (!selectedSession) {\n                selectedSession = defaultSession;\n            }\n\n            if (selectedSession) {\n                const sessionStartObj = selectedSession.SessionEvents && selectedSession.SessionEvents.length && selectedSession.SessionEvents.find(date => date.DisplayName === \"Session Start\");\n                const startDate = sessionStartObj ? moment(sessionStartObj.ActualDate).format(\"MM/DD/YYYY\") : '';\n                const dateParam = 'effectiveDate=' + encodeURIComponent(startDate);\n                const sessionParam = 'sessionID=' + selectedSession.SessionID;\n                this.getPatrons(sessionParam);\n                this.getSubjects(sessionParam);\n                this.getCommittees(dateParam);\n                this.getIntroDates(sessionParam)\n\n                this.setState({ selectedSession }, () => {\n                    if (this.props.login.userClaims.resources.find(resource => resource === BILL_COLLECTION_AUTHOR)) {\n                        this.getCollections(\"?SessionID=\" + this.state.selectedSession.SessionID);\n                    }\n                    if (queryObj && !queryObj.sessionOnly) {\n                        this.handleSearch()\n                    } else {\n                        this.setState({ showCategories: true })\n                    }\n\n                    document.querySelector('body').addEventListener('keydown', this.searchOnEnterPress);\n                })\n            } else {\n                this.setState({ failedToGetSessions: true })\n            }\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            console.log(err)\n        });\n    }\n\n    componentDidUpdate(prevProps, prevState) {\n        if (this.props.location.search !== prevProps.location.search) {\n            this.executeSearch();\n        }\n        if (this.props.nav.session !== prevProps.nav.session) {\n            if (!isNaN(parseInt(this.props.nav.session))) {\n                this.sessionChange(this.props.nav.session);\n            }\n        }\n\n        //get collections if user logs in/logged in user changes\n        if (this.props.login.userProfile.email && this.props.login.userProfile.email !== prevProps.login.userProfile.email) {\n            if (this.state.selectedSession.SessionID && this.props.login.userClaims.resources.find(resource => resource === BILL_COLLECTION_AUTHOR)) {\n                this.getCollections(\"?SessionID=\" + this.state.selectedSession.SessionID);\n            } else if (this.state.collections && this.state.collections.length) {\n                this.setState({ collections: [] })\n            }\n        }\n\n        if (this.state.billList !== prevState.billList || this.state.showCategories !== prevState.showCategories) {\n            if (window.innerWidth > 900) { //breaks mobile otherwise, and the sidebar toggle isn't shown on mobile anyways\n                let height = document.getElementById('results-div');\n                if (height && (height.scrollHeight / 540) !== this.state.height) {\n                    this.setState({\n                        height: (height.scrollHeight / 540) >= 1 ? (height.scrollHeight / 540) : 1\n                    })\n                } else {\n                    this.setState({\n                        height: 1\n                    })\n                }\n            }\n        }\n    }\n\n    executeSearch() {\n        let queryObj = '';\n        const parsed = queryString.parse(this.props.location.search, { decode: false });\n        if (parsed.q) {\n            const base64 = parsed.q;\n            const decodedSearch = window.atob(base64);\n            queryObj = JSON.parse(decodedSearch);\n            //Remove any existing entries in the form and replace it with the content of the url\n            this.clearForm();\n            this.setState(state => ({\n                ...state,\n                ...queryObj\n            }), () => {\n                //If a member is already selected and there are no patron types selected then select them all by default\n                if (this.state.selectedPatron && this.state.selectedPatronType.length === 0) {\n                    const patronRoles = [];\n                    this.state.patronRoles.forEach(role => patronRoles.push(role.PatronTypeID));\n                    this.setState({\n                        selectedPatronType: patronRoles\n                    });\n                }\n                //If a committee is already selected and there is no legislation status category then select 'In Committee' as the status\n                if (this.state.selectedCommittee && !this.state.selectedBillStatusCategory) {\n                    const selectedBillStatusCategory = this.state.billStatusCategoryList.find(status => status.Name === 'In Committee');\n                    this.setState({\n                        selectedBillStatusCategory: selectedBillStatusCategory ? selectedBillStatusCategory.LegislationCategoryID : ''\n                    });\n                }\n                this.getSessions(queryObj);\n            });\n        } else if (!parsed.collection) {\n            //this means the user hit the back button from a query and there are no longer any params in the url,\n            //and the user should be back at the base search page with categories\n            this.clearForm(true);\n        }\n    }\n\n    componentWillUnmount() {\n        document.querySelector('body').removeEventListener('keydown', this.searchOnEnterPress);\n        cancelRequest();\n    }\n\n    searchOnEnterPress(event) {\n        if (event.key === 'Enter' && !this.state.isFetching) {\n            //Pressing enter while on a react-select will select an option. A search should not happen because of that.\n            //Also do not submit a search if they are entering a value in the quick-search input at the top right which sends the user to the public search\n            //otherwise, if they are on the categories page in bill mgmt, search using the quick-search, and then hit back button from the public bill search results, it will send them to the results page in bill mgmt rather than back to the categories page\n            if (!event.target.id.includes('react-select') && !event.target.className.includes('note-area') && !event.target.className.includes('event-date-picker') && event.target.id !== \"quick-search\") {\n                if (!this.state.selectedChamber && !this.state.selectedBillEvent && !this.state.selectedBillType && !this.state.selectedCommittee && !this.state.selectedSubcommittee && !this.state.selectedPatron && !this.state.selectedSubject && !this.state.selectedKeywords && !this.state.selectedBillNumbers && !this.state.selectedBillRangeBeginning && !this.state.selectedBillRangeEnd && !this.state.selectedSubject && !this.state.selectedChapterNumber && !this.state.selectedBillStatusCategory) {\n                    //there are not any search parameters provided, don't execute a search\n                    return;\n                }\n                this.searchBox.current.handleSubmit();\n            }\n        }\n    }\n\n    toggleShowCategories(val) {\n        this.setState({\n            showCategories: val\n        });\n    }\n\n    toggleGroup(groupName) {\n        this.setState(state => ({\n            [groupName]: !state[groupName]\n        }));\n    }\n\n    clearForm(clearUrl, clearBillData) {\n        this.setState({\n            selectedBillEvent: '',\n            selectedBill: '',\n            selectedKeywords: '',\n            selectedBillAction: '',\n            billEventStartDate: null,\n            billEventEndDate: null,\n            selectedBillSession: '',\n            selectedBillType: '',\n            selectedBillNumbers: '',\n            selectedBillRangeBeginning: '',\n            selectedBillRangeEnd: '',\n            selectedChapterNumber: '',\n            subcommitteeList: [],\n            selectedPatron: '',\n            selectedPatronType: '',\n            selectedChamber: '',\n            selectedBillStatusCategory: '',\n            billStatusStartDate: null,\n            billStatusEndDate: null,\n            selectedCommittee: '',\n            selectedSubcommittee: '',\n            selectedSubject: '',\n            isPending: null,\n            mostFrequent: null,\n            allLegislation: null,\n            selectedBillVersion: 'All',\n            selectedSummaryVersion: 'All',\n            selectedLocation: 'Caption',\n            displaySelectedLocation: \"Caption\",\n            introductionDate: null\n        }, () => {\n            if (clearUrl) {\n                this.props.history.push('/bill-management');\n                this.setState({ billList: [], showCategories: true })\n            }\n            if (clearBillData) {\n                this.setState({\n                    billList: []\n                })\n            }\n        });\n\n    }\n\n    handleSubmit(queryObj) {\n        let encodedSearch = window.btoa(JSON.stringify(queryObj));\n        //if it is the same search (i.e. same parameters) as the current one, updating the url won't work since it will be the same, just execute it manually\n        const parsed = queryString.parse(this.props.location.search, { decode: false });\n        if (parsed.q && parsed.q === encodedSearch) {\n            this.executeSearch();\n        } else {\n            this.props.history.push('/bill-management?q=' + encodedSearch + (this.state.selectedCollection ? '&collection=' + this.state.selectedCollection.WatchListID : ''));\n        }\n    }\n\n    handleSearch() {\n        if (this.state.failedToGetSessions) { return; }\n        //Format the selected options to be sent to the API\n        //Add bill range to list of bills\n        let selectedBillNumbers = this.state.selectedBillNumbers.trim();\n        if (this.state.selectedBillRangeBeginning && this.state.selectedBillRangeEnd) {\n            selectedBillNumbers = selectedBillNumbers ? selectedBillNumbers + ',' : selectedBillNumbers;\n            selectedBillNumbers += this.state.selectedBillRangeBeginning + '-' + this.state.selectedBillRangeEnd;\n        }\n\n        let keywordVersion = null;\n        switch (this.state.selectedLocation) {\n            case ('Bill Text'):\n                if (this.state.selectedBillVersion !== 'All') {\n                    keywordVersion = { KeywordLegislationVersionID: this.state.selectedBillVersion }\n                }\n                break;\n            case ('Summary'):\n                if (this.state.selectedSummaryVersion !== 'All') {\n                    keywordVersion = { KeywordSummaryVersionID: this.state.selectedSummaryVersion }\n                }\n                break;\n        }\n\n        // Build the param array with param names as the keys\n        const params = {\n            ChamberCode: this.state.selectedChamber ? this.state.selectedChamber.value : null,\n            CommitteeID: this.state.selectedSubcommittee || this.state.selectedCommittee || null,\n            PatronTypes: this.state.selectedPatronType || null,\n            LegislationNumbers: selectedBillNumbers ? [{ LegislationNumber: selectedBillNumbers.replaceAll(\" \", \"\") }] : null,\n            ChapterNumber: this.state.selectedChapterNumber,\n            SessionID: this.state.selectedSession.SessionID,\n            StartDate: this.state.billStatusStartDate ? moment(this.state.billStatusStartDate).format('MM/DD/YYYY') : null,\n            EndDate: this.state.billStatusEndDate ? moment(this.state.billStatusEndDate).format() : null,\n            KeywordExpression: this.state.selectedKeywords || null,\n            KeywordLocation: this.state.selectedLocation || null,\n            ...keywordVersion,\n            MemberID: this.state.selectedPatron,\n            SubjectIndexID: this.state.selectedSubject,\n            LegislationCategoryID: this.state.selectedBillStatusCategory,\n            LegislationEventTypeID: this.state.selectedBillEvent,\n            EventStartDate: this.state.billEventStartDate ? moment(this.state.billEventStartDate).format(\"MM/DD/YYYY\") : null,\n            EventEndDate: this.state.billEventEndDate ? moment(this.state.billEventEndDate).format(\"MM/DD/YYYY\") : null,\n            IsPending: this.state.isPending || null,\n            MostFrequent: this.state.mostFrequent || null,\n            AllLegislation: this.state.allLegislation || null,\n            CurrentStatus: this.state.currentStatus,\n            ExcludeFailed: this.state.excludeFailed,\n            LegislationIDs: this.state.legislationIDs,\n            IntroductionDate: this.state.introductionDate\n        }\n        //Open the fieldset if one of the form inputs is filled out\n        if (params.LegislationNumbers) {\n            this.setState({\n                billFieldset: true\n            });\n        }\n        if (params.KeywordExpression) {\n            this.setState({\n                keywordFieldset: true\n            });\n        }\n        if (params.LegislationCategoryID || params.ChamberCode) {\n            this.setState({\n                statusFieldset: true\n            });\n        }\n        if (params.EventStartDate || params.EventEndDate) {\n            this.setState({\n                activityFieldset: true\n            });\n        }\n        if (params.MemberID) {\n            this.setState({\n                membersFieldset: true\n            });\n        }\n        if (params.CommitteeID) {\n            this.setState({\n                committeesFieldset: true\n            });\n        }\n        if (params.SubjectIndexID) {\n            this.setState({\n                subjectFieldset: true\n            });\n        }\n\n        this.setState({\n            searchMade: true,\n            displaySelectedLocation: this.state.selectedLocation,\n            showUpdateSearchButton: false\n        });\n\n        this.getBillsResults(params);\n    }\n\n    getBillsResults(params) {\n\n        //if the user searches hb1-hb4 and expands all of these bills to see further info, and then search hb1-hb5, leave open their previously expanded bills for them;\n        //however, if the existing search (if there is one, i.e. this new one is not the first search they're making) is a bill text keyword search, which automatically expands all of them in order to show bill text matches,\n        //then close these in the new search results as there's a good chance they don't care for the expanded info regarding patrons/summary/etc\n        const closeBillInfo = this.state.params?.KeywordLocation === \"Bill Text\" && this.state.params?.KeywordExpression && (params?.KeywordLocation !== \"Bill Text\" || !params?.KeywordExpression);\n\n        this.setState({\n            isFetching: true,\n            showCategories: false\n        });\n\n        window.scrollTo(0, 0);\n\n        let getResultsPromise;\n        if (params.MostFrequent) {\n            getResultsPromise = this.props.actions.getMostFrequentBillList(\"?sessionID=\" + params.SessionID + \"&excludeFailed=\" + params.ExcludeFailed);\n        } else {\n            getResultsPromise = this.props.actions.getBillList(params)\n        }\n\n        getResultsPromise.then(() => {\n            let billList = !params.MostFrequent ? [...this.props.bills.billList] : [...this.props.bills.mostFrequentBillList];\n            let legislationIDs = \"\";\n\n            //Can't manage bills that are outside of the selected session\n            billList = billList.filter(x => x.SessionID === this.state.selectedSession.SessionID);\n            //Filter to only one result per bill per session since DB sometimes returns duplicates which messes up pagination\n            billList = billList.filter((item, pos) => billList.findIndex(i => i.LegislationNumber === item.LegislationNumber && i.SessionID === item.SessionID) === pos);\n            //If coming from the calendar, sort according to calendar order which is preserved in the query param\n            if (this.state.calendarCategoryTypeID && this.state.legislationIDs?.length) {\n                billList.sort((a, b) => this.state.legislationIDs.findIndex(l => l.LegislationID === a.LegislationID) - this.state.legislationIDs.findIndex(l => l.LegislationID === b.LegislationID))\n            }\n            let hideAllEvents = []\n            billList.forEach((bill, i) => {\n                legislationIDs = legislationIDs + \"legislationIDs=\" + bill.LegislationID;\n                legislationIDs = i + 1 !== this.props.bills.billList.length ? legislationIDs + \"&\" : legislationIDs;\n                // Remove all references to any previous organizedEvents, and set the hideAllEvents for this specific bill to true\n                hideAllEvents.push(true)\n                this.setState({\n                    [`organizedEvents${i}`]: '',\n                    hideAllEvents\n                })\n            });\n\n            if (legislationIDs) {\n                let promises =\n                    [this.props.actions.getBillHistoryByBillID(`?${legislationIDs}`, true),\n                    this.props.actions.getBillVersionsByBillID(`?${legislationIDs}`)];\n\n                Promise.all(promises).then(() => {\n                    billList.forEach((bill, i) => {\n                        bill.historyList = this.props.bills.billHistory.filter(x => x.LegislationID === bill.LegislationID);\n                        bill.versionsList = this.props.bills.billVersion.filter(x => x.LegislationID === bill.LegislationID).map(x => ({\n                            ...x,\n                            label: x.DocumentCode,\n                            value: x.LegislationTextID\n                        }));\n                    })\n                }).then(() => {\n                    this.setState({\n                        billList: billList,\n                        checkedBills: [],\n                        lastCheckedBill: -1,\n                        isFetching: false\n                    }, () => {\n                        if (closeBillInfo)\n                            [...this.state.billList].forEach(b => this.toggleShowData(b.LegislationID, false))\n                    });\n                });\n            } else {\n                this.setState({\n                    billList: [],\n                    checkedBills: [],\n                    lastCheckedBill: -1,\n                    isFetching: false\n                })\n            }\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            this.setState({\n                isFetching: false\n            });\n        })\n    }\n\n    getBillStatusCategoryOptions() {\n        // Get Bill Status references for bill status typeahead\n        this.props.actions.getBillStatusCategoryReferences().then(() => {\n            let billStatusReferences = [...this.props.bills.billStatusCategoryReferences];\n            billStatusReferences.forEach(ref => {\n                ref.label = ref.Name\n                ref.value = ref.LegislationCategoryID\n            });\n            if (this.state.selectedCommittee && !this.state.selectedBillStatusCategory) {\n                const selectedBillStatusCategory = billStatusReferences.find(status => status.Name === 'In Committee');\n                this.setState({\n                    selectedBillStatusCategory: selectedBillStatusCategory ? selectedBillStatusCategory.LegislationCategoryID : ''\n                });\n            }\n            this.setState({\n                billStatusCategoryList: billStatusReferences,\n                billStatusCategoryListIsLoading: false\n            });\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            console.log(err)\n            this.setState({ billStatusCategoryListIsLoading: false })\n        });\n    }\n\n    getBillVersionOptions() {\n        this.props.actions.getBillVersionRef().then(() => {\n            let topOfList = [{ Name: 'All Versions', LegislationVersionID: 'All' }];\n            let billVersionReferences = topOfList.concat(this.props.bills.billVersionRef);\n            billVersionReferences.forEach(ref => {\n                ref.label = ref.Name\n                ref.value = ref.LegislationVersionID\n            });\n            this.setState({\n                billVersionList: billVersionReferences,\n            });\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            console.log(err)\n        });\n    }\n\n    getBillSummaryOptions() {\n        this.props.actions.getBillSummaryRef().then(() => {\n            let topOfList = [{ Name: 'All Summary Versions', SummaryVersionID: 'All' }];\n            let billSummaryReferences = topOfList.concat(this.props.bills.billSummaryRef);\n            billSummaryReferences.forEach(ref => {\n                ref.label = ref.Name\n                ref.value = ref.SummaryVersionID\n            });\n            this.setState({\n                billSummaryList: billSummaryReferences,\n            });\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            console.log(err)\n        });\n    }\n\n    getBillEventOptions(calendarCategoryTypeID) {\n        if (calendarCategoryTypeID) {\n            this.props.actions.getBillEventReferences(\"?calendarCategoryTypeID=\" + calendarCategoryTypeID)\n                .then(() => {\n                    let billEventReferences = [...this.props.bills.billEventRef];\n                    billEventReferences.forEach(ref => {\n                        delete ref.LegislationChamberCode;\n                        ref.label = ref.LegislationDescription || ref.CalendarDescription;\n                        ref.value = `${ref.EventCode}-${ref.IsPassed}`\n                    });\n                    billEventReferences = this.filterBillEventReferences(billEventReferences);\n\n                    billEventReferences.push({\n                        label: \"Other\",\n                        value: \"Other\"\n                    })\n                    this.setState({\n                        billEventOptions: billEventReferences\n                    });\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    console.log(err)\n                });\n        } else {\n            this.props.actions.getBillEvents(\"\").then(() => {\n                let billEventReferences = [...this.props.bills.billEvents];\n                billEventReferences.forEach(ref => {\n                    delete ref.LegislationChamberCode;\n                    ref.label = ref.LegislationDescription || ref.CalendarDescription\n                    ref.value = `${ref.EventCode}-${ref.IsPassed}`\n                });\n                billEventReferences = this.filterBillEventReferences(billEventReferences);\n\n                this.setState({\n                    billEventOptions: billEventReferences\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n            });\n        }\n    }\n\n    getOtherBillEventOptions() {\n        this.props.actions.getBillEvents(\"\").then(() => {\n            let billEventReferences = [...this.props.bills.billEvents];\n            billEventReferences.forEach(ref => {\n                ref.label = ref.LegislationDescription || ref.CalendarDescription;\n                ref.value = `${ref.EventCode}-${ref.IsPassed}`\n            });\n            billEventReferences = this.filterBillEventReferences(billEventReferences);\n            this.setState({\n                otherBillEventOptions: billEventReferences\n            });\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            console.log(err)\n        });\n    }\n\n    filterBillEventReferences(billEventReferences) {\n        return billEventReferences.filter((value, index, self) =>\n            index === self.findIndex((t) => (\n                t.EventCode === value.EventCode && JSON.stringify(t.ActionReferences) === JSON.stringify(value.ActionReferences) && t.IsPassed === value.IsPassed\n            ))\n        )\n    }\n\n    getPatrons(sessionParam) {\n        // Get Patrons list for typeahead\n        this.props.actions.getMemberList(sessionParam).then(() => {\n            let memberList = [...this.props.members.memberList];\n            memberList.forEach(patron => {\n                patron.label = patron.ListDisplayName + ' ' + '(' + patron.ChamberCode + ')';\n                patron.value = patron.MemberID;\n            });\n            const member = memberList.find(member => member.MemberID === this.state.selectedPatron);\n            let selectedPatronType = [];\n            if (member && this.state.selectedPatronType.length === 0) {\n                this.state.patronRoles.forEach(role => selectedPatronType.push(role.PatronTypeID));\n                this.setState({\n                    selectedPatronType: selectedPatronType\n                });\n            }\n            this.setState({\n                patronList: memberList,\n                filteredPatronList: memberList,\n            });\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            console.log(err)\n        });\n    }\n\n    getSubjects(sessionParam) {\n        this.props.actions.getSubjectList('?' + sessionParam)\n            .then(() => {\n                this.setState({\n                    subjectList: this.props.bills.subjectList\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n            });\n    }\n\n    getPatronRoles() {\n        this.props.actions.getPatronRoles()\n            .then(() => {\n                const patronRoles = [...this.props.patrons.patronRoles];\n                patronRoles.forEach(role => {\n                    role.label = role.Name;\n                    role.value = role.PatronTypeID;\n                });\n                this.setState({\n                    patronRoles: patronRoles,\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n            });\n    }\n\n    getCommittees(sessionParam) {\n        this.props.actions.getCommitteeList(sessionParam + \"&includeSubCommittees=true\").then(() => {\n            let fullCommitteeList = this.props.committee.committeeList.filter(c => !c.ParentCommitteeID);\n            fullCommitteeList.forEach(committee => {\n                committee.label = committee.Name + ' ' + '(' + committee.ChamberCode + ')';\n                committee.value = committee.CommitteeID;\n            });\n            let committeeList = fullCommitteeList.filter(c => !c.ParentCommitteeID);\n            let groupedCommitteeList = [{ \"label\": \"House Committees\", \"ChamberCode\": \"H\", \"options\": committeeList.filter(c => c.ChamberCode === \"H\") }, { \"label\": \"Senate Committees\", \"ChamberCode\": \"S\", \"options\": committeeList.filter(c => c.ChamberCode === \"S\") }]\n            this.setState({\n                fullCommitteeList: fullCommitteeList,\n                committeeList: committeeList,\n                groupedCommitteeList: groupedCommitteeList,\n                filteredCommitteeList: groupedCommitteeList\n            });\n            //If a committee is already selected then that committee's subcommittees need to be retrieved\n            if (this.state.selectedCommittee) {\n                this.getSubcommittees(this.state.selectedCommittee);\n            }\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            console.log(err)\n        });\n    }\n\n    getSubcommittees(id) {\n        this.props.actions.getCommitteeList(\"parentCommitteeID=\" + id)\n            .then(() => {\n                let committeeList = [...this.props.committee.committeeList];\n                committeeList.forEach(committee => {\n                    committee.label = '(' + committee.ChamberCode + ') ' + committee.Name;\n                    committee.value = committee.CommitteeID;\n                });\n                this.setState({\n                    subcommitteeList: committeeList\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n            });\n    }\n\n    getIntroDates(sessionParam) {\n        this.props.actions.getIntroDateList('?' + sessionParam)\n            .then(() => {\n                let datesList = [];\n                this.props.bills.introDateList.forEach(date => datesList.push(moment(date.IntroductionDate)));\n                this.setState({\n                    introDateList: datesList\n                })\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n            });\n    }\n\n    sessionChange(code) {\n        const selectedSession = this.state.sessionOptions.find(session => session.SessionCode === code);\n        if (!selectedSession) {\n            return;\n        }\n        const sessionParam = 'sessionID=' + selectedSession.SessionID;\n        this.getPatrons(sessionParam);\n        this.getSubjects(sessionParam);\n        this.getCommittees(sessionParam);\n        this.getIntroDates(sessionParam);\n        this.getCollections(\"?SessionID=\" + selectedSession.SessionID);\n\n        const parsed = queryString.parse(this.props.location.search, { decode: false });\n        if (parsed.q) {\n            const base64 = parsed.q;\n            const decodedSearch = window.atob(base64);\n            let queryObj = JSON.parse(decodedSearch);\n            if (queryObj.selectedSession) {\n                queryObj.selectedSession = selectedSession.SessionID;\n                this.handleSubmit(queryObj);\n                return;\n            }\n        } else {\n            this.setState({ currentStatus: selectedSession.IsActive })\n        }\n\n        if (this.state.selectedBillStatusCategory) {\n            this.setState({\n                selectedPatron: '',\n                selectedPatronType: '',\n                selectedCommittee: '',\n                selectedSubcommittee: '',\n                selectedSubject: '',\n                selectedSession: selectedSession\n            }, () => {\n                this.handleSearch();\n            });\n        } else {\n            this.setState({\n                selectedPatron: '',\n                selectedPatronType: '',\n                selectedCommittee: '',\n                selectedSubcommittee: '',\n                selectedSubject: '',\n                selectedSession: selectedSession\n            }, () => {\n                const parsed = queryString.parse(this.props.location.search, { decode: false });\n                if (parsed.q) {\n                    this.handleSearch();\n                }\n            });\n        }\n    }\n\n    chamberChange(value) {\n        this.setState({\n            selectedChamber: value\n        });\n        if (value) {\n            const patronList = [...this.state.patronList];\n            const committeeList = [...this.state.groupedCommitteeList];\n            //Remove the patrons from the patronList that do not fit the current selected chamber\n            //Remove the committees from the committee list that do not fit the current selected chamber\n            let filteredPatronList = patronList.filter(patron => patron.ChamberCode === value.value);\n            let filteredCommitteeList = committeeList.filter(committee => committee.ChamberCode === value.value);\n            this.setState({\n                filteredPatronList: filteredPatronList,\n                filteredCommitteeList: filteredCommitteeList,\n            });\n        } else {\n            // 'all' has been selected so show all patrons/committees\n            this.setState({\n                filteredPatronList: this.state.patronList,\n                filteredCommitteeList: this.state.groupedCommitteeList,\n            });\n        }\n        // Reset all the values that are chamber specific\n        this.setState({\n            selectedPatron: '',\n            selectedPatronType: '',\n            selectedCommittee: '',\n            selectedSubcommittee: ''\n        });\n    }\n\n    committeeChange(opt) {\n        this.setState({\n            selectedCommittee: opt ? opt.value : null,\n            selectedSubcommittee: null\n        });\n        if (opt) {\n            if (!this.state.selectedBillStatusCategory) {\n                const selectedBillStatusCategory = this.state.billStatusCategoryList.find(status => status.Name === 'In Committee');\n                this.setState({\n                    selectedBillStatusCategory: selectedBillStatusCategory ? selectedBillStatusCategory.LegislationCategoryID : ''\n                });\n            }\n            this.getSubcommittees(opt.CommitteeID)\n        };\n    }\n\n    handlePatronChange(opt) {\n        let patronTypes = [];\n        if (opt) {\n            this.state.patronRoles.forEach(role => patronTypes.push(role.PatronTypeID));\n        }\n        this.setState({\n            selectedPatron: opt ? opt.value : null,\n            selectedPatronType: patronTypes\n        });\n    }\n\n    handlePatronTypeChange(options) {\n        let values = [];\n        if (options) {\n            options.forEach(opt => values.push(opt.value));\n        }\n        this.setState({\n            selectedPatronType: values\n        });\n    }\n\n    handleSelectChange = (opt, name) => {\n        this.setState({\n            [name]: opt ? opt.value : null\n        });\n        if (name === 'selectedBillStatusCategory') {\n            if (opt === null || (opt && [2, 3, 4, 6, 7, 11, 22, 16, 17, 21, 27].includes(opt.LegislationCategoryID))) {\n                this.setState({\n                    currentStatus: true,\n                    billStatusStartDate: null,\n                    billStatusEndDate: null\n                });\n            } else if ([1, 5, 23, 24, 18, 26, 29, 8, 9, 10, 19, 14, 20, 25, 13, 15, 28].includes(opt.LegislationCategoryID)) {\n                this.setState({\n                    currentStatus: false\n                });\n            }\n        }\n    }\n\n    handleDateChange = (val, name) => {\n        this.setState({\n            [name]: val\n        });\n    }\n\n    handleTextChange = (evt, name) => {\n        let value = evt.target.value;\n        if (['selectedChapterNumber', 'selectedBillRangeBeginning', 'selectedBillRangeEnd'].includes(name)) {\n            value = value.replace(/[^a-zA-Z0-9]/, \"\");\n        }\n        this.setState({ [name]: value });\n    }\n\n    handleSelectionClear(key) {\n        //Clearing some form inputs changes the value of other form inputs. Handle them here.\n        this.setState({ showUpdateSearchButton: true }, () => {\n            switch (key) {\n                case \"selectedBillStatusCategory\":\n                    this.handleSelectChange(null, \"selectedBillStatusCategory\");\n                    break;\n                case \"selectedPatron\":\n                    this.handlePatronChange(null);\n                    break;\n                case \"selectedCommittee\":\n                    this.committeeChange(null);\n                    break;\n                case \"selectedChamber\":\n                    this.chamberChange(null);\n                    break;\n                default:\n                    this.setState({\n                        [key]: ''\n                    });\n            }\n\n            if (!localStorage.getItem('searchModalDismissed')) {\n                this.toggleModal();\n                localStorage.setItem('searchModalDismissed', true);\n            }\n        })\n    }\n\n    handleMultiSelectionClear(key, index) {\n        let value = [...this.state[key]];\n        value.splice(index, 1);\n        this.setState({\n            [key]: value,\n            showUpdateSearchButton: true\n        })\n    }\n\n    handleCurrentStatusChange() {\n        this.setState({\n            currentStatus: !this.state.currentStatus\n        }, () => {\n            if (this.state.currentStatus) {\n                this.setState({\n                    billStatusStartDate: null,\n                    billStatusEndDate: null\n                })\n            }\n        })\n    }\n\n    getCollections(params) {\n        this.setState({\n            collectionIsLoading: true\n        });\n        this.props.actions.getCollections(params)\n            .then(() => {\n                const parsed = queryString.parse(this.props.location.search);\n                const collectionIndex = this.props.collection.collections.findIndex(coll => coll.WatchListID === parseInt(parsed.collection))\n                this.setState({\n                    collections: this.props.collection.collections,\n                    collectionIsLoading: false,\n                }, () => {\n                    if (collectionIndex !== -1) {\n                        this.selectCollection(collectionIndex)\n                    }\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return\n                }\n                this.setState({\n                    collectionIsLoading: false\n                });\n            });\n    }\n\n    selectCollection(collectionIndex) {\n        if (collectionIndex === this.state.selectedCollectionIndex) {\n            this.setState({\n                selectedCollectionIndex: -1,\n                selectedCollection: ''\n            })\n        } else {\n            if (this.state.collections[collectionIndex].IsPaid && !Boolean(this.props.login.userClaims.claims.find(claim => claim.Scope === \"Paid\" && claim.Resource === \"LegislationCollections\" && claim.RoleName === \"PaidLegislationCollectionsAuthor\")) && !Boolean(this.props.login.userClaims.resources.find(resource => resource === \"PaidLegislationCollectionsAuthor\" || resource === \"All\"))) {\n                alert(\"The watchlist you are trying to access is a paid watchlist. As a free user, you are no longer able to access this watchlist.\");\n                return;\n            }\n\n            let legNumbers = '';\n            this.state.collections[collectionIndex].WatchListLegislation.filter(leg => !leg.DeletionDate).forEach((leg, legIndex) => {\n                if (legIndex !== 0) {\n                    legNumbers += ', ';\n                }\n                legNumbers += leg.LegislationNumber;\n            });\n            // Don't make a search lacking any legislation\n            if (legNumbers) {\n                let queryObj = {\n                    selectedBillNumbers: legNumbers,\n                    selectedSession: this.state.selectedSession.SessionID\n                };\n                this.handleSubmit(queryObj);\n            } else {\n                // This watchlist does not have any legislation. Clear the form and clear the results.\n                this.clearForm(true);\n                this.setState({\n                    billList: []\n                });\n            }\n            this.setState({\n                selectedCollectionIndex: collectionIndex,\n                selectedCollection: this.state.collections[collectionIndex]\n            })\n        }\n    }\n\n    selectCollection(collectionIndex, returningFromSearch) {\n        if (collectionIndex === -1) {\n            this.setState({\n                selectedCollectionIndex: -1,\n                selectedCollection: '',\n                billList: [],\n                searchMade: true\n            })\n            this.props.history.push('/bill-management');\n            this.clearForm();\n        } else {\n            // Remove object references so the state does not mutate\n            const selectedCollection = JSON.parse(JSON.stringify(this.state.collections[collectionIndex] || ''))\n            if (selectedCollection.IsPaid && !Boolean(this.props.login.userClaims.claims.find(claim => claim.Scope === \"Paid\" && claim.Resource === \"LegislationCollections\" && claim.RoleName === \"PaidLegislationCollectionsAuthor\")) && !Boolean(this.props.login.userClaims.resources.find(resource => resource === \"PaidLegislationCollectionsAuthor\" || resource === \"All\"))) {\n                alert(\"The watchlist you are trying to access is a paid watchlist. As a free user, you are no longer able to access this watchlist.\");\n                return;\n            }\n            const parsed = queryString.parse(this.props.location.search, { decode: false });\n            let sessionOnly = false;\n            if (parsed.q) {\n                const base64 = parsed.q;\n                const decodedSearch = window.atob(base64);\n                const queryObj = JSON.parse(decodedSearch);\n                sessionOnly = queryObj.sessionOnly || false;\n            }\n            if (returningFromSearch || !parsed.q || sessionOnly)\n                this.props.history.push(`/bill-management?collection=${selectedCollection.WatchListID}`)\n            this.setState({\n                selectedCollectionIndex: collectionIndex,\n                selectedCollection: selectedCollection,\n                showCategories: false,\n                billList: parsed.q ? this.state.billList : [],\n                searchMade: parsed.q ? this.state.searchMade : false,\n            });\n            if (returningFromSearch || !parsed.q || sessionOnly) {\n                const bills = selectedCollection.WatchListLegislation.filter(l => !l.DeletionDate).map(l => l.LegislationID);\n                if (bills.length > 0) {\n                    let legislationIds = [];\n                    for (let i = 0; i < bills.length; i++) {\n                        legislationIds.push({ LegislationId: bills[i] });\n                    }\n\n                    const params = {\n                        LegislationIDs: legislationIds,\n                        SessionID: this.state.selectedSession.SessionID\n                    }\n                    this.getBillsResults(params);\n                }\n                this.clearForm();\n            }\n        }\n    }\n\n    handleBillCheckbox(billIndex, e) {\n        let checkedBills = [...this.state.checkedBills];\n        let lastCheckedBill = this.state.lastCheckedBill;\n        if (e.nativeEvent.shiftKey && this.state.lastCheckedBill !== -1) {\n            checkedBills = checkedBills.fill(false);\n            for (let i = 0; i < Math.abs(billIndex - this.state.lastCheckedBill); i++) {\n                const index = this.state.lastCheckedBill + i * (billIndex - this.state.lastCheckedBill) / Math.abs(billIndex - this.state.lastCheckedBill);\n                checkedBills[index] = true;\n            }\n        } else {\n            lastCheckedBill = !checkedBills[billIndex] ? billIndex : this.state.lastCheckedBill;\n        }\n        checkedBills[billIndex] = !checkedBills[billIndex]\n        this.setState({\n            checkedBills: checkedBills,\n            lastCheckedBill: lastCheckedBill\n        });\n    }\n\n    toggleAllBills() {\n        const opposite = !this.state.selectAllBills;\n        let checkedBills = [...this.state.checkedBills];\n        checkedBills = new Array(this.state.billList.length).fill(opposite);\n        this.setState({\n            selectAllBills: opposite,\n            checkedBills: checkedBills,\n            lastCheckedBill: -1\n        });\n    }\n\n    handleEventChange(billIndex, events) {\n        //The reason an array is not used here to contain all the organized events is because a bunch of components are calling this function at the same time.\n        //Using the same object to contain all the organized events would cause the components to be overwriting eachother's changes.\n        this.setState({\n            [`organizedEvents${billIndex}`]: events\n        }, () => {\n            this.handleEditedBills();\n        });\n    }\n\n    addEvent(eventDate, eventSequence, event) {\n        this.state.billList.forEach((bill, billIndex) => {\n            if (this.state.checkedBills[billIndex]) {\n                bill.eventsChanged = true;\n                let organizedEvents = this.state[`organizedEvents${billIndex}`] || BillHistoryForm.organizeEvents(bill.historyList || []);\n\n                let newEvent = {\n                    ...event,\n                    IsPublic: true,\n                    LegislationID: bill.LegislationID,\n                    EventDate: eventDate,\n                    hasChanged: true\n                };\n\n                //Check to see if there is are events with the same date already\n                const newEventGroupIndex = organizedEvents ? organizedEvents.findIndex(eventGroup => eventDate.toISOString().substring(0, 10) === moment(eventGroup.date).toISOString().substring(0, 10)) : -1;\n                if (newEventGroupIndex > -1) {\n                    //Make sure DisplaySequence is handled first\n                    if (organizedEvents[newEventGroupIndex].events.find(e => !e.DisplaySequence)) {\n                        for (let i = 0; i < organizedEvents[newEventGroupIndex].events.length; i++) {\n                            if (!organizedEvents[newEventGroupIndex].events[i].DisplaySequence) {\n                                if (i === 0) {\n                                    organizedEvents[newEventGroupIndex].events[i].DisplaySequence = 10;\n                                } else {\n                                    organizedEvents[newEventGroupIndex].events[i].DisplaySequence = organizedEvents[newEventGroupIndex].events[i - 1].DisplaySequence % 10 === 0 ? (organizedEvents[newEventGroupIndex].events[i - 1].DisplaySequence + 10) : (Math.round(organizedEvents[newEventGroupIndex].events[i - 1].DisplaySequence / 10) * 10);\n                                }\n                            }\n                        }\n                    }\n                    // If the selected date already has events that occured on that date then the event is moved into the existing group\n                    // If a display sequence (e.g. 30) is provided AND it is not the largest display sequence in that group, put it at the provided spot, otherwise put it last\n                    if (Number.isInteger(eventSequence) && Math.max.apply(null, organizedEvents[newEventGroupIndex].events.map(o => o.DisplaySequence)) > eventSequence) {\n                        newEvent.DisplaySequence = eventSequence;\n                        let insertIdx;\n                        organizedEvents[newEventGroupIndex].events.forEach((evt, i) => {\n                            if (evt.DisplaySequence >= eventSequence) {\n                                if (!Number.isInteger(insertIdx)) {\n                                    newEvent.Sequence = evt.Sequence;\n                                    insertIdx = i;\n                                }\n                                evt.Sequence++;\n                                evt.hasChanged = true;\n                            }\n                        })\n                        organizedEvents[newEventGroupIndex].events.splice(insertIdx || 0, 0, newEvent)\n                    } else {\n                        newEvent.Sequence = organizedEvents[newEventGroupIndex].events.length + 1;\n                        newEvent.DisplaySequence = eventSequence || (organizedEvents[newEventGroupIndex].events[organizedEvents[newEventGroupIndex].events.length - 1].DisplaySequence % 10 === 0 ? (organizedEvents[newEventGroupIndex].events[organizedEvents[newEventGroupIndex].events.length - 1].DisplaySequence + 10) : (Math.round(organizedEvents[newEventGroupIndex].events[organizedEvents[newEventGroupIndex].events.length - 1].DisplaySequence / 10) * 10));\n                        organizedEvents[newEventGroupIndex].events.push(newEvent)\n                    }\n                } else {\n                    // If the selected date does not have any events then a new event group needs to be created for this date\n                    newEvent.Sequence = 1;\n                    newEvent.DisplaySequence = 10;\n                    const newEventGroup = {\n                        date: eventDate,\n                        events: [newEvent]\n                    };\n                    // Gotta find where it goes in the list of groups\n                    organizedEvents.some((eventGroup, i) => {\n                        if (eventGroup.date.isAfter(eventDate, 'day')) {\n                            organizedEvents.splice(i, 0, newEventGroup)\n                            return true;\n                        }\n                        if (i === organizedEvents.length - 1) {\n                            organizedEvents.push(newEventGroup)\n                        }\n                    });\n                }\n                this.setState({\n                    [`organizedEvents${billIndex}`]: organizedEvents,\n                    [bill.LegislationID]: true\n                }, () => {\n                    this.handleEditedBills();\n                });\n            }\n        });\n    }\n\n    removeEvent(eventDate, event, displaySequence) {\n        this.state.billList.forEach((bill, billIndex) => {\n            if (this.state.checkedBills[billIndex]) {\n                let organizedEvents = this.state[`organizedEvents${billIndex}`] || BillHistoryForm.organizeEvents(bill.historyList || []);\n                organizedEvents.forEach((dateItem, dateItemIdx) => {\n                    if (moment(dateItem.date).isSame(eventDate, 'day')) {\n                        for (let i = 0; i < dateItem.events.length; i++) {\n                            let eventItem = dateItem.events[i];\n                            if (eventItem.EventCode === event.EventCode && !event.DeletionDate && (!displaySequence || displaySequence === eventItem.DisplaySequence)) {\n                                //if deleting an event that didn't already exist/hasn't been saved at all, just remove it entirely\n                                if (!eventItem.LegislationEventID) {\n                                    //if there is only one event in this day, just remove the day\n                                    if (dateItem.events.length === 1) {\n                                        const wasLastEventGroup = dateItemIdx === organizedEvents.length - 1;\n                                        organizedEvents.splice(dateItemIdx, 1);\n                                        //if it was the last event day that got removed, expand the now-last event day\n                                        if (wasLastEventGroup) {\n                                            organizedEvents[organizedEvents.length - 1].hidden = false;\n                                        }\n                                    } else {\n                                        //There is more than just this event in the day, only remove this event from the group and move on\n                                        dateItem.events.splice(i, 1);\n\n                                        //recalculate sequences of events\n                                        for (let idx = i; idx < dateItem.events.length; idx++) {\n                                            dateItem.events[idx].Sequence--\n                                        }\n\n                                        i--;\n                                    }\n                                } else {\n                                    //this event existed to begin with, we need to set the deletion date and save it\n                                    eventItem.DeletionDate = moment().toISOString();\n                                    eventItem.hasChanged = true;\n                                    this.setState({ [bill.LegislationID]: true })\n                                }\n                            }\n                        }\n                    }\n                });\n                this.setState({\n                    [`organizedEvents${billIndex}`]: organizedEvents\n                }, () => {\n                    this.handleEditedBills();\n                });\n            }\n        });\n    }\n\n    handleEditedBills() {\n        let bills = [...this.state.billList];\n        bills.forEach((bill, billIndex) => {\n            bill.eventsChanged = false;\n            if (this.state[`organizedEvents${billIndex}`]) {\n                this.state[`organizedEvents${billIndex}`].forEach(eventGroup => {\n                    //newly added events do not have legeventid; also encompasses initially deleted events that were un-deleted\n                    let newEvents = eventGroup.events.filter(event => !event.LegislationEventID || (event.hasChanged && !event.DeletionDate && event.originallyDeleted));\n                    if (newEvents.length) {\n                        //mark the bill as changed, and the events as newly added (how styling is handled)\n                        bill.eventsChanged = true;\n                        newEvents.forEach(evt => evt.isNewlyAdded = true);\n                    }\n\n                    //newly deleted events have a legeventid, deletion date, and hasChanged property without originallyDeleted\n                    let deletedEvents = eventGroup.events.filter(event => event.LegislationEventID && event.hasChanged && event.DeletionDate && !event.originallyDeleted);\n                    if (deletedEvents.length) {\n                        //mark the bill as changed, and the events as newly deleted (how styling is handled)\n                        bill.eventsChanged = true;\n                        deletedEvents.forEach(evt => evt.isNewlyDeleted = true);\n                    }\n\n                    //handle events that were initially deleted, then un-deleted, then re-deleted\n                    let reDeletedEvents = eventGroup.events.filter(event => event.LegislationEventID && event.hasChanged && event.DeletionDate && event.originallyDeleted);\n                    if (reDeletedEvents.length) {\n                        //do not mark the bill as changed - these were reverted; but do reset the events themselves\n                        reDeletedEvents.forEach(evt => evt.isNewlyAdded = false);\n                    }\n\n                    //for any events that are not deleted, mark as non deleted (important for resetting events that were deleted and then un-deleted)\n                    let nonDeletedEvents = eventGroup.events.filter(event => event.LegislationEventID && !event.DeletionDate);\n                    nonDeletedEvents.forEach(evt => evt.isNewlyDeleted = false);\n\n                    //date changed events\n                    let dateChangedEvents = eventGroup.events.filter(event => event.LegislationEventID && event.origDate && !moment(event.origDate).isSame(moment(event.EventDate)));\n                    if (dateChangedEvents.length) {\n                        //mark the bill as changed, and the events as 'dateChanged'\n                        bill.eventsChanged = true;\n                        dateChangedEvents.forEach(evt => evt.dateChanged = true);\n                    }\n\n                    //for any events that are non-date-changed, mark as such (important for resetting events that were changed and then reverted)\n                    let nonDateChangedEvents = eventGroup.events.filter(event => event.LegislationEventID && (!event.origDate || moment(event.origDate).isSame(event.EventDate)));\n                    nonDateChangedEvents.forEach(evt => evt.dateChanged = false);\n\n                    //sequence changed events\n                    let sequenceChangedEvents = eventGroup.events.filter(event => event.LegislationEventID && event.origSequence && event.Sequence !== event.origSequence)\n                    if (sequenceChangedEvents.length) {\n                        //mark the bill as changed, and the events as 'sequenceChanged'\n                        bill.eventsChanged = true;\n                        sequenceChangedEvents.forEach(evt => evt.sequenceChanged = true);\n                    }\n\n                    //for any events that are non-sequence-changed, mark as such (important for resetting events that were changed and then reverted)\n                    let nonSequenceChangedEvents = eventGroup.events.filter(event => event.LegislationEventID && (!event.origSequence || event.Sequence === event.origSequence));\n                    nonSequenceChangedEvents.forEach(evt => evt.sequenceChanged = false);\n\n                    //description changed events\n                    let descriptionChangedEvents = eventGroup.events.filter(event => event.LegislationEventID && event.origDescription && event.Description !== event.origDescription)\n                    if (descriptionChangedEvents.length) {\n                        //mark the bill as changed, and the events as 'descriptionChanged'\n                        bill.eventsChanged = true;\n                        descriptionChangedEvents.forEach(evt => evt.descriptionChanged = true);\n                    }\n\n                    //for any events that are non-description-changed, mark as such (important for resetting events that were changed and then reverted)\n                    let nonDescriptionChangedEvents = eventGroup.events.filter(event => event.LegislationEventID && (!event.origDescription || event.Description === event.origDescription));\n                    nonDescriptionChangedEvents.forEach(evt => evt.descriptionChanged = false);\n\n                    //event code changed events\n                    let eventCodeChangedEvents = eventGroup.events.filter(event => event.LegislationEventID && event.origEventCode && event.EventCode !== event.origEventCode)\n                    if (eventCodeChangedEvents.length) {\n                        //mark the bill as changed, and the events as 'eventCodeChanged'\n                        bill.eventsChanged = true;\n                        eventCodeChangedEvents.forEach(evt => evt.eventCodeChanged = true);\n                    }\n\n                    //for any events that are non-event-code-changed, mark as such (important for resetting events that were changed and then reverted)\n                    let nonEventCodeChangedEvents = eventGroup.events.filter(event => event.LegislationEventID && (!event.origEventCode || event.EventCode === event.origEventCode));\n                    nonEventCodeChangedEvents.forEach(evt => evt.eventCodeChanged = false);\n                })\n            }\n        });\n        this.setState({ billList: bills });\n    }\n\n    saveForm() {\n        let eventsToSave = [];\n        this.state.billList.forEach((_bill, billIndex) => {\n            if (this.state[`organizedEvents${billIndex}`]) {\n                this.state[`organizedEvents${billIndex}`].forEach(eventGroup => {\n                    eventGroup.events.forEach(event => {\n                        //Only save events that have been changed\n                        if (event.hasChanged) {\n                            //Do not save the events that have been deleted and lack a event id. These events to do not need to be created\n                            if (!event.LegislationEventID && event.DeletionDate) {\n                                return\n                            } else {\n                                eventsToSave.push(event);\n                            }\n                        }\n                    })\n                });\n            }\n        });\n        if (eventsToSave.length > 0) {\n            this.setState({\n                isSaving: true\n            });\n            this.props.actions.saveBillEvent({ LegislationEvents: eventsToSave })\n                .then(() => {\n                    this.props.actions.makeToast([{ message: \"Events Saved\", type: \"success\" }]);\n                    this.setState({\n                        historyIsLoaded: false,\n                        isSaving: false\n                    });\n                    // If there is a selected collection then do not do a search, just get those bills again\n                    if (this.state.selectedCollection) {\n                        this.selectCollection(this.state.selectedCollectionIndex)\n                    } else {\n                        this.handleSearch();\n                    }\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.props.actions.makeToast([{ message: \"Events Save Failed\", type: \"failure\" }]);\n                    this.setState({\n                        isSaving: false\n                    });\n                });\n        }\n    }\n\n    toggleSidebar() {\n        this.setState({\n            showSidebar: !this.state.showSidebar\n        })\n    }\n\n    toggleShowData(billID, bool) {\n        if (bool === undefined) {\n            this.setState(prevState => ({\n                [billID]: !prevState[billID]\n            }));\n        } else {\n            //not just toggling, we're explicitly setting (e.g. if searching by keyword, and a bill has been expanded, if the keyword search location changes to bill text,\n            //don't just toggle all (which would reset that bill to false), set them all to true)\n            this.setState({\n                [billID]: bool\n            })\n        }\n    }\n\n    togglehideAllEvents(idx) {\n        let hideAllEvents = [...this.state.hideAllEvents]\n        const hide = !hideAllEvents[idx];\n        hideAllEvents[idx] = hide\n        this.setState({\n            hideAllEvents\n        }, () => {\n            if (!hide) {\n                const lastEventGroup = document.getElementById(\"last-\" + idx);\n                if (lastEventGroup) { lastEventGroup.scrollIntoView({ block: 'center' }); }\n            }\n        })\n    }\n\n    toggleModal() {\n        this.setState({\n            showModal: !this.state.showModal\n        })\n    }\n\n    handleExcludeFailedChange() {\n        this.setState({\n            excludeFailed: !this.state.excludeFailed,\n            showUpdateSearchButton: true\n        })\n    }\n\n    toggleExpandAllLegislation(expand) {\n        let billList = [...this.state.billList];\n        billList.forEach(bill => {\n            this.toggleShowData(bill.LegislationID, expand)\n        })\n    }\n\n    render() {\n        const { isFetching, sessionID, billList, showSidebar, height } = this.state;\n        const { errorMessage } = this.props.bills;\n\n        let toggleArrows = [];\n        for (let i = 1; i <= height; i++) {\n            let top = (i * 540).toString() + \"px\";\n            toggleArrows.push(<button key={i} type=\"button\" aria-expanded={showSidebar} onClick={this.toggleSidebar} className={showSidebar ? \"sidebar-button arrow-up white-chevron\" : \"sidebar-button arrow-down white-chevron\"} style={{ top: top }}></button>);\n        }\n\n        return (\n            <div id=\"results-div\">\n                {this.state.showModal &&\n                    <div className=\"schedule-modal\">\n                        <div className=\"schedule-modal-content\">\n                            <p>You will need to click the search button or press the enter key in order to update your search results after removing a search parameter.</p>\n                            <button className=\"button primary float-right\" onClick={() => this.toggleModal()}>Close</button>\n                            <br />\n                        </div>\n                    </div>\n                }\n                <h1>Bill Management</h1>\n                <br />\n                <div className={showSidebar ? \"inner-grid one-toggle-and-three\" : \"inner-grid toggle-and-three\"}>\n                    {showSidebar &&\n                        <div>\n                            <LegislationWatchlists\n                                collections={this.state.collections}\n                                isLoading={this.state.collectionIsLoading}\n                                error={this.props.collection.collectionError}\n                                selectedCollectionIndex={this.state.selectedCollectionIndex}\n                                selectCollection={this.selectCollection}\n                                createCollection={() => null}\n                                isCreatingCollection={this.state.isCreatingCollection}\n                                location={this.props.history.location.pathname}\n                                isBillManagement={true}\n                                isAuthor={true}\n                            />\n                            <br />\n                            <AdvancedSearchBox\n                                ref={this.searchBox}\n                                selectedBillNumbers={this.state.selectedBillNumbers}\n                                selectedBillRangeBeginning={this.state.selectedBillRangeBeginning}\n                                selectedBillRangeEnd={this.state.selectedBillRangeEnd}\n                                selectedChapterNumber={this.state.selectedChapterNumber}\n                                selectedKeywords={this.state.selectedKeywords}\n                                selectedBillEvent={this.state.selectedBillEvent}\n                                billEventOptions={this.state.billEventOptions}\n                                sessionOptions={this.state.sessionOptions}\n                                selectedSession={this.state.selectedSession}\n                                billStatusCategoryList={this.state.billStatusCategoryList}\n                                selectedBillStatusCategory={this.state.selectedBillStatusCategory}\n                                billStatusStartDate={this.state.billStatusStartDate}\n                                billStatusEndDate={this.state.billStatusEndDate}\n                                selectedCommittee={this.state.selectedCommittee}\n                                committeeList={this.state.filteredCommitteeList}\n                                subcommitteeList={this.state.subcommitteeList}\n                                selectedSubcommittee={this.state.selectedSubcommittee}\n                                patronList={this.state.filteredPatronList}\n                                patronRoles={this.state.patronRoles}\n                                selectedPatron={this.state.selectedPatron}\n                                selectedPatronType={this.state.selectedPatronType}\n                                selectedChamber={this.state.selectedChamber}\n                                selectedBillType={this.state.selectedBillType}\n                                billEventEndDate={this.state.billEventEndDate}\n                                billEventStartDate={this.state.billEventStartDate}\n                                resetUrl={this.resetUrl}\n                                handleSubmit={this.handleSubmit}\n                                handleTextChange={this.handleTextChange}\n                                handleSelectChange={this.handleSelectChange}\n                                handleDateChange={this.handleDateChange}\n                                committeeChange={this.committeeChange}\n                                chamberChange={this.chamberChange}\n                                sessionChange={this.sessionChange}\n                                clearForm={this.clearForm}\n                                isFetching={this.state.isFetching}\n                                handlePatronChange={this.handlePatronChange}\n                                handlePatronTypeChange={this.handlePatronTypeChange}\n                                subjectList={this.state.subjectList}\n                                selectedSubject={this.state.selectedSubject}\n                                toggleGroup={this.toggleGroup}\n                                billFieldset={this.state.billFieldset}\n                                keywordFieldset={this.state.keywordFieldset}\n                                statusFieldset={this.state.statusFieldset}\n                                activityFieldset={this.state.activityFieldset}\n                                membersFieldset={this.state.membersFieldset}\n                                committeesFieldset={this.state.committeesFieldset}\n                                subjectFieldset={this.state.subjectFieldset}\n                                showCategories={this.state.showCategories}\n                                toggleShowCategories={this.toggleShowCategories}\n                                location={this.props.history.location.pathname}\n                                billVersionList={this.state.billVersionList}\n                                selectedBillVersion={this.state.selectedBillVersion}\n                                billSummaryList={this.state.billSummaryList}\n                                selectedSummaryVersion={this.state.selectedSummaryVersion}\n                                selectedLocation={this.state.selectedLocation}\n                                billManagement={true}\n                                handleCurrentStatusChange={this.handleCurrentStatusChange}\n                                currentStatus={this.state.currentStatus}\n                                failedToGetSessions={this.state.failedToGetSessions}\n                                searchParam={this.props.history.location.search}\n                                handleExcludeFailedChange={this.handleExcludeFailedChange}\n                                excludeFailed={this.state.excludeFailed}\n                                showUpdateSearchButton={this.state.showUpdateSearchButton}\n                            />\n                        </div>\n                    }\n                    <div className={showSidebar ? \"management sidebar-toggle-open\" : \"management sidebar-toggle-closed\"} onClick={this.toggleSidebar}>\n                        {toggleArrows.map((a, i) => {\n                            return (a)\n                        })}\n                    </div>\n                    {this.state.failedToGetSessions ? <div className=\"center input-feedback\" style={{ fontSize: '1em' }}>Failed to retrieve sessions. Please refresh & try again.</div> : !this.state.selectedSession ? <div className=\"center-spinner spinner\">Loading...</div>\n                        :\n                        this.state.showCategories ?\n                            <BillCategories\n                                session={this.state.sessionOptions.find(session => session.SessionCode === this.props.nav.session)}\n                                patronList={this.state.patronList}\n                                committeeList={this.state.groupedCommitteeList}\n                                subjectList={this.state.subjectList}\n                                introDateList={this.state.introDateList}\n                                statusCategoriesList={this.state.billStatusCategoryList}\n                                isLoading={this.state.billStatusCategoryListIsLoading}\n                                history={this.props.history}\n                                location={this.props.history.location.pathname}\n                                selectedSession={this.state.selectedSession}\n                                excludeFailed={this.state.excludeFailed}\n                            />\n                            :\n                            <div className=\"public-list\">\n                                <CollectionControls\n                                    searchMade={this.state.searchMade}\n                                    collections={this.state.collections}\n                                    selectedCollection={this.state.selectedCollection}\n                                    selectedCollectionIndex={this.state.selectedCollectionIndex}\n                                    handleCollectionChange={() => null}\n                                    selectCollection={this.selectCollection}\n                                    collectionIsSaving={this.state.collectionIsSaving}\n                                    saveCollection={() => null}\n                                    deleteCollection={() => null}\n                                    calendarHeader={this.state.calendarHeader}\n                                    isBillManagement={true}\n                                />\n                                {this.state.searchMade &&\n                                    <SearchSelections\n                                        currentStatus={this.state.currentStatus}\n                                        selectedSession={this.state.selectedSession}\n                                        selectedBillNumbers={this.state.selectedBillNumbers}\n                                        selectedBillRangeBeginning={this.state.selectedBillRangeBeginning}\n                                        selectedBillRangeEnd={this.state.selectedBillRangeEnd}\n                                        selectedChapterNumber={this.state.selectedChapterNumber}\n                                        selectedKeywords={this.state.selectedKeywords}\n                                        selectedBillEvent={this.state.billEventOptions.find(opt => opt.value === this.state.selectedBillEvent)}\n                                        selectedBillStatusCategory={this.state.billStatusCategoryList.find(opt => opt.value === this.state.selectedBillStatusCategory)}\n                                        billStatusStartDate={this.state.billStatusStartDate}\n                                        billStatusEndDate={this.state.billStatusEndDate}\n                                        selectedCommittee={this.state.committeeList.find(opt => opt.value === this.state.selectedCommittee)}\n                                        selectedSubcommittee={this.state.subcommitteeList.find(opt => opt.value === this.state.selectedSubcommittee)}\n                                        selectedPatron={this.state.patronList.find(opt => opt.value === this.state.selectedPatron)}\n                                        selectedPatronType={this.state.patronRoles.filter(role => this.state.selectedPatronType.includes(role.PatronTypeID))}\n                                        selectedChamber={this.state.selectedChamber}\n                                        billEventEndDate={this.state.billEventEndDate}\n                                        billEventStartDate={this.state.billEventStartDate}\n                                        selectedSubject={this.state.subjectList.find(opt => opt.value === this.state.selectedSubject)}\n                                        excludeFailed={this.state.excludeFailed}\n                                        handleSelectionClear={this.handleSelectionClear}\n                                        handleMultiSelectionClear={this.handleMultiSelectionClear}\n                                        updateSearch={this.state.showUpdateSearchButton ? this.searchBox.current.handleSubmit : null}\n                                    />}\n                                <EventControls\n                                    billEventOptions={this.state.billEventOptions}\n                                    addEvent={this.addEvent}\n                                    removeEvent={this.removeEvent}\n                                    checkedBills={this.state.checkedBills}\n                                    patronList={this.state.patronList}\n                                    committeeList={this.state.fullCommitteeList}\n                                    actionTypes={this.state.actionTypes}\n                                    textList={this.state.billList.flatMap(bill => bill.versionsList ? [...bill.versionsList] : [])}\n                                    otherBillEventOptions={this.state.otherBillEventOptions}\n                                    getOtherBillEventOptions={this.getOtherBillEventOptions}\n                                />\n                                {!isFetching &&\n                                    <div className=\"flex-row search-results-title-section\">\n                                        {this.state.searchMade ?\n                                            <>\n                                                {this.state.allLegislation && <h2>All legislation</h2>}\n                                                {this.state.mostFrequent && <h2>Most frequently accessed bills</h2>}\n                                                {this.state.isPending && <h2>Pending bills</h2>}\n                                                {!this.state.isPending && !this.state.mostFrequent && !this.state.allLegislation && <h2 style={{ marginBottom: '0px' }}>{billList.length === 0 && \"No \"}Search Results</h2>}\n                                            </>\n                                            : <div></div>}\n                                    </div>\n                                }\n                                <div className=\"search-results\">\n                                    {isFetching ?\n                                        <div className=\"spinner\"></div>\n                                        :\n                                        <>\n                                            {errorMessage ?\n                                                <p className=\"message-error\">{errorMessage}</p>\n                                                :\n                                                null\n                                            }\n                                        </>\n                                    }\n                                    {!isFetching && !errorMessage &&\n                                        <ul className=\"slidedown-list\">\n                                            <div className=\"flex-row\">\n                                                <div />\n                                                <div>\n                                                    {billList.length ? <button className=\"button-link\" style={{ fontSize: '12px' }} onClick={() => this.toggleExpandAllLegislation(billList.find(bill => !this.state[bill.LegislationID]))}>{billList.find(bill => !this.state[bill.LegislationID]) ? \"Expand All Legislation\" : \"Collapse All Legislation\"}</button> : null}\n                                                </div>\n                                            </div>\n                                            <div className='flex-row'>\n                                                {billList.length ? <label htmlFor=\"sr-select-all\"\n                                                    className=\"txt-greyed\">\n                                                    <input id=\"sr-select-all\" checked={this.state.selectAllBills} onChange={this.toggleAllBills} type=\"checkbox\" style={{ verticalAlign: 'sub', marginRight: '10px' }} />\n                                                    Select all</label> : <label />}\n                                                {!errorMessage && <span id=\"search-result-count\" className=\"txt-greyed\">{billList.length} {this.state.searchMade ? \"Result\" : \"Item\"}{billList.length !== 1 && \"s\"}</span>}\n                                            </div>\n                                            <hr className=\"faded-line\" style={{ marginBlockEnd: \"0px\" }} />\n                                            {billList.map((bill, i) =>\n                                                <BillInfoComponent\n                                                    key={i}\n                                                    bill={bill}\n                                                    billIndex={i}\n                                                    checked={this.state.checkedBills[i]}\n                                                    expanded={this.state[bill.LegislationID]}\n                                                    toggleShowData={this.toggleShowData}\n                                                    selectedCollection={this.state.selectedCollection}\n                                                    handleCollectionChange={() => null}\n                                                    billEvents={this.state.billEventOptions}\n                                                    handleBillCheckbox={e => this.handleBillCheckbox(i, e)}\n                                                    sessionCode={this.state.sessionOptions.find(session => session.SessionID === bill.SessionID).SessionCode}\n                                                    isBillManagement={true}\n                                                    selectedLocation={this.state.displaySelectedLocation}\n                                                    selectedKeywords={this.state.selectedKeywords}\n                                                    displayChapterNumber={this.state.selectedChapterNumber || (this.state.selectedBillStatusCategory && this.state.billStatusCategoryList.find(it => it.Name.toLowerCase() === \"acts of assembly chapters\") && this.state.selectedBillStatusCategory === this.state.billStatusCategoryList.find(it => it.Name.toLowerCase() === \"acts of assembly chapters\").LegislationCategoryID)}\n                                                >\n                                                    <div style={{ fontSize: '16px' }}>\n                                                        <BillHistoryForm\n                                                            historyList={bill.historyList || []}\n                                                            organizedEvents={this.state[`organizedEvents${i}`] || []}\n                                                            handleEventChange={events => this.handleEventChange(i, events)}\n                                                            isBillManagement={true}\n                                                            billEvents={this.state.billEventOptions}\n                                                            billData={bill}\n                                                            idx={i}\n                                                            handleEditedBills={this.handleEditedBills}\n                                                            toggleEditContent={this.toggleEditContent}\n                                                            saveEvents={this.saveEvents}\n                                                            hideAllEvents={this.state.hideAllEvents[i]}\n                                                            togglehideAllEvents={this.togglehideAllEvents}\n                                                            versionsList={bill.versionsList}\n                                                            actionTypes={this.state.actionTypes}\n                                                            memberList={this.state.patronList}\n                                                            committeeList={this.state.fullCommitteeList}\n                                                        />\n                                                    </div>\n                                                </BillInfoComponent>\n                                            )}\n                                        </ul>\n                                    }\n                                </div>\n                            </div>\n                    }\n                </div>\n                {\n                    !this.state.showCategories &&\n                    <div className=\"floating-button-bar align-right invisible-bar\">\n                        <button type=\"button\" onClick={this.saveForm} disabled={!this.state.billList.find(b => b.eventsChanged) || this.state.isSaving} className=\"button\">{this.state.isSaving ? \"Saving...\" : \"Save\"}</button>\n                    </div>\n                }\n            </div>\n        )\n    }\n}\n\nconst PublicBillSearch = connect(\n    (state) => {\n        const { bills, session, members, committee, patrons, nav, collection, login, minutes } = state;\n        return {\n            bills,\n            session,\n            members,\n            committee,\n            patrons,\n            nav,\n            collection,\n            login,\n            minutes\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, authActionCreators, committeeActionCreators, billActionCreators, sessionActionCreators, memberActionCreators, patronActionCreators, navActionCreators, collectionActionCreators, minutesActionCreators), dispatch)\n        }\n    }\n)(BillManagement)\n\nexport default PublicBillSearch;\n\n","import React from \"react\";\nimport ReactTable from \"react-table\";\nimport { Link } from 'react-router-dom';\nimport '../../../stylesheets/shared/react-table.css';\nimport moment from 'moment-timezone';\nimport * as Fields from '../../../lis-shared/lis-layout/components/lis-forms-component';\nimport DatePicker from \"react-datepicker\";\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { communicationsActionCreators } from '../../../stores/lis-communications-store';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\nimport { cancelRequest } from '../../../services/request.service';\n\nclass CommunicationsManagementGrid extends React.Component {\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            isLoaded: true,\n            selectedSession: [],\n            selectedChamber: '',\n            sessionOptions: [],\n            chamberOptions: [\n                { label: \"House\", value: \"H\" },\n                { label: \"Senate\", value: \"S\" }\n            ],\n            commDate: moment(),\n            commList: [],\n            showCreateSuccess: false,\n        };\n\n        this.handleChamberChange = this.handleChamberChange.bind(this);\n        this.handleSessionChange = this.handleSessionChange.bind(this);\n        this.loadCommsList = this.loadCommsList.bind(this);\n        this.handleDateChange = this.handleDateChange.bind(this);\n        this.createComm = this.createComm.bind(this);\n        this.deleteCommunication = this.deleteCommunication.bind(this);\n    }\n\n    handleChamberChange(value) {\n        this.setState({\n            selectedChamber: value\n        }, () => {\n            this.props.actions.toggleChamber(value);\n            this.loadCommsList()\n        });\n    }\n\n    handleSessionChange(value) {\n        this.setState({\n            selectedSession: value\n        }, () => { this.loadCommsList() });\n    }\n\n    loadCommsList() {\n        if (this.state.selectedChamber && this.state.selectedSession) {\n            this.setState({ isLoaded: false });\n            const commParams = '?sessionID=' + this.state.selectedSession.SessionID + '&chamberCode=' + this.state.selectedChamber.value + '&isPublic=false&communicationType=Floor';\n            this.props.actions.getCommList(commParams, true)\n                .then(() => {\n                    this.setState({\n                        isLoaded: true,\n                        commList: this.props.communications.commList\n                    });\n                });\n        }\n    }\n\n    handleDateChange(value) {\n        this.setState({\n            commDate: moment(value)\n        });\n    }\n\n    createComm() {\n        this.setState({ isAdding: true });\n\n        let createObj = {\n            CommunicationDate: this.state.commDate,\n            IsPublic: false,\n            ChamberCode: this.state.selectedChamber.value,\n            CommunicationType: 'Floor',\n            SessionID: this.state.selectedSession.SessionID,\n        };\n\n        this.props.actions.createComm({ CommunicationResponse: [createObj] })\n            .then(() => {\n                this.setState({ showCreateSuccess: true });\n                this.loadCommsList();\n                setTimeout(() => {\n                    this.setState({\n                        showCreateSuccess: false,\n                        createErrorMessage: '',\n                        isAdding: false\n                    })\n                }, 3000);\n                this.loadCommsList();\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    createErrorMessage: this.props.communications.commCreateError\n                });\n                setTimeout(() => {\n                    this.setState({\n                        showCreateSuccess: false,\n                        createErrorMessage: '',\n                        isAdding: false\n                    })\n                }, 3000);\n                this.loadCommsList();\n            })\n    }\n\n    deleteCommunication(rowIndex) {\n        this.setState({\n            communicationBeingDeleted: rowIndex\n        });\n        // Before being able to delete the communication we need to get the mod dates. So get the communication\n        this.props.actions.getComm('?communicationId=' + this.state.commList[rowIndex].CommunicationID, true)\n            .then(() => {\n                let communicationData = this.props.communications.commGet;\n                // Now that we have the communication data add a deletion date then save it\n                communicationData.DeletionDate = moment();\n                return this.props.actions.saveComm({ CommunicationResponse: [communicationData] })\n            }).then(() => {\n                this.setState({\n                    showDeleteSuccess: true,\n                    communicationBeingDeleted: -1\n                });\n                this.loadCommsList();\n                setTimeout(() => {\n                    this.setState({\n                        showDeleteSuccess: false\n                    })\n                }, 3000);\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    communicationBeingDeleted: -1,\n                    deleteFailureMessage: 'Communication failed to be deleted'\n                });\n                console.log(err)\n                setTimeout(() => {\n                    this.setState({\n                        deleteFailureMessage: '',\n                    });\n                }, 3000);\n            });\n    }\n\n    componentDidMount() {\n        //Get the list of active sessions for the session dropdown\n        this.props.actions.getSessionShallowList(\"IsActive=true\")\n            .then(() => {\n                let sessionList = [...this.props.session.sessionShallowList];\n                sessionList.forEach((session, index) => {\n                    session.label = session.SessionYear + ' ' + session.DisplayName;\n                    session.value = session.SessionID;\n                    if (session.IsDefault) {\n                        this.handleSessionChange(session);\n                    }\n                });\n                //set the default chamber to house or senate depending on the user's role\n                let selectedChamber = '';\n\n                //set the default chamber to house or senate depending on the user's role\n                let disableChamberSelector = false;\n\n                if (!this.props.login.userClaims.claims.find(x => x.RoleName === \"Admin\")) {\n                    //Find if the user is a house calendar editor, if so select house, otherwise select senate, and disable the chamber selector\n                    selectedChamber = this.props.login.userClaims.claims.find(x => x.RoleName === \"HouseLegislationCommunicationsEditor\") ? this.state.chamberOptions.find(chamber => chamber.label === \"House\") : this.state.chamberOptions.find(chamber => chamber.label === \"Senate\");\n                    disableChamberSelector = true;\n                }\n\n                this.setState({\n                    sessionOptions: sessionList,\n                    selectedChamber: selectedChamber,\n                    disableChamberSelector: disableChamberSelector\n                }, () => {\n                    //Load the list of communicationsand put them in the grid\n                    this.loadCommsList();\n                });\n            });\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        return (\n            <div>\n                <div className=\"header-half\">\n                    <h1>Communications Management</h1>\n                    {this.props.login.userClaims.claims.find(c => c.RoleName === \"Admin\") &&\n                        <div className=\"flex-row flex-vertical-center flex-end\">\n                            <a className=\"icon settings\" href=\"/configurations-management/communications\" />\n                        </div>\n                    }\n                </div>\n\n                <div className=\"toolbar minutes-toolbar dlas-forms\">\n                    <div>\n                        <Fields.Dropdown\n                            value={this.state.selectedChamber}\n                            options={this.state.chamberOptions}\n                            onChange={this.handleChamberChange}\n                            isDisabled={this.state.disableChamberSelector}\n                        />\n                    </div>\n                    <div>\n                        <Fields.Dropdown\n                            value={this.state.selectedSession}\n                            options={this.state.sessionOptions}\n                            onChange={this.handleSessionChange}\n                        />\n                    </div>\n                </div>\n                <ReactTable\n                    resizable={false}\n                    loading={!this.state.isLoaded}\n                    data={this.state.commList}\n                    ref={r => this.reactTable = r}\n                    columns={[\n                        {\n                            Header: \"Communications Date\",\n                            columns: [\n                                {\n                                    Header: (\n                                        <div className=\"dlas-forms datepicker-container\">\n                                            {!this.state.showCreateSuccess &&\n                                                <DatePicker\n                                                    id=\"commDate\"\n                                                    className=\"dnd-field\"\n                                                    selected={this.state.commDate}\n                                                    onChange={this.handleDateChange}\n                                                    placeholderText=\"Communications Date\"\n\n                                                />\n                                            }\n                                        </div>\n                                    ),\n                                    headerClassName: \"header-insert\",\n                                    accessor: \"CommunicationDate\",\n                                    sortable: false,\n                                    width: 200,\n                                    Cell: row => <span>{moment(row.value).format('L')}</span>\n                                }\n                            ]\n                        },\n                        {\n                            Header: \"ID\",\n                            columns: [\n                                {\n                                    Header: (<div></div>),\n                                    headerClassName: \"header-insert\",\n                                    accessor: \"CommunicationNumber\",\n                                    sortable: false,\n                                    width: 140,\n                                    Cell: row => <span>{row.value}</span>\n                                }\n                            ]\n                        },\n                        {\n                            Header: \"Session\",\n                            columns: [\n                                {\n                                    Header: (\n                                        <div>\n                                            {this.state.showCreateSuccess &&\n                                                <span className=\"insert-message\">Communications created successfully!</span>\n                                            }\n                                            {this.state.createErrorMessage &&\n                                                <span className=\"insert-message fail\">{this.state.createErrorMessage}</span>\n                                            }\n                                            {!this.state.createErrorMessage && !this.state.showCreateSuccess &&\n                                                <span>{this.state.selectedSession.label}</span>\n                                            }\n                                            {this.state.showDeleteSuccess &&\n                                                <span className=\"insert-message\">Communication was deleted successfully!</span>\n                                            }\n                                            {this.state.deleteFailureMessage &&\n                                                <span className=\"insert-message fail\">{this.state.deleteFailureMessage}</span>\n                                            }\n                                        </div>\n                                    ),\n                                    headerClassName: \"header-insert-dropdown\",\n                                    accessor: \"SessionID\",\n                                    sortable: false,\n                                    Cell: row => <span>{this.state.selectedSession.label}</span>\n                                }\n                            ]\n                        },\n                        {\n                            Header: 'Actions',\n                            headerClassName: \"submit-action\",\n                            sortable: false,\n                            filterable: false,\n                            columns: [\n                                {\n                                    Header: () => this.state.isAdding ?\n                                        <span><button className=\"button\" onClick={this.createComm} disabled={true}>Adding...</button></span>\n                                        :\n                                        <span><button className=\"button\" onClick={this.createComm} disabled={!this.state.commDate || !this.state.selectedChamber || !this.state.selectedSession}>Create</button></span>\n                                    ,\n                                    headerClassName: \"header-action\",\n                                    accessor: \"action\",\n                                    sortable: false,\n                                    className: \"action-column\",\n                                    width: 90,\n                                    Cell: row => {\n                                        return (\n                                            <div className=\"committee-action-column-two\">\n                                                <Link to={`/communications-management/edit-communication/${row.original.CommunicationID}`} className=\"icon edit\"></Link>\n                                                {row.original.IsPublic ?\n                                                    <Link target=\"_blank\" to={`/session-details/${this.state.selectedSession.SessionCode}/communications/${row.original.ReferenceNumber}`} className=\"icon book\"></Link>\n                                                    :\n                                                    <span onClick={() => this.deleteCommunication(row.index)} className=\"icon delete\"></span>\n                                                }\n                                            </div>\n                                        )\n                                    }\n                                }\n                            ]\n                        }\n                    ]}\n                    defaultPageSize={15}\n                    pageSizeOptions={[5, 10, 15, 20, 25, 50, 100]}\n                    className=\"committee-table -striped -highlight\"\n                />\n            </div>\n        )\n\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { session, communications, login } = state;\n        return {\n            session,\n            communications,\n            login\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, sessionActionCreators, communicationsActionCreators, authActionCreators), dispatch)\n        }\n    }\n)(CommunicationsManagementGrid)","export default __webpack_public_path__ + \"static/media/houseclerk_paulnardo.489d8f4a.png\";","import React from 'react';\nimport moment from 'moment-timezone'\nimport { Link } from 'react-router-dom';\nimport houseSig from '../../images/houseclerk_paulnardo.png';\nimport senateSig from '../../images/senateclerk_susanclarkeschaar.png';\n\nimport renderHTML from 'react-render-html';\n\nconst Communication = props => {\n    //Only display the legislation that is marked as active\n    const onlyActive = props.comm.CommunicationLegislation.filter(leg => leg.IsActive);\n    const legList = onlyActive.map(leg => {\n        leg.ChamberCode = leg.ChamberCode ?? leg.LegislationNumber[0];\n        leg.Patrons?.sort((a, b) => a.ChamberCode !== b.ChamberCode ? a.ChamberCode !== leg.ChamberCode ? 1 : -1 : a.Sequence - b.Sequence || a.PatronTypeID - b.PatronTypeID || a.PatronDisplayName.localeCompare(b.PatronDisplayName));\n        const patronList = leg.Patrons?.map((patron, patronIndex) => {\n            let sameAsPrevious = patronIndex === 0 ? true : (!leg.Patrons[patronIndex - 1] && patron.ChamberCode === leg.ChamberCode && !leg.Patrons.find(p => p.ChamberCode !== leg.ChamberCode)) || (leg.Patrons[patronIndex - 1] && patron.ChamberCode === leg.Patrons[patronIndex - 1].ChamberCode);\n            let sameAsNext = leg.Patrons[patronIndex + 1] && patron.ChamberCode === leg.Patrons[patronIndex + 1].ChamberCode;\n            let patronDisplayName = patron.PatronDisplayName\n\n            return (\n                <React.Fragment key={patronIndex}>\n                    {patron.ChamberCode !== leg.ChamberCode\n                        ? patronIndex !== leg.Patrons.length - 1\n                            ? leg.ChamberCode === \"S\"\n                                ? !sameAsPrevious ? (patronIndex !== 0 ? \"; \" : \"\") + \"Delegates: \" + patronDisplayName + \", \" : sameAsNext ? patronDisplayName + \", \" : patronDisplayName\n                                : !sameAsPrevious ? (patronIndex !== 0 ? \"; \" : \"\") + \"Senators: \" + patronDisplayName + \", \" : sameAsNext ? patronDisplayName + \", \" : patronDisplayName\n                            : leg.ChamberCode === \"S\"\n                                ? !sameAsPrevious ? (patronIndex !== 0 ? \"; \" : \"\") + \"Delegate: \" + patronDisplayName : patronDisplayName\n                                : !sameAsPrevious ? (patronIndex !== 0 ? \"; \" : \"\") + \"Senator: \" + patronDisplayName : patronDisplayName\n                        : sameAsNext\n                            ? patronDisplayName + \", \" : patronDisplayName\n                    }\n                </React.Fragment>\n            )\n        })\n\n\n        let legNumber = leg.LegislationNumber;\n        //Add dots in between the characters because that is how they want it displayed\n        const billType = legNumber.slice(0, 2);\n        const numbers = legNumber.slice(2);\n        legNumber = billType.split('').map(char => {\n            char += '.'\n            // Senate Joint and House Joint Resolutions are displayed as 'H.J.R.' and 'S.J.R.' on this page rather than 'HJ' and 'SJ'\n            // If the bill has a 'J' in the bill number then it is a joint resolution\n            if (char === 'J.') {\n                char += 'R.'\n            }\n            return char;\n        }).join('');\n        legNumber += ' ' + numbers;\n\n        let billLink = '<strong><a className=\"bill-number\" target=\"_blank\" href=/bill-details/' + props.session.SessionCode + '/' + leg.LegislationNumber + '>' + legNumber + '</a></strong>';\n        let draftTitle = leg.DraftTitle;\n\n        if (draftTitle && draftTitle.indexOf(\"<p class=ldtitle>\") > -1) {\n            draftTitle = draftTitle.slice(0, 17) + billLink + \" \" + draftTitle.slice(17, draftTitle.length + 1)\n        }\n        else if (draftTitle && draftTitle.indexOf(\"<p class=ldtitle>\") == -1) {\n            draftTitle = \"<p class=ldtitle>\" + billLink + \" \" + draftTitle + \"</p>\"\n        }\n\n        const removeLDNum = (draftTitle) => draftTitle.replace(/<p class=ldrt>\\d+D<\\/p>/, \"\");\n\n        return (\n            <div key={leg.LegislationNumber}>\n                <div className=\"list-desc\">\n                    <div>\n                        <div className=\"comm-leg-wrapper\">\n                            {!draftTitle &&\n                                <strong>\n                                    <Link className=\"bill-number\" target=\"_blank\" to={`/bill-details/${props.session.SessionCode}/${leg.LegislationNumber}`}>{legNumber}</Link>\n                                </strong>\n                            }\n                            {draftTitle && draftTitle.indexOf(billLink) < 0 &&\n                                <strong>\n                                    <Link className=\"bill-number\" target=\"_blank\" to={`/bill-details/${props.session.SessionCode}/${leg.LegislationNumber}`}>{legNumber}</Link>\n                                    {\" \"}\n                                </strong>\n                            }\n                            {draftTitle &&\n                                renderHTML(removeLDNum(draftTitle))\n                            }\n                        </div>\n                    </div>\n                    <div>\n                        <p>{leg.EffectiveType === \"Emergency\" && \"EMERGENCY\"}</p>\n                    </div>\n                    <div>\n                        <p>{leg.Patrons?.length > 1 ? 'Patrons' : 'Patron'} - {patronList}</p>\n                    </div>\n                </div>\n            </div>\n        );\n    });\n    if (legList.length > 0) {\n        const categoryStyle = {\n            fontSize: '18px',\n            color: '#315981'\n        }\n        return (\n            <div>\n                <br />\n                {props.comm.Description ? <p style={categoryStyle}>{props.comm.Description}</p> :\n                    <React.Fragment>\n                        {legList.length === 1 ?\n                            <p style={categoryStyle}>{props.comm.CategoryDescription}</p>\n                            :\n                            <p style={categoryStyle}>{props.comm.PluralDescription}</p>\n                        }\n                    </React.Fragment>\n                }\n                {legList}\n            </div>\n        );\n    } else {\n        return false;\n    }\n}\n\nclass CommunicationsDetailsComponent extends React.Component {\n\n    render() {\n        const { session, communication, refNum, authoring } = this.props;\n        const chamberCode = communication.ChamberCode;\n        const referenceNumber = refNum || communication.ReferenceNumber;\n        const date = communication.CommunicationDate;\n        const categories = communication.CommunicationCategories || [];\n\n        const committeeHeader = \"In the \" + (chamberCode === \"S\" ? \"Senate\" : \"House of Delegates\");\n        const sessionHeader = session.SessionYear + \" \" + session.DisplayName;\n        const floatRightStyle = {\n            float: 'right'\n        };\n        return (\n            <div className=\"bill-theme public-details inner-grid\">\n                <div>\n                    <h2>{sessionHeader}</h2>\n                </div>\n                <hr />\n                <div className='details-page-data-container'>\n                    <div className=\"communication-header-container\">\n                        <p>{referenceNumber}</p>\n                        <div style={floatRightStyle}>\n                            <p className=\"float-right\">{committeeHeader}</p>\n                            <p>{moment(date).format(\"MMMM DD, YYYY\")}</p>\n                        </div>\n                    </div>\n                    <div>\n                        {categories.length > 0 && categories.map(comm => <Communication key={comm.CommunicationCategoryID} comm={comm} session={session} />)}\n                    </div>\n                    <br />\n                    <div className=\"list-desc\">\n                        <p>{communication.ShowSignatureNote ? communication.FooterSentence : <pre>&emsp;</pre>}</p>\n                    </div>\n                    <div className=\"list-desc align-right\">\n                        {authoring &&\n                            <div style={{ width: \"100%\", height: \"105px\" }}>\n                                {chamberCode === \"H\"\n                                    /* Get image sizes from images themselves and set height/width */\n                                    ? <img style={{ width: \"394px\", height: \"104px\", float: \"right\", WebkitPrintColorAdjust: \"exact\" }} src={houseSig} />\n                                    : <img style={{ width: \"393px\", height: \"86px\", float: \"right\", WebkitPrintColorAdjust: \"exact\" }} src={senateSig} />\n                                }\n                            </div>\n                        }\n                        <p>{communication.ClerkName}</p>\n                        <p>{communication.ClerkTitle}</p>\n                    </div>\n                </div>\n            </div>\n        )\n    }\n}\n\nexport default CommunicationsDetailsComponent;\n","export default \"data:image/png;base64,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\"","import React from \"react\";\nimport Select from 'react-select';\nimport ReactTooltip from 'react-tooltip';\nimport renderHTML from 'react-render-html';\nimport { Link } from 'react-router-dom';\nimport { Editor } from '@tinymce/tinymce-react';\nimport stripTags from \"striptags\";\n\nclass BillsGrid extends React.Component {\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            selectAllActive: false,\n            selectAllInactive: false,\n            newDescriptions: [],\n            lastCheckedBills: [],\n            textHeight: []\n        };\n        this.toggleSelectAll = this.toggleSelectAll.bind(this);\n        this.toggleRow = this.toggleRow.bind(this);\n        this.toggleBill = this.toggleBill.bind(this);\n        this.toggleEditCategoryDescription = this.toggleEditCategoryDescription.bind(this);\n        this.handleDescriptionChange = this.handleDescriptionChange.bind(this);\n        this.toggleEdit = this.toggleEdit.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n        this.handleTitleChange = this.handleTitleChange.bind(this);\n    }\n\n    componentDidMount() {\n        this.props.organizedComms.forEach((_, index) => {\n            this.getCommunicationCategoryHeight(index)\n        })\n    }\n\n    componentDidUpdate(prevProps) {\n        if (this.props.organizedComms.map(c => c.CategoryCode) !== prevProps.organizedComms.map(c => c.CategoryCode)) {\n            this.props.organizedComms.forEach((_, index) => {\n                this.getCommunicationCategoryHeight(index)\n            })\n        }\n    }\n\n    toggleSelectAll(categoryIndex) {\n        let organizedComms = [...this.props.organizedComms];\n        const opposite = !organizedComms[categoryIndex].selectAll;\n        organizedComms[categoryIndex].selectAll = opposite\n        organizedComms[categoryIndex].CommunicationLegislation.forEach(leg => leg.checked = opposite);\n        this.props.updateAgenda(organizedComms);\n\n        let lastCheckedBills = this.state.lastCheckedBills;\n        lastCheckedBills[categoryIndex] = -1;\n        this.setState({\n            lastCheckedBills: lastCheckedBills\n        });\n    }\n\n    toggleRow(categoryIndex, itemIndex, e) {\n        let organizedComms = [...this.props.organizedComms];\n        let lastCheckedBills = this.state.lastCheckedBills;\n        let lastCheckedBill = lastCheckedBills[categoryIndex];\n        if (e.nativeEvent.shiftKey && !isNaN(lastCheckedBill) && lastCheckedBill !== -1) {\n            organizedComms[categoryIndex].CommunicationLegislation.forEach(item => item.checked = false);\n            for (let i = 0; i < Math.abs(itemIndex - lastCheckedBill); i++) {\n                const index = lastCheckedBill + i * (itemIndex - lastCheckedBill) / Math.abs(itemIndex - lastCheckedBill);\n                organizedComms[categoryIndex].CommunicationLegislation[index].checked = true;\n            }\n        } else {\n            lastCheckedBill = itemIndex;\n        }\n        organizedComms[categoryIndex].CommunicationLegislation[itemIndex].checked = !organizedComms[categoryIndex].CommunicationLegislation[itemIndex].checked;\n        this.props.updateAgenda(organizedComms);\n\n        lastCheckedBills[categoryIndex] = lastCheckedBill;\n        this.setState({\n            lastCheckedBills: lastCheckedBills\n        });\n    }\n\n    toggleBill(categoryIndex, itemIndex) {\n        let organizedComms = [...this.props.organizedComms];\n        organizedComms[categoryIndex].CommunicationLegislation[itemIndex].IsActive = !organizedComms[categoryIndex].CommunicationLegislation[itemIndex].IsActive;\n        organizedComms[categoryIndex].CommunicationLegislation[itemIndex].checked = false;\n        this.props.updateAgenda(organizedComms, true);\n    }\n\n    toggleBillBulk(activate, categoryIndex) {\n        let organizedComms = [...this.props.organizedComms];\n        organizedComms[categoryIndex].selectAll = false;\n        organizedComms[categoryIndex].CommunicationLegislation.forEach(leg => {\n            if (leg.checked) {\n                leg.IsActive = activate;\n                leg.checked = false;\n            }\n        });\n        this.props.updateAgenda(organizedComms, true);\n    }\n\n    toggleEditCategoryDescription(categoryIndex, save) {\n        const categories = [...this.props.organizedComms];\n        let category = categories.filter(c => !c.DeletionDate)[categoryIndex];\n        category.editing = !category.editing;\n        if (save) {\n            category.Description = category.tempDescription;\n        } else {\n            category.tempDescription = category.Description || (category.CommunicationLegislation.filter(leg => leg.IsActive).length > 1 ? category.PluralDescription : category.CategoryDescription);\n        }\n        this.props.updateAgenda(categories, save);\n    }\n\n    handleDescriptionChange(categoryIndex, val) {\n        let organizedComms = [...this.props.organizedComms];\n        organizedComms[categoryIndex].tempDescription = val;\n        this.props.updateAgenda(organizedComms);\n    }\n\n    handleTitleChange(categoryIndex, itemIndex, value) {\n        let organizedComms = [...this.props.organizedComms];\n        organizedComms[categoryIndex].CommunicationLegislation[itemIndex].newDraftTitle = stripTags(value);\n        this.props.updateAgenda(organizedComms);\n    }\n\n    getCommunicationCategoryHeight(category) {\n        const el = document.getElementsByClassName(\"category-description-\" + category);\n        if (el && el.length) {\n            //setting the overflow to scroll is used to accommodate firefox \n            //from firefox documentation: \"When an element's content does not generate a vertical scrollbar, then its scrollHeight property is equal to its clientHeight property.\"\n            const initialOverflow = el[0].style.overflow;\n            el[0].style.overflow = \"scroll\";\n            el[0].style.height = el[0].scrollHeight + \"px\";\n            el[0].style.overflow = initialOverflow;\n        }\n    }\n\n    toggleEdit(categoryIndex, agendaIndex) {\n        let categories = [...this.props.organizedComms];\n        //This key is used to tell the DOM whether to display an input or a span\n        categories.filter(c => !c.DeletionDate)[categoryIndex].CommunicationLegislation[agendaIndex].isEditing = !categories.filter(c => !c.DeletionDate)[categoryIndex].CommunicationLegislation[agendaIndex].isEditing;\n        //Create a key called newDraftTitle that will hold the text that  the user types in\n        categories.filter(c => !c.DeletionDate)[categoryIndex].CommunicationLegislation[agendaIndex].newDraftTitle = categories.filter(c => !c.DeletionDate)[categoryIndex].CommunicationLegislation[agendaIndex].DraftTitle;\n        this.props.updateAgenda(categories);\n    }\n\n    handleChange(categoryIndex, agendaIndex, e) {\n        let textHeight = [...this.state.textHeight];\n\n        //Init the nested height value if undefined at the category or agenda index\n        if (!textHeight[categoryIndex]) {\n            textHeight[categoryIndex] = {};\n            textHeight[categoryIndex].CommunicationLegislation = [];\n            textHeight[categoryIndex].CommunicationLegislation[agendaIndex] = {};\n            textHeight[categoryIndex].CommunicationLegislation[agendaIndex].height = '70px';\n        } else if (!textHeight[categoryIndex].CommunicationLegislation[agendaIndex]) {\n            textHeight[categoryIndex].CommunicationLegislation[agendaIndex] = {};\n            textHeight[categoryIndex].CommunicationLegislation[agendaIndex].height = '70px';\n        }\n\n        let height = (Math.round(e.target.value.length / 95) * 20 + 40) || 70;\n\n        textHeight[categoryIndex].CommunicationLegislation[agendaIndex].height = height.toString() + \"px\";\n\n        let categories = [...this.props.organizedComms];\n\n        categories.filter(c => !c.DeletionDate)[categoryIndex].CommunicationLegislation[agendaIndex].newDraftTitle = e.target.value;\n\n        this.props.updateAgenda(categories);\n\n        this.setState({\n            textHeight: textHeight\n        })\n    }\n\n    saveChange(categoryIndex, agendaIndex) {\n        //Turn input back into span\n        let categories = [...this.props.organizedComms];\n        categories.filter(c => !c.DeletionDate)[categoryIndex].CommunicationLegislation[agendaIndex].isEditing = false;\n        //Set description to the text that the user has typed in. If new description is null then set it to the current description\n        categories.filter(c => !c.DeletionDate)[categoryIndex].CommunicationLegislation[agendaIndex].DraftTitle = categories.filter(c => !c.DeletionDate)[categoryIndex].CommunicationLegislation[agendaIndex].newDraftTitle;\n        this.props.updateAgenda(categories, true);\n    }\n\n    render() {\n        // The button will read 'Add' if the bill is not already part of a category. The button will read 'Move' if it is already part of a category.\n        const billButtonText = (index) => {\n            let billExists = false;\n            if (this.props.selectedBill[index]) {\n                this.props.organizedComms.some(category => {\n                    if (category.CommunicationLegislation.findIndex(bill => bill.LegislationID === this.props.selectedBill[index].LegislationID) >= 0) {\n                        billExists = true;\n                        return true;\n                    }\n                });\n                if (billExists) {\n                    return (\"Move\");\n                }\n            }\n            return (\"Add\");\n        }\n\n        const customFilter = (option, searchText) => {\n            // regex that matches all zeros and white space that is preceded by two letters (e.g. SC) and followed by a group of numbers.\n            // The purpose is to remove all leading zeros and white space from the user types in and the option label\n            try {\n                const regexp = new RegExp(\"(?<=[a-z]{2})[0\\s]+(?=[1-9][0-9]*)\", \"ig\")\n                const newLabel = option.label.toLowerCase().replace(regexp, \"\");\n                const newSearchText = searchText.toLowerCase().replace(regexp, \"\");\n                if (option.label.toLowerCase().includes(searchText.toLowerCase()) || newLabel.includes(newSearchText)) {\n                    return true;\n                }\n            }\n            catch (e) {\n                // Safari does not allow lookback regex (i.e. the '?<=' above), so we must handle it differently\n                // however, the below code will remove trailing zeros (i.e. searching 'HC11' will filter both 'HC0011' and 'HC1001'), so we want to at least try the above code first\n                if (e instanceof SyntaxError) {\n                    const regexp = new RegExp(\"(?![a-z]{2})[0\\s]+(?=[1-9][0-9]*)\", \"ig\")\n                    const newLabel = option.label.toLowerCase().replace(regexp, \"\");\n                    const newSearchText = searchText.toLowerCase().replace(regexp, \"\");\n                    if (option.label.toLowerCase().includes(searchText.toLowerCase()) || newLabel.includes(newSearchText)) {\n                        return true;\n                    }\n                } else {\n                    console.log(e.message)\n                }\n            }\n        };\n\n        const removeLDNum = (draftTitle) => draftTitle.replace(/<p class=ldrt>\\d+D<\\/p>/, \"\");\n\n        return (\n            <div className=\"drag-container\">\n                <div className=\"align-right grid-wrapper eight-and-one\" style={{ alignItems: 'end' }}>\n                    <Select\n                        className=\"grid-selector-dropdown inline-dropdown\"\n                        classNamePrefix=\"grid-selector-dropdown\"\n                        options={this.props.communicationCategories}\n                        value={this.props.selectedCategory}\n                        onChange={this.props.changeCategoryDropdown}\n                        styles={{ menu: provided => ({ ...provided, whiteSpace: 'nowrap', right: '0', zIndex: 3 }), option: provided => ({ ...provided, whiteSpace: 'pre-wrap', overflow: 'hidden', textOverflow: 'ellipsis', borderBottom: '1px solid #DDD' }) }}\n                        getOptionLabel={(option) => option.CategoryCode + \": \" + option.label}\n                        filterOption={customFilter}\n                    />\n                    <button type=\"button\" className=\"button m-left\" disabled={!this.props.selectedCategory} onClick={this.props.addCategory}>Add Category</button>\n                </div>\n                <div style={{ marginTop: 15 }}>\n                    <div className=\"bill-grid communications-category-grid\">\n                        <div className=\"bill-grid-header\">\n                            <span></span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>Bill #</span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>Document Label</span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>Patron</span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>Draft Title</span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>Status</span>\n                        </div>\n                        <div className=\"bill-grid-header\">\n                            <span>Action</span>\n                        </div>\n                    </div>\n                    <div>\n                        {this.props.organizedComms.sort((a, b) => a.Sequence - b.Sequence).map((category, categoryIndex) =>\n                            <div>\n                                <form key={categoryIndex}>\n                                    <div className=\"bill-grid communications-category-grid communications-category-grid-header\">\n                                        <div>\n                                            <button onClick={() => this.props.toggleHideCategory(categoryIndex)} type=\"button\" className={`${this.props.hideCategories[categoryIndex] ? \"arrow-down\" : \"arrow-up\"}`}></button>\n                                            <input\n                                                type=\"checkbox\"\n                                                className=\"checkbox\"\n                                                checked={category.selectAll || ''}\n                                                onChange={() => this.toggleSelectAll(categoryIndex)}\n                                            />\n                                        </div>\n                                        <div>\n                                            <span>\n                                                {category.editing ?\n                                                    <React.Fragment>\n                                                        <textarea\n                                                            className={`category-description-${categoryIndex}`}\n                                                            style={{ width: '90%', fontSize: '0.9em' }}\n                                                            type=\"text\"\n                                                            onChange={(e) => this.handleDescriptionChange(categoryIndex, e.target.value)}\n                                                            value={category.tempDescription}\n                                                        />\n                                                        <a className=\"icon save\" style={{ marginLeft: '7px' }} onClick={() => this.toggleEditCategoryDescription(categoryIndex, true)} />\n                                                        <a className=\"icon delete\" style={{ marginLeft: '7px' }} onClick={() => this.toggleEditCategoryDescription(categoryIndex)} />\n                                                    </React.Fragment>\n                                                    :\n                                                    <React.Fragment>\n                                                        <b>{category.CategoryCode + \": \" + (category.Description ? category.Description : category.CommunicationLegislation.filter(leg => leg.IsActive).length > 1 ? category.PluralDescription : category.CategoryDescription)}</b>\n                                                        <a className=\"icon edit\" style={{ marginLeft: '7px' }} onClick={() => this.toggleEditCategoryDescription(categoryIndex)} />\n                                                    </React.Fragment>\n                                                }\n                                            </span>\n                                        </div>\n                                        <div>\n                                            <button type=\"button\" className=\"button small-button\" onClick={() => this.toggleBillBulk(false, categoryIndex)}>Exclude Selected</button>\n                                        </div>\n                                        <div>\n                                            <button type=\"button\" className=\"button small-button\" onClick={() => this.toggleBillBulk(true, categoryIndex)}>Include Selected</button>\n                                        </div>\n                                        <div />\n                                        <div />\n                                    </div>\n                                    {!this.props.hideCategories[categoryIndex] && <div className=\"bill-grid communications-category-grid\">\n                                        <div></div>\n                                        <div>\n                                            <Select\n                                                className=\"grid-selector-dropdown\"\n                                                classNamePrefix=\"grid-selector-dropdown\"\n                                                options={this.props.billList}\n                                                onChange={(value) => this.props.changeBillDropdown(categoryIndex, value)}\n                                                value={this.props.selectedBill[categoryIndex]}\n                                                styles={{ menu: provided => ({ ...provided, zIndex: 3 }) }}\n                                                filterOption={(bill, inputValue) => {\n                                                    if (category.CommunicationLegislation.findIndex(agenda => agenda.LegislationID === bill.value) < 0) {\n                                                        return bill.label.toLowerCase().includes(inputValue.toLowerCase());\n                                                    } else { return false; }\n                                                }}\n                                            />\n                                        </div>\n                                        <div className=\"center\">\n                                            <button\n                                                className=\"button\"\n                                                type=\"button\"\n                                                disabled={!this.props.selectedBill[categoryIndex]}\n                                                onClick={() => this.props.addBill(categoryIndex)}>\n                                                {billButtonText(categoryIndex)}\n                                            </button>\n                                        </div>\n                                        <div></div>\n                                        <div></div>\n                                        <div></div>\n                                        <div></div>\n                                    </div>\n                                    }\n                                    {\n                                        !this.props.hideCategories[categoryIndex] && category.CommunicationLegislation.sort((a, b) => a.LegislationNumber.localeCompare(b.LegislationNumber, 'en', { numeric: true })).map((item, itemIndex) => {\n                                            const showNewIndicator = !item.CommunicationLegislationID && category.CommunicationCategoryID;\n                                            const existsInMultipleCategories = this.props.organizedComms.find(c => c.CommunicationCategoryTypeID !== category.CommunicationCategoryTypeID && c.CommunicationLegislation.find(a => a.LegislationNumber === item.LegislationNumber));\n                                            return (\n                                                <div style={!item.IsActive ? { color: '#8b8b8b' } : {}} className=\"bill-grid communications-category-grid\" key={itemIndex}>\n                                                    <React.Fragment>\n                                                        <div>\n                                                            <input\n                                                                type=\"checkbox\"\n                                                                className=\"checkbox\"\n                                                                checked={item.checked || ''}\n                                                                onChange={e => this.toggleRow(categoryIndex, itemIndex, e)} />\n                                                        </div>\n                                                        <div className=\"new-container\">\n                                                            {existsInMultipleCategories &&\n                                                                <React.Fragment>\n                                                                    <i data-tip=\"This legislation exists in multiple categories.\" className={`icon notification communication-authoring${showNewIndicator ? ' new' : ''}`} />\n                                                                    <ReactTooltip key={new Date()} />\n                                                                </React.Fragment>\n                                                            }\n                                                            <Link to={`/bill-details/${this.props.sessionCode}/${item.LegislationNumber}`} target=\"_blank\" rel=\"noreferrer\" style={!item.IsActive ? { color: 'inherit' } : {}}>{item.LegislationNumber}</Link>\n                                                            {showNewIndicator && <span className='corner-new'>NEW</span>}\n                                                            {!item.IsCandidate && <i data-tip=\"This legislation is not currently a candidate for this category.\" className={`icon notification non-candidate communication-authoring${showNewIndicator ? ' new' : ''}${existsInMultipleCategories ? ' duplicate' : ''}`} />}\n                                                            <ReactTooltip />\n                                                        </div>\n                                                        <div>\n                                                            <span>{item.DocumentCode}</span>\n                                                        </div>\n                                                        <div>\n                                                            <span>{item.Patrons && item.Patrons[0] && item.Patrons[0].PatronDisplayName}</span>\n                                                        </div>\n                                                        <div>\n                                                            <div className=\"flex-row\" style={{ display: 'flex' }}>\n                                                                <div className=\"flex-row flex-vertical-center\" style={{ width: \"100%\", display: \"inline-flex\" }}>\n                                                                    {item.isEditing ?\n                                                                        <Editor\n                                                                            init={{\n                                                                                inline: true,\n                                                                                toolbar: false,\n                                                                                menubar: false\n                                                                            }}\n                                                                            onEditorChange={(content) => this.handleTitleChange(categoryIndex, itemIndex, content)}\n                                                                            value={item.newDraftTitle}\n                                                                        />\n                                                                        :\n                                                                        <span>{renderHTML(item.Description ? item.Description : item.newDraftTitle ? removeLDNum(item.newDraftTitle) : item.DraftTitle ? removeLDNum(item.DraftTitle) : \"\")}</span>}\n                                                                </div>\n                                                                {(item.isEditing || (!item.Description && item.DraftTitle)) &&\n                                                                    <React.Fragment>\n                                                                        <div className=\"bill-grid-actions\">\n                                                                            {item.isEditing\n                                                                                ?\n                                                                                <div className=\"bill-grid-actions\" style={{ display: \"inline-flex\" }}>\n                                                                                    <button onClick={() => this.saveChange(categoryIndex, itemIndex)} type=\"button\" className=\"icon save float-right\"></button>\n                                                                                    <button onClick={() => this.toggleEdit(categoryIndex, itemIndex)} type=\"button\" className=\"icon delete float-right\"></button>\n                                                                                </div>\n                                                                                :\n                                                                                <div className=\"bill-grid-actions\">\n                                                                                    {/*Allow edit if the item IsActive*/}\n                                                                                    {item.IsActive &&\n                                                                                        <button onClick={() => this.toggleEdit(categoryIndex, itemIndex)} type=\"button\" className=\"icon edit float-right\"></button>\n                                                                                    }\n                                                                                </div>\n                                                                            }\n                                                                        </div>\n                                                                    </React.Fragment>\n                                                                }\n                                                            </div>\n                                                        </div>\n                                                        <div>\n                                                            <span className={item.IsActive ? 'message-success' : ''}>{item.IsActive ? 'Included' : 'Not Included'}</span>\n                                                        </div>\n                                                        <div className=\"communication-bill-grid-actions\">\n                                                            <div className=\"toggle-switch\" onClick={() => this.toggleBill(categoryIndex, itemIndex)}>\n                                                                <input id=\"sr-status-change\" checked={item.IsActive} type=\"checkbox\" />\n                                                                <span className=\"slider\"></span>\n                                                            </div>\n                                                        </div>\n                                                    </React.Fragment>\n                                                </div>\n                                            )\n                                        }\n                                        )\n                                    }\n                                </form>\n                            </div>\n                        )}\n                    </div>\n                </div>\n            </div >\n        );\n    }\n}\n\nexport default BillsGrid;","import React from 'react';\nimport ReactToPrint from \"react-to-print\";\nimport CommunicationsDetailsComponent from '../../../lis-shared/lis-communications/lis-communications-details';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { billActionCreators } from '../../../stores/lis-legislation-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { minutesActionCreators } from '../../../stores/lis-minutes-store';\nimport { communicationsActionCreators } from '../../../stores/lis-communications-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport BillsGrid from './lis-bills-grid';\nimport { cancelRequest } from '../../../services/request.service';\nimport DatePicker from 'react-datepicker';\nimport moment from 'moment-timezone';\nimport { personnelActionCreators } from '../../../stores/lis-personnel-store';\nimport { Prompt } from 'react-router';\nconst PUBLISH_COMM = true;\nconst SAVE_COMM = false;\nlet abortController = null;\n\nclass CommunicationsForm extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            communicationCategories: [],\n            organizedComms: [],\n            hideCategories: [],\n            commGet: '',\n            isLoaded: false,\n            errorMessage: '',\n            isSaving: false,\n            pendingSave: true,\n            showPreview: false,\n            selectedCategory: '',\n            selectedBill: [],\n            billList: [],\n            referenceNumber: '',\n            failedToJoinBills: [],\n            isDirty: false,\n            isDoubleSided: false\n        };\n\n        this.handleInputChange = this.handleInputChange.bind(this);\n        this.updateAgenda = this.updateAgenda.bind(this);\n        this.changeCategoryDropdown = this.changeCategoryDropdown.bind(this);\n        this.addCategory = this.addCategory.bind(this);\n        this.changeBillDropdown = this.changeBillDropdown.bind(this);\n        this.addBill = this.addBill.bind(this);\n\n        this.togglePreview = this.togglePreview.bind(this);\n        this.saveComm = this.saveComm.bind(this);\n        this.genCommDoc = this.genCommDoc.bind(this);\n        this.hasSelectedBills = this.hasSelectedBills.bind(this);\n        this.hasIncludedBills = this.hasIncludedBills.bind(this);\n        this.toggleShowSignatureNote = this.toggleShowSignatureNote.bind(this);\n        this.includeAll = this.includeAll.bind(this);\n        this.validateCommunicationNumber = this.validateCommunicationNumber.bind(this);\n        this.toggleHideCategory = this.toggleHideCategory.bind(this);\n        this.toggleIsDoubleSided = this.toggleIsDoubleSided.bind(this);\n    }\n\n    toggleHideCategory(catIndex) {\n        let hideCategories = this.state.hideCategories;\n        hideCategories[catIndex] = !hideCategories[catIndex]\n        this.setState({\n            hideCategories: hideCategories\n        });\n    }\n\n    handleInputChange(key, val) {\n        let commGet = { ...this.state.commGet };\n        commGet[key] = val;\n        this.setState({\n            commGet: commGet,\n            isDirty: true\n        }, () => {\n            this.validateCommunicationNumber();\n            //Update ref number with new comm date and comm number\n            const data = this.state.commGet;\n            let newReferenceNumber = data.ChamberCode + 'N';\n            newReferenceNumber += data.CommunicationNumber.toString();\n            let formattedDate = moment(data.CommunicationDate).format('MMDD');\n            newReferenceNumber += formattedDate;\n            this.setState({\n                referenceNumber: newReferenceNumber\n            });\n        });\n    }\n\n    updateAgenda(organizedComms, saveRequired) {\n        this.setState({\n            organizedComms: organizedComms,\n            isDirty: true,\n            pendingSave: saveRequired === undefined ? this.state.pendingSave : saveRequired\n        });\n    }\n\n    togglePreview() {\n        this.setState(state => ({\n            showPreview: !state.showPreview\n        }));\n    }\n\n    saveComm(publishing) {\n        if (!this.state.commGet.CommunicationNumber) {\n            return;\n        }\n        this.setState({ isSaving: true });\n        let commSave = { ...this.state.commGet };\n        commSave.CommunicationCategories = this.state.organizedComms;\n        commSave.ReferenceNumber = this.state.referenceNumber || commSave.ReferenceNumber;\n        //Set whether it should be published or not. The published value depends on what button the user clicked\n        commSave.IsPublic = publishing;\n        this.props.actions.saveComm({ CommunicationResponse: [commSave] })\n            .then(failureMessage => {\n                if (publishing) {\n                    const commId = this.props.communications.commSave.CommunicationID;\n                    this.props.actions.saveCommFile(\"?communicationID=\" + commId);\n                    //Communications cannot be edited once published so send the user back to the grid\n                    this.props.history.push('/communications-management');\n                } else {\n                    //If the form was not published then get the new mod dates and update the React state variables\n                    const commSave = { ...this.props.communications.commSave };\n\n                    commSave.FooterSentence = this.props.communications.commSave.ChamberCode === \"S\" ? \"IN WHICH ACTION IT REQUESTS THE CONCURRENCE OF THE HOUSE OF DELEGATES.\" : \"IN WHICH ACTION IT REQUESTS THE CONCURRENCE OF THE SENATE.\";\n                    commSave.ClerkTitle = this.props.communications.commSave.ChamberCode === \"H\" ? \"Clerk of the House of Delegates\" : \"Clerk of the Senate\";\n                    commSave.ClerkName = this.props.personnel.personnelOtherList ? this.props.personnel.personnelOtherList[0].FullName : \"\";\n\n                    this.setState({\n                        organizedComms: commSave.CommunicationCategories,\n                        commGet: commSave,\n                        isSaving: false,\n                        pendingSave: false,\n                        isDirty: false\n                    });\n                }\n                if (failureMessage && failureMessage.includes(\"Minutes\")) {\n                    this.props.actions.makeToast([{ message: `Communication ${publishing ? 'Published' : 'Saved'}`, type: \"success\" }, { message: \"Problem with Minutes Creation\", type: \"failure\" }])\n                } else {\n                    this.props.actions.makeToast([{ message: `Communication ${publishing ? 'Published' : 'Saved'}`, type: \"success\" }])\n                }\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n                this.setState({\n                    isSaving: false\n                });\n                this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n            });\n\n    }\n\n    validateCommunicationNumber() {\n        this.setState({ duplicateCommNumber: this.state.commNumbers.find(n => n === this.state.commGet.CommunicationNumber) });\n    }\n\n    changeCategoryDropdown(value) {\n        this.setState({\n            selectedCategory: value\n        });\n    }\n\n    addCategory() {\n        const selectedCategory = this.state.selectedCategory;\n        //Used to find the new index of the category so the hidden categories indices can be updated\n        const categoryFinder = new Date().getTime();\n        let organizedComms = [...this.state.organizedComms];\n        let newCommCategory = {\n            CommunicationLegislation: [],\n            IsLegislationCategory: selectedCategory.IsLegislationCategory,\n            CommunicationCategoryTypeID: selectedCategory.CommunicationCategoryTypeID,\n            CategoryCode: selectedCategory.CategoryCode,\n            CategoryDescription: selectedCategory.Description,\n            PluralDescription: selectedCategory.PluralDescription,\n            Sequence: selectedCategory.Sequence,\n            isNewCategory: categoryFinder\n        };\n        //push new category\n        organizedComms.push(newCommCategory);\n        //Sort the communication by sequence\n        organizedComms.sort((a, b) => a.Sequence - b.Sequence);\n        //Update the categories that are hidden since the array indices have changed\n        const newCategoryIndex = organizedComms.filter(c => !c.DeletionDate).findIndex(cat => cat.isNewCategory === categoryFinder);\n        if (newCategoryIndex !== -1) {\n            let hideCategories = this.state.hideCategories;\n            hideCategories.splice(newCategoryIndex, 0, false);\n            this.setState({\n                hideCategories: hideCategories\n            });\n        }\n        //Remove the selected category so the user doesn't accidently add it twice\n        this.setState({\n            selectedCategory: '',\n            organizedComms: organizedComms,\n            isDirty: true\n        });\n    }\n\n    changeBillDropdown(index, value) {\n        let selectedBill = [...this.state.selectedBill];\n        selectedBill[index] = value;\n        this.setState({\n            selectedBill: selectedBill\n        });\n    }\n\n    addBill(index) {\n        let organizedComms = [...this.state.organizedComms];\n        let newAgenda = {};\n        //Check whether to move the bill from another category or add the bill\n        let billExists = false;\n        if (this.state.selectedBill[index]) {\n            organizedComms.some((category, categoryIndex) => {\n                const duplicateBillIndex = category.CommunicationLegislation.findIndex(bill => bill.LegislationID === this.state.selectedBill[index].LegislationID);\n                if (duplicateBillIndex >= 0) {\n                    billExists = true;\n                    newAgenda = { ...organizedComms[categoryIndex].CommunicationLegislation[duplicateBillIndex] };\n                    newAgenda.CommunicationCategoryTypeID = organizedComms[index].CommunicationCategoryTypeID;\n                    newAgenda.CommunicationCategoryID = organizedComms[index].CommunicationCategoryID;\n                    newAgenda.IsActive = true;\n                    newAgenda.IsCandidate = false;\n                    organizedComms[categoryIndex].CommunicationLegislation.splice(duplicateBillIndex, 1);\n                    return true;\n                }\n            });\n            if (!billExists) {\n                newAgenda = {\n                    CommunicationCategoryTypeID: organizedComms[index].CommunicationCategoryTypeID,\n                    CommunicationCategoryID: organizedComms[index].CommunicationCategoryID,\n                    IsActive: true,\n                    LegislationID: this.state.selectedBill[index].LegislationID,\n                    LegislationNumber: this.state.selectedBill[index].LegislationNumber,\n                    Patrons: this.state.selectedBill[index].Patrons,\n                    Description: this.state.selectedBill[index].Description,\n                    IsCandidate: false\n                }\n            }\n            organizedComms[index].CommunicationLegislation.push(newAgenda);\n\n            //Remove object so the bill is no longer currently selected in the dropdown\n            let selectedBill = [...this.state.selectedBill];\n            selectedBill[index] = '';\n            this.setState({\n                selectedBill: selectedBill,\n                organizedComms: organizedComms,\n                isDirty: true\n            });\n        }\n    }\n\n    genCommDoc(printAllIncluded) {\n        let billsToGen = [];\n        this.state.organizedComms.forEach(category => {\n            const associatedCategory = this.state.communicationCategories.find(c => c.CategoryCode === category.CategoryCode);\n            category.CommunicationLegislation.forEach(item => {\n                //if user clicked \"Print all included\", push all items that are active (i.e. included)\n                //if user clicked \"Print selected\", push all items that are checked\n                if (printAllIncluded && item.IsActive) {\n                    billsToGen.push({\n                        billNum: item.LegislationNumber,\n                        LegislationTextID: item.LegislationTextID,\n                        LegislationID: item.LegislationID,\n                        CommunicationID: this.state.commGet.CommunicationID,\n                        SessionID: this.state.commGet.SessionID,\n                        AmendmentCount: associatedCategory ? associatedCategory.AmendmentCount : null,\n                        FirstChamberCount: associatedCategory ? associatedCategory.FirstChamberCount : null,\n                        SecondChamberCount: associatedCategory ? associatedCategory.SecondChamberCount : null\n                    })\n                }\n                else if (!printAllIncluded && item.checked) {\n                    billsToGen.push({\n                        billNum: item.LegislationNumber,\n                        LegislationTextID: item.LegislationTextID,\n                        LegislationID: item.LegislationID,\n                        CommunicationID: this.state.commGet.CommunicationID,\n                        SessionID: this.state.commGet.SessionID,\n                        AmendmentCount: associatedCategory ? associatedCategory.AmendmentCount : null,\n                        FirstChamberCount: associatedCategory ? associatedCategory.FirstChamberCount : null,\n                        SecondChamberCount: associatedCategory ? associatedCategory.SecondChamberCount : null\n                    });\n                }\n            });\n        });\n        this.setState({\n            gettingPdf: true,\n            failedToJoinBills: [],\n            pdfSrc: ''\n        });\n        this.props.actions.joinCommFile({ LegislationFiles: billsToGen, isDoubleSided: this.state.isDoubleSided })\n            .then(() => {\n                const res = this.props.communications.joinCommFile;\n                if (res.Pdf && res.Pdf.FileContents) {\n                    fetch(`data:application/pdf;base64,${res.Pdf.FileContents}`)\n                        .then(res => res.blob())\n                        .then(blob => {\n                            const urlObj = URL.createObjectURL(blob);\n                            this.setState({\n                                pdfSrc: urlObj\n                            });\n                        });\n                }\n                let failedBills = [];\n                res.JoinLegislation.forEach(leg => {\n                    if (!leg.Generated && !res.JoinLegislation.find(l => l.LegislationID === leg.LegislationID && l.Generated)) {\n                        const bill = billsToGen.find(bill => bill.LegislationTextID === leg.LegislationTextID || bill.LegislationID === leg.LegislationID)\n                        if (bill && !failedBills.includes(bill)) {\n                            failedBills.push(bill)\n                        }\n                    }\n                });\n\n                if (failedBills.length === billsToGen.length) {\n                    // Every single bill in the list does not have a clerk copy\n                    this.props.actions.makeToast([{ message: \"No selected bills have a clerk copy\", type: \"failure\", long: true }]);\n                    this.setState({\n                        gettingPdf: false\n                    });\n                } else {\n                    this.setState({\n                        failedToJoinBills: failedBills,\n                        showPdfWindow: true,\n                        gettingPdf: false\n                    });\n                }\n            }).catch(err => {\n                if (err === 'AbortError') {\n                    return;\n                }\n                this.setState({\n                    gettingPdf: false\n                });\n                console.log(err.toString());\n                this.props.actions.makeToast([{ message: \"Failed To Get Data\", type: \"failure\" }]);\n            })\n    }\n\n    hasSelectedBills() {\n        let hasSelectedBills = false;\n        this.state.organizedComms.forEach(category => {\n            category.CommunicationLegislation.forEach(item => {\n                if (item.checked) { hasSelectedBills = true; return }\n            })\n        })\n\n        return hasSelectedBills;\n    }\n\n    hasIncludedBills() {\n        let hasIncludedBills = false;\n        this.state.organizedComms.forEach(category => {\n            category.CommunicationLegislation.forEach(item => {\n                if (item.IsActive) { hasIncludedBills = true; return }\n            })\n        })\n\n        return hasIncludedBills;\n\n    }\n\n    includeAll() {\n        let organizedComms = [...this.state.organizedComms]\n        organizedComms.forEach(category => {\n            category.selectAll = false;\n            category.CommunicationLegislation.forEach(item => {\n                item.IsActive = true;\n                item.checked = false;\n            })\n        })\n\n        this.updateAgenda(organizedComms);\n    }\n\n    toggleShowSignatureNote() {\n        let commGet = { ...this.state.commGet };\n        commGet.ShowSignatureNote = !commGet.ShowSignatureNote;\n        this.setState({\n            commGet: commGet\n        })\n    }\n\n    toggleIsDoubleSided() {\n        this.setState({\n            isDoubleSided: !this.state.isDoubleSided\n        })\n    }\n\n    componentDidMount() {\n        //Get the list of bills for the form\n        const communicationsId = this.props.match.params.communicationid\n        this.props.actions.getComm('?communicationID=' + communicationsId, true)\n            .then(() => {\n                const commGet = { ...this.props.communications.commGet };\n                if (!commGet.CommunicationCategories) {\n                    throw 'No categories in communication';\n                }\n                let noSavedItems = true;\n                //bills are added to the communication by default so set IsActive to true for all of them\n                commGet.CommunicationCategories.forEach(category => {\n                    category.CommunicationLegislation.forEach(leg => {\n                        if (leg.IsActive === undefined) {\n                            leg.IsActive = true;\n                        }\n                        if (leg.CommunicationLegislationID) {\n                            noSavedItems = false;\n                        }\n                    })\n                });\n                // Get the list of communication categories\n                this.props.actions.getCommCategories('?chamberCode=' + commGet.ChamberCode)\n                    .then(() => {\n                        let catList = [...this.props.communications.commCategories];\n                        catList.forEach(cat => {\n                            cat.label = cat.Description;\n                            cat.value = cat.CommunicationCategoryTypeID;\n                        });\n                        this.setState({\n                            communicationCategories: catList\n                        });\n                    });\n                //Get the list of existing communications so we know communication numbers (to alert user in the event they change the number to a duplicate)\n                const commParams = '?sessionID=' + commGet.SessionID + '&chamberCode=' + commGet.ChamberCode + '&isPublic=false&communicationType=Floor';\n                this.props.actions.getCommList(commParams, true)\n                    .then(() => {\n                        const commNumbers = this.props.communications.commList.filter(comm => comm.CommunicationID !== commGet.CommunicationID && moment(comm.CommunicationDate).isSame(commGet.CommunicationDate, 'day')).map(comm => comm.CommunicationNumber);\n                        this.setState({\n                            commNumbers: commNumbers,\n                            duplicateCommNumber: commNumbers.find(n => n === commGet.CommunicationNumber)\n                        });\n                    });\n\n                //Get bills in the session for the bill dropdown\n                this.props.actions.getSessionBills('?sessionID=' + commGet.SessionID)\n                    .then(() => {\n                        let billList = [...this.props.bills.sessionBills];\n                        billList.forEach(bill => {\n                            bill.label = bill.LegislationNumber;\n                            bill.value = bill.LegislationID;\n                        });\n                        this.setState({\n                            billList: billList\n                        })\n                    });\n\n                this.props.actions.getRoleTypes()\n                    .then(() => {\n                        let roleType = this.props.personnel.roleTypes.find(x => x.Name.toLowerCase().includes(\"clerk\") && x.Name.toLowerCase().includes(this.props.communications.commGet.ChamberCode === \"H\" ? \"house\" : \"senate\"))\n                        let clerkRoleTypeID = roleType ? roleType.StaffRoleTypeID : 0;\n                        this.props.actions.getPersonnelList(\"staffroletypeid=\" + clerkRoleTypeID + \"&isPublic=true\")\n                            .then(() => {\n                                commGet.FooterSentence = this.props.communications.commGet.ChamberCode === \"S\" ? \"IN WHICH ACTION IT REQUESTS THE CONCURRENCE OF THE HOUSE OF DELEGATES.\" : \"IN WHICH ACTION IT REQUESTS THE CONCURRENCE OF THE SENATE.\";\n                                commGet.ClerkTitle = this.props.communications.commGet.ChamberCode === \"H\" ? \"Clerk of the House of Delegates\" : \"Clerk of the Senate\";\n                                commGet.ClerkName = this.props.personnel.personnelOtherList ? this.props.personnel.personnelOtherList[0].FullName : \"\";\n                            });\n                    })\n\n                commGet.ShowSignatureNote = [null, true].includes(commGet.ShowSignatureNote); // attr is returned as null on first creation and should default to true\n                this.setState({\n                    organizedComms: [...commGet.CommunicationCategories],\n                    commGet: commGet,\n                    isLoaded: true,\n                    pendingSave: noSavedItems\n                });\n\n                //Get the session data for use in the preview\n                this.props.actions.getSessionById(commGet.SessionID)\n                    .then(() => {\n                        this.setState({\n                            session: this.props.session.selectedSession\n                        });\n                    })\n            })\n            .catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    isLoaded: true,\n                    errorMessage: err\n                });\n            });\n    }\n\n    componentWillUnmount() {\n        if (abortController)\n            abortController.abort();\n        cancelRequest();\n    }\n\n    render() {\n        if (this.state.showPreview) {\n            return (\n                <div>\n                    <div className=\"flex-row\">\n                        <h2>Communications Preview</h2>\n                        <ReactToPrint\n                            trigger={() => <a type=\"button\" className=\"button print\"> Print</a>}\n                            content={() => this.componentRef}\n                            pageStyle={\"break-inside: avoid\"}\n                        />\n                    </div>\n                    <div className=\"checkbox-container\">\n                        <div className=\"inner-grid two\">\n                            <div className=\"checkbox\">\n                                <label><input type=\"checkbox\" onChange={() => this.toggleShowSignatureNote()} checked={this.state.commGet.ShowSignatureNote} /> Show Clerk's Note</label>\n                            </div>\n                            <div />\n                        </div>\n                    </div>\n                    <div ref={el => (this.componentRef = el)}>\n                        <CommunicationsDetailsComponent\n                            session={this.state.session}\n                            communication={this.state.commGet}\n                            refNum={this.state.referenceNumber}\n                            authoring\n                        />\n                    </div>\n                    <div className=\"button-bar\">\n                        <div></div>\n                        <div className=\"align-right\">\n                            <button onClick={this.togglePreview} className=\"button secondary\">Edit</button>\n                            <button onClick={() => this.saveComm(PUBLISH_COMM)} disabled={this.state.isSaving} className=\"button\">{this.state.isSaving ? \"Publishing...\" : \"Publish\"}</button>\n                        </div>\n                    </div>\n                </div>\n            );\n        } else {\n            const allLegislation = this.state.organizedComms.flatMap(cat => cat.CommunicationLegislation ? cat.CommunicationLegislation.filter(cl => cl.IsActive).map(cl => cl.LegislationNumber) : []);\n            const hasDuplicates = Boolean(allLegislation.filter((leg, idx) => allLegislation.indexOf(leg) !== idx).length);\n            return (\n                <React.Fragment>\n                    <div>\n                        <Prompt\n                            when={this.state.isDirty}\n                            message={`You have unsaved changes. Are you sure you would like to leave?`}\n                        />\n                    </div>\n                    <div style={{ display: this.state.showPdfWindow ? 'block' : 'none', overflow: 'hidden' }} onClick={() => this.setState({ showPdfWindow: false })} className=\"overlay center-content\">\n                        <div className=\"full full-height\" style={{ maxWidth: '100vw', width: '95%' }}>\n                            <div onClick={e => e.stopPropagation()} className=\"dlas-forms user-forms overlay-content animated-fade-in-up full-height\">\n                                <div>\n                                    <button className=\"button print\" onClick={() => this.pdfRef ? this.pdfRef.contentWindow.print() : null}> Print</button>\n                                </div>\n                                {this.state.failedToJoinBills.length > 0 &&\n                                    <div className=\"small-text\">\n                                        <span>These bills do not have clerk copies and are not included in the PDF: </span>\n                                        <span>{this.state.failedToJoinBills.map((bill, i) => <React.Fragment key={i}>{i !== 0 && \", \"}{bill.billNum}</React.Fragment>)}</span>\n                                    </div>\n                                }\n                                <div className=\"center full-height\">\n                                    <iframe className=\"center\" style={{ width: '100%', height: '90%' }} ref={el => this.pdfRef = el} src={this.state.pdfSrc}></iframe>\n                                    <button style={{ position: 'absolute', bottom: '10px', right: '10px' }} type=\"button\" onClick={() => this.setState({ showPdfWindow: false })} className=\"button secondary\">Close</button>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                    {this.state.commGet ? <h1>{(this.state.commGet.ChamberCode === \"H\" ? \"House \" : \"Senate \") + \"Communication\"}</h1> : <h1>&nbsp;</h1>}\n                    <div className=\"user-forms\">\n                        {!this.state.isLoaded ?\n                            <div className=\"center-spinner spinner\">Fetching results...</div>\n                            :\n                            <div className=\"dlas-forms\">\n                                <span className=\"error-message\">{this.state.errorMessage}</span>\n                                <fieldset className=\"fieldset-collapse fieldset-open\" style={{ paddingBottom: '50px' }}>\n                                    <legend>Communication Information</legend>\n                                    <div className=\"multi-row four no-margin\">\n                                        <div>\n                                            <label>Communication Date</label>\n                                            <DatePicker\n                                                selected={moment(this.state.commGet.CommunicationDate)}\n                                                onChange={val => this.handleInputChange('CommunicationDate', val)}\n                                            />\n                                        </div>\n                                        <div>\n                                            <label>Communication ID</label>\n                                            <input\n                                                type=\"number\"\n                                                placeholder=\"Communication ID\"\n                                                value={this.state.commGet.CommunicationNumber}\n                                                onChange={e => this.handleInputChange('CommunicationNumber', parseInt(e.target.value))}\n                                            />\n                                            {this.state.duplicateCommNumber && <div className=\"input-feedback-warning\">Warning: Communication ID {this.state.commGet.CommunicationNumber} is already in use on another communication on this same communication date.</div>}\n                                            {!this.state.commGet.CommunicationNumber && <div className=\"input-feedback\">Communication ID is required.</div>}\n                                        </div>\n                                        <div />\n                                        <div>\n                                            <button type=\"button\" className=\"button m-left\" style={{ float: 'right' }} disabled={!this.state.organizedComms.map(comm => comm.CommunicationLegislation).find(leg => leg.find(it => !it.IsActive))} onClick={this.includeAll}>Include All</button>\n                                        </div>\n                                    </div>\n                                    <BillsGrid\n                                        organizedComms={this.state.organizedComms}\n                                        communicationCategories={this.state.communicationCategories}\n                                        updateAgenda={this.updateAgenda}\n                                        changeCategoryDropdown={this.changeCategoryDropdown}\n                                        changeCategoryPositionDropdown={this.changeCategoryPositionDropdown}\n                                        selectedCategory={this.state.selectedCategory}\n                                        addCategory={this.addCategory}\n                                        selectedBill={this.state.selectedBill}\n                                        changeBillDropdown={this.changeBillDropdown}\n                                        addBill={this.addBill}\n                                        billList={this.state.billList}\n                                        sessionCode={this.state.commGet.SessionCode}\n                                        hideCategories={this.state.hideCategories}\n                                        toggleHideCategory={this.toggleHideCategory}\n                                    />\n                                </fieldset>\n                                <div className=\"floating-button-bar\">\n                                    <div className=\"flex-row flex-vertical-center\" style={{ width: \"100%\" }}>\n                                        <div className=\"inline-list\">\n                                            <button disabled={this.state.pendingSave || this.state.gettingPdf || !this.hasSelectedBills()} title={this.state.pendingSave ? \"You must save the pending changes in order to print\" : this.hasSelectedBills() ? \"Print Selected\" : \"You must select one or more legislation\"} type=\"button\" className=\"button\" onClick={() => this.genCommDoc(false)}>{this.gettingPdf ? \"Getting Document...\" : \"Print Selected\"}</button>\n                                            <button disabled={this.state.pendingSave || this.state.gettingPdf || !this.hasIncludedBills()} title={this.state.pendingSave ? \"You must save the pending changes in order to print\" : this.hasIncludedBills() ? \"Print All Included\" : \"You must include one or more legislation\"} type=\"button\" className=\"button\" onClick={() => this.genCommDoc(true)}>{this.gettingPdf ? \"Getting Document...\" : \"Print All Included\"}</button>\n                                            <React.Fragment>\n                                                <div className=\"toggle-switch\" onClick={this.toggleIsDoubleSided}>\n                                                    <input id=\"is-double-sided-switch\" checked={this.state.isDoubleSided} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                                    <span className=\"slider\"></span>\n                                                </div>\n                                                <label htmlFor=\"is-double-sided-switch\" className=\"checkbox-label no-background\" style={{ whiteSpace: \"no-wrap\", marginTop: '0px', fontSize: '14px' }}>Printing Double Sided?</label>\n                                            </React.Fragment>\n                                        </div>\n                                        <div className=\"inline-list\">\n                                            {hasDuplicates && <span style={{ fontSize: '15px' }}>Please remove all duplicate legislation included in multiple categories before saving</span>}\n                                            <button disabled={hasDuplicates || this.state.isSaving || !this.state.commGet.CommunicationNumber} onClick={() => this.saveComm(SAVE_COMM)} className=\"button\" type=\"submit\">{this.state.commGet.IsPublic ? \"Unpublish\" : this.state.isSaving ? \"Saving...\" : \"Save\"}</button>\n                                            <button disabled={hasDuplicates || this.state.pendingSave || !this.state.commGet.CommunicationNumber || this.state.commGet.IsPublic} onClick={this.togglePreview} className=\"button\" type=\"button\">Preview</button>\n                                            {!this.state.commGet.CommunicationNumber && <div className=\"input-feedback\">Communication ID is required.</div>}\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        }\n                    </div>\n                </React.Fragment>\n            )\n        }\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { bills, session, communications, minutes, nav, personnel } = state;\n        return {\n            bills,\n            session,\n            communications,\n            minutes,\n            nav,\n            personnel\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, billActionCreators, sessionActionCreators, communicationsActionCreators, minutesActionCreators, navActionCreators, personnelActionCreators), dispatch)\n        }\n    }\n)(CommunicationsForm)","import React from 'react';\nimport { Route } from 'react-router';\nimport CommunicationsManagementGrid from './lis-communications-grid';\nimport CommunicationsForm from './lis-communications-form'\n\nclass CommunicationsManagement extends React.Component {\n\n    render() {\n\n        return (\n            <div>\n                <Route exact path={this.props.match.path} component={CommunicationsManagementGrid} />\n                <Route path={`${this.props.match.path}/edit-communication/:communicationid`} component={CommunicationsForm} />\n            </div>\n        )\n    }\n}\n\nexport default CommunicationsManagement;","import React from \"react\";\nimport ReactTable from \"react-table\";\nimport { Link } from 'react-router-dom';\nimport '../../../stylesheets/shared/react-table.css';\nimport moment from 'moment-timezone';\nimport DatePicker from \"react-datepicker\";\nimport Select from 'react-select';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\nimport { voteActionCreators } from '../../../stores/lis-votes-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport { authActionCreators } from \"../../../stores/lis-auth-store\";\n\nconst customStyles = {\n    option: (base, state) => ({\n        ...base,\n        fontSize: '0.8em',\n    }),\n    control: (base) => ({\n        ...base,\n        padding: '1px',\n        margin: 0,\n        minHeight: 0,\n        fontSize: '0.8em',\n    }),\n    singleValue: (base, state) => {\n        return { ...base, };\n    },\n    input: (base) => ({\n        ...base,\n        padding: '0px'\n    }),\n    dropdownIndicator: (base) => ({\n        ...base,\n        height: '29px',\n        padding: '6px'\n    }),\n    clearIndicator: (base) => ({\n        ...base,\n        height: '29px',\n        padding: '6px'\n    })\n}\n\nclass VoteGrid extends React.Component {\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            selectAll: false,\n            showDeleteModal: false,\n            voteOriginOptions: [],\n            chamberOptions: [\n                { label: 'House', value: 'H' },\n                { label: 'Senate', value: 'S' }\n            ],\n            saving: false\n        };\n\n        this.getVoteTypeReferences = this.getVoteTypeReferences.bind(this);\n        this.toggleRow = this.toggleRow.bind(this);\n        this.toggleSelectAll = this.toggleSelectAll.bind(this);\n        this.saveVotes = this.saveVotes.bind(this);\n        this.toggleDeleteVoteModal = this.toggleDeleteVoteModal.bind(this);\n        this.deleteVote = this.deleteVote.bind(this);\n    }\n\n    toggleRow(index, voteIndex) {\n        let dateList = [...this.props.organizedVotes];\n        if (voteIndex !== undefined) {\n            dateList[index].Votes[voteIndex].checked = !dateList[index].Votes[voteIndex].checked;\n        } else {\n            dateList[index].checked = !dateList[index].checked;\n            dateList[index].Votes.forEach(vote => vote.checked = dateList[index].checked);\n        }\n        this.setState({\n            organizedVotes: dateList\n        });\n    }\n\n    toggleSelectAll() {\n        const opposite = !this.state.selectAll;\n        let dateList = [...this.props.organizedVotes];\n        dateList.forEach(date => {\n            date.checked = opposite;\n            date.Votes.forEach(vote => {\n                vote.checked = opposite\n            });\n        });\n        this.setState({\n            selectAll: opposite\n        });\n    }\n\n    saveVotes(publish, voteToDelete) {\n        this.setState({ saving: true }, () => {\n            let votesToSave = [];\n\n            if (!voteToDelete) {\n                const datesToIterate = [...this.props.organizedVotes].filter(date => date.Votes.find(v => v.checked));\n                let checkedVotes = 0;\n                let invalidFinalVotePublish = false;\n                datesToIterate.some(date => {\n                    date.Votes.some(vote => {\n                        // Select all votes that are checked and are not already published or not-published\n                        if (vote.checked) {\n                            checkedVotes++; //we use this when alerting the user if no checked votes were published/unpublished (based on the below logic)\n                            if (vote.IsPublic !== publish) {\n                                if (this.props.voteOrigin.label === \"Committee\" && publish && vote.FinalVote && date.Votes.find(v => !v.checked && !v.IsPublic && v.CommitteeID === vote.CommitteeID)) {\n                                    this.props.actions.makeToast([{ message: `Before publishing a final committee vote, you must publish all preceding votes from this committee${datesToIterate.length > 1 ? ' (' + moment(date.Date).format(\"L\") + ')' : ''}`, type: \"failure\", long: true }]);\n                                    invalidFinalVotePublish = true; //exit loop if we threw an error toast\n                                    return true;\n                                }\n                                \n                                let voteObj = { VoteID: vote.VoteID };\n\n                                if (this.props.chamber.value === \"S\" && this.props.voteOrigin.value === 1) {\n                                    voteObj.VoteLegislation = [vote.LegislationNumber];\n                                }\n\n                                if (vote.FinalVote) {\n                                    voteObj.LegislationNumber = vote.LegislationNumber;\n                                    voteObj.FinalVote = vote.FinalVote;\n                                    voteObj.ChamberCode = vote.ChamberCode;\n                                    voteObj.CommitteeID = vote.CommitteeID;\n                                    voteObj.VoteDate = vote.VoteDate;\n                                    voteObj.SessionID = vote.SessionID;\n                                    voteObj.CommitteeVotedOnLegislation = date.Votes.filter(v => v.LegislationNumber && (v.IsPublic || v.checked) && v.CommitteeID === vote.CommitteeID).map(v => { return { LegislationNumber: v.LegislationNumber, EventCode: v.EventCode } });\n                                }\n                                votesToSave.push(voteObj);\n                            }\n                        }\n                    });\n                    return invalidFinalVotePublish; //exit loop if we threw an error toast\n                });\n\n                if (invalidFinalVotePublish) {\n                    this.setState({ saving: false })\n                    return;\n                }\n                \n                if (votesToSave.length > 0) {\n                    this.props.actions.saveVoteBulk({ IsPublic: publish, VoteIDs: votesToSave })\n                        .then(async () => {\n                            // Create a file for all the votes, and create the chairman's report summarized on minutes if FinalVote\n                            let chairmansReportFailures = [];\n                            if (publish) {\n                                for (const vote of votesToSave) {\n                                    this.props.actions.voteFileGen('?voteID=' + vote.VoteID)\n                                        .then(() => {\n                                            if (this.props.votes.voteFileError) {\n                                                console.log(this.props.votes.voteFileError.toString());\n                                            }\n                                        });\n                                    if (this.props.voteOrigin.label === \"Committee\" && vote.FinalVote && vote.CommitteeID && vote.VoteDate) {\n                                        const success = await this.props.createChairmansReportSummarizedOnMinutes(vote.SessionID, vote.ChamberCode, vote.CommitteeID, moment(vote.VoteDate).utc().hour(0), vote.CommitteeVotedOnLegislation);\n                                        if (!success) { chairmansReportFailures.push(vote.LegislationNumber) }\n                                    }\n                                };\n                            }\n\n                            if (chairmansReportFailures.length) {\n                                const chairmansReportVotes = votesToSave.filter(v => v.FinalVote && v.CommitteeID && v.VoteDate);\n                                this.props.actions.makeToast([{ message: \"Vote Publish Successful, Chairman's Report Save Failed\" + (chairmansReportVotes.length > 1 ? \" For \" + chairmansReportVotes.join(', ') : ''), type: \"failure\", long: true }]);\n                            } else {\n                                this.props.actions.makeToast([{ message: \"Save Successful\", type: \"success\" }]);\n                            }\n                            this.props.getVotes();\n                            this.setState({ saving: false })\n                        }).catch(err => {\n                            if (err === 'Aborted') {\n                                return;\n                            }\n                            console.log(err.toString());\n                            this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n                            this.setState({ saving: false })\n                            this.props.getVotes();\n                        });\n                } else if (checkedVotes === 0) {\n                    this.props.actions.makeToast([{ message: \"You have not selected any votes\", type: \"warning\" }]);\n                    this.setState({ saving: false })\n                } else {\n                    this.props.actions.makeToast([{ message: (checkedVotes === 1 ? \"This vote has\" : \"The selected votes have\") + (publish ? \" already been published\" : \" not yet been published\"), type: \"warning\", long: true }]);\n                    this.setState({ saving: false })\n                }\n            } else {\n                this.setState({\n                    deletingVote: true\n                }, () => {\n                    this.props.actions.getVoteDetails(\"?voteID=\" + this.state.voteToDelete.VoteID, true)\n                        .then(() => {\n                            votesToSave.push(\n                                this.props.votes.voteDetailsResponse[0]\n                            )\n                            votesToSave[0].DeletionDate = moment();\n\n                            this.props.actions.saveVote({ VoteList: votesToSave })\n                                .then(() => {\n                                    this.setState({\n                                        deletingVote: false,\n                                        showDeleteModal: false,\n                                        voteToDelete: undefined,\n                                        saving: false\n                                    }, () => {\n                                        this.props.actions.makeToast([{ message: \"Vote Deleted\", type: \"success\" }]);\n                                        this.props.getVotes();\n                                    })\n                                }).catch(err => {\n                                    if (err === 'Aborted') {\n                                        return;\n                                    }\n                                    console.log(err.toString());\n                                    this.props.actions.makeToast([{ message: \"Vote Delete Failed\", type: \"failure\" }]);\n                                    this.setState({ deletingVote: false, saving: false })\n                                    this.props.getVotes();\n                                });\n                        })\n                })\n            }\n        })\n    }\n\n    toggleDeleteVoteModal(voteToDelete) {\n        this.setState({\n            showDeleteModal: !this.state.showDeleteModal,\n            voteToDelete: voteToDelete\n        })\n    }\n\n    deleteVote() {\n        this.saveVotes(false, this.state.voteToDelete)\n    }\n\n    async getVoteTypeReferences() {\n        await this.props.actions.getVoteTypes()\n            .then(() => {\n                let voteOriginOptions = [];\n                this.props.votes.voteTypes.forEach(type => {\n                    type.label = type.Name;\n                    type.value = type.VoteTypeID;\n                    voteOriginOptions.push(type);\n                });\n                const voteOrigin = voteOriginOptions.find(o => o.Name === \"Floor\") ? voteOriginOptions.find(o => o.Name === \"Floor\") : null;\n                this.setState({\n                    voteOriginOptions: voteOriginOptions,\n                    voteOrigin: voteOrigin\n                }, () => {\n                    if (voteOrigin) {\n                        this.props.getVotes();\n                    }\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err);\n            });\n    }\n\n    async getCommittees() {\n        await new Promise(res => {\n            this.setState({ fetchingCommittees: true }, async () =>\n                await this.props.actions.getCommitteeList('includeSubCommittees=true')\n                    .then(() => {\n                        this.props.committee.committeeList.forEach(cmte => {\n                            cmte.label = cmte.Name;\n                            cmte.value = cmte.CommitteeID\n                        })\n\n                        this.setState({ fetchingCommittees: false, committeeList: this.props.committee.committeeList })\n                        res();\n                    }).catch(err => {\n                        if (err === 'Aborted') {\n                            return;\n                        }\n                        console.log(err);\n                        this.setState({ fetchingCommittees: false })\n                    })\n            )\n        })\n    }\n\n    handleChange(key, value) {\n        this.props.handleChange(key, value, () => {\n            let organizedVotes = [...this.props.organizedVotes];\n            organizedVotes.forEach((date, idx) => {\n                if (date.show) this.props.showVotes(idx, false)\n            });\n            this.props.getVotes();\n        })\n    }\n\n    sortVotes(votes) {\n        let organizedVotes = [...this.props.organizedVotes];\n        let voteDay = organizedVotes.findIndex(x => moment(x.Date).isSame(votes.original.Date, \"days\"));\n\n        if (organizedVotes[voteDay].sortTimeDesc) {\n            organizedVotes[voteDay].Votes.sort((a, b) => a.FinalVote === b.FinalVote || this.props.voteOrigin.label === \"Floor\" ? moment(a.VoteDate).isBefore(b.VoteDate, \"seconds\") ? 1 : moment(a.VoteDate).isAfter(b.VoteDate, \"seconds\") ? -1 : 0 : a.FinalVote ? 1 : -1)\n        } else {\n            organizedVotes[voteDay].Votes.sort((a, b) => a.FinalVote === b.FinalVote || this.props.voteOrigin.label === \"Floor\" ? moment(a.VoteDate).isAfter(b.VoteDate, \"seconds\") ? 1 : moment(a.VoteDate).isBefore(b.VoteDate, \"seconds\") ? -1 : 0 : a.FinalVote ? 1 : -1)\n        }\n\n        organizedVotes[voteDay].sortTimeDesc = !organizedVotes[voteDay].sortTimeDesc;\n\n        this.setState({\n            organizedVotes\n        })\n    }\n\n    componentDidMount() {\n        //set the default chamber to house or senate depending on the user's role\n        let disableChamberSelector = false;\n        let selectedChamber = null;\n\n        if (!this.props.login.userClaims.claims.find(x => x.RoleName === \"Admin\")) {\n            //Find if the user is a house vote editor, if so select house, otherwise select senate, and disable the chamber selector\n            selectedChamber = this.props.login.userClaims.claims.find(x => x.Resource === \"Vote\" && x.Scope === \"House\") ? this.state.chamberOptions.find(chamber => chamber.label === \"House\") : this.props.login.userClaims.claims.find(x => x.Resource === \"Vote\" && x.Scope === \"Senate\") ? this.state.chamberOptions.find(chamber => chamber.label === \"Senate\") : null;\n            disableChamberSelector = true;\n            this.handleChange('chamber', selectedChamber);\n        }\n\n        this.setState({\n            disableChamberSelector: disableChamberSelector\n        });\n\n        Promise.all([this.getVoteTypeReferences(), this.getCommittees()]).then(() => {\n            this.props.getVotes();\n        })\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { committeeList, fetchingCommittees, voteOriginOptions, chamberOptions, saving } = this.state;\n        const { startDate, endDate, committeeVal, chamber, voteOrigin, isLoaded, organizedVotes } = this.props;\n\n        const VoteActions = (vote) =>\n            <div className=\"vote-information-actions\">\n                {vote.IsPublic ?\n                    <Link to={`/vote-management/edit-vote/${vote.VoteID}`} className=\"icon edit\"></Link>\n                    :\n                    <React.Fragment>\n                        <Link to={`/vote-management/edit-vote/${vote.VoteID}`} className=\"icon edit\"></Link>\n                        <span className=\"icon flag\"></span>\n                    </React.Fragment>\n                }\n                <span onClick={() => this.toggleDeleteVoteModal(vote)} className=\"icon delete\"></span>\n                {vote.FinalVote && <span className=\"bold\">(Final Vote)</span>}\n                {vote.IsVoice && <span className=\"bold\">(Voice)</span>}\n            </div>\n\n        return (\n            <div>\n                {this.state.showDeleteModal &&\n                    <div className='schedule-modal'>\n                        <div className='schedule-modal-content'>\n                            <div className='grid-wrapper two'>\n                                <div className='inner-grid eight-one-and-one'>\n                                    <span>Are you sure you want to delete vote {this.state.voteToDelete.VoteNumber}?</span>\n                                    {this.state.deletingVote\n                                        ? <div className=\"small-spinner\"></div>\n                                        : <button className='button primary' onClick={() => this.deleteVote()}>Yes</button>\n                                    }\n                                    <button className='button secondary' onClick={() => this.toggleDeleteVoteModal()}>No</button>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                }\n                <div className=\"header-half\">\n                    <h1>Vote Management</h1>\n                </div>\n\n                <div className=\"toolbar dlas-forms\">\n                    <div className=\"flex-row\">\n                        <div style={{ display: 'grid', gridTemplateColumns: 'min-content min-content 120px 150px 350px', gap: '10px' }}>\n                            <div>\n                                <label className=\"label\" htmlFor=\"start-date\">Start Date</label>\n                                <DatePicker\n                                    name=\"start-date\"\n                                    selected={startDate}\n                                    onChange={value => this.props.handleDateChange('startDate', value, () => {\n                                        let organizedVotes = [...this.props.organizedVotes];\n                                        organizedVotes.forEach((date, idx) => {\n                                            if (date.show) this.props.showVotes(idx, false)\n                                        });\n                                        this.props.getVotes();\n                                    })}\n                                />\n                            </div>\n                            <div>\n                                <label className=\"label\" htmlFor=\"end-date\">End Date</label>\n                                <DatePicker\n                                    name=\"end-date\"\n                                    selected={endDate}\n                                    onChange={value => this.props.handleDateChange('endDate', value, () => {\n                                        let organizedVotes = [...this.props.organizedVotes];\n                                        organizedVotes.forEach((date, idx) => {\n                                            if (date.show) this.props.showVotes(idx, false)\n                                        });\n                                        this.props.getVotes();\n                                    })}\n                                />\n                            </div>\n                            <div>\n                                <label className=\"label\" htmlFor=\"chamber\">Chamber</label>\n                                <Select\n                                    styles={customStyles}\n                                    name=\"chamber\"\n                                    options={chamberOptions}\n                                    isDisabled={this.state.disableChamberSelector}\n                                    onChange={value => this.handleChange('chamber', value)}\n                                    value={chamber}\n                                    style={{ width: \"150px\" }}\n                                />\n                            </div>\n                            <div>\n                                <label className=\"label\" htmlFor=\"committee\">Vote Origin</label>\n                                <Select\n                                    styles={customStyles}\n                                    name=\"vote-origin\"\n                                    options={voteOriginOptions}\n                                    onChange={value => this.handleChange('voteOrigin', value)}\n                                    value={voteOrigin}\n                                    style={{ width: \"150px\" }}\n                                />\n                            </div>\n                            <div>\n                                {voteOrigin && voteOrigin.label !== \"Floor\" &&\n                                    <React.Fragment>\n                                        <label className=\"label\" htmlFor=\"committee\">Committee</label>\n                                        <Select\n                                            styles={customStyles}\n                                            name=\"committee\"\n                                            options={committeeList && chamber ? committeeList.filter(c => c.ChamberCode === chamber.value && (voteOrigin.label === \"Committee\" ? !c.ParentCommitteeID : c.ParentCommitteeID)) : []}\n                                            onChange={value => this.handleChange('committee', value)}\n                                            value={committeeVal}\n                                            isDisabled={!chamber}\n                                            placeholder={fetchingCommittees ? 'Getting Committees....' : 'Select...'}\n                                            style={{ width: \"350px\" }}\n                                            isClearable\n                                        />\n                                    </React.Fragment>}\n                            </div>\n\n                        </div>\n                    </div>\n                </div>\n                <br />\n                <div className=\"toolbar minutes-toolbar dlas-forms\">\n                    <button type=\"button\" disabled={saving || (voteOrigin && voteOrigin.label !== \"Floor\" && (!committeeVal || !committeeVal.label))} onClick={() => this.saveVotes(true)} className=\"button\">Publish</button>\n                    <button type=\"button\" disabled={saving || (voteOrigin && voteOrigin.label !== \"Floor\" && (!committeeVal || !committeeVal.label))} onClick={() => this.saveVotes(false)} className=\"button danger\">Unpublish</button>\n                </div>\n                <ReactTable\n                    resizable={false}\n                    loading={!isLoaded}\n                    data={organizedVotes}\n                    noDataText=\"No votes found\"\n                    ref={r => this.reactTable = r}\n                    columns={[\n                        {\n                            sortable: false,\n                            filterable: false,\n                            style: { textAlign: 'center' },\n                            width: 45,\n                            Header: x => {\n                                return (\n                                    <input\n                                        id={'cm-checkbox-selectall'}\n                                        type=\"checkbox\"\n                                        className=\"checkbox\"\n                                        checked={this.state.selectAll}\n                                        onChange={this.toggleSelectAll}\n                                    />\n                                );\n                            },\n                            Cell: ({ original, index }) => {\n                                return (\n                                    <input\n                                        id={'cm-checkbox-' + index}\n                                        type=\"checkbox\"\n                                        className=\"checkbox\"\n                                        checked={original.checked}\n                                        onChange={() => this.toggleRow(index)}\n                                    />\n                                );\n                            }\n                        },\n                        {\n                            Header: \"\",\n                            accessor: \"Date\",\n                            Cell: row => {\n                                if (row.original.show) {\n                                    return (\n                                        <div className=\"vote-date-container\">\n                                            <div className=\"vote-date\" onClick={() => this.props.showVotes(row.index)}>\n                                                <span>{moment(row.value).format('L')}</span>\n                                                <button className=\"arrow-up\">votes</button>\n                                            </div>\n                                            <div className={`vote-information${voteOrigin.label === \"Floor\" ? \"\" : \" committee\"}`}>\n                                                {voteOrigin.label === \"Floor\" ?\n                                                    <React.Fragment>\n                                                        <span className=\"vote-information-header\"></span>\n                                                        <span className=\"vote-information-header\">Legislation</span>\n                                                        <span className=\"vote-information-header\">Vote Number</span>\n                                                        <span className=\"vote-information-header\" onClick={() => this.sortVotes(row)} style={{ cursor: \"pointer\" }}>Vote Time</span>\n                                                        <span className=\"vote-information-header\"></span>\n                                                        {row.original.Votes.map((vote, voteIndex) =>\n                                                            <React.Fragment key={voteIndex}>\n                                                                <span><input type=\"checkbox\" checked={vote.checked} onChange={() => this.toggleRow(row.index, voteIndex)} /></span>\n                                                                {![\"block\", \"cancelled\"].includes(vote.LegislationNumber?.toLowerCase()) ? <Link to={`/bill-details/${vote.SessionCode}/${vote.LegislationNumber}`} target=\"_blank\" rel=\"noreferrer\">{vote.LegislationNumber}</Link> : <span>{vote.LegislationNumber}</span>}\n                                                                <span>{vote.VoteNumber}</span>\n                                                                <span>{moment(vote.VoteDate).format(\"LTS\")}</span>\n                                                                {VoteActions(vote)}\n                                                            </React.Fragment>\n                                                        )}\n                                                    </React.Fragment>\n                                                    :\n                                                    <React.Fragment>\n                                                        <span className=\"vote-information-header checkbox-container\"></span>\n                                                        <span className=\"vote-information-header\">Legislation</span>\n                                                        <span className=\"vote-information-header\">Action</span>\n                                                        <span className=\"vote-information-header\">Committee</span>\n                                                        <span className=\"vote-information-header\">Vote Tally</span>\n                                                        <span className=\"vote-information-header\"></span>\n                                                        {row.original.Votes.map((vote, voteIndex) =>\n                                                            <React.Fragment key={voteIndex}>\n                                                                <span title={\"Vote Number: \" + vote.VoteNumber} className=\"checkbox-container\"><input type=\"checkbox\" checked={vote.checked} onChange={() => this.toggleRow(row.index, voteIndex)} /></span>\n                                                                {vote.LegislationNumber?.toLowerCase() !== \"block\" ? <Link to={`/bill-details/${vote.SessionCode}/${vote.LegislationNumber}`} target=\"_blank\" rel=\"noreferrer\">{vote.LegislationNumber}</Link> : <span>{vote.LegislationNumber}</span>}\n                                                                <span title={\"Vote Number: \" + vote.VoteNumber}>{this.props.voteActions && this.props.voteActions.find(x => x.EventCode === vote.EventCode) ? this.props.voteActions.find(x => x.EventCode === vote.EventCode).Description : vote.EventCode}</span>\n                                                                <span title={vote.CommitteeName}>{vote.CommitteeName}</span>\n                                                                <span title={\"Vote Number: \" + vote.VoteNumber}>{vote.VoteTally}</span>\n                                                                {VoteActions(vote)}\n                                                            </React.Fragment>\n                                                        )}\n                                                    </React.Fragment>\n                                                }\n                                            </div>\n                                        </div>\n                                    );\n                                } else {\n                                    return (\n                                        <div style={{ cursor: 'pointer' }} onClick={() => this.props.showVotes(row.index)}>\n                                            <span>{moment(row.value).format('L')}</span>\n                                            <button style={{ float: 'right' }} className=\"arrow-down\">votes</button>\n                                        </div>\n                                    );\n                                }\n                            }\n                        }\n                    ]}\n                    defaultPageSize={15}\n                    pageSizeOptions={[5, 10, 15, 20, 25, 50, 100]}\n                    className=\"committee-table -striped -highlight\"\n                />\n            </div>)\n\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { votes, nav, committee, login } = state;\n        return {\n            votes,\n            nav,\n            committee,\n            login\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, voteActionCreators, navActionCreators, committeeActionCreators, authActionCreators), dispatch)\n        }\n    }\n)(VoteGrid)","import React from 'react';\nimport ReactToPrint from \"react-to-print\";\nimport moment from 'moment-timezone';\nimport { Link } from 'react-router-dom';\n\nconst VoteDetails = props => {\n    const { sessionData, voteMembers, billData, voteData } = props;\n    const sessionHeader = sessionData ? sessionData.SessionYear + ' ' + sessionData.DisplayName : '';\n    const memberYeas = voteMembers.filter(nObj => nObj.ResponseCode === 'Y');\n    const memberNays = voteMembers.filter(nObj => nObj.ResponseCode === 'N');\n    const memberAbstentions = voteMembers.filter(nObj => nObj.ResponseCode === 'A');\n    const memberNoVote = voteMembers.filter(nObj => nObj.ResponseCode === 'X');\n    const voteStatements = voteMembers.filter(member => member.VoteStatement);\n    const voteActionDescription = voteData.ChamberCode === \"S\" ? \" Senate: \" + voteData.LegislationActionDescription : \" House of Delegates: \" + voteData.LegislationActionDescription\n    // Abstentions appear as rule 36 on senate floor tally sheets\n    let memberRule36 = [];\n    if (voteData.ChamberCode === \"S\" && voteData.VoteType === \"Floor\") {\n        memberRule36 = voteMembers.filter(nObj => nObj.ResponseCode === 'A');\n    } else {\n        memberRule36 = voteMembers.filter(nObj => nObj.ResponseCode === 'R');\n    }\n\n    let componentRef;\n    let removeRefFromPrint;\n    const displayTallySheet = props.voteFileUrl && !voteData.CommitteeID && voteData.ChamberCode !== \"H\";\n    const displayCommitteeLink = voteData.CommitteeID;\n    const linksGridColumns = displayTallySheet && displayCommitteeLink ? 'three' : (displayTallySheet || displayCommitteeLink) ? 'two' : 'one';\n    const linksGridTemplateColumns = linksGridColumns === 'three' ? 'auto min-content min-content' : linksGridColumns === 'two' ? 'auto min-content' : 'min-content';\n    const headerGridTemplateColumns = linksGridColumns === 'three' ? '7fr 3fr' : linksGridColumns === 'two' ? '7fr 2fr' : '7fr 1fr';\n    const mobileLinksPosition = linksGridColumns === 'three' ? 'justify-center' : 'justify-left';\n\n    return (\n        <div ref={el => (componentRef = el)} id=\"vote-details\" className=\"bill-theme public-details inner-grid\">\n            <div>\n                <h2 style={{ marginBottom: '10px' }}>{sessionHeader}</h2>\n            </div>\n            <div className={props.isPublic ? 'details-header' : ''} style={props.isPublic && { gridTemplateColumns: headerGridTemplateColumns }}>\n                {billData.length === 1 ?\n                    <div style={{ marginBottom: \"15px\" }}>\n                        <h3><span style={{ marginRight: '1em' }}>{billData[0].LegislationNumber}</span><span>{billData[0].Description}</span></h3>\n                    </div>\n                    :\n                    <div>\n                        <h3>Bills</h3>\n                        <p>{billData.map((bill, index) =>\n                            <React.Fragment key={index}>\n                                {bill.LegislationNumber}{index !== billData.length - 1 && \",\"}&nbsp;\n                            </React.Fragment>\n                        )}</p>\n                    </div>\n                }\n                {props.isPublic &&\n                    <div className={`remove-from-print inner-grid ${linksGridColumns} list-links ${mobileLinksPosition}`} style={{ display: 'grid', justifyContent: 'end', gridTemplateColumns: linksGridTemplateColumns }}>\n                        {displayTallySheet &&\n                            <a href={props.voteFileUrl.FileURL}>Tally Sheet PDF</a>\n                        }\n                        {displayCommitteeLink &&\n                            <Link to={`/session-details/${sessionData.SessionCode}/committee-information/${voteData.CommitteeNumber}/committee-details`}>{voteData.ParentCommitteeID ? 'Subcommittee' : 'Committee'}</Link>\n                        }\n                        <ReactToPrint\n                            trigger={() => <a type=\"button\" className=\"button print\"> Print</a>}\n                            content={() => {\n                                let printedContent = componentRef.cloneNode(true);\n                                //remove icons from printed document\n                                const removedContent = printedContent.getElementsByClassName('remove-from-print');\n                                for (const el of removedContent) {\n                                    el.innerHTML = ''\n                                }\n                                //set header to block instead of grid so it can span the width of printed document rather than be cut off short\n                                let header = printedContent.getElementsByClassName('details-header');\n                                if (header && header[0]) {\n                                    header = header[0];\n                                    header.style.display = 'block';\n                                    let billDescription = header.getElementsByTagName('div');\n                                    if (billDescription && billDescription[0]) {\n                                        billDescription[0].style['margin-bottom'] = '0px';\n                                    }\n                                }\n                                return printedContent\n                            }}\n                            pageStyle={\"break-inside: avoid\"}\n                        />\n                    </div>\n                }\n            </div >\n            <div>\n                <p><strong>{moment(voteData.VoteDate).format(\"MM/DD/YYYY\")} {voteActionDescription}</strong></p>\n            </div>\n            <div>\n                <div className=\"details-section\">\n                    {voteData.CommitteeID &&\n                        <p>{voteData.ParentCommitteeID ? \"Subcommittee: \" : \"Committee: \"} {voteData.ReferToCommitteeID !== undefined ? voteData.ReferToCommitteeName : voteData.CommitteeName}</p>\n                    }\n                    {voteData.ParentCommitteeID &&\n                        <p>Committee: {voteData.ParentCommitteeName}</p>\n                    }\n                </div>\n                <div className=\"details-section\">\n                    <h4>Votes</h4>\n                    <p>\n                        YEAS--\n                        {memberYeas.map((item, index) => (\n                            <span key={index}>{item.PatronDisplayName}{memberYeas.length === index + 1 ? '--' : ', '}</span>\n                        ))}\n                        {memberYeas.length}\n                    </p>\n                    <p>\n                        NAYS--\n                        {memberNays.map((item, index) => (\n                            <span key={index}>{item.PatronDisplayName}{memberNays.length === index + 1 ? '--' : ', '}</span>\n                        ))}\n                        {memberNays.length}\n                    </p>\n                    <p>\n                        {(voteData.VoteType === \"Floor\" && voteData.ChamberCode === \"S\") ? \"RULE 36--\" : \"ABSTENTIONS--\"}\n                        {memberAbstentions.map((item, index) => (\n                            <span key={index}>{item.PatronDisplayName}{memberAbstentions.length === index + 1 ? '--' : ', '}</span>\n                        ))}\n                        {memberAbstentions.length}\n                    </p>\n                    {voteData.VoteType === \"Committee\" && voteData.ChamberCode === \"S\" ? \"\"\n                        : <p>\n                            NOT VOTING--\n                            {memberNoVote.map((item, index) => (\n                                <span key={index}>{item.PatronDisplayName}{memberNoVote.length === index + 1 ? '--' : ', '}</span>\n                            ))}\n                            {memberNoVote.length}\n                        </p>\n                    }\n                </div>\n            </div>\n            <div id=\"vote-statements\">\n                {voteStatements.map((statement, statementIndex) =>\n                    <p key={statementIndex}>{statement.VoteStatement}</p>\n                )}\n            </div>\n            {voteData.VoteComment &&\n                <div id=\"vote-comments\">\n                    <p>{voteData.VoteComment}</p>\n                </div>\n            }\n        </div>\n    );\n}\n\nexport default VoteDetails\n","import React from \"react\";\nimport { Prompt } from \"react-router\";\nimport moment from 'moment-timezone';\nimport DatePicker from \"react-datepicker\";\nimport ReactToPrint from \"react-to-print\";\nimport VoteDetails from \"../../../lis-shared/lis-votes/lis-vote-details\";\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { voteActionCreators } from '../../../stores/lis-votes-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport Select from 'react-select';\nimport Popout from '../../../lis-shared/lis-layout/components/lis-popout-component';\nimport { sessionActionCreators } from \"../../../stores/lis-session-store\";\nimport { calendarActionCreators } from \"../../../stores/lis-calendar-store\";\nimport { cancelRequest } from '../../../services/request.service';\nimport { billActionCreators } from \"../../../stores/lis-legislation-store\";\nimport { committeeActionCreators } from \"../../../stores/lis-committee-store\";\n\nconst PassFailOptions = [{ label: \"Pass\", value: \"P\" }, { label: \"Fail\", value: \"F\" }];\n\nconst REFER_ACTIONS = [\"H0105\", \"H0106\", \"H0107\", \"H0108\", \"H0109\", \"H0114\", \"H0205\", \"H0206\", \"H0207\", \"H0208\", \"H0209\", \"H0214\", \"H0307\", \"H0407\", \"H0507\", \"H0607\", \"H0705\", \"H0706\", \"H0707\", \"H0708\", \"H0709\", \"H0714\", \"H0805\", \"H0806\", \"H0807\", \"H0808\", \"H0809\", \"H0814\", \"H0905\", \"H0906\", \"H0907\", \"H0908\", \"H0909\", \"H0914\", \"H1005\", \"H1006\", \"H1007\", \"H1008\", \"H1009\", \"H1014\", \"H1105\", \"H1106\", \"H1107\", \"H1108\", \"H1109\", \"H1114\", \"H1307\", \"H1405\", \"H1406\", \"H1407\", \"H1408\", \"H1409\", \"H1414\", \"H1505\", \"H1506\", \"H1507\", \"H1508\", \"H1509\", \"H1514\", \"H1707\", \"H1805\", \"H1806\", \"H1807\", \"H1808\", \"H1809\", \"H1814\", \"H1905\", \"H1906\", \"H1907\", \"H1908\", \"H1909\", \"H1914\", \"H2005\", \"H2006\", \"H2007\", \"H2008\", \"H2009\", \"H2014\", \"H2105\", \"H2106\", \"H2107\", \"H2108\", \"H2109\", \"H2114\", \"H2305\", \"H2306\", \"H2307\", \"H2308\", \"H2309\", \"H2314\", \"H2405\", \"H2406\", \"H2407\", \"H2408\", \"H2409\", \"H2414\", \"S0105\", \"S0106\", \"S0107\", \"S0108\", \"S0109\", \"S0110\", \"S0114\", \"S0205\", \"S0206\", \"S0207\", \"S0208\", \"S0209\", \"S0210\", \"S0214\", \"S0305\", \"S0306\", \"S0307\", \"S0308\", \"S0309\", \"S0310\", \"S0314\", \"S0405\", \"S0406\", \"S0407\", \"S0408\", \"S0409\", \"S0410\", \"S0414\", \"S0505\", \"S0506\", \"S0507\", \"S0508\", \"S0509\", \"S0510\", \"S0514\", \"S0607\", \"S0705\", \"S0706\", \"S0707\", \"S0708\", \"S0709\", \"S0710\", \"S0714\", \"S0805\", \"S0806\", \"S0807\", \"S0808\", \"S0809\", \"S0810\", \"S0814\", \"S0905\", \"S0906\", \"S0907\", \"S0908\", \"S0909\", \"S0910\", \"S0914\", \"S1005\", \"S1006\", \"S1007\", \"S1008\", \"S1009\", \"S1010\", \"S1014\", \"S1105\", \"S1106\", \"S1107\", \"S1108\", \"S1109\", \"S1110\", \"S1114\", \"S1205\", \"S1206\", \"S1207\", \"S1208\", \"S1209\", \"S1210\", \"S1214\", \"S1305\", \"S1306\", \"S1307\", \"S1308\", \"S1309\", \"S1310\", \"S1314\"];\nconst INCORPORATED_ACTIONS = [/* \"H0199\", \"H0299\", \"H0799\", \"H0899\", \"H0999\", \"H1099\", \"H1199\", \"H1499\", \"H1599\", \"H1899\", \"H2099\", \"H2199\", \"H2399\", \"H2499\", */ \"S0199\", \"S0299\", \"S0399\", \"S0499\", \"S0599\", \"S0699\", \"S0799\", \"S0899\", \"S0999\", \"S1099\", \"S1199\", \"S1299\", \"S1399\"];\n\nclass VoteForm extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            voteData: '',\n            message: '',\n            isPreviewing: false,\n            isLoaded: false,\n            changeVotes: false,\n            selectedVoteActionDescription: '',\n            voteActionList: [],\n            selectedCalendarCategoryType: '',\n            calendarCategoryTypeList: [],\n            pendingSave: false,\n            isDirty: false,\n            showWarning: false,\n            settingIsBlock: false,\n            billList: [],\n            committeeList: [],\n            sessionBills: [],\n            savedIncorporated: false\n        };\n\n        this.resetForm = this.resetForm.bind(this);\n        this.resetVoteMembers = this.resetVoteMembers.bind(this);\n        this.getVoteActionReferences = this.getVoteActionReferences.bind(this);\n        this.getCalendarCategoryTypes = this.getCalendarCategoryTypes.bind(this);\n        this.handleVoteActionDescriptionChange = this.handleVoteActionDescriptionChange.bind(this);\n        this.handleCalendarCategoryTypeChange = this.handleCalendarCategoryTypeChange.bind(this);\n        this.handleInputChange = this.handleInputChange.bind(this);\n        this.handleDateChange = this.handleDateChange.bind(this);\n        this.handleVoteChange = this.handleVoteChange.bind(this);\n        this.handleVoteLegislationChange = this.handleVoteLegislationChange.bind(this);\n        this.handleCommitteeChange = this.handleCommitteeChange.bind(this);\n        this.updateStatement = this.updateStatement.bind(this);\n        this.togglePreview = this.togglePreview.bind(this);\n        this.togglePortal = this.togglePortal.bind(this);\n        this.toggleTallySheetPDFPreview = this.toggleTallySheetPDFPreview.bind(this);\n        this.handleSave = this.handleSave.bind(this);\n        this.toggleChangeVotes = this.toggleChangeVotes.bind(this);\n        this.setVoteTally = this.setVoteTally.bind(this);\n        this.toggleWarning = this.toggleWarning.bind(this);\n        this.getVoteListForFinalVote = this.getVoteListForFinalVote.bind(this);\n        this.toggleEditVoteLegislation = this.toggleEditVoteLegislation.bind(this);\n        this.getCommittees = this.getCommittees.bind(this);\n        this.getBills = this.getBills.bind(this);\n        this.handleBillChange = this.handleBillChange.bind(this);\n        this.handleSenateCommitteeVoteLegislationChange = this.handleSenateCommitteeVoteLegislationChange.bind(this);\n\n        this.pdfRef = React.createRef();\n    }\n\n    resetForm() {\n        const originalVoteData = JSON.parse(JSON.stringify(this.props.votes.voteDetailsResponse[0]));\n        this.setState({\n            pendingSave: false,\n            voteData: originalVoteData,\n            selectedVoteActionDescription: this.state.voteActionList.find(x => x.EventCode === originalVoteData.EventCode),\n            selectedCalendarCategoryType: this.state.calendarCategoryTypeList.find(x => x.CalendarCategoryTypeID === originalVoteData.CalendarCategoryTypeID) || null,\n            isDirty: false\n        });\n    }\n\n    resetVoteMembers() {\n        let voteData = { ...this.state.voteData };\n        let originalVoteData = JSON.parse(JSON.stringify(this.props.votes.voteDetailsResponse[0]));\n        const originalVoteMembers = originalVoteData.VoteMember;\n        voteData.VoteMember = originalVoteMembers;\n        this.setState({\n            voteData,\n            isDirty: false\n        }, () => {\n            this.setVoteTally();\n        })\n    }\n\n    getVoteActionReferences(setSelectedValue) {\n        this.setState({ loadingVoteActionList: true }, () => {\n            this.props.actions.getVoteActionList(\"?\"\n                + (this.state.voteData.CalendarCategoryTypeID ? \"calendarCategoryTypeId=\" + this.state.voteData.CalendarCategoryTypeID + \"&\" : \"\")\n                + \"committeeID=\" + this.state.voteData.CommitteeID\n                + \"&voteTypeID=\" + this.state.voteData.VoteTypeID\n                + \"&chamberCode=\" + this.state.voteData.ChamberCode)\n                .then(() => {\n                    let voteActionList = [...this.props.votes.voteActionList];\n\n                    // if this is a committee vote, separate the vote action options between actions of this vote's committee and then all other committee's vote actions\n                    if (this.state.voteData.VoteType !== \"Floor\") {\n                        voteActionList = [\n                            {\n                                label: this.state.voteData.CommitteeName ? this.state.voteData.CommitteeName + \" Vote Actions\" : 'Vote Actions From This Committee',\n                                options: [...voteActionList.filter(v => v.EventCode.substr(1, 2) === this.state.voteData.EventCode.substr(1, 2))]\n                            },\n                            {\n                                label: 'Vote Actions From Other Committees',\n                                options: [...voteActionList.filter(v => v.EventCode.substr(1, 2) !== this.state.voteData.EventCode.substr(1, 2))]\n                            }\n                        ]\n                    }\n\n                    if (setSelectedValue) {\n                        let voteAction = voteActionList.flatMap(x => x.options || x).find(x => x.EventCode === this.state.voteData.EventCode) || null;\n                        let voteData = { ...this.state.voteData };\n                        if (voteAction) {\n                            voteData.VoteActionID = voteAction.VoteActionID;\n                            voteData.EventCode = voteAction.EventCode;\n                        } else if (voteData.EventCode && voteData.VoteActionDescription) {\n                            const voteObj = { EventCode: voteData.EventCode, Description: voteData.VoteActionDescription, ChamberCode: voteData.ChamberCode, VoteActionID: voteData.VoteActionID }\n                            if (this.state.voteData.VoteType !== \"Floor\") {\n                                voteActionList[0].options.push(voteObj);\n                            } else {\n                                voteActionList.push(voteObj)\n                            }\n                            voteAction = voteActionList.flatMap(x => x.options || x).find(x => x.EventCode === this.state.voteData.EventCode) || null;\n                        }\n                        this.setState({ selectedVoteActionDescription: voteAction, voteData })\n                    }\n                    this.setState({ voteActionList, loadingVoteActionList: false })\n                })\n        })\n    }\n\n    getCalendarCategoryTypes() {\n        this.props.actions.getCalendarCategoriesReferences('?Chambercode=' + this.state.voteData.ChamberCode)\n            .then(() => {\n                let calendarCategoryTypeList = this.props.calendar.calendarCategoriesReferences;\n                let selectedCalendarCategoryType = calendarCategoryTypeList.find(x => x.CalendarCategoryTypeID === this.state.voteData.CalendarCategoryTypeID);\n                if (!selectedCalendarCategoryType && this.state.voteData.CalendarCategoryTypeID && this.state.voteData.CategoryDescription) {\n                    calendarCategoryTypeList.push({ Description: this.state.voteData.CategoryDescription, CalendarCategoryTypeID: this.state.voteData.CalendarCategoryTypeID })\n                    selectedCalendarCategoryType = calendarCategoryTypeList.find(x => x.CalendarCategoryTypeID === this.state.voteData.CalendarCategoryTypeID);\n                }\n                this.setState({\n                    calendarCategoryTypeList,\n                    selectedCalendarCategoryType\n                });\n            });\n    }\n\n    handleVoteActionDescriptionChange(value) {\n        let voteData = { ...this.state.voteData };\n        voteData.VoteActionDescription = value.Description;\n        voteData.ChamberCode = value.ChamberCode;\n        voteData.EventCode = value.EventCode;\n        voteData.VoteActionID = value.VoteActionID;\n        voteData.Description = voteData.VoteActionDescription + \" \" + voteData.VoteTally;\n\n        this.setState({\n            pendingSave: true,\n            voteData: voteData,\n            selectedVoteActionDescription: this.state.voteActionList.find(x => x.EventCode === voteData.EventCode),\n            isDirty: true\n        });\n    }\n\n    handleCalendarCategoryTypeChange(value) {\n        let voteData = { ...this.state.voteData };\n        voteData.CalendarCategoryTypeID = value.CalendarCategoryTypeID;\n\n        this.setState({\n            pendingSave: true,\n            voteData: voteData,\n            selectedCalendarCategoryType: this.state.calendarCategoryTypeList.find(x => x.CalendarCategoryTypeID === value.CalendarCategoryTypeID),\n            isDirty: true\n        }, () => {\n            this.getVoteActionReferences(true);\n        });\n    }\n\n    handleInputChange(key, value) {\n        let voteData = { ...this.state.voteData };\n        voteData[key] = value;\n        let promise;\n        if (key === \"VoteTally\") {\n            voteData.Description = voteData.VoteActionDescription + \" \" + voteData.VoteTally\n        } else if (key === \"IsBlock\") {\n            if (voteData.VoteLegislation && voteData.VoteLegislation.filter(v => !v.DeletionDate).length > 1 && !value) {\n                return;\n            } else if (!this.state.billList || !this.state.billList.length) {\n                //Get bills in the session for the bill dropdown\n                promise = new Promise(res => {\n                    this.setState({ settingIsBlock: true }, () => {\n                        this.props.actions.getSessionBills('?sessionID= ' + voteData.SessionID).then(() => {\n                            let billList = [...this.props.bills.sessionBills];\n                            billList.forEach(bill => {\n                                bill.label = bill.LegislationNumber\n                                bill.value = bill.LegislationID\n                            });\n                            this.setState({\n                                billList: billList,\n                                settingIsBlock: false\n                            })\n                            res();\n                        })\n                    });\n                })\n            }\n        }\n        Promise.resolve(promise).then(() => {\n            this.setState({\n                pendingSave: true,\n                voteData: voteData,\n                isDirty: true\n            }, () => {\n                //if they are setting it to be the final vote, and we have not already checked to make sure this is valid based on other votes on this date, do so now\n                if (key === \"FinalVote\" && !this.state.committeeSameDayVoteList && this.state.voteData.FinalVote && this.state.voteData.VoteType === \"Committee\" && this.state.voteData.CommitteeID && !this.state.voteData.ParentCommitteeID) {\n                    this.getVoteListForFinalVote(this.state.voteData);\n                }\n            });\n        })\n    }\n\n    handleDateChange(val) {\n        let voteData = { ...this.state.voteData };\n        voteData.VoteDate = moment(val).utcOffset(-300).format(\"MM/DD/YYYY HH:mm:ss\")\n        this.setState({\n            pendingSave: true,\n            voteData: voteData,\n            isDirty: true\n        });\n    }\n\n    handleVoteChange(index, val) {\n        let voteData = { ...this.state.voteData };\n        voteData.VoteMember[index].ResponseCode = val;\n        this.setState({\n            pendingSave: true,\n            voteData: voteData,\n            isDirty: true\n        }, () => {\n            this.setVoteTally();\n        });\n    }\n\n    toggleEditVoteLegislation(undo) {\n        this.setState({ editingVoteLegislation: !this.state.editingVoteLegislation, showEditingVoteLegislationMessage: false }, () => {\n            let voteData = { ...this.state.voteData }\n            if (this.state.editingVoteLegislation) {\n                this.setState({ uneditedVoteLegislation: JSON.parse(JSON.stringify(voteData.VoteLegislation)) })\n            } else if (undo === true) {\n                voteData.VoteLegislation = this.state.uneditedVoteLegislation;\n                this.setState({ voteData });\n            }\n        })\n    }\n\n    handleVoteLegislationChange(_, behavior) {\n        let voteData = { ...this.state.voteData };\n        let voteLegislation = [...voteData.VoteLegislation];\n        if (behavior && behavior.action) {\n            switch (behavior.action) {\n                case 'select-option':\n                    const deletedLegIndex = voteLegislation.findIndex(vl => vl.DeletionDate && vl.LegislationID === behavior.option.LegislationID);\n                    if (deletedLegIndex >= 0) {\n                        voteLegislation[deletedLegIndex].DeletionDate = null;\n                    } else {\n                        voteLegislation.push({ LegislationNumber: behavior.option.LegislationNumber, LegislationID: behavior.option.LegislationID });\n                    }\n                    break;\n                case 'remove-value':\n                    const legIndex = voteLegislation.findIndex(vl => !vl.DeletionDate && vl.LegislationID === behavior.removedValue.LegislationID);\n                    voteLegislation[legIndex].DeletionDate = moment();\n                    break;\n                case 'clear':\n                    voteLegislation.filter(vl => !vl.DeletionDate).forEach(vl => vl.DeletionDate = moment())\n                    break;\n                default:\n                    break;\n            }\n        }\n\n        voteData.VoteLegislation = voteLegislation;\n        voteData.IsBlock = voteLegislation.filter(vl => !vl.DeletionDate).length > 1 ? true : voteData.IsBlock;\n        this.setState({\n            voteData\n        });\n    }\n\n    handleSenateCommitteeVoteLegislationChange(value) {\n        let voteData = { ...this.state.voteData };\n        voteData.LegislationNumber = value.LegislationNumber;\n        voteData.VoteLegislation[0].DeletionDate = moment().toISOString();\n        voteData.VoteLegislation.push(value);\n        voteData.IsBlock = false;\n        this.setState({\n            voteData\n        });\n    }\n\n    handleCommitteeChange(value) {\n        let voteData = { ...this.state.voteData };\n\n        if(!value) {\n            voteData.ReferToCommitteeID = undefined;\n            voteData.ReferToCommitteeNumber = undefined;\n            voteData.ReferToCommitteeName = undefined;\n        } else {\n            voteData.ReferToCommitteeID = value.value;\n        }\n\n        this.setState({\n            voteData: voteData\n        })\n    }\n\n    handleBillChange(value) {\n        let voteData = { ...this.state.voteData };\n\n        voteData.ReferenceID = value.LegislationID;\n        voteData.ReferenceNumber = value.label;\n\n        this.setState({\n            voteData: voteData\n        })\n    }\n\n    updateStatement(voteMembers) {\n        let voteData = { ...this.state.voteData };\n        voteData.VoteMember = voteMembers;\n        this.setState({\n            pendingSave: true,\n            voteData: voteData,\n            isDirty: true\n        });\n    }\n\n    setVoteTally() {\n        const yeaVotes = this.state.voteData.VoteMember.filter(vm => vm.ResponseCode === \"Y\").length.toString();\n        const nayVotes = this.state.voteData.VoteMember.filter(vm => vm.ResponseCode === \"N\").length.toString();\n        const abstainVotes = this.state.voteData.VoteMember.filter(vm => vm.ResponseCode === \"A\").length.toString();\n        this.handleInputChange('VoteTally', '(' + yeaVotes + '-Y ' + nayVotes + \"-N\" + (abstainVotes !== \"0\" ? \" \" + abstainVotes + \"-A\" : \"\") + \")\")\n    }\n\n    togglePreview() {\n        this.setState(state => ({\n            isPreviewing: !state.isPreviewing\n        }));\n    }\n\n    togglePortal() {\n        this.setState({\n            showPortal: !this.state.showPortal\n        }, () => {\n            if (this.state.showPortal) {\n                this.toggleTallySheetPDFPreview();\n            }\n        });\n    }\n\n    toggleTallySheetPDFPreview() {\n        this.setState({\n            gettingPdf: true\n        });\n        // This endpoint returns a pdf document and not json so the partnerRequest function will not work\n        // It doesn't need to be saved to the redux store because it will not be referenced after the user sees it. So it is called here within the component.\n        const API_URL = window.env ? window.env.API_SERVER : '';\n        const idToken = 'LIS_ID_TOKEN';\n        let signal = new window.AbortController().signal;\n        const config = {\n            headers: {\n                'content-type': \"application/json; charset=utf-8\",\n                Authorization: \"Bearer \" + localStorage.getItem(idToken),\n                'WebAPIKey': process.env.REACT_APP_API_KEY\n            },\n            method: \"GET\",\n            signal: signal\n        };\n        let params = `?voteId=${this.state.voteData.VoteID}` + `&IsNonLegislative=` + ((this.state.voteData.LegislationNumber || this.state.voteData.VoteLegislation.length > 0) ? false : true)\n        fetch((API_URL || process.env.REACT_APP_VOTE_FILE_GEN_URL) + '/VoteFileGeneration/api/PreviewTallySheetFileAsync' + params, config)\n            .then(response => {\n                if (response.status === 204) {\n                    throw 'No Content';\n                } else if (response.status > 399) {\n                    throw response;\n                } else {\n                    response.blob()\n                        .then(res => {\n                            if (this.pdfRef && this.pdfRef.current) {\n                                let pdfRef = this.pdfRef.current;\n                                pdfRef.setAttribute('src', URL.createObjectURL(res));\n                                pdfRef.onload = () => {\n                                    this.setState({\n                                        gettingPdf: false\n                                    });\n                                };\n                            }\n                        })\n                }\n            }).catch(err => {\n                if (err.name === 'AbortError') {\n                    return;\n                }\n                this.setState({\n                    gettingPdf: false\n                });\n                //This is a response and the text needs to be extracted\n                if (err.text) {\n                    err.text().then(err => console.log(err.toString()));\n                } else {\n                    console.log(err.toString())\n                }\n                this.props.actions.makeToast([{ message: \"Failed To Get Data\", type: \"failure\" }]);\n            })\n    }\n\n    toggleWarning() {\n        this.setState({\n            showWarning: !this.state.showWarning\n        })\n    }\n\n    handleSave(isPublishing) {\n        this.setState({ isSaving: true, showWarning: false }, () => {\n            let voteData = { ...this.state.voteData };\n            if (isPublishing) {\n                voteData.IsPublic = true;\n            }\n\n            this.props.actions.saveVote({ VoteList: [voteData] })\n                .then(async () => {\n                    if (this.props.votes.voteSaveError) {\n                        throw this.props.votes.voteSaveError;\n                    }\n                    if (this.props.votes.voteSave.length === 0) {\n                        throw 'No vote data returned'\n                    }\n                    this.setState({ pendingSave: false })\n                    const voteData = JSON.parse(JSON.stringify(this.props.votes.voteSave[0]));\n                    if (isPublishing) {\n                        //Call Vote File Generation and move the user back to the grid\n                        this.props.actions.voteFileGen('?voteID=' + voteData.VoteID)\n                            .then(() => {\n                                if (this.props.votes.voteFileError) {\n                                    console.log(this.props.votes.voteFileError.toString());\n                                }\n                            })\n                        if (voteData.FinalVote && voteData.VoteType === \"Committee\" && voteData.CommitteeID && !voteData.ParentCommitteeID && voteData.VoteDate) {\n                            let committeeSameDayVoteList = [...this.state.committeeSameDayVoteList];\n                            committeeSameDayVoteList = committeeSameDayVoteList.concat(voteData.VoteLegislation.filter(vl => !vl.DeletionDate).map(vl => { return { LegislationNumber: vl.LegislationNumber, EventCode: voteData.EventCode } }));\n                            const success = await this.props.createChairmansReportSummarizedOnMinutes(voteData.SessionID, voteData.ChamberCode, voteData.CommitteeID, moment(voteData.VoteDate).utc().hour(0), committeeSameDayVoteList);\n                            if (!success) {\n                                this.props.actions.makeToast([{ message: \"Vote Publish Successful, Chairman's Report Save Failed\", type: \"failure\", long: true }]);\n                            } else {\n                                this.props.actions.makeToast([{ message: \"Vote Published\", type: \"success\" }]);\n                            }\n                        } else {\n                            this.props.actions.makeToast([{ message: \"Vote Published\", type: \"success\" }]);\n                        }\n                        this.setState({ isDirty: false }, () => {\n                            this.props.history.push('/vote-management');\n                        });\n                    } else {\n                        this.props.actions.makeToast([{ message: \"Vote Saved\", type: \"success\" }]);\n                        this.setState({\n                            voteData: voteData,\n                            isSaving: false,\n                            isDirty: false,\n                            changeVotes: false,\n                            savedIncorporated: INCORPORATED_ACTIONS.includes(voteData.EventCode)\n                        });\n                    }\n                }).catch((err) => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    console.log(err.toString());\n                    this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n                    this.setState({\n                        isSaving: false\n                    });\n                });\n        });\n    }\n\n    toggleChangeVotes() {\n        this.setState({ changeVotes: !this.state.changeVotes }, () => {\n            if (!this.state.changeVotes) {\n                this.resetVoteMembers();\n            }\n        })\n    }\n\n    getCommittees(sessionId) {\n        this.props.actions.getCommitteeList(sessionId).then(() => {\n            let committeeList = [...this.props.committee.committeeList.filter(x => x.ChamberCode !== \"H\")];\n            committeeList.forEach(committee => {\n                committee.label = committee.Name;\n                committee.value = committee.CommitteeID;\n            });\n            this.setState({\n                committeeList: committeeList\n            });\n\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            console.log(err)\n        });\n    }\n\n    getBills(sessionId) {\n        this.props.actions.getBillNumbers('?sessionID=' + sessionId).then(() => {\n            let billNumbers = this.props.bills.billNumbers;\n            billNumbers.forEach(bill => {\n                bill.label = bill.LegislationNumber;\n                bill.value = bill.LegislationNumber;\n            })\n            this.setState({\n                sessionBills: billNumbers\n            });\n        })\n    }\n\n    componentDidMount() {\n        const voteId = this.props.match.params.voteid;\n        this.props.actions.getVoteDetails('?voteID=' + voteId, true)\n            .then(() => {\n                if (this.props.votes.voteDetailsError) {\n                    throw this.props.votes.voteDetailsError;\n                }\n                if (this.props.votes.voteDetailsResponse.length === 0) {\n                    throw \"Cannot get vote data\";\n                }\n                const voteData = JSON.parse(JSON.stringify(this.props.votes.voteDetailsResponse[0]));\n\n                //Get bills in the session for the bill dropdown\n                this.props.actions.getSessionBills('?sessionID= ' + voteData.SessionID).then(() => {\n                    let billList = [...this.props.bills.sessionBills];\n                    billList.forEach(bill => {\n                        bill.label = bill.LegislationNumber\n                        bill.value = bill.LegislationID\n                    });\n                    this.setState({\n                        billList: billList,\n                    })\n\n                    // if this is a final vote, check other votes for this committee on this day to ensure whether or not this vote should be publishable\n                    if (voteData.FinalVote && voteData.VoteType === \"Committee\" && voteData.CommitteeID && !voteData.ParentCommitteeID) {\n                        this.getVoteListForFinalVote(voteData);\n                    } else {\n                        this.setState({\n                            isLoaded: true,\n                            voteData: voteData\n                        }, () => {\n                            this.getVoteActionReferences(true);\n                            if (voteData.VoteType === \"Floor\") {\n                                this.getCalendarCategoryTypes();\n                            }\n                        });\n                    }\n                    //Get the session data for use in the preview\n                    this.props.actions.getSessionById(this.props.votes.voteDetailsResponse[0].SessionID)\n\n                    this.getCommittees(this.props.votes.voteDetailsResponse[0].SessionID);\n                    this.getBills(this.props.votes.voteDetailsResponse[0].SessionID);\n                })\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n                this.setState({\n                    message: err.toString(),\n                    isLoaded: true\n                });\n            });\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    getVoteListForFinalVote(voteData) {\n        let voteParams = `?startDate=${moment(voteData.VoteDate).startOf('day').format('YYYY-MM-DDTHH:mm:ss')}&endDate=${moment(voteData.VoteDate).endOf('day').format('YYYY-MM-DDTHH:mm:ss')}`;\n        voteParams += '&chamberCode=' + voteData.ChamberCode;\n        voteParams += '&voteTypeID=' + voteData.VoteTypeID;\n        voteParams += '&committeeID=' + voteData.CommitteeID;\n        this.props.actions.getVoteList(voteParams)\n            .then(() => {\n                if (this.props.votes.voteListError) {\n                    throw this.props.votes.voteListError;\n                }\n                if (this.props.votes.voteList.length === 0) {\n                    throw 'No Votes in list'; // there should be at least one considering we already retrieved one\n                }\n                this.setState({\n                    isLoaded: true,\n                    voteData: voteData,\n                    preventPublish: this.props.votes.voteList.find(v => v.VoteID !== voteData.VoteID && v.CommitteeID === voteData.CommitteeID && !v.IsPublic), //don't allow publishing Final Votes before all preceding votes for that committee are published,\n                    committeeSameDayVoteList: this.props.votes.voteList.filter(v => v.VoteID !== voteData.VoteID && v.CommitteeID === voteData.CommitteeID).map(v => { return { LegislationNumber: v.LegislationNumber, EventCode: v.EventCode } })\n                }, () => {\n                    this.getVoteActionReferences(true);\n                });\n            })\n    }\n\n    render() {\n        const { voteData, isLoaded, isPreviewing, message, isSaving, pendingSave, preventPublish, selectedVoteActionDescription, voteActionList, selectedCalendarCategoryType, calendarCategoryTypeList, editingVoteLegislation } = this.state;\n\n        const customStyles = (multi) => ({\n            option: (base, state) => ({\n                ...base,\n                fontSize: '0.8em',\n            }),\n            control: (base) => ({\n                ...base,\n                padding: '1px',\n                margin: \"10px 0 0 0\",\n                minHeight: 0,\n                fontSize: '0.8em',\n                height: !multi && \"32px\",\n                zIndex: multi && '10'\n            }),\n            valueContainer: (base) => ({\n                ...base,\n                height: !multi && \"32px\"\n            }),\n            dropdownIndicator: (base) => ({\n                ...base,\n                paddingTop: \"0px\",\n                paddingBottom: \"0px\"\n            }),\n            input: (base) => ({\n                ...base,\n                margin: \"0px\",\n                position: multi ? \"relative\" : \"absolute\"\n            }),\n            singleValue: (base, state) => {\n                return { ...base, };\n            },\n            menu: (base) => ({\n                ...base,\n                position: 'absolute',\n                zIndex: '10'\n            })\n        })\n\n        if (message) {\n            return (\n                <div className=\"dlas-forms\">\n                    <span>{message}</span>\n                </div>);\n        }\n        if (!isLoaded) {\n            return (\n                <div className=\"user-forms\">\n                    <div className=\"center-spinner spinner\">Loading results...</div>\n                </div>);\n        }\n        if (isPreviewing) {\n            return (\n                <div>\n                    <div className=\"flex-row\">\n                        <h2>Vote Preview</h2>\n                        <ReactToPrint\n                            trigger={() => <a type=\"button\" className=\"button print\"> Print</a>}\n                            content={() => this.componentRef}\n                            pageStyle={\"break-inside: avoid\"}\n                        />\n                    </div>\n                    <div ref={el => (this.componentRef = el)}>\n                        <VoteDetails\n                            sessionData={this.props.session.selectedSession}\n                            billData={voteData.VoteLegislation ? voteData.VoteLegislation.filter(vl => !vl.DeletionDate) : []}\n                            voteMembers={voteData.VoteMember || []}\n                            voteData={voteData}\n                        />\n                    </div>\n                    <div className=\"button-bar\">\n                        <div></div>\n                        <div className=\"align-right\">\n                            <button onClick={this.togglePreview} type=\"button\" className=\"button secondary\">Edit</button>\n                            <button onClick={() => this.handleSave(true)} type=\"button\" disabled={isSaving || preventPublish} className=\"button\">Publish</button>\n                            {preventPublish && <p className=\"input-feedback\">You must publish all preceding votes for this commmittee before publishing this final vote</p>}\n                        </div>\n                    </div>\n                </div>\n            );\n        }\n\n        let showVoteTallyWarningMessage = false;\n        let voteTallyInDescription = voteData.Description.match(/\\(\\d+-Y\\s\\d+-N(\\s\\d+-A)?\\)/);\n        if (voteTallyInDescription) {\n            voteTallyInDescription = voteTallyInDescription[0];\n            showVoteTallyWarningMessage = voteTallyInDescription !== voteData.VoteTally;\n        }\n\n        return (\n            <div className=\"user-forms\">\n                <div>\n                    <Prompt\n                        when={this.state.isDirty}\n                        message={`You have unsaved changes. Are you sure you would like to leave?`}\n                    />\n                </div>\n                {this.state.showPortal &&\n                    <Popout togglePortal={this.togglePortal} windowTitle=\"Preview\">\n                        {this.state.gettingPdf &&\n                            <div className=\"center-spinner spinner\">You must save before seeing changes in this PDF preview</div>\n                        }\n                        <iframe style={{ display: this.state.gettingPdf ? 'none' : 'block', width: '100%', height: '100%' }} ref={this.pdfRef}></iframe>\n                    </Popout>\n                }\n                {this.state.showWarning &&\n                    <div className=\"schedule-modal\">\n                        <div className=\"schedule-modal-content\">\n                            <p>You are about to save a change to a vote. Are you sure about this?</p>\n                            <button className=\"button secondary float-right\" onClick={() => this.toggleWarning(false)}>No</button>\n                            <button className=\"button primary float-right\" onClick={() => this.handleSave()} style={{ marginRight: \"15px\" }}>Yes</button>\n                            <br />\n                        </div>\n                    </div>\n                }\n                <div className=\"dlas-forms\">\n                    <form className=\"vote-form\">\n                        <fieldset className=\"fieldset-collapse fieldset-open\">\n                            <legend>Vote Information</legend>\n                            <div className=\"inner-grid two\">\n                                <div className=\"multi-row three no margin\">\n                                    <div>\n                                        <label className=\"label\" htmlFor=\"sequence\">Vote Number</label>\n                                        <input\n                                            id=\"vote-number\"\n                                            type=\"text\"\n                                            placeholder=\"Vote Number\"\n                                            value={voteData.VoteNumber || ''}\n                                            onChange={(e) => this.handleInputChange('VoteNumber', e.target.value)}\n                                        />\n                                    </div>\n                                    <div>\n                                        <label className=\"label\" htmlFor=\"time\">Time of Vote</label>\n                                        <DatePicker\n                                            id=\"time\"\n                                            selected={moment(voteData.VoteDate)}\n                                            onChange={this.handleDateChange}\n                                            showTimeSelect\n                                            timeFormat=\"h:mm A\"\n                                            timeIntervals={1}\n                                            timeCaption=\"Time\"\n                                            dateFormat=\"MM/DD/YYYY h:mm A\"\n                                        />\n                                    </div>\n                                    <div>\n                                        <label className=\"label\" htmlFor=\"pass-fail\">Pass/Fail</label>\n                                        <Select\n                                            id=\"pass-fail\"\n                                            className=\"grid-selector-dropdown\"\n                                            styles={customStyles()}\n                                            options={PassFailOptions}\n                                            value={PassFailOptions.find(o => o.value === voteData.PassFail)}\n                                            onChange={(value) => this.handleInputChange(\"PassFail\", value.value)} />\n                                    </div>\n                                </div>\n                                <div className=\"multi-row two no margin\" style={{ gap: '15px', gridTemplateColumns: '80% 20%' }}>\n                                    <div style={{ display: 'grid', gridTemplateColumns: '1fr 100px' }}>\n                                        <div>\n                                            <div>\n                                                <label className=\"label\">Bills</label>\n                                                <a className={`icon ${editingVoteLegislation ? 'save' : 'edit'}`} style={{ marginLeft: '7px' }} onClick={this.toggleEditVoteLegislation} />\n                                                {editingVoteLegislation && <a className=\"icon delete\" style={{ marginLeft: '7px' }} onClick={() => this.toggleEditVoteLegislation(true)} />}\n                                            </div>\n                                            {voteData.VoteLegislation &&\n                                                (editingVoteLegislation ?\n                                                    (this.state.voteData.ChamberCode === \"S\" && this.state.voteData.VoteType === \"Committee\")\n                                                        ? <Select\n                                                            styles={customStyles(true)}\n                                                            options={this.state.billList.filter(bl => !voteData.VoteLegislation.filter(vl => !vl.DeletionDate).map(vl => vl.LegislationID).includes(bl.LegislationID))}\n                                                            value={voteData.VoteLegislation.filter(vl => !vl.DeletionDate)}\n                                                            getOptionLabel={vl => vl.LegislationNumber}\n                                                            onChange={this.handleSenateCommitteeVoteLegislationChange}\n                                                        />\n                                                        : <Select\n                                                            styles={customStyles(true)}\n                                                            options={this.state.billList.filter(bl => !voteData.VoteLegislation.filter(vl => !vl.DeletionDate).map(vl => vl.LegislationID).includes(bl.LegislationID))}\n                                                            value={voteData.VoteLegislation.filter(vl => !vl.DeletionDate)}\n                                                            getOptionLabel={vl => vl.LegislationNumber}\n                                                            onChange={this.handleVoteLegislationChange}\n                                                            isMulti /* Conditionals for isMulti don't work */\n                                                        />\n                                                    :\n                                                    <input\n                                                        type=\"text\"\n                                                        value={voteData.VoteLegislation.filter(vl => !vl.DeletionDate).map((leg, index) => leg.LegislationNumber).join(', ')}\n                                                        title={voteData.VoteLegislation.filter(vl => !vl.DeletionDate).map((leg, index) => leg.LegislationNumber).join(', ')}\n                                                        disabled\n                                                    />)\n                                            }\n                                        </div>\n                                        <div style={{ position: 'relative', left: \"20px\" }}>\n                                            <div className=\"flex-row\" style={{ justifyContent: 'flex-start', alignItems: 'center' }}>\n                                                <div style={{ textAlign: 'left', width: '60px' }}>\n                                                    <label htmlFor=\"reprint-button\" style={{ paddingLeft: '0px' }} className=\"checkbox-label label no-background\">Is Block</label>\n                                                    <div className=\"toggle-switch\" disabled={this.state.settingIsBlock || (voteData.IsBlock && voteData.VoteLegislation && voteData.VoteLegislation.filter(v => !v.DeletionDate).length > 1)} onClick={() => this.handleInputChange(\"IsBlock\", !voteData.IsBlock)}>\n                                                        <input id=\"reprint-button\" checked={voteData.IsBlock} type=\"checkbox\" />\n                                                        <span className=\"slider\"></span>\n                                                    </div>\n                                                </div>\n                                                {this.state.settingIsBlock && <div className=\"spinner small-spinner\" style={{ height: '0px' }} />}\n                                            </div>\n                                        </div>\n                                    </div>\n                                    <div className=\"published-status multi-row two\">\n                                        {voteData.VoteType === \"Committee\" && voteData.CommitteeID && !voteData.ParentCommitteeID && voteData.VoteDate &&\n                                            <div style={{ width: '102%', textAlign: 'left' }}>\n                                                <label htmlFor=\"reprint-button\" style={{ paddingLeft: '0px' }} className=\"checkbox-label label no-background\">Final Vote</label>\n                                                <div className=\"toggle-switch\" onClick={() => this.handleInputChange(\"FinalVote\", !voteData.FinalVote)}>\n                                                    <input id=\"reprint-button\" checked={voteData.FinalVote} type=\"checkbox\" />\n                                                    <span className=\"slider\"></span>\n                                                </div>\n                                            </div>\n                                        }\n                                        {voteData.IsPublic ? <p style={{ textAlign: 'right', marginTop: '0px' }}>Published</p> : <p style={{ marginTop: '0px' }} className=\"dirty\">Not Published</p>}\n                                    </div>\n                                </div>\n                            </div>\n                            <div className=\"multi-row three-two-and-one no margin\">\n                                <div>\n                                    <label className=\"label\" htmlFor=\"vote-act\">Vote Action</label>\n                                    <Select\n                                        id=\"vote-act\"\n                                        value={selectedVoteActionDescription}\n                                        options={voteActionList}\n                                        getOptionLabel={v => v.EventCode + \" - \" + v.Description}\n                                        getOptionValue={v => v.EventCode}\n                                        styles={customStyles()}\n                                        placeholder={this.state.loadingVoteActionList ? 'Loading...' : 'Select...'}\n                                        onChange={this.handleVoteActionDescriptionChange}\n                                    />\n                                </div>\n                                <div>\n                                    <label className=\"label\" htmlFor=\"ref-committee\">Committee Rereferred</label>\n                                    <Select\n                                        id=\"ref-committee\"\n                                        value={this.state.committeeList ? this.state.committeeList.find(x => x.value === this.state.voteData.ReferToCommitteeID) : { label: \"Loading...\" }}\n                                        options={this.state.committeeList}\n                                        styles={customStyles()}\n                                        placeholder={this.state.loadingVoteActionList ? 'Loading...' : 'Select...'}\n                                        onChange={this.handleCommitteeChange}\n                                        isDisabled={!REFER_ACTIONS.includes(this.state.voteData.EventCode)}\n                                        isClearable\n                                    />\n                                </div>\n                                <div>\n                                    <label className=\"label\" htmlFor=\"motion-code\">Vote Tally</label>\n                                    <input\n                                        id=\"vote-tally\"\n                                        className={showVoteTallyWarningMessage ? 'input-feedback-warning-background' : ''}\n                                        type=\"text\"\n                                        placeholder=\"Vote Tally\"\n                                        value={voteData.VoteTally}\n                                        disabled\n                                    />\n                                </div>\n                                {voteData.VoteType === \"Floor\" &&\n                                    <div>\n                                        <label className=\"label\" htmlFor=\"vote-act\">Calendar Category</label>\n                                        <Select\n                                            id=\"vote-act\"\n                                            value={selectedCalendarCategoryType}\n                                            options={calendarCategoryTypeList}\n                                            getOptionLabel={v => v.Description + (v.DisplayType ? ' (' + v.CategoryType + ')' : '')}\n                                            getOptionValue={v => v.CalendarCategoryTypeID}\n                                            styles={customStyles()}\n                                            onChange={this.handleCalendarCategoryTypeChange}\n                                        />\n                                    </div>\n                                }\n                            </div>\n                            <div className=\"multi-row three-and-one no margin\">\n                                <div>\n                                    <label className=\"label\" htmlFor=\"vote-desc\">Vote Description (Appears on the Tally Sheet)</label>\n                                    <input\n                                        style={showVoteTallyWarningMessage ? { marginBottom: '0px' } : {}}\n                                        className={showVoteTallyWarningMessage ? 'input-feedback-warning-background' : ''}\n                                        id=\"vote-desc\"\n                                        type=\"text\"\n                                        placeholder=\"Vote Description\"\n                                        value={voteData.Description}\n                                        onChange={(e) => this.handleInputChange(\"Description\", e.target.value)}\n                                    />\n                                    {showVoteTallyWarningMessage && <p className=\"input-feedback-warning\" style={{ marginTop: '2px' }}>{voteTallyInDescription} in the Vote Description does not match the Vote Tally {voteData.VoteTally}. This will not prevent you from saving.</p>}\n                                </div>\n                                <div>\n                                    <label className=\"label\" htmlFor=\"vote-leg\">Incorporating Legislation</label>\n                                    <Select\n                                        id=\"vote-leg\"\n                                        value={(this.state.billList && this.state.voteData.ReferenceID && INCORPORATED_ACTIONS.includes(this.state.voteData.EventCode) && this.state.billList.find(x => x.LegislationID === this.state.voteData.ReferenceID)) ? this.state.billList.find(x => x.LegislationID === this.state.voteData.ReferenceID) : { label: \"Select...\" }}\n                                        options={this.state.sessionBills}\n                                        styles={customStyles()}\n                                        onChange={this.handleBillChange}\n                                        isDisabled={!INCORPORATED_ACTIONS.includes(this.state.voteData.EventCode) || !this.state.voteData.VoteType === \"Committee\"}\n                                    />\n                                </div>\n                            </div>\n                            <div>\n                                <button type=\"button\" className=\"button\" onClick={this.toggleChangeVotes}>{!this.state.changeVotes ? 'Change Votes' : 'Cancel'}</button>\n                            </div>\n                            <VoteMembers\n                                voteMembers={this.state.voteData.VoteMember || []}\n                                handleVoteChange={this.handleVoteChange}\n                                changeVotes={this.state.changeVotes}\n                            />\n                            {voteData.VoteType === \"Floor\" &&\n                                <VoteStatements\n                                    members={voteData.VoteMember || []}\n                                    updateStatement={this.updateStatement}\n                                />\n                            }\n                            <div>\n                                <p className=\"title\">{\"Vote Comment\" + (this.state.voteData.ChamberCode === \"S\" ? \" (ex. Lt. Governor's vote in the event of a tie)\" : \"\")}</p>\n                                <input\n                                    style={{ width: \"100%\" }}\n                                    type=\"text\"\n                                    value={this.state.voteData.VoteComment}\n                                    placeholder=\"Vote Comment\"\n                                    onChange={(e) => this.handleInputChange(\"VoteComment\", e.target.value)}\n                                />\n                            </div>\n                        </fieldset>\n                        <div className=\"button-bar\">\n                            <div>\n                                <button type=\"button\" className=\"button\" onClick={this.resetForm}>Reset</button>\n                                {this.state.voteData.MinutesBookID && this.state.voteData.ChamberCode === \"S\" && this.state.voteData.VoteType === \"Committee\" &&\n                                    <>\n                                        <button style={{ marginLeft: \"295px\" }} type=\"button\" className=\"button primary\" onClick={() => this.props.history.push(\"/session-details/\" + this.state.voteData.SessionCode + \"/committee-information/\" + this.state.voteData.CommitteeNumber + \"/meetings/\" + this.state.voteData.MinutesBookID + \"/1\")}>Meeting View</button>\n                                        <button type=\"button\" className=\"button primary\" onClick={() => this.props.history.push(\"/session-details/\" + this.state.voteData.SessionCode + \"/committee-information/\" + this.state.voteData.CommitteeNumber + \"/meetings/\" + this.state.voteData.MinutesBookID + \"/2\")}>Chair's Report</button>\n                                        <button type=\"button\" className=\"button primary\" onClick={() => this.props.history.push(\"/session-details/\" + this.state.voteData.SessionCode + \"/committee-information/\" + this.state.voteData.CommitteeNumber + \"/meetings/\" + this.state.voteData.MinutesBookID + \"/3\")}>Vote Sheet</button>\n                                    </>\n                                }\n                            </div>\n                            <div className=\"align-right\" style={{display: \"inline-flex\", height: \"32px\"}}>\n                                {this.state.showEditingVoteLegislationMessage && <span style={{ fontSize: '15px' }}>Please finish updating the vote legislation</span>}\n                                {this.state.voteData.EventDeletionDate && <span className=\"txt fail\" style={{fontSize: \"15px\", whiteSpace: \"nowrap\"}}>Vote Event has been deleted</span>}\n                                <button disabled={isSaving\n                                    || (this.state.savedIncorporated && !this.state.isDirty)\n                                } onMouseEnter={() => { if (editingVoteLegislation) { this.setState({ showEditingVoteLegislationMessage: true }) } }} onClick={() => editingVoteLegislation ? null : this.state.changeVotes && this.state.isDirty ? this.toggleWarning() : this.handleSave(voteData.IsPublic)} type=\"button\" className=\"button\">{voteData.IsPublic ? \"Republish\" : \"Save\"}</button>\n                                {!voteData.IsPublic && <button disabled={pendingSave || isSaving} onClick={this.togglePreview} type=\"button\" className=\"button secondary\">Review</button>}\n                                {voteData.VoteType === \"Floor\" && voteData.ChamberCode === \"S\" && <button disabled={pendingSave || isSaving} onClick={this.togglePortal} type=\"button\" className=\"button secondary\">Preview Tally</button>}\n                            </div>\n                        </div>\n                    </form>\n                </div>\n            </div>);\n    }\n}\n\nconst VoteMembers = props => {\n    const responseStyle = (res) => {\n        switch (res) {\n            case 'Y':\n                return 'yea';\n            case 'N':\n                return 'nay';\n            case 'A':\n                return 'abs';\n            default:\n                return '';\n        }\n    }\n\n    let arrangedVoteMembers = [[]];\n    let voteColumns = 0;\n\n    props.voteMembers.map((member, index) => {\n        if (index % 10 > 0 || (voteColumns === 0 && arrangedVoteMembers[0].length === 0)) {\n            arrangedVoteMembers[voteColumns].push(member)\n        } else {\n            voteColumns++;\n            arrangedVoteMembers.push([member])\n        }\n    })\n\n    return (\n        <div className=\"no-gap-grid four vote-members\">\n            {arrangedVoteMembers.map((memberColumn, i) =>\n                <div key={\"column-\" + i} className=\"inner-grid ten-vert\">\n                    {memberColumn.map((memberVote, j) =>\n                        <div className=\"inner-grid two vote-member-container\" key={\"member-\" + j}>\n                            <span>{memberVote.PatronDisplayName}</span>\n                            <div>\n                                <select disabled={!props.changeVotes} onChange={(e) => props.handleVoteChange(parseInt(i.toString() + j.toString()), e.target.value)} className={\"vote-response \" + responseStyle(memberVote.ResponseCode)} value={memberVote.ResponseCode}>\n                                    <option value=\"Y\">Y</option>\n                                    <option value=\"N\">N</option>\n                                    <option value=\"A\">A</option>\n                                    <option value=\"X\">X</option>\n                                </select>\n                            </div>\n                        </div>\n                    )}\n                </div>\n            )}\n        </div>);\n}\n\nclass VoteStatements extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            selectedMember: '',\n            editorContent: '',\n            newVoteStatement: []\n        }\n        this.toggleEditing = this.toggleEditing.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n        this.handleMemberSelection = this.handleMemberSelection.bind(this);\n        this.saveChange = this.saveChange.bind(this);\n        this.addStatement = this.addStatement.bind(this);\n        this.exitEdit = this.exitEdit.bind(this);\n    }\n\n    handleMemberSelection(val) {\n        this.setState({\n            selectedMember: val\n        });\n    }\n\n    toggleEditing(statementIndex, memberId) {\n        let members = [...this.props.members];\n        const memberIndex = members.findIndex(member => member.MemberID === memberId);\n        members[memberIndex].isEditing = !members[memberIndex].isEditing;\n        this.state.newVoteStatement[statementIndex] = members[memberIndex].VoteStatement;\n        this.props.updateStatement(members);\n    }\n\n    exitEdit() {\n        this.setState({\n            selectedMember: \"\",\n            editorContent: \"\"\n        })\n    }\n\n    handleChange(statementIndex, val) {\n        let newVoteStatement = [...this.state.newVoteStatement];\n        newVoteStatement[statementIndex] = val\n        this.setState({\n            newVoteStatement: newVoteStatement\n        });\n    }\n\n    saveChange(statementIndex, memberId) {\n        let members = [...this.props.members];\n        const memberIndex = members.findIndex(member => member.MemberID === memberId);\n        members[memberIndex].VoteStatement = this.state.newVoteStatement[statementIndex];\n        members[memberIndex].isEditing = false;\n        this.props.updateStatement(members);\n    }\n\n    addStatement() {\n        let members = [...this.props.members];\n        const memberIndex = members.findIndex(member => member.MemberID === this.state.selectedMember.MemberID);\n        members[memberIndex].VoteStatement = this.state.editorContent;\n        this.props.updateStatement(members);\n        this.setState({\n            selectedMember: '',\n            editorContent: ''\n        });\n    }\n\n    removeStatement(memberId) {\n        let members = [...this.props.members];\n        const memberIndex = members.findIndex(member => member.MemberID === memberId);\n        members[memberIndex].VoteStatement = '';\n        this.props.updateStatement(members);\n    }\n\n    render() {\n        const { selectedMember, editorContent, newVoteStatement } = this.state;\n        let memberOptions = [];\n        this.props.members.forEach(member => {\n            if (!member.VoteStatement) {\n                member.label = member.PatronDisplayName;\n                member.value = member.MemberID;\n                memberOptions.push(member);\n            }\n        });\n        const voteStatements = this.props.members.filter(member => member.VoteStatement);\n        const customStyles = {\n            option: (base, state) => ({\n                ...base,\n                fontSize: '0.8em',\n            }),\n            control: (base) => ({\n                ...base,\n                padding: '1px',\n                margin: 0,\n                minHeight: 0,\n                fontSize: '0.8em',\n            }),\n            singleValue: (base, state) => {\n                return { ...base, };\n            }\n        }\n        return (\n            <div className=\"vote-statements\">\n                <p className=\"title\">Add a Vote Statement</p>\n\n                <div className=\"vote-statement-text no-gap-grid wide-middle\">\n                    <div className=\"vote-statement-header\">\n                        <span>Member</span>\n                    </div>\n                    <div className=\"vote-statement-header\">\n                        <span>Statement</span>\n                    </div>\n                    <div className=\"vote-statement-header\">\n                        <span></span>\n                    </div>\n                    {voteStatements.map((statement, index) =>\n                        <React.Fragment key={index}>\n                            <div className=\"vote-statement-content\">\n                                <span>{statement.PatronDisplayName}</span>\n                            </div>\n                            {statement.isEditing ?\n                                <React.Fragment>\n                                    <div className=\"vote-statement-content\">\n                                        <input\n                                            type=\"text\"\n                                            value={newVoteStatement[index]}\n                                            onChange={e => this.handleChange(index, e.target.value)}\n                                        />\n                                    </div>\n                                    <div>\n                                        <button onClick={() => this.saveChange(index, statement.MemberID)} type=\"button\" className=\"icon save\"></button>\n                                        <button onClick={() => this.toggleEditing(index, statement.MemberID)} type=\"button\" className=\"icon delete\"></button>\n                                    </div>\n                                </React.Fragment>\n                                :\n                                <React.Fragment>\n                                    <div className=\"vote-statement-content\">\n                                        <span>{statement.VoteStatement}</span>\n                                    </div>\n                                    <div>\n                                        <button onClick={() => this.toggleEditing(index, statement.MemberID)} type=\"button\" className=\"icon edit\"></button>\n                                        <button onClick={() => this.removeStatement(statement.MemberID)} type=\"button\" className=\"icon delete\"></button>\n                                    </div>\n                                </React.Fragment>\n                            }\n                        </React.Fragment>\n                    )}\n                    <div className=\"member-dropdown\">\n                        <Select\n                            className=\"grid-selector-dropdown\"\n                            styles={customStyles}\n                            options={memberOptions}\n                            value={selectedMember}\n                            onChange={this.handleMemberSelection}\n                        />\n                    </div>\n                    <div>\n                        {selectedMember ?\n                            <input\n                                type=\"text\"\n                                id=\"new-vote-statement-text\"\n                                value={editorContent}\n                                onChange={(e) => {\n                                    this.setState({\n                                        editorContent: e.target.value\n                                    });\n                                }}\n                            />\n                            :\n                            <span></span>\n                        }\n                    </div>\n                    <div>\n                        {selectedMember ?\n                            <React.Fragment>\n                                <button onClick={this.addStatement} type=\"button\" className=\"icon save\"></button>\n                                <button onClick={this.exitEdit} type=\"button\" className=\"icon delete\"></button>\n                            </React.Fragment>\n                            :\n                            <span></span>\n                        }\n                    </div>\n\n                </div>\n\n\n            </div>);\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { votes, nav, session, calendar, bills, committee } = state;\n        return {\n            votes,\n            nav,\n            session,\n            calendar,\n            bills,\n            committee\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, voteActionCreators, navActionCreators, sessionActionCreators, calendarActionCreators, billActionCreators, committeeActionCreators), dispatch)\n        }\n    }\n)(VoteForm)","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { Route } from 'react-router';\nimport VoteGrid from './lis-vote-grid';\nimport VoteForm from './lis-vote-form'\nimport moment from 'moment-timezone';\nimport { communicationsActionCreators } from '../../../stores/lis-communications-store';\nimport { minutesActionCreators } from '../../../stores/lis-minutes-store';\nimport { voteActionCreators } from '../../../stores/lis-votes-store';\n\nclass VoteManagement extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            startDate: moment(),\n            endDate: moment(),\n            chamber: null,\n            committee: null,\n            voteOrigin: null,\n            organizedVotes: [],\n            isLoaded: true\n        };\n        this.handleDateChange = this.handleDateChange.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n        this.getVotes = this.getVotes.bind(this);\n        this.showVotes = this.showVotes.bind(this);\n        this.createChairmansReportSummarizedOnMinutes = this.createChairmansReportSummarizedOnMinutes.bind(this);\n    }\n\n    handleDateChange(key, value, callback) {\n        this.setState({\n            [key]: value\n        }, () => callback());\n    }\n\n    handleChange(key, value, callback) {\n        this.setState({\n            [key]: value\n        }, () => {\n            if (key === 'voteOrigin' || key === 'chamber') {\n                this.setState({ committee: null }, () => {\n                    if (callback) {\n                        callback();\n                    }\n                })\n            } else {\n                if (callback) {\n                    callback();\n                }\n            }\n        });\n    }\n\n    showVotes(dateIndex, value) {\n        let organizedVotes = [...this.state.organizedVotes];\n        organizedVotes[dateIndex].show = typeof value === 'boolean' ? value : !organizedVotes[dateIndex].show;\n        this.setState({\n            organizedVotes: organizedVotes\n        });\n    }\n\n    async createChairmansReportSummarizedOnMinutes(sessionID, chamberCode, committeeID, commDate, votedLegislation) {\n        let success = false;\n        let createObj = {\n            CommunicationDate: commDate,\n            IsPublic: false,\n            ChamberCode: chamberCode,\n            CommunicationType: 'Committee',\n            CommitteeID: committeeID,\n            SessionID: sessionID,\n        };\n\n        await this.props.actions.createComm({ CommunicationResponse: [createObj] })\n            .then(async () => {\n                success = true; //as long as it got here, succeed because it may be valid/expected for below checks to not pass\n                let communication = this.props.communications.commCreate;\n                if (communication.CommunicationCategories && communication.CommunicationCategories.length) {\n                    const votedLegislationNumbers = votedLegislation.map(vl => vl.LegislationNumber);\n                    const commCategoriesWithVotedBills = communication.CommunicationCategories.filter(cat => cat.CommunicationLegislation && cat.CommunicationLegislation.map(cl => cl.LegislationNumber).some(cl => votedLegislationNumbers.includes(cl)));\n                    if (commCategoriesWithVotedBills.length) {\n                        commCategoriesWithVotedBills.forEach(cat => {\n                            cat.CommunicationLegislation.filter(cl => votedLegislationNumbers.includes(cl.LegislationNumber)).forEach(cl => {\n                                cl.IsActive = true;\n                                //set suffix of communication legislation (indicating presence of amendment or substitute) based on event code\n                                const vote = votedLegislation.find(vl => vl.LegislationNumber === cl.LegislationNumber);\n                                if (vote.EventCode) {\n                                    if (vote.EventCode.endsWith('06') || vote.EventCode.endsWith('07')) { //reported with amendment\n                                        cl.Suffix = 'A'\n                                    } else if (vote.EventCode.endsWith('08')) { //reported with substitute\n                                        cl.Suffix = 'S'\n                                    }\n                                }\n                            })\n                        })\n                        communication.IsPublic = true;\n                        await this.props.actions.saveComm({ CommunicationResponse: [communication] })\n                            .then(async () => {\n                                const commId = this.props.communications.commSave.CommunicationID;\n                                await this.props.actions.saveCommFile(\"?communicationID=\" + commId);\n                            })\n                    } else {\n                        console.log(\"No communication categories in created communication with voted on legislation\")\n                    }\n                } else {\n                    console.log(\"No communication categories in created communication\")\n                }\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n                success = false;\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n                success = false;\n            });\n        return success;\n    }\n\n    getVotes() {\n        const { startDate, endDate, chamber, committee, voteOrigin } = this.state;\n        if (startDate && endDate && chamber && voteOrigin) {\n            this.setState({ isLoaded: false });\n            let voteParams = `?startDate=${moment(startDate).startOf('day').format('YYYY-MM-DDTHH:mm:ss')}&endDate=${moment(endDate).endOf('day').format('YYYY-MM-DDTHH:mm:ss')}`;\n            voteParams += '&chamberCode=' + chamber.value;\n            voteParams += '&voteTypeID=' + voteOrigin.value;\n            if (voteOrigin.label !== \"Floor\" && committee && committee.CommitteeID > 0) {\n                voteParams += '&committeeID=' + committee.CommitteeID\n            }\n            this.props.actions.getVoteList(voteParams)\n                .then(() => {\n                    if (this.props.votes.voteListError) {\n                        throw this.props.votes.voteListError;\n                    }\n\n                    let voteList = [...this.props.votes.voteList];\n                    \n                    if(this.state.chamber.value !== \"S\" && this.state.voteOrigin.value !== 1) {\n                        voteList = voteList.filter(v => !v.IsVoice);\n                    }\n\n                    if (this.props.votes.voteList.length === 0) {\n                        throw 'No Votes in list';\n                    }\n                    // Turn the list of votes into a list of dates each containing a list of votes\n                    // This formatting is done so the votes can be listed in the table with a date as a container\n                    voteList.sort((a, b) => {\n                        return new Date(b.VoteDate) - new Date(a.VoteDate);\n                    });\n                    let organizedVotes = [];\n                    let voteArray = [];\n                    let previousVote = voteList[0];\n                    voteList.forEach((vote, index) => {\n                        if (moment(previousVote.VoteDate).format('L') !== moment(vote.VoteDate).format('L')) {\n                            //Add the list of legislation to the category\n                            let newDateContainer = {\n                                Votes:\n                                    chamber.value === \"H\" ? [...voteArray].sort((a, b) => {\n                                        if (a.LegislationNumber && b.LegislationNumber && (a.FinalVote === b.FinalVote || voteOrigin.label === \"Floor\")) {\n                                            let legislationKeyA = a.LegislationNumber.match(/\\d+/);\n                                            let legislationKeyB = b.LegislationNumber.match(/\\d+/);\n                                            return a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]) ||\n                                                a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]) ||\n                                                (legislationKeyA && legislationKeyA.length && legislationKeyB && legislationKeyB.length && parseInt(legislationKeyA[0]) - parseInt(legislationKeyB[0])) ||\n                                                new Date(a.VoteDate) - new Date(b.VoteDate)\n                                        } else if (a.FinalVote) {\n                                            return 1\n                                        } else {\n                                            return -1\n                                        }\n                                    })\n                                        :\n                                        [...voteArray].sort((a, b) => {\n                                            if (a.FinalVote === b.FinalVote || voteOrigin.label === \"Floor\") {\n                                                return a.VoteNumber.localeCompare(b.VoteNumber)\n                                            } else if (a.FinalVote) {\n                                                return 1\n                                            } else {\n                                                return -1\n                                            }\n                                        }),\n                                Date: previousVote.VoteDate,\n                                sortTimeDesc: false\n                            };\n                            organizedVotes.push(newDateContainer);\n                            //Empty out the leg array so we can use it for another category\n                            voteArray = [];\n                            //Add the first item to the next category\n                            voteArray.push(vote);\n                        } else {\n                            voteArray.push(vote);\n                        }\n                        //Set this variable so the next iteration will know what the vote date of the previous iteration was\n                        previousVote = vote;\n                    });\n                    //If the vote array still has elements then that means not every vote in the results have been added to a container\n                    //So, check to see if the vote array has elements and if so create another container\n                    if (voteArray.length > 0) {\n                        let newDateContainer = {\n                            Votes:\n                                chamber.value === \"H\" ? [...voteArray].sort((a, b) => {\n                                    if (a.FinalVote === b.FinalVote || voteOrigin.label === \"Floor\") {\n                                        let legislationKeyA = a.LegislationNumber?.match(/\\d+/) ?? \"\";\n                                        let legislationKeyB = b.LegislationNumber?.match(/\\d+/) ?? \"\";\n                                        return (a.LegislationNumber && b.LegislationNumber && a.LegislationNumber[0].localeCompare(b.LegislationNumber[0])) ||\n                                            (a.LegislationNumber && b.LegislationNumber && a.LegislationNumber[1].localeCompare(b.LegislationNumber[1])) ||\n                                            (legislationKeyA && legislationKeyA.length && legislationKeyB && legislationKeyB.length && parseInt(legislationKeyA[0]) - parseInt(legislationKeyB[0])) ||\n                                            new Date(a.VoteDate) - new Date(b.VoteDate)\n                                    } else if (a.FinalVote) {\n                                        return 1\n                                    } else {\n                                        return -1\n                                    }\n                                })\n                                    :\n                                    [...voteArray].sort((a, b) => {\n                                        if (a.FinalVote === b.FinalVote || voteOrigin.label === \"Floor\") {\n                                            return a.VoteNumber.localeCompare(b.VoteNumber)\n                                        } else if (a.FinalVote) {\n                                            return 1\n                                        } else {\n                                            return -1\n                                        }\n                                    }),\n                            Date: previousVote.VoteDate,\n                            sortTimeDesc: false\n                        };\n                        organizedVotes.push(newDateContainer);\n                    }\n\n                    const currentlyShownOrganizedVotes = [...this.state.organizedVotes].filter(date => date.show);\n                    currentlyShownOrganizedVotes.forEach(date => {\n                        const newOrganizedVoteDate = organizedVotes.find(newDate => newDate.Date === date.Date);\n                        if (newOrganizedVoteDate) {\n                            newOrganizedVoteDate.show = true;\n                        }\n                    });\n                    this.setState({\n                        isLoaded: true,\n                        organizedVotes: organizedVotes\n                    });\n                })\n                .catch((err) => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    console.log(err);\n                    this.setState({\n                        isLoaded: true,\n                        organizedVotes: []\n                    });\n                });\n\n            this.props.actions.getVoteActionList(\"?voteTypeID=\" + this.state.voteOrigin.VoteTypeID + \"&chamberCode=\" + this.state.chamber.value)\n        }\n    }\n\n    render() {\n        const { startDate, endDate, voteOrigin, committee, chamber, organizedVotes, isLoaded } = this.state;\n        return (\n            <div>\n                <Route exact path={this.props.match.path} render={props => <VoteGrid\n                    {...props}\n                    startDate={startDate}\n                    endDate={endDate}\n                    voteOrigin={voteOrigin}\n                    committeeVal={committee}\n                    chamber={chamber}\n                    handleDateChange={this.handleDateChange}\n                    handleChange={this.handleChange}\n                    getVotes={this.getVotes}\n                    organizedVotes={organizedVotes}\n                    isLoaded={isLoaded}\n                    showVotes={this.showVotes}\n                    createChairmansReportSummarizedOnMinutes={this.createChairmansReportSummarizedOnMinutes}\n                    voteActions={this.props.votes.voteActionList}\n                />} />\n                <Route path={`${this.props.match.path}/edit-vote/:voteid`} render={props => <VoteForm\n                    {...props}\n                    createChairmansReportSummarizedOnMinutes={this.createChairmansReportSummarizedOnMinutes}\n                />} />\n            </div>\n        )\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { votes, communications, minutes } = state;\n        return {\n            votes,\n            communications,\n            minutes\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, voteActionCreators, communicationsActionCreators, minutesActionCreators), dispatch)\n        }\n    }\n)(VoteManagement)","import React from 'react';\nimport moment from 'moment-timezone'\nimport ReactToPrint from 'react-to-print';\n\nclass PrintRoomGrid extends React.Component {\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            showRow: [],\n            printPreviewIndex: undefined\n        }\n        this.toggleRow = this.toggleRow.bind(this);\n        this.togglePrintView = this.togglePrintView.bind(this);\n\n        this.componentRef = React.createRef();\n    }\n\n    togglePrintView(value) {\n        this.setState({\n            printPreviewIndex: value\n        })\n    }\n\n    toggleRow(batchIndex) {\n        let showRow = [...this.state.showRow];\n        showRow[batchIndex] = !showRow[batchIndex];\n        this.setState({\n            showRow: showRow\n        });\n    }\n\n    componentDidMount() {\n        if (this.props.urlBatchId !== \"\" && this.props.textResults.length > 0 && this.state.urlBatchIndex === \"\") {\n            let index = this.props.textResults.findIndex(x => x.PrintBatchID == this.props.urlBatchId);\n            this.toggleRow(index)\n        }\n    }\n\n    render() {\n        const { showRow } = this.state;\n        const findMember = memberId => {\n            const patron = this.props.members.find(member => member.MemberID === memberId);\n            if (patron) {\n                return patron.PatronDisplayName;\n            } else {\n                return '';\n            }\n        }\n        const headerStyle = {\n            color: 'white',\n            backgroundColor: '#9e9e9e',\n            padding: '10px',\n            border: '1px solid #e0e0e0'\n        }\n\n        const headerStyleComplete = {\n            color: 'white',\n            backgroundColor: '#dc3545',\n            padding: '10px',\n            border: '1px solid #e0e0e0'\n        }\n\n        const filterTextResults = (textResults) => {\n            let filteredTextResults = [...textResults];\n\n            filteredTextResults = filteredTextResults.filter(x =>\n                this.props.showComplete\n                    ? true\n                    : !this.props.viewOnlyCompletedItems\n                        ? x.BatchItems.findIndex(y => y.PrintDate === undefined) > -1\n                            ? true\n                            : false\n                        : x.BatchItems.findIndex(y => y.PrintDate !== undefined) > -1\n                            ? true\n                            : false\n            )\n\n            filteredTextResults = filteredTextResults.filter(batch => batch.BatchItems.every(text => {\n                if (this.props.introStartDate && this.props.introEndDate) {\n                    let formattedStartDate = this.props.introStartDate.clone().hour(0);\n                    let formattedEndDate = this.props.introEndDate.clone().endOf('day');\n\n                    return moment(text.VersionDate).isBetween(formattedStartDate, formattedEndDate);\n                } else if (this.props.introStartDate) {\n                    let formattedStartDate = this.props.introStartDate.clone().hour(0);\n\n                    return moment(text.VersionDate).isSameOrAfter(formattedStartDate);\n                } else if (this.props.introEndDate) {\n                    let formattedEndDate = this.props.introEndDate.clone().endOf('day');\n\n                    return moment(text.VersionDate).isSameOrBefore(formattedEndDate);\n                } else {\n                    return true;\n                }\n            }));\n\n            return filteredTextResults ?? [];\n        }\n\n        const flattenBatches = (textResults) => {\n            let flatBillList = []\n\n            textResults.forEach(batch => {\n                batch.BatchItems.forEach(item => {\n                    if (item.PrintDate) {\n                        flatBillList.push({ documentCode: item.DocumentCode, printDate: item.PrintDate })\n                    }\n                })\n            });\n\n            return flatBillList.sort((a, b) => { return a.documentCode.localeCompare(b.documentCode) })\n        }\n\n        return this.props.viewCompletedByBill ?\n            <div className='view-by-completed-bills'>\n                {flattenBatches(this.props.textResults).map(x => {\n                    return <p>{x.documentCode + \" - \" + moment(x.printDate).format(\"M/D/YYYY h:mm:ss\")}</p>\n                })}\n            </div>\n            : !this.props.viewCompletedByBill\n                ? <div style={{ marginBottom: \"35px\" }}>\n                    {this.state.printPreviewIndex &&\n                        <div className=\"schedule-modal\">\n                            <div className=\"schedule-modal-content fit-content center-content\" style={{ maxHeight: \"fit-content\", marginTop: \"50px\" }}>\n                                <ReactToPrint\n                                    trigger={() => <button style={{ margin: \"0 0 0 10px\", float: \"right\" }} type=\"button\" className=\"button primary\">Print</button>}\n                                    content={() => this.componentRef}\n                                />\n                                <button style={{ float: \"right\" }} type=\"button\" className=\"button secondary\" onClick={() => this.togglePrintView(undefined)}>Close</button>\n                                {/* All styling is being applied inline due to issues with the bill room's computer (for whatever reason) not loading the styling into the browser print preview window. */}\n                                <div\n                                    ref={el => (this.componentRef = el)}\n                                    style={{\n                                        padding: \"20px 50px\",\n                                        lineHeight: \"2.5em\",\n                                        fontSize: \"16px\"\n                                    }}\n                                >\n                                    <h2 style={{ fontFamily: '\"Lato\", sans-serif', fontWeight: '400', color: '#34495e' }}>\n                                        {moment(this.props.textResults[this.state.printPreviewIndex].BatchDate).format(\"M/D/YYYY h:mm:ss A\")\n                                            + \" \"\n                                            + \"(BATCH \" + this.props.textResults[this.state.printPreviewIndex].BatchSequence + \")\"\n                                            + \" \"\n                                            + (this.props.textResults[this.state.printPreviewIndex].BatchDescription ? this.props.textResults[this.state.printPreviewIndex].BatchDescription : \"\")\n                                            + \" \"\n                                            + (this.props.textResults[this.state.printPreviewIndex].VendorBatch ? \"Vendor\" : \"Bill Room\")\n                                            + \" \"\n                                            + \"Total Pages: \" + this.props.textResults[this.state.printPreviewIndex].totalPageCount\n                                        }</h2>\n                                    <div\n                                        style={{\n                                            display: \"grid\",\n                                            gridTemplateColumns: \"100px 75px 100px 100px 1fr\",\n                                            gridGap: \"10px\",\n                                            textAlign: \"left\",\n                                            overflow: \"hidden\"\n                                        }}\n                                    >\n                                        <div style={{ overflow: \"hidden\", whiteSpace: \"nowrap\", textOverflow: \"ellipsis\" }}>\n                                            Doc Code\n                                        </div>\n                                        <div style={{ overflow: \"hidden\", whiteSpace: \"nowrap\", textOverflow: \"ellipsis\" }}>\n                                            Pages\n                                        </div>\n                                        <div style={{ overflow: \"hidden\", whiteSpace: \"nowrap\", textOverflow: \"ellipsis\" }}>\n                                            Version Date\n                                        </div>\n                                        <div style={{ overflow: \"hidden\", whiteSpace: \"nowrap\", textOverflow: \"ellipsis\" }}>\n                                            Complete?\n                                        </div>\n                                        <div style={{ overflow: \"hidden\", whiteSpace: \"nowrap\", textOverflow: \"ellipsis\" }}>\n                                            Comment\n                                        </div>\n                                    </div>\n                                    {this.props.textResults[this.state.printPreviewIndex].BatchItems.map(item => {\n                                        return (\n                                            <div\n                                                style={{\n                                                    display: \"grid\",\n                                                    gridTemplateColumns: \"100px 75px 100px 100px 1fr\",\n                                                    gridGap: \"10px\",\n                                                    textAlign: \"left\",\n                                                    overflow: \"hidden\"\n                                                }}\n                                            >\n                                                <div style={{ overflow: \"hidden\", whiteSpace: \"nowrap\", textOverflow: \"ellipsis\" }}>\n                                                    {item.DocumentCode}\n                                                </div>\n                                                <div style={{ overflow: \"hidden\", whiteSpace: \"nowrap\", textOverflow: \"ellipsis\" }}>\n                                                    {item.PDFFile[0].PageCount}\n                                                </div>\n                                                <div style={{ overflow: \"hidden\", whiteSpace: \"nowrap\", textOverflow: \"ellipsis\" }}>\n                                                    {moment(item.VersionDate).format(\"MM/DD/YYYY\")}\n                                                </div>\n                                                <div style={{ overflow: \"hidden\", whiteSpace: \"nowrap\", textOverflow: \"ellipsis\" }}>\n                                                    {item.PrintDate ? \"Complete\" : \"Incomplete\"}\n                                                </div>\n                                                <div style={{ overflow: \"hidden\", whiteSpace: \"nowrap\", textOverflow: \"ellipsis\" }}>\n                                                    {item.Comment}\n                                                </div>\n                                            </div>\n                                        )\n                                    })}\n                                </div>\n                                <ReactToPrint\n                                    trigger={() => <button style={{ margin: \"-20px 0 0 10px\", float: \"right\" }} type=\"button\" className=\"button primary\">Print</button>}\n                                    content={() => this.componentRef}\n                                />\n                                <button style={{ marginTop: \"-20px\", float: \"right\" }} type=\"button\" className=\"button secondary\" onClick={() => this.togglePrintView(undefined)}>Close</button>\n                            </div>\n                        </div>\n                    }\n                    {filterTextResults(this.props.textResults).sort((a, b) => {\n                        return moment(a.BatchDate).isBefore(moment(b.BatchDate)) ? 1 : -1\n                    }).map((batch, batchIndex) => {\n                        let batchDate = moment.utc(batch.BatchDate).utcOffset(-300).format('M/D/YYYY h:mm:ss A');\n\n                        return <div key={batchIndex}>\n                            {batch.BatchItems.length > 0 &&\n                                <React.Fragment>\n                                    <div className=\"flex-row\" style={!batch.BatchItems.find(x => !x.pdfMarked) ? headerStyleComplete : headerStyle}>\n                                        <div>\n                                            <button\n                                                className={showRow[batchIndex] ? \"arrow-up\" : \"arrow-down\"}\n                                                onClick={() => this.toggleRow(batchIndex)}>\n                                            </button>\n                                            <span>{batchDate}</span>\n                                            <span style={{ marginLeft: '5px', fontWeight: \"bold\" }}>({\"BATCH \" + batch.BatchSequence})</span>\n                                            {batch.BatchDescription &&\n                                                <span> - {batch.BatchDescription}</span>\n                                            }\n                                            {batch.VendorBatch\n                                                ? <span> Vendor</span>\n                                                : <span> Bill Room</span>\n                                            }\n                                            <a type=\"button\" className=\"button print white\" onClick={() => {\n                                                let batchIndex = this.props.textResults.findIndex(x => x.PrintBatchID === batch.PrintBatchID);\n                                                this.togglePrintView(batchIndex);\n                                                this.toggleRow(batchIndex);\n                                            }}>Open Print View</a>\n                                        </div>\n                                        <div>\n                                            <span>Total pages: {batch.totalPageCount}</span>\n                                        </div>\n                                    </div>\n                                    {showRow[batchIndex] &&\n                                        <form>\n                                            <div className=\"bill-grid print-bill-grid print-room-bill-grid\">\n                                                <div className={!batch.BatchItems.find(x => !x.pdfMarked) ? \"bill-grid-header completed\" : \"bill-grid-header\"}>\n                                                    <input\n                                                        type=\"checkbox\"\n                                                        checked={batch.selectAll || ''}\n                                                        onChange={() => {\n                                                            let batchIndex = this.props.textResults.findIndex(x => x.PrintBatchID === batch.PrintBatchID);\n                                                            this.props.toggleSelectAll(batchIndex);\n                                                        }} />\n                                                </div>\n                                                <div className={!batch.BatchItems.find(x => !x.pdfMarked) ? \"bill-grid-header completed\" : \"bill-grid-header\"}>\n                                                    <span>Bill #</span>\n                                                </div>\n                                                <div className={!batch.BatchItems.find(x => !x.pdfMarked) ? \"bill-grid-header completed\" : \"bill-grid-header\"}>\n                                                    <span>Document</span>\n                                                </div>\n                                                <div className={!batch.BatchItems.find(x => !x.pdfMarked) ? \"bill-grid-header completed\" : \"bill-grid-header\"}>\n                                                    <span>Pages</span>\n                                                </div>\n                                                <div className={!batch.BatchItems.find(x => !x.pdfMarked) ? \"bill-grid-header completed\" : \"bill-grid-header\"}>\n                                                    <span>Date</span>\n                                                </div>\n                                                <div className={!batch.BatchItems.find(x => !x.pdfMarked) ? \"bill-grid-header completed\" : \"bill-grid-header\"}>\n                                                    <span>Patron</span>\n                                                </div>\n                                                <div className={!batch.BatchItems.find(x => !x.pdfMarked) ? \"bill-grid-header completed\" : \"bill-grid-header\"}>\n                                                    <span>Caption</span>\n                                                </div>\n                                                <div className={!batch.BatchItems.find(x => !x.pdfMarked) ? \"bill-grid-header completed\" : \"bill-grid-header\"}>\n                                                    <span>Status</span>\n                                                </div>\n                                                <div className={!batch.BatchItems.find(x => !x.pdfMarked) ? \"bill-grid-header completed\" : \"bill-grid-header\"}>\n                                                    <span>Comment</span>\n                                                </div>\n                                                <div className={!batch.BatchItems.find(x => !x.pdfMarked) ? \"bill-grid-header completed\" : \"bill-grid-header\"}>\n                                                    <span>View</span>\n                                                </div>\n                                            </div>\n                                            <div>\n                                                {batch.BatchItems.filter(x => {\n                                                    if (!this.props.viewOnlyCompletedItems) {\n                                                        return true\n                                                    } else {\n                                                        return x.PrintDate ? true : false\n                                                    }\n                                                }).map((text, textIndex) =>\n                                                    <div key={textIndex} className=\"bill-grid print-bill-grid print-room-bill-grid\">\n                                                        <div>\n                                                            <input\n                                                                type=\"checkbox\"\n                                                                checked={text.checked || ''}\n                                                                onChange={(e) => {\n                                                                    let batchIndex = this.props.textResults.findIndex(x => x.PrintBatchID === batch.PrintBatchID);\n                                                                    let textIndex = this.props.textResults[batchIndex].BatchItems.findIndex(x => x.BatchItemID === text.BatchItemID);\n                                                                    this.props.toggleText(batchIndex, textIndex, e);\n                                                                }} />\n                                                        </div>\n                                                        <div>\n                                                            <span><a\n                                                                className={text.pdfMarked && \"red\"}\n                                                                target=\"_blank\"\n                                                                href={text.PDFFile[0].FileURL}\n                                                                onClick={() => {\n                                                                    let batchIndex = this.props.textResults.findIndex(x => x.PrintBatchID === batch.PrintBatchID);\n                                                                    let textIndex = this.props.textResults[batchIndex].BatchItems.findIndex(x => x.BatchItemID === text.BatchItemID);\n                                                                    this.props.markPdf(batchIndex, textIndex)\n                                                                }}>\n                                                                {text.LegislationNumber}\n                                                            </a></span>\n                                                        </div>\n                                                        <div>\n                                                            {text.IsReprint && <div className=\"small-text message-error\">REPRINT</div>}\n                                                            <span>{text.DocumentCode}</span>\n                                                        </div>\n                                                        <div>\n                                                            <span>\n                                                                {text.PDFFile && text.PDFFile.length > 0 &&\n                                                                    <React.Fragment>{text.PDFFile[0].PageCount}</React.Fragment>\n                                                                }\n                                                            </span>\n                                                        </div>\n                                                        <div>\n                                                            <span>{moment(text.VersionDate).format('L')}</span>\n                                                        </div>\n                                                        <div>\n                                                            <span>{findMember(text.MemberID)}</span>\n                                                        </div>\n                                                        <div style={{ overflow: 'hidden', textOverflow: 'ellipsis' }}>\n                                                            <span\n                                                                title={text.LegislationDescription || text.Description}\n                                                                style={{ whiteSpace: 'nowrap' }}>\n                                                                {text.LegislationDescription || text.Description}\n                                                            </span>\n                                                        </div>\n                                                        <div>\n                                                            <span>{text.PrintDate ? \"Complete\" : \"Incomplete\"}</span>\n                                                        </div>\n                                                        <div style={text.Comment && text.Comment.length > 12 ? { overflowX: \"scroll\" } : {}}>\n                                                            <span style={{ whiteSpace: \"nowrap\" }}>{text.Comment}</span>\n                                                        </div>\n                                                        <div>\n                                                            <div className=\"inner-grid three\" style={{ gridGap: \"0px\" }}>\n                                                                {text.PDFFile && text.PDFFile.length > 0 ?\n                                                                    <a target=\"_blank\"\n                                                                        href={text.IsPublic ? text.PDFFile[0].FileURL : text.SasURL}\n                                                                        onClick={() => {\n                                                                            let batchIndex = this.props.textResults.findIndex(x => x.PrintBatchID === batch.PrintBatchID);\n                                                                            let textIndex = this.props.textResults[batchIndex].BatchItems.findIndex(x => x.BatchItemID === text.BatchItemID);\n                                                                            this.props.markPdf(batchIndex, textIndex)\n                                                                        }}>\n                                                                        <span className={\"icon pdf\" + (text.pdfMarked ? \" red\" : \"\")}></span>\n                                                                    </a>\n                                                                    :\n                                                                    <br />\n                                                                }\n                                                                <div>\n                                                                    <span\n                                                                        onClick={(e) => this.props.togglePortal(this.props.showPortal, e, text.LegislationTextID)}\n                                                                        className=\"icon paper\"></span>\n                                                                </div>\n                                                                <div>\n                                                                    {text.IsPublic &&\n                                                                        <i className=\"icon book\" />\n                                                                    }\n                                                                </div>\n                                                            </div>\n                                                        </div>\n                                                    </div>\n                                                )}\n                                            </div>\n                                        </form>\n                                    }\n                                </React.Fragment>\n                            }\n                        </div>\n                    }\n                    )}\n                </div> : null\n    }\n}\nexport default PrintRoomGrid;","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { batch, connect } from 'react-redux';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { billActionCreators } from '../../../stores/lis-legislation-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport Popout from '../../../lis-shared/lis-layout/components/lis-popout-component';\nimport Select from 'react-select';\nimport DatePicker from 'react-datepicker';\nimport moment from 'moment-timezone'\nimport renderHTML from 'react-render-html';\nimport PrintRoomGrid from './lis-print-room-grid'\nimport { memberActionCreators } from '../../../stores/lis-members-store';\nimport { printActionCreators } from '../../../stores/lis-print-store';\n\nconst versionOptions = [\n    { label: \"Introduced\", value: 1 },\n    { label: \"Substitute\", value: 5 },\n    { label: \"Engrossed\", value: 2 },\n    { label: \"Reengrossed\", value: 6 },\n    { label: \"Enrolled\", value: 3 },\n    { label: \"Reenrolled\", value: 7 },\n    { label: \"Chaptered\", value: 4 }\n]\n\nclass PrintManagement extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            sessionOptions: [],\n            billRoomView: false,\n            selectedSession: '',\n            chamberOptions: [\n                { label: 'Both', value: 'Both' },\n                { label: 'House', value: 'H' },\n                { label: 'Senate', value: 'S' }\n            ],\n            selectedChamber: { label: 'Both', value: 'Both' },\n            introStartDate: '',\n            introEndDate: '',\n            search: '',\n            isLoaded: false,\n            isSearching: false,\n            textResults: [],\n            showPortal: false,\n            selectedBill: '',\n            isSaving: false,\n            versionOptions: versionOptions,\n            selectedVersion: { label: 'All', value: 'All' },\n            lastCheckedBills: [],\n            anyChecked: false,\n            urlBatchId: \"\",\n            viewCompletedByBill: false,\n            viewOnlyCompletedItems: false\n        }\n\n        this.handleChange = this.handleChange.bind(this);\n        this.handleSearch = this.handleSearch.bind(this);\n        this.handleFilter = this.handleFilter.bind(this);\n        this.toggleSelectAll = this.toggleSelectAll.bind(this);\n        this.toggleText = this.toggleText.bind(this);\n        this.togglePortal = this.togglePortal.bind(this);\n        this.handleCommentChange = this.handleCommentChange.bind(this);\n        this.handleReleaseToPrint = this.handleReleaseToPrint.bind(this);\n        this.handlePrintComplete = this.handlePrintComplete.bind(this);\n        this.handlePrintAllEnrolled = this.handlePrintAllEnrolled.bind(this);\n        this.toggleBillRoomView = this.toggleBillRoomView.bind(this);\n        this.toggleCommentEdit = this.toggleCommentEdit.bind(this);\n        this.markPdf = this.markPdf.bind(this);\n    }\n\n    handleChange(key, val) {\n        this.setState({\n            [key]: val\n        }, () => {\n            if (key === 'selectedSession' || key === 'selectedVersion') {\n                this.handleSearch();\n            } else {\n                this.handleFilter();\n            }\n        });\n    }\n\n    handleSearch() {\n        this.setState({\n            isSearching: true\n        });\n        // Get the list of members for this session so the patron for the legislation can be shown in the grid\n        this.props.actions.getMemberList('sessionID=' + this.state.selectedSession.SessionID)\n\n        let params = '?isReleased=' + this.state.billRoomView + '&sessionID=' + this.state.selectedSession.SessionID;\n        if (this.state.selectedVersion.value !== 'All') {\n            params += '&legislationVersionID=' + this.state.selectedVersion.value;\n        }\n        if (!this.state.showComplete) {\n            params += '&IsPrinted=false'\n        }\n        this.props.actions.getPrintDocuments(params)\n            .then(() => {\n                if (this.props.print.printDocuments.length === 0) {\n                    throw 'No Results Found';\n                }\n                let promises = [];\n                this.props.print.printDocuments.forEach(batch => {\n                    batch.BatchItems.forEach(text => {\n                        //Set URL for non-public enrolled PDFs\n                        if (!text.SasURL && text.LegislationVersionID === versionOptions.find(v => v.label === \"Enrolled\").value && !text.IsPublic) {\n                            promises.push(new Promise((res, rej) => {\n                                this.props.actions.getSasURL('?billNumber=' + text.LegislationNumber).then(() => {\n                                    text.SasURL = this.props.bills.sasURLLink;\n                                    res();\n                                }).catch(() => {\n                                    console.log(\"Failed to retrieve SasURL for bill \" + text.LegislationNumber);\n                                });\n                            }));\n                        }\n\n                        text.checked = false;\n                    })\n                })\n                Promise.all(promises).then(() => {\n                    // Filter out any entries if any of the filter options are set\n                    this.handleFilter()\n                    this.setState({\n                        isSearching: false,\n                        message: ''\n                    });\n                })\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    isSearching: false,\n                    message: err.toString()\n                });\n            });\n    }\n\n    handleFilter() {\n        // This is done so the redux state is not mutated by the filters\n        let printDocuments = JSON.parse(JSON.stringify(this.props.print.printDocuments));\n        const { search, introStartDate, introEndDate, selectedChamber, showComplete, showReprints } = this.state;\n\n        printDocuments.forEach(batch => {\n            if (showReprints) {\n                batch.BatchItems = batch.BatchItems.filter(text => text.IsReprint);\n            }\n            // Filter out based on the chambercode. The chambercode is not in the response so assume it using the first letter of the legislation number\n            if (selectedChamber.value !== 'Both') {\n                batch.BatchItems = batch.BatchItems.filter(text => {\n                    return text.LegislationNumber[0].toUpperCase() === selectedChamber.value;\n                });\n            }\n            // Check if the search field is blank before filtering\n            const formattedSearch = search.toLowerCase().replace(/ /g, '');\n            if (formattedSearch) {\n                batch.BatchItems = batch.BatchItems.filter(text => {\n                    if (text.LegislationNumber && text.LegislationNumber.toLowerCase().includes(formattedSearch)) {\n                        return true;\n                    }\n                    if (text.DocumentCode && text.DocumentCode.toLowerCase().includes(formattedSearch)) {\n                        return true;\n                    }\n                    if (text.LDNumber && text.LDNumber.toLowerCase().includes(formattedSearch)) {\n                        return true;\n                    }\n                    if (text.LegislationDescription && text.LegislationDescription.replace(/ /g, '').toLowerCase().includes(formattedSearch)) {\n                        return true;\n                    }\n                    const patron = this.props.members.memberList.find(member => member.MemberID === text.MemberID);\n                    if (patron) {\n                        if (patron.PatronDisplayName.toLowerCase().includes(formattedSearch)) {\n                            return true;\n                        }\n                    }\n                });\n            }\n            // Filter entries based on the draft date if the start date or end date are set\n            batch.BatchItems = batch.BatchItems.filter(text => {\n                let returnItem = true;\n                if (introStartDate) {\n                    let formattedStartDate = introStartDate.clone().hour(0);\n                    returnItem = moment(text.VersionDate).isSameOrAfter(formattedStartDate);\n                }\n                if (introEndDate) {\n                    let formattedEndDate = introEndDate.clone().endOf('day');\n                    returnItem = moment(text.VersionDate).isSameOrBefore(formattedEndDate);\n                }\n                if (introStartDate && introEndDate) {\n                    //Clone them to not mutate the state\n                    let formattedStartDate = introStartDate.clone().hour(0);\n                    let formattedEndDate = introEndDate.clone().endOf('day');\n                    // Add one day to the dates so that results at the outer limits are included as well\n                    returnItem = moment(text.VersionDate).isBetween(formattedStartDate, formattedEndDate);\n                }\n                return returnItem;\n            });\n\n            //This gets the page count\n            //This is done here because the bill room's page needs the page count and this is the only loop that runs regardless.\n            let totalPageCount = 0;\n            batch.BatchItems.forEach(text => {\n                if (text.PDFFile && text.PDFFile.length > 0) {\n                    if (!isNaN(text.PDFFile[0].PageCount)) {\n                        totalPageCount += text.PDFFile[0].PageCount\n                    }\n                }\n\n                text.checked = false;\n            });\n\n            if (this.state.textResults.length) {\n                const batchIndex = this.state.textResults.findIndex(c => c.BatchDate === batch.BatchDate);\n                if (batchIndex > -1) {\n                    this.state.textResults[batchIndex].BatchItems\n                        .forEach(x => {\n                            //If the current dataset has a checked bill that isn't in the new filtered set then add that bill back into the result set\n                            const billInNewFilteredDataset = batch.BatchItems.find(y => y.LegislationTextID === x.LegislationTextID);\n                            if (x.checked && !billInNewFilteredDataset) {\n                                batch.BatchItems.push(x)\n                            } else if (billInNewFilteredDataset) {\n                                billInNewFilteredDataset.checked = this.state.textResults[batchIndex].BatchItems.find(y => y.LegislationTextID === x.LegislationTextID).checked;\n                            }\n                        });\n                }\n            }\n\n            batch.totalPageCount = totalPageCount;\n        });\n\n        this.setState({\n            textResults: printDocuments\n        });\n    }\n\n    toggleSelectAll(batchIndex) {\n        let textResults = [...this.state.textResults];\n        const opposite = !textResults[batchIndex].selectAll;\n\n        textResults[batchIndex].selectAll = opposite;\n        textResults[batchIndex].BatchItems.forEach(text => text.checked = opposite);\n        this.setState({\n            textResults: textResults,\n            anyChecked: opposite\n        })\n    }\n\n    toggleText(batchIndex, textIndex, e) {\n        let textResults = [...this.state.textResults];\n        let lastCheckedBills = this.state.lastCheckedBills;\n        let lastCheckedBill = lastCheckedBills[batchIndex];\n        if (e.nativeEvent.shiftKey && !isNaN(lastCheckedBill) && lastCheckedBill !== -1) {\n            textResults[batchIndex].BatchItems.forEach(agenda => agenda.checked = false);\n            for (let i = 0; i < Math.abs(textIndex - lastCheckedBill); i++) {\n                const index = lastCheckedBill + i * (textIndex - lastCheckedBill) / Math.abs(textIndex - lastCheckedBill);\n                textResults[batchIndex].BatchItems[index].checked = true;\n            }\n        } else {\n            lastCheckedBill = textIndex;\n        }\n        textResults[batchIndex].BatchItems[textIndex].checked = !textResults[batchIndex].BatchItems[textIndex].checked;\n        lastCheckedBills[batchIndex] = lastCheckedBill;\n\n        this.setState({\n            textResults: textResults,\n            lastCheckedBills: lastCheckedBills\n        }, () => {\n            //If we unchecked one that doesn't meet filter requirements we need to take it out of the current dataset\n            if (!textResults[batchIndex].BatchItems[textIndex].checked) {\n                this.handleFilter();\n            }\n\n            let checked = false;\n\n            this.state.textResults.forEach((batch) => {\n                batch.BatchItems.forEach((item) => {\n                    if (item.checked) {\n                        checked = true;\n                    }\n                });\n            });\n\n            this.setState({\n                anyChecked: checked\n            })\n        })\n    }\n\n    togglePortal(showPortal, e, textId) {\n        if (e) {\n            e.stopPropagation();\n        }\n        this.setState({\n            showPortal: !showPortal,\n            selectedBill: { message: 'Loading...' }\n        });\n        if (textId) {\n            this.props.actions.getBillText('?legislationTextID=' + textId)\n                .then(() => {\n                    if (this.props.bills.billTextError) {\n                        throw this.props.bills.billTextError.toString()\n                    }\n                    // We are getting it by ID, so there should only be one\n                    if (this.props.bills.billText.length !== 1) {\n                        throw 'Draft text could not be found'\n                    }\n                    this.setState({\n                        selectedBill: this.props.bills.billText[0]\n                    });\n                }).catch(err => {\n                    this.setState({\n                        selectedBill: { message: err }\n                    })\n                })\n        }\n    }\n\n    handleCommentChange(batchIndex, textIndex, value) {\n        let textResults = [...this.state.textResults];\n        textResults[batchIndex].BatchItems[textIndex].Comment = value;\n\n        this.setState({\n            textResults: textResults\n        })\n    }\n\n    handleReleaseToPrint(vendorBatch) {\n        let isReleased = vendorBatch !== undefined ? true : false;\n        this.setState({\n            isSaving: true\n        }, () => {\n            let releaseDate = new Date();\n            let batchItemsToSave = [];\n            let itemsToRemove = [];\n            this.state.textResults.forEach((batch, batchIndex) => {\n                batch.BatchItems.forEach((item, itemIndex) => {\n                    if (item.checked) {\n                        batchItemsToSave.push(item);\n                        itemsToRemove.push({ batch: batchIndex, item: itemIndex })\n                    }\n                });\n            });\n            if (batchItemsToSave.length === 0) {\n                this.setState({\n                    isSaving: false\n                });\n                return;\n            }\n\n            //Need to decide here whether or not to call createPrintDocument or savePrintDocument based on whether or not we have a PrintBatchID\n            if (this.state.textResults[0].PrintBatchID) {\n                this.props.actions.savePrintDocument(\n                    {\n                        BatchDate: releaseDate,\n                        VendorBatch: vendorBatch,\n                        SessionID: this.state.selectedSession.SessionID,\n                        BatchItems: batchItemsToSave,\n                        IsReleased: isReleased,\n                        PrintBatchID: this.state.textResults[0].PrintBatchID,\n                        ModificationDate: this.state.textResults[0].ModificationDate\n                    })\n                    .then(() => {\n                        this.props.actions.makeToast([{ message: (batchItemsToSave.length + \" Item(s)\") + (isReleased ? \" Released to \" + (vendorBatch ? \"Vendor\" : \"Print\") : \" Saved\"), type: \"success\", long: true }]);\n                        this.handleSearch();\n                        this.setState({\n                            isSaving: false\n                        });\n                    }).catch(err => {\n                        if (err === 'Aborted') {\n                            return;\n                        }\n                        this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n                        console.log(this.props.print.printSaveError);\n                        this.setState({\n                            isSaving: false\n                        });\n                    });\n            } else {\n                this.props.actions.createPrintDocument(\n                    {\n                        BatchDate: releaseDate,\n                        VendorBatch: vendorBatch,\n                        SessionID: this.state.selectedSession.SessionID,\n                        BatchItems: batchItemsToSave,\n                        isReleased: isReleased,\n                    })\n                    .then(() => {\n                        this.props.actions.makeToast([{ message: (batchItemsToSave.length + \" Item(s)\") + (isReleased ? \" Released to \" + (vendorBatch ? \"Vendor\" : \"Print\") : \" Saved\"), type: \"success\", long: true }]);\n                        this.handleSearch();\n                        this.setState({\n                            isSaving: false\n                        });\n                    }).catch(err => {\n                        if (err === 'Aborted') {\n                            return;\n                        }\n                        this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n                        console.log(this.props.print.printCreateError);\n                        this.setState({\n                            isSaving: false\n                        });\n                    });\n            }\n        });\n    }\n\n    handlePrintComplete() {\n        const completeDate = new Date();\n        let completedItems = [];\n        this.state.textResults.forEach(batch => {\n            batch.BatchItems.forEach(item => {\n                if (item.checked) {\n                    completedItems.push({ BatchItemID: item.BatchItemID })\n                }\n            });\n        });\n        if (completedItems.length !== 0) {\n            this.setState({\n                isSaving: true\n            }, () => {\n                this.props.actions.completeBatchItem({\n                    PrintDate: completeDate,\n                    BatchItemIDs: completedItems,\n                })\n                    .then(() => {\n                        this.props.actions.makeToast([{ message: \"Save Success\", type: \"success\" }]);\n                        this.handleSearch();\n                        this.setState({\n                            isSaving: false\n                        });\n                    }).catch(err => {\n                        if (err === 'Aborted') {\n                            return;\n                        }\n                        this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n                        console.log(this.props.print.batchItemCompleteError);\n                        this.setState({\n                            isSaving: false\n                        });\n                    });\n            });\n        }\n    }\n\n    handlePrintAllEnrolled() {\n        this.setState({\n            isSaving: true\n        }, () => {\n            this.props.actions.printAllEnrolled(\"?SessionID=\" + this.state.selectedSession.SessionID)\n                .then(() => {\n                    this.props.actions.makeToast([{ message: \"Request Successful\", type: \"success\" }]);\n                    this.setState({\n                        isSaving: false\n                    });\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.props.actions.makeToast([{ message: \"Request Failed\", type: \"failure\" }]);\n                    console.log(this.props.print.batchItemCompleteError);\n                    this.setState({\n                        isSaving: false\n                    });\n                });\n        });\n    }\n\n    toggleBillRoomView() {\n        this.setState(state => ({\n            billRoomView: !state.billRoomView\n        }), () => this.handleSearch());\n    }\n\n    toggleCommentEdit(e, batchIndex, textIndex) {\n        e.preventDefault();\n        let textResults = [...this.state.textResults];\n        textResults[batchIndex].BatchItems[textIndex].Editing = !textResults[batchIndex].BatchItems[textIndex].Editing;\n\n        this.setState({\n            textResults: textResults\n        })\n    }\n\n    markPdf(batchIndex, textIndex) {\n        let textResults = [...this.state.textResults];\n        textResults[batchIndex].BatchItems[textIndex].pdfMarked = true;\n\n        this.setState({\n            textResults: textResults\n        })\n    }\n\n    componentDidMount() {\n        this.props.actions.getSessionList()\n            .then(() => {\n                const sessionList = [...this.props.session.sessionList];\n                let selectedSession = '';\n                sessionList.forEach(session => {\n                    session.label = session.SessionYear + \" \" + session.DisplayName\n                    session.value = session.SessionID;\n                    if (session.IsDefault) {\n                        selectedSession = session;\n                    }\n                });\n                sessionList.reverse();\n                this.setState({\n                    sessionOptions: sessionList,\n                    selectedSession: selectedSession,\n                    isLoaded: true\n                }, () => {\n                    if (this.props.location.search.substr(9, this.props.location.search.length)) {\n                        this.toggleBillRoomView();\n                        this.setState({\n                            urlBatchId: this.props.location.search.substr(9, this.props.location.search.length)\n                        })\n                    } else if (selectedSession) {\n                        this.handleSearch()\n                    }\n                });\n            })\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { versionOptions, selectedVersion, sessionOptions,\n            selectedSession, chamberOptions, selectedChamber,\n            introStartDate, introEndDate, search,\n            textResults, showReprints, showComplete } = this.state;\n        const customStyles = {\n            container: base => ({\n                ...base,\n                lineHeight: 'normal',\n            }),\n            option: (base, state) => ({\n                ...base,\n                fontSize: '0.8em',\n            }),\n            control: (base) => ({\n                ...base,\n                padding: '1px',\n                margin: 0,\n                minHeight: 0,\n                fontSize: '0.8em',\n            }),\n            dropdownIndicator: base => ({\n                ...base,\n                padding: '0px 8px'\n            })\n        }\n        if (!this.state.isLoaded) {\n            return (<div className=\"center-spinner spinner\">Loading...</div>)\n        }\n        return (<div>\n            <div className=\"header-half\">\n                <h1>{this.state.billRoomView ? \"Bill Room Management\" : \"Print Management\"}</h1>\n                <p><button className=\"button\" onClick={this.toggleBillRoomView} type=\"button\">{this.state.billRoomView ? \"Print Management\" : \"Bill Room Management\"}</button></p>\n            </div>\n            {this.state.showPortal &&\n                <Popout togglePortal={this.togglePortal} windowTitle={this.state.selectedBill.LegislationNumber || ''}>\n                    <LegislationText\n                        text={this.state.selectedBill}\n                    />\n                </Popout>\n            }\n            <div className=\"user-forms dlas-forms\">\n                {this.state.billRoomView &&\n                    <React.Fragment>\n                        <div className=\"button-bar floating-button-bar\" style={{ paddingBottom: \"15px\", paddingRight: \"15px\" }}>\n                            <div />\n                            <div>\n                                <button\n                                    id=\"bill-room-submit\"\n                                    onClick={this.handlePrintComplete}\n                                    type=\"button\"\n                                    disabled={this.state.isSaving || !this.state.anyChecked}\n                                    className=\"button\">\n                                    {this.state.isSaving ? \"Saving...\" : \"Complete\"}\n                                </button>\n                                <button\n                                    id=\"bill-room-submit\"\n                                    onClick={this.handlePrintAllEnrolled}\n                                    type=\"button\"\n                                    disabled={this.state.isSaving}\n                                    className=\"button\">\n                                    {this.state.isSaving ? \"Saving...\" : \"Print All Enrolled Versions\"}\n                                </button>\n                            </div>\n                        </div>\n                    </React.Fragment>\n                }\n                <fieldset className=\"fieldset-collapse\">\n                    <div>\n                        <div className=\"inner-grid five align-end\">\n                            <div>\n                                <label htmlFor=\"version-dropdown\">Version Type</label>\n                                <Select\n                                    options={versionOptions}\n                                    value={selectedVersion}\n                                    id=\"version-dropdown\"\n                                    styles={customStyles}\n                                    onChange={(val) => this.handleChange(\"selectedVersion\", val)}\n                                />\n                            </div>\n                            <div className=\"advanced-search dlas-forms\">\n                                <div className=\"checkbox-container\">\n                                    <div className=\"checkbox flex-row flex-vertical-center flex-start\" style={{ width: '102%' }}>\n                                        <div className=\"toggle-switch\" onClick={() => this.handleChange(\"showReprints\", !showReprints)}>\n                                            <input id=\"reprint-button\" checked={showReprints} type=\"checkbox\" />\n                                            <span className=\"slider\"></span>\n                                        </div>\n                                        <label htmlFor=\"reprint-button\" className=\"checkbox-label no-background\">Show Only Reprinted Items</label>\n                                    </div>\n                                </div>\n                            </div>\n                            {this.state.billRoomView &&\n                                <>\n                                    <div className=\"advanced-search dlas-forms\">\n                                        <div className=\"checkbox-container\">\n                                            <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                                                <div className=\"toggle-switch\" onClick={() => this.handleChange(\"showComplete\", !showComplete)}>\n                                                    <input id=\"complete-button\" checked={showComplete} type=\"checkbox\" />\n                                                    <span className=\"slider\"></span>\n                                                </div>\n                                                <label htmlFor=\"complete-button\" className=\"checkbox-label no-background\">Include Completed Items</label>\n                                            </div>\n                                        </div>\n                                    </div>\n                                    <button className=\"button primary\" type=\"button\" onClick={() => this.setState({ viewCompletedByBill: !this.state.viewCompletedByBill, viewOnlyCompletedItems: false })} style={{ marginBottom: \"4px\" }}>{(this.state.viewCompletedByBill ? \"Hide\" : \"View\") + \" Completed Items By Bill\"}</button>\n                                    <button className=\"button primary\" type=\"button\" onClick={() => this.setState({ viewOnlyCompletedItems: !this.state.viewOnlyCompletedItems, viewCompletedByBill: false })} style={{ marginBottom: \"4px\" }}>{(this.state.viewOnlyCompletedItems ? \"Hide\" : \"View\") + \" Only Completed Items\"}</button>\n                                </>\n                            }\n                        </div>\n                        <div className=\"inner-grid six\">\n                            <div>\n                                <label htmlFor=\"session-dropdown\">Session</label>\n                                <Select\n                                    options={sessionOptions}\n                                    value={selectedSession}\n                                    id=\"session-dropdown\"\n                                    styles={customStyles}\n                                    onChange={(val) => this.handleChange(\"selectedSession\", val)}\n                                />\n                            </div>\n                            <div>\n                                <label htmlFor=\"chamber-dropdown\">Chamber</label>\n                                <Select\n                                    options={chamberOptions}\n                                    value={selectedChamber}\n                                    id=\"chamber-dropdown\"\n                                    styles={customStyles}\n                                    onChange={(val) => this.handleChange(\"selectedChamber\", val)}\n                                />\n                            </div>\n                            <div>\n                                <label htmlFor=\"intro-start-date\">Date</label>\n                                <DatePicker\n                                    selected={introStartDate || null}\n                                    isClearable\n                                    id=\"intro-start-date\"\n                                    placeholderText=\"Start Date\"\n                                    onChange={(val) => this.handleChange(\"introStartDate\", val)}\n                                />\n                            </div>\n                            <div>\n                                <br />\n                                <DatePicker\n                                    selected={introEndDate || null}\n                                    isClearable\n                                    id=\"intro-end-date\"\n                                    placeholderText=\"End Date\"\n                                    onChange={(val) => this.handleChange(\"introEndDate\", val)}\n                                />\n\n                            </div>\n                            <div>\n                                <label htmlFor=\"search-filter\">Search filter</label>\n                                <input\n                                    type=\"text\"\n                                    value={search}\n                                    id=\"search-filter\"\n                                    onChange={(e) => this.handleChange(\"search\", e.target.value)}\n                                />\n                            </div>\n                        </div>\n                        <br />\n                        <div className=\"inner-grid six\">\n                            {!this.state.billRoomView &&\n                                <React.Fragment>\n                                    <button\n                                        id=\"print-management-submit\"\n                                        onClick={() => this.handleReleaseToPrint(false)}\n                                        type=\"button\"\n                                        disabled={this.state.isSaving || !this.state.anyChecked}\n                                        className=\"button\">\n                                        {this.state.isSaving ? \"Saving...\" : \"Release To Print\"}\n                                    </button>\n                                    <button\n                                        id=\"print-management-submit-vendor\"\n                                        onClick={() => this.handleReleaseToPrint(true)}\n                                        type=\"button\"\n                                        disabled={this.state.isSaving || !this.state.anyChecked}\n                                        className=\"button\">\n                                        {this.state.isSaving ? \"Saving...\" : \"Release To Vendor\"}\n                                    </button>\n                                    <button\n                                        id=\"print-management-save-batch\"\n                                        onClick={() => this.handleReleaseToPrint(undefined)}\n                                        type=\"button\"\n                                        disabled={this.state.isSaving || !this.state.anyChecked}\n                                        className=\"button\">\n                                        {this.state.isSaving ? \"Saving...\" : \"Save Batch Without Releasing\"}\n                                    </button>\n                                </React.Fragment>\n                            }\n                        </div>\n                    </div>\n                </fieldset>\n                <div>\n                    {this.state.isSearching ?\n                        <div className=\"center-spinner spinner\">Searching...</div>\n                        :\n                        <React.Fragment>\n                            {this.state.message ?\n                                <div className=\"center\">{this.state.message}</div>\n                                :\n                                <React.Fragment>\n                                    {this.state.billRoomView ?\n                                        <PrintRoomGrid\n                                            textResults={textResults}\n                                            toggleSelectAll={this.toggleSelectAll}\n                                            toggleText={this.toggleText}\n                                            showBillText={this.showBillText}\n                                            togglePortal={this.togglePortal}\n                                            showPortal={this.state.showPortal}\n                                            members={this.props.members.memberList}\n                                            selectedSession={this.state.selectedSession}\n                                            urlBatchId={this.state.urlBatchId}\n                                            showComplete={this.state.showComplete}\n                                            introStartDate={this.state.introStartDate}\n                                            introEndDate={this.state.introEndDate}\n                                            markPdf={this.markPdf}\n                                            viewCompletedByBill={this.state.viewCompletedByBill}\n                                            viewOnlyCompletedItems={this.state.viewOnlyCompletedItems}\n                                        />\n                                        :\n                                        <BillGrid\n                                            textResults={textResults}\n                                            toggleSelectAll={this.toggleSelectAll}\n                                            toggleText={this.toggleText}\n                                            showBillText={this.showBillText}\n                                            togglePortal={this.togglePortal}\n                                            showPortal={this.state.showPortal}\n                                            members={this.props.members.memberList}\n                                            selectedSession={this.state.selectedSession}\n                                            handleCommentChange={this.handleCommentChange}\n                                            toggleCommentEdit={this.toggleCommentEdit}\n                                        />\n                                    }\n                                </React.Fragment>\n                            }\n                        </React.Fragment>\n                    }\n                </div>\n            </div>\n        </div>)\n    }\n}\n\nconst BillGrid = props => {\n    const findMember = memberId => {\n        const patron = props.members.find(member => member.MemberID === memberId);\n        if (patron) {\n            return patron.PatronDisplayName;\n        } else {\n            return '';\n        }\n    }\n    return (<div>\n        {props.textResults.map((batch, batchIndex) =>\n            <form key={batchIndex}>\n                <div className=\"bill-grid print-bill-grid\">\n                    <div className=\"bill-grid-header\">\n                        <input\n                            type=\"checkbox\"\n                            checked={batch.selectAll || ''}\n                            onChange={() => props.toggleSelectAll(batchIndex)} />\n                    </div>\n                    <div className=\"bill-grid-header\">\n                        <span>Bill #</span>\n                    </div>\n                    <div className=\"bill-grid-header\">\n                        <span>Pages</span>\n                    </div>\n                    <div className=\"bill-grid-header\">\n                        <span>Document</span>\n                    </div>\n                    <div className=\"bill-grid-header\">\n                        <span>Date</span>\n                    </div>\n                    <div className=\"bill-grid-header\">\n                        <span>Patron</span>\n                    </div>\n                    <div className=\"bill-grid-header\">\n                        <span>Caption</span>\n                    </div>\n                    <div className=\"bill-grid-header\">\n                        <span>LD#</span>\n                    </div>\n                    <div className=\"bill-grid-header\">\n                        <span>Comment</span>\n                    </div>\n                    <div className=\"bill-grid-header\">\n                        <span>View</span>\n                    </div>\n                </div>\n                <div>\n                    {batch.BatchItems\n                        .sort((a, b) => !a.checked && b.checked ? 1 : a.checked && !b.checked ? -1 : moment(a.VersionDate).isAfter(b.VersionDate, \"days\") ? 1 : moment(b.VersionDate).isAfter(a.VersionDate, \"days\") ? -1 : 0)\n                        .map((text, textIndex) =>\n                            <div key={textIndex} className=\"bill-grid print-bill-grid\">\n                                <div>\n                                    <input\n                                        type=\"checkbox\"\n                                        checked={text.checked || ''}\n                                        onChange={(e) => props.toggleText(batchIndex, textIndex, e)} />\n                                </div>\n                                <div>\n                                    <span><a\n                                        target=\"_blank\"\n                                        href={`/bill-details/${props.selectedSession.SessionCode}/${text.LegislationNumber}`}>\n                                        {text.LegislationNumber}\n                                    </a></span>\n                                </div>\n                                <div>\n                                    <span>{text.PDFFile[0] && text.PDFFile[0].PageCount}</span>\n                                </div>\n                                <div>\n                                    {text.IsReprint && <div className=\"small-text message-error\">REPRINT</div>}\n                                    <span>{text.DocumentCode}</span>\n                                </div>\n                                <div>\n                                    <span>{moment(text.VersionDate).format('L')}</span>\n                                </div>\n                                <div>\n                                    <span>{findMember(text.MemberID)}</span>\n                                </div>\n                                <div style={{ overflow: 'hidden', textOverflow: 'ellipsis' }}>\n                                    <span\n                                        title={text.LegislationDescription || text.Description}\n                                        style={{ whiteSpace: 'nowrap' }}>\n                                        {text.LegislationDescription || text.Description}\n                                    </span>\n                                </div>\n                                <div>\n                                    <span>{text.LDNumber}</span>\n                                </div>\n                                <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 25px\" }}>\n                                    <input\n                                        key={text.LegislationTextID}\n                                        onChange={(e) => props.handleCommentChange(batchIndex, textIndex, e.target.value)}\n                                        value={text.Comment}\n                                        disabled={!props.textResults[batchIndex].BatchItems[textIndex].Editing}\n                                    />\n                                    {props.textResults[batchIndex].BatchItems[textIndex].Editing\n                                        ? <button className=\"icon save\" onClick={(e) => props.toggleCommentEdit(e, batchIndex, textIndex)}></button>\n                                        : <button type=\"button\" className=\"icon edit\" onClick={(e) => props.toggleCommentEdit(e, batchIndex, textIndex)}></button>\n                                    }\n                                </div>\n                                <div>\n                                    <div className=\"inner-grid three\">\n                                        {text.SasURL || (text.PDFFile && text.PDFFile.length > 0) ?\n                                            <a target=\"_blank\" href={text.SasURL || text.PDFFile[0].FileURL}><span className=\"icon pdf\"></span></a>\n                                            :\n                                            <br />\n                                        }\n                                        <div>\n                                            <span\n                                                onClick={(e) => props.togglePortal(props.showPortal, e, text.LegislationTextID)}\n                                                className=\"icon paper\"></span>\n                                        </div>\n                                        <div>\n                                            {text.IsPublic &&\n                                                <i className=\"icon book\" />\n                                            }\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        )}\n                </div>\n            </form>\n        )}\n    </div>);\n}\n\nconst LegislationText = props => {\n    if (props.text.message) {\n        return (<p>{props.text.message}</p>)\n    }\n    return (\n        <div style={{ margin: '10px' }}>\n            {renderHTML(props.text.DraftText)}\n        </div>\n    );\n}\n\nexport default connect(\n    (state) => {\n        const { print, session, nav, bills, members } = state;\n        return {\n            nav,\n            print,\n            session,\n            bills,\n            members\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, printActionCreators, sessionActionCreators, billActionCreators, navActionCreators, memberActionCreators), dispatch)\n        }\n    }\n)(PrintManagement)","import React from \"react\";\nimport ReactToPrint from \"react-to-print\";\nimport DatePicker from \"react-datepicker\";\nimport Select from 'react-select';\nimport moment from 'moment-timezone';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { cancelRequest } from '../../../services/request.service';\nimport { reportActionCreators } from \"../../../stores/lis-report-store\";\nimport { sessionActionCreators } from \"../../../stores/lis-session-store\";\nimport renderHTML from \"react-render-html\";\nimport { Link } from 'react-router-dom';\nimport { billActionCreators } from \"../../../stores/lis-legislation-store\";\n\nclass ReportManagement extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            isSearching: false,\n            sessionList: [],\n            reportTypes: [],\n            selectedSession: '',\n            selectedReport: '',\n            selectedDate: null,\n            reportData: []\n        };\n        this.handleFormChange = this.handleFormChange.bind(this);\n        this.handleReportTypeChange = this.handleReportTypeChange.bind(this);\n        this.getReport = this.getReport.bind(this);\n        this.handleRadioChange = this.handleRadioChange.bind(this);\n    };\n\n    handleFormChange(key, val) {\n        this.setState({\n            [key]: val,\n            reportData: []\n        }, () => {\n            if (key === \"selectedSession\") {\n                this.props.actions.getIntroDateList('?sessionCode=' + val.SessionCode);\n                this.setState({\n                    selectedDate: null\n                })\n            }\n        });\n    }\n\n    handleReportTypeChange(val) {\n        this.setState({\n            selectedReport: val,\n            selectedDate: null,\n            reportData: []\n        });\n    }\n\n    getReport() {\n        const { selectedDate, selectedSession, selectedReport } = this.state;\n        this.setState({\n            isSearching: true\n        });\n        let params = `?sessionID=${selectedSession.SessionID}&reportID=${selectedReport.ReportID}`;\n        if (selectedDate) {\n            params += `&reportDate=${selectedDate.format('YYYY-MM-DD')}`\n        }\n        this.props.actions.getReport(params)\n            .then(() => {\n                let reportDataChamber = '';\n                let reportDataName = '';\n                if (selectedReport.ReportName.includes('Senate')) {\n                    reportDataChamber = 'SENATE OF VIRGINIA'\n                    reportDataName = selectedReport.ReportName.replace('Senate ', '');\n                }\n                if (selectedReport.ReportName.includes('House')) {\n                    reportDataChamber = 'HOUSE OF DELEGATES'\n                    reportDataName = selectedReport.ReportName.replace('House ', '');\n                }\n                const sessionStartObj = selectedSession.SessionEvents && selectedSession.SessionEvents.length && selectedSession.SessionEvents.find(date => date.DisplayName === \"Session Start\");\n                const startDate = sessionStartObj ? moment(sessionStartObj.ActualDate).format(\"MM/DD/YYYY\") : '';\n                let reportData = this.props.report.report;\n                reportData.forEach((rpt, idx) => {\n                    rpt.showItem = idx === 0;\n                });\n                this.setState({\n                    isSearching: false,\n                    reportData: reportData,\n                    reportDataChamber: reportDataChamber,\n                    reportDataDate: startDate,\n                    reportDataName: reportDataName\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    isSearching: false\n                });\n            })\n    }\n\n    handleRadioChange(item) {\n        let filteredReportData = [...this.state.reportData];\n        filteredReportData.forEach(reportItem => {\n            if (reportItem.Heading === item.Heading) {\n                reportItem.showItem = true;\n            } else {\n                reportItem.showItem = false;\n            }\n        });\n        this.setState({\n            reportData: filteredReportData\n        });\n    }\n\n    componentDidMount() {\n        this.props.actions.getSessionList()\n            .then(() => {\n                const sessionList = [...this.props.session.sessionList];\n                let selectedSession = '';\n                sessionList.forEach(session => {\n                    session.label = session.SessionYear + \" \" + session.DisplayName\n                    session.value = session.SessionID;\n                    if (session.IsDefault) {\n                        selectedSession = session;\n                    }\n                });\n                this.setState({\n                    sessionList: sessionList,\n                    selectedSession: selectedSession,\n                    sessionisLoaded: true\n                }, () => {\n                    this.props.actions.getIntroDateList('?sessionCode=' + this.state.selectedSession.SessionCode);\n                });\n            });\n        this.props.actions.getReportTypes()\n            .then(() => {\n                let reportTypes = [...this.props.report.reportTypes];\n\n                reportTypes.forEach(type => {\n                    type.label = type.ReportName;\n                    type.value = type.ReportID;\n                });\n                this.setState({\n                    reportTypes: reportTypes.filter(x => {\n                        if (this.props.login.userClaims.claims.find(x => x.RoleName === \"Admin\"))\n                            return true;\n\n                        if (this.props.login.userClaims.claims.find(x => x.RoleName === \"SenateReportFileGenerationEditor\"))\n                            if (x.ReportID == 2 || x.ReportID == 4)\n                                return true;\n\n                        if (this.props.login.userClaims.claims.find(x => x.RoleName === \"HouseReportFileGenerationEditor\"))\n                            if (x.ReportID == 1 || x.ReportID == 3)\n                                return true;\n                    }),\n                    reportTypesAreLoaded: true\n                }, () => {\n                    if (this.props.login.userClaims.claims.find(x => x.RoleName === \"HouseReportFileGenerationEditor\") && this.state.reportTypes.find(rt => rt.label === \"House Daily Rule Report\")) {\n                        this.handleReportTypeChange(this.state.reportTypes.find(rt => rt.label === \"House Daily Rule Report\"));\n                    } else if (this.props.login.userClaims.claims.find(x => x.RoleName === \"SenateReportFileGenerationEditor\") && this.state.reportTypes.find(rt => rt.label === \"Senate Daily Rule Report\")) {\n                        this.handleReportTypeChange(this.state.reportTypes.find(rt => rt.label === \"Senate Daily Rule Report\"));\n                    }\n                });\n            });\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { reportTypes, sessionList, isSearching, selectedSession, selectedReport, selectedDate, reportData } = this.state;\n        if (!this.state.sessionisLoaded || !this.state.reportTypesAreLoaded) {\n            return (<div className=\"center-spinner spinner\">Loading...</div>)\n        }\n        // Get a list of distinct headers for the filter section.\n        let flags = new Set();\n        let uniqueHeaderItems = reportData.filter(item => {\n            if (flags.has(item.Heading)) {\n                return false;\n            }\n            flags.add(item.Heading);\n            return true;\n        })\n        const dateLabel = this.state.selectedReport.value === 3 && this.state.selectedSession.SessionCode === \"20251\"\n            ? \"January 13, 2025\" /* Date we started after the water crisis, Google it. --JGB */\n            : moment(this.state.selectedReport.ReportID === 1 || this.state.selectedReport.ReportID === 2\n                ? this.state.selectedDate\n                : this.state.reportDataDate).format('MMMM D, YYYY')\n\n        let dateList = [];\n        this.props.bills.introDateList?.forEach(x => dateList.push(moment(x.IntroductionDate)));\n\n        return (<div>\n            <div className=\"header-half\">\n                <h1>Rule Reports</h1>\n            </div>\n            <div className=\"user-forms dlas-forms\">\n                <fieldset className=\"fieldset-collapse\">\n                    <div>\n                        <div className=\"inner-grid five\">\n                            <div>\n                                <label>Report Type</label>\n                                <Select\n                                    options={reportTypes}\n                                    value={selectedReport}\n                                    styles={customStyles}\n                                    onChange={this.handleReportTypeChange}\n                                />\n                            </div>\n                            <div></div>\n                        </div>\n                        <div className=\"inner-grid five\">\n                            <div>\n                                <label>Session</label>\n                                <Select\n                                    options={sessionList}\n                                    value={selectedSession}\n                                    styles={customStyles}\n                                    onChange={(val) => this.handleFormChange('selectedSession', val)}\n                                />\n                            </div>\n                            {(selectedReport && selectedReport.ReportName.toLowerCase().includes('daily')) || (selectedReport && selectedReport.ReportName.toLowerCase().includes('prefile') && selectedReport.ReportName.toLowerCase().includes('house')) ?\n                                <div>\n                                    <label>Date</label>\n                                    {(selectedReport && selectedReport.ReportName.toLowerCase().includes('prefile') && selectedReport.ReportName.toLowerCase().includes('house'))\n                                        ?\n                                        <DatePicker\n                                            selected={selectedDate}\n                                            isClearable\n                                            placeholderText=\"Date\"\n                                            onChange={(val) => this.handleFormChange('selectedDate', val)}\n                                            includeDates={dateList || []}\n                                        />\n                                        :\n                                        <DatePicker\n                                            selected={selectedDate}\n                                            isClearable\n                                            placeholderText=\"Date\"\n                                            onChange={(val) => this.handleFormChange('selectedDate', val)}\n                                        />\n                                    }\n                                </div> : null\n                            }\n                        </div>\n                        <br />\n                    </div>\n                    <div className=\"inner-grid six\">\n                        <div>\n                            <label></label>\n                            <button\n                                type=\"button\"\n                                onClick={this.getReport}\n                                disabled={!selectedSession || !selectedReport || selectedReport.ReportID === 1 && !selectedDate || selectedReport.ReportID === 2 && !selectedDate}\n                                className=\"button\">\n                                Get Report</button>\n                        </div>\n                        <div></div>\n                    </div>\n                </fieldset>\n                <div>\n                    {isSearching ?\n                        <div className=\"center-spinner spinner\">Getting Records...</div>\n                        :\n                        <React.Fragment>\n                            <div className=\"center\">{this.props.report.reportError}</div>\n                            {reportData.length > 0 &&\n                                <React.Fragment>\n                                    <hr className='faded-line' />\n                                    <div className=\"advanced-search checkbox-container dlas-forms\">\n                                        <span>Include Section</span>\n                                        <br />\n                                        {uniqueHeaderItems.map((item, idx) =>\n                                            <div key={item.Heading} className=\"label-and-radio\">\n                                                <label htmlFor={idx}><input id={idx} checked={this.state.reportData.find(rpt => rpt.Heading === item.Heading).showItem} onChange={() => this.handleRadioChange(item)} type=\"radio\" /> {item.Heading}</label>\n                                            </div>\n                                        )}\n                                    </div>\n                                    <hr className='faded-line' />\n                                    <div className=\"align-right\">\n                                        <ReactToPrint\n                                            trigger={() => <a type=\"button\" className=\"button print\">Print</a>}\n                                            content={() => this.printRef}\n                                            pageStyle={\"break-inside: avoid\"}\n                                        />\n                                    </div>\n                                    <div ref={el => this.printRef = el} className=\"public-details details-section section-content\">\n                                        <p className=\"center\">{this.state.reportDataName !== \"Daily Rule Report\" && this.state.reportDataName}</p>\n                                        <p className=\"center\">\n                                            <strong>\n                                                {this.state.reportDataChamber}\n                                            </strong>\n                                        </p>\n                                        <p className=\"align-right\">{\"Printed \" + moment().format(\"MMMM D, YYYY\")}</p>\n                                        <p className=\"align-right\">{dateLabel}</p>\n                                        {reportData.map((reportItem, reportItemIndex) =>\n                                            <div key={reportItemIndex}>\n                                                {reportItem.showItem &&\n                                                    <React.Fragment>\n                                                        <p>{reportItem.Heading}</p>\n                                                        {reportItem.Legislation.filter(x => {\n                                                            if (selectedDate && selectedReport.ReportName.toLowerCase().includes('prefile') && selectedReport.ReportName.toLowerCase().includes('house')) {\n                                                                return moment(selectedDate).isSame(moment(x.IntroductionDate), \"day\")\n                                                            } else {\n                                                                return true;\n                                                            }\n                                                        }).map((bill, billIndex) => {\n                                                            bill.Patrons.sort((a, b) => a.ChamberCode !== b.ChamberCode ? a.ChamberCode !== bill.ChamberCode ? 1 : -1 : a.Sequence - b.Sequence);\n                                                            return (<div key={billIndex}>\n                                                                <p><b><Link to={`/bill-details/${selectedSession.SessionCode}/${bill.LegislationNumber}`} target=\"_blank\" rel=\"noreferrer\">{bill.LegislationNumber.substring(0, 1) + '.' + (bill.LegislationNumber.substring(1, 2) === 'J' ? 'J.R. ' : bill.LegislationNumber.substring(1, 2) + '. ') + bill.LegislationNumber.substring(2)}</Link></b> {bill.DraftTitle && renderHTML(bill.DraftTitle.replace(\"<p class=ldtitle>\", \"<span>\").replace(\"</p>\", \"</span>\"))}</p>\n                                                                <p className=\"align-right\">{bill.LDNumber}</p>\n                                                                {bill.EffectiveType === \"Emergency\" && <p>EMERGENCY</p>}\n                                                                {this.state.reportDataName !== \"Daily Rule Report\" && <p>(Prefiled {moment(bill.IntroductionDate).format('MMMM D, YYYY')})</p>}\n                                                                <p>{bill.Patrons.length > 1 ? \"Patrons--\" : \"Patron--\"}\n                                                                    {bill.Patrons.map((patron, patronIndex) => {\n                                                                        let patronString = '';\n                                                                        if (bill.Patrons[patronIndex + 1] && bill.Patrons[patronIndex + 1].ChamberCode !== bill.ChamberCode && bill.Patrons[patronIndex].ChamberCode === bill.ChamberCode) {\n                                                                            patronString = (patronIndex !== 0 ? \" and \" : \"\") + patron.PatronDisplayName + (bill.ChamberCode === \"H\" ? patronIndex + 2 === bill.Patrons.length ? \"; Senator: \" : \"; Senators: \" : patronIndex + 2 === bill.Patrons.length ? \"; Delegate: \" : \"; Delegates: \");\n                                                                        } else if (patronIndex + 1 === bill.Patrons.length && bill.Patrons.length > 1 && bill.Patrons[patronIndex].ChamberCode === bill.Patrons[patronIndex - 1].ChamberCode) {\n                                                                            patronString = \" and \" + patron.PatronDisplayName;\n                                                                        } else if (patronIndex != 0 && bill.Patrons[patronIndex - 1].ChamberCode === bill.Patrons[patronIndex].ChamberCode) {\n                                                                            patronString = \", \" + patron.PatronDisplayName;\n                                                                        } else {\n                                                                            patronString = patron.PatronDisplayName\n                                                                        }\n                                                                        return (<React.Fragment key={patronIndex}>{patronString}{patron.ByRequest ? ' (By Request)' : null}</React.Fragment>)\n                                                                    })}</p>\n                                                                {bill.ConsentRequired &&\n                                                                    <p>Unanimous consent to introduce</p>\n                                                                }\n                                                                {bill.GovernorsRequest &&\n                                                                    <p>Introduced at the request of Governor.</p>\n                                                                }\n                                                                {bill.CommitteeName\n                                                                    ? bill.CommitteeName === \"Judiciary\"\n                                                                        ? <p>Referred to Committee on the {bill.CommitteeName}</p>\n                                                                        : bill.CommitteeName === \"Courts of Justice\"\n                                                                            ? <p>Referred to Committee for {bill.CommitteeName}</p>\n                                                                            : <p>Referred to Committee on {bill.CommitteeName}</p>\n                                                                    :\n                                                                    !reportItem.Heading.includes(' laid on ')\n                                                                        ? <p>Committee Referral Pending</p>\n                                                                        : null\n                                                                }\n                                                                <br />\n                                                            </div>)\n                                                        }\n                                                        )}\n                                                    </React.Fragment>\n                                                }\n                                            </div>\n                                        )}\n                                    </div>\n                                </React.Fragment>\n                            }\n                        </React.Fragment>\n                    }\n                </div>\n            </div>\n        </div>)\n    }\n}\n\nconst customStyles = {\n    container: base => ({\n        ...base,\n        lineHeight: 'normal',\n    }),\n    option: (base, state) => ({\n        ...base,\n        fontSize: '0.8em',\n    }),\n    control: (base) => ({\n        ...base,\n        padding: '1px',\n        margin: 0,\n        minHeight: 0,\n        fontSize: '0.8em',\n    }),\n    dropdownIndicator: base => ({\n        ...base,\n        padding: '0px 8px'\n    })\n}\n\nexport default connect(\n    (state) => {\n        const { session, report, login, bills } = state;\n        return {\n            session,\n            report,\n            login,\n            bills\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, sessionActionCreators, reportActionCreators, billActionCreators), dispatch)\n        }\n    }\n)(ReportManagement);","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport ReactTable from 'react-table'\n\nclass BillGridSection extends React.Component {\n    constructor(props) {\n        super(props);\n\n        this.state = {\n        }\n\n        this.onExpandedChange = this.onExpandedChange.bind(this);\n    }\n\n    getAmendmentDescription(legislationText) {\n        let descriptionAndDisposition = legislationText.Description;\n        // Versions that are held have the text disposition hidden to match the public version table\n        if (legislationText.TextDispositionID === 12) {\n            return legislationText.Description + \" Engrossed\"\n        }\n\n        if (legislationText.TextDisposition === \"Hold\") {\n            return descriptionAndDisposition;\n        } else if (legislationText.TextDisposition !== \"Posted\") {\n            descriptionAndDisposition = `${legislationText.Description} ${legislationText.TextDisposition || ''}`;\n        }\n        //If the IsReprint boolean is true and the service didn't append Reprint to the description already\n        if (legislationText.IsReprint && !descriptionAndDisposition.includes(\"(Reprint)\")) {\n            descriptionAndDisposition = descriptionAndDisposition + \" (Reprint)\";\n        }\n\n        if (legislationText.LDNumber) {\n            descriptionAndDisposition = descriptionAndDisposition + \" - \" + legislationText.LDNumber;\n        }\n\n        if (!legislationText.DocumentCode || legislationText.DocumentCode === \"\") {\n            return legislationText.Description;\n        }\n\n        return descriptionAndDisposition;\n    }\n\n    onExpandedChange(newExpanded) {\n        this.props.toggleExpandedBills(newExpanded, this.props.currentPage)\n    }\n\n    render() {\n        return (\n            <div>\n                <ReactTable\n                    resizable={false}\n                    data={this.props.billList}\n                    loading={!this.props.isLoaded}\n                    ref={r => this.reactTable = r}\n                    autoResetExpanded={false}\n                    freezeWhenExpanded={false}\n                    expanded={Object.keys(this.props.expandedBills).length > 0 ? this.props.expandedBills : undefined}\n                    onExpandedChange={newExpanded => this.onExpandedChange(newExpanded)}\n                    page={this.props.currentPage}\n                    pages={Math.ceil((this.props.billList ? this.props.billList.length : 0) / this.props.pageSize)}\n                    onPageChange={this.props.onPageChange}\n                    SubComponent={({ original, index }) => {\n                        return (\n                            <div style={{ fontSize: \"1.2em\" }}>\n                                <ul>\n                                    {original.Amendments.filter((x) => this.props.selectedChamber ? x.ChamberCode === this.props.selectedChamber : x).sort((a, b) => a.DocumentCode && a.DocumentCode.localeCompare(b.DocumentCode)).map((amendment, amendmentIndex) => {\n                                        return (\n                                            <div key={amendmentIndex}>\n                                                {amendment.IsPublic ?\n                                                    <Link to={`/bill-details/${original.SessionCode}/${original.LegislationNumber}/text/${amendment.DocumentCode}`} target=\"_blank\" rel=\"noreferrer\" className=\"icon book\" style={{ marginRight: '8px' }} />\n                                                    :\n                                                    <span className=\"icon flag\" style={{ marginRight: '8px' }} />\n                                                }\n                                                <button onClick={() => this.props.selectAmendment(index, amendment)} className=\"button-link\">{amendment.DocumentCode && amendment.DocumentCode + ' - '}{this.getAmendmentDescription(amendment)}</button>\n                                            </div>\n                                        )\n                                    }\n                                    )}\n                                </ul>\n                            </div>\n                        );\n                    }}\n                    columns={[\n                        {\n                            Header: 'Bill #',\n                            sortable: true,\n                            filterable: false,\n                            width: 90,\n                            accessor: \"\",\n                            Cell: ({ original, index }) => {\n                                if (original && original.SessionCode) {\n                                    return (<Link to={`/bill-details/${original.SessionCode}/${original.LegislationNumber}`} target=\"_blank\" rel=\"noreferrer\">{original.LegislationNumber}</Link >)\n                                } else {\n                                    return (<span>{original.LegislationNumber}</span>)\n                                }\n                            }\n                        },\n                        {\n                            Header: 'Patron',\n                            sortable: true,\n                            filterable: false,\n                            accessor: \"Patrons\",\n                            width: 90,\n                            Cell: row =>\n                                <span>{row.value && row.value.map((patron, index) => <React.Fragment key={index}>{patron.PatronDisplayName}{index !== row.value.length - 1 && \", \"}</React.Fragment>)}</span>\n                        },\n                        {\n                            Header: 'Caption',\n                            sortable: true,\n                            filterable: false,\n                            accessor: \"Description\",\n                            Cell: row => <span>{row.value}</span>\n                        },\n                        {\n                            Header: 'Actions',\n                            sortable: false,\n                            filterable: false,\n                            accessor: \"\",\n                            width: 145,\n                            expander: true,\n                            Expander: ({ isExpanded, index }) => {\n                                return (\n                                    <div className=\"committee-action-column\">\n                                        {this.props.billDataIsLoading === index ?\n                                            <div><span className=\"small-spinner\"></span></div>\n                                            :\n                                            <button className={`${isExpanded ? 'arrow-up' : 'arrow-down'}`} type=\"button\"></button>\n                                        }\n                                    </div>\n                                );\n                            }\n                        }\n                    ]}\n                    pageSize={this.props.pageSize}\n                    onPageSizeChange={this.props.onPageSizeChange}\n                    className=\"committee-table -striped -highlight react-table-hide-no-data\"\n                />\n            </div>\n        );\n    }\n}\n\nexport default BillGridSection;","import React from 'react';\nimport * as Fields from '../../../lis-shared/lis-layout/components/lis-forms-component';\n\nclass SelectorSection extends React.Component {\n\n    render() {\n        return (\n            <div className=\"inner-grid four\">\n                <div>\n                    <Fields.Dropdown\n                        value={this.props.selectedSession}\n                        options={this.props.sessionOptions}\n                        id=\"sessionDropdown\"\n                        onChange={this.props.onSessionChange}\n                    />\n                </div>\n                <div>\n                    <Fields.Dropdown\n                        value={this.props.selectedChamber}\n                        options={this.props.chamberOptions}\n                        id=\"chamberDropdown\"\n                        onChange={this.props.onChamberChange}\n                        isDisabled={this.props.isDisabled || this.props.chamberIsDisabled}\n                    />\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default SelectorSection;","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { Prompt } from 'react-router';\nimport { billActionCreators } from '../../../stores/lis-legislation-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport ReactToPrint from 'react-to-print';\nimport renderHTML from 'react-render-html';\n\nimport BillGridSection from './lis-bill-grid';\nimport SelectorSection from './lis-selectors';\nimport ReviewSection from '../../lis-version-management/components/lis-review';\n\nclass AmendmentManagement extends React.Component {\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            billFieldsetIsActive: true,\n            reviewFieldsetIsActive: false,\n            sessionOptions: [],\n            selectedSession: '',\n            reviewContent: '',\n            isLoaded: true,\n            billList: [],\n            selectedAmendment: '',\n            isPreviewVisible: false,\n            processingFile: false,\n            billDataIsLoading: null,\n            billFilter: '',\n            sessionID: '',\n            selectedChamber: '',\n            chamberOptions: [],\n            expandedBills: {},\n            isDirty: false,\n            firstPass: true,\n            currentPage: 0,\n            pageSize: 5,\n            unpublished: false,\n            wasEmpty: false,\n            replaced: false\n        };\n\n        this.reviewRef = React.createRef();\n\n        this.togglePreview = this.togglePreview.bind(this);\n        this.toggleFieldsetCollapse = this.toggleFieldsetCollapse.bind(this);\n        this.handleSessionChange = this.handleSessionChange.bind(this);\n        this.handleChamberChange = this.handleChamberChange.bind(this);\n        this.selectAmendment = this.selectAmendment.bind(this);\n        this.filterBills = this.filterBills.bind(this);\n        this.handleEditorChange = this.handleEditorChange.bind(this);\n        this.handleSave = this.handleSave.bind(this);\n        this.toggleExpandedBills = this.toggleExpandedBills.bind(this);\n        this.onPageChange = this.onPageChange.bind(this);\n        this.onPageSizeChange = this.onPageSizeChange.bind(this);\n        this.getEDoc = this.getEDoc.bind(this);\n        this.appendEdoc = this.appendEdoc.bind(this);\n        this.setWasEmpty = this.setWasEmpty.bind(this);\n        this.setReplaced = this.setReplaced.bind(this);\n        this.filterToEDocReady = this.filterToEDocReady.bind(this);\n        this.isEDocReady = this.isEDocReady.bind(this);\n    }\n\n    toggleFieldsetCollapse(isActive) {\n        this.setState(state => ({\n            [isActive]: !state[isActive]\n        }));\n    }\n\n    togglePreview() {\n        this.setState(state => ({\n            isPreviewVisible: !state.isPreviewVisible\n        }));\n    }\n\n    setWasEmpty(val, callback) {\n        this.setState({ wasEmpty: val }, () => {\n            if (callback) {\n                callback();\n            }\n        })\n    }\n\n    setReplaced(val, callback) {\n        this.setState({ replaced: val }, () => {\n            if (callback) {\n                callback();\n            }\n        })\n    }\n\n    async handleSave(publish) {\n        this.setState({ isSaving: true });\n\n        let selectedAmendment = { ...this.state.selectedAmendment };\n        let amendmentsToSave = [];\n\n        //Try to find the draft title in the text and set it\n        let domContainer = document.createElement('div');\n        domContainer.innerHTML = this.state.reviewContent;\n        //The first element in the content with this class is the draft title\n        let draftLDTitle = domContainer.querySelector('.ldtitle');\n        if (draftLDTitle && draftLDTitle.innerHTML !== '') {\n            selectedAmendment.DraftTitle = draftLDTitle.innerHTML;\n        }\n\n        //Remove any tags TinyMCE may have added when pasting from Word (Borrowing DOM container)\n        domContainer.childNodes.forEach(node => {\n            if (node.nodeName !== \"#text\") {\n                node.removeAttribute('data-mce-fragment');\n                if (node.childNodes.length > 0) {\n                    node.childNodes.forEach(childNode => {\n                        if (childNode.nodeName !== \"#text\") {\n                            childNode.removeAttribute('data-mce-fragment');\n                        }\n                    })\n                }\n            }\n        });\n\n        selectedAmendment.DraftText = domContainer.innerHTML;\n        selectedAmendment.IsPublic = publish || false;\n\n        if (!selectedAmendment.LegislationTypeCode) {\n            selectedAmendment.LegislationTypeCode = this.state.billList.find(x => x.LegislationID === selectedAmendment.LegislationID).LegislationTypeCode\n        }\n\n        if (!selectedAmendment.LegislationChamberCode) {\n            selectedAmendment.LegislationChamberCode = selectedAmendment.ChamberCode;\n        }\n\n        //If we're publishing the engrossed collection of adopted/adopted in part amendments then mark all of those amendments inactive and add them to the save array\n        if (publish && Boolean(selectedAmendment.Description.match(/((Senate)|(House))\\s(Amendment)s?/)) && selectedAmendment.TextDispositionID === 12) {\n            let bill = this.state.billList.find(x => x.LegislationID === selectedAmendment.LegislationID);\n            for (let i = 0; i < bill.Amendments.length; i++) {\n                if (bill.Amendments[i].TextDispositionID !== 12) {\n                    if ((bill.Amendments[i].TextDispositionID === 6 || bill.Amendments[i].TextDispositionID === 7) && bill.Amendments[i].IsActive) {\n                        //Missing draft text can cause republish to fail\n                        if (!bill.Amendments[i].DraftText) {\n                            await this.props.actions.getBillText(\"?legislationTextID=\" + bill.Amendments[i].LegislationTextID, true)\n                                .then(() => {\n                                    bill.Amendments[i] = this.props.bills.billText[0]\n                                })\n                        }\n                        bill.Amendments[i].IsActive = false;\n\n                        amendmentsToSave.push(bill.Amendments[i])\n                    };\n                }\n            }\n        }\n\n        amendmentsToSave.push(selectedAmendment)\n\n        this.props.actions.saveBillText({ TextsList: amendmentsToSave.filter(x => x.LegislationVersionID === 8) })\n            .then(() => {\n                this.setState({ isSaving: false });\n                //In instances where we're publishing the engrossed version, other versions (like introduced) were present in the response\n                //Filter out anything that ins't an amendment so we don't fall into the exception throw\n                let billTextSave = [...this.props.bills.billTextSave.filter(x => x.LegislationVersionID === 8)];\n                if (!billTextSave.length) {\n                    throw 'The response does not contain a bill text';\n                }\n                //If only one bill text is returned, use that one, otherwise, use the engrossed one (if there is more than one bill text returned and there is not exactly one engrossed version, there is an issue)\n                if (billTextSave.length > 1) {\n                    billTextSave = billTextSave.filter(x => x.TextDisposition === \"Engrossed\");\n                }\n                if (billTextSave.length !== 1) {\n                    throw 'The response contains more than one bill text, but not exactly one engrossed version';\n                }\n                if (publish) {\n                    this.setState({\n                        isPreviewVisible: false,\n                        selectedAmendment: '',\n                        reviewContent: '',\n                        reviewFieldsetIsActive: false,\n                        billFieldsetIsActive: true,\n                        isDirty: false,\n                        firstPass: true\n                    });\n                    let filtered = this.state.filteredBillList.length != this.state.billList.length ? true : false\n                    let billList = filtered ? [...this.state.filteredBillList] : [...this.state.billList];\n                    const publishedBillIndex = billList.findIndex(b => b.LegislationID === billTextSave[0].LegislationID)\n                    this.handleSessionChange(this.state.selectedSession, publishedBillIndex);\n                    const legFileGenParams = \"?legislationID=\" + billTextSave[0].LegislationID\n                        + \"&legislationTextID=\" + billTextSave[0].LegislationTextID\n                        + \"&legislationVersionID=\" + billTextSave[0].LegislationVersionID\n                        + \"&sessionID=\" + this.state.selectedSession.SessionID;\n                    this.props.actions.genBillFile(legFileGenParams)\n                } else {\n                    this.setState({\n                        selectedAmendment: billTextSave[0],\n                        isDirty: false,\n                        firstPass: true\n                    });\n                }\n                this.props.actions.makeToast([{ message: \"Save Successful\", type: \"success\" }]);\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err.toString());\n                this.props.actions.makeToast([{ message: \"Save Failed. You may need to refresh before attempting to save.\", type: \"failure\" }]);\n                this.setState({ isSaving: false });\n            });\n    }\n\n    handleEditorChange(content) {\n        this.setState({\n            reviewContent: content,\n            isDirty: this.state.firstPass ? false : true,\n            firstPass: false\n        });\n    }\n\n    handleSessionChange(val, publishedLegislationIndex) {\n        this.setState({\n            selectedSession: val,\n            isLoaded: false,\n            selectedBill: '',\n            amendmentFieldsetIsActive: false,\n            reviewFieldsetIsActive: false\n        });\n        let params = \"?sessionID=\" + val.SessionID;\n        if (this.state.selectedChamber !== \"\" && this.state.selectedChamber.value) {\n            params = params + \"&chamberCode=\" + this.state.selectedChamber.value;\n        }\n\n        this.props.actions.getLegislationAmendmentList(params)\n            .then(() => {\n                this.setState({\n                    billList: this.props.bills.legislationAmendmentList,\n                    isLoaded: true,\n                    sessionID: val.SessionID\n                }, () => {\n                    const callback = () => {\n                        if (!isNaN(publishedLegislationIndex) && publishedLegislationIndex > -1) {\n                            this.createEDoc(publishedLegislationIndex);\n                        }\n                        //create e doc for bills that were expanded; \n                        //if we are viewing bills ready for eDoc, then the bill just published will be removed so we also need to reset expandedBills state accordingly\n                        let newExpanded = { ...this.state.expandedBills };\n                        Object.entries(this.state.expandedBills).forEach((b, i) => {\n                            const idx = Number(b[0]);\n                            const expanded = b[1];\n                            if (this.state.eDocFiltered && !isNaN(publishedLegislationIndex) && publishedLegislationIndex > -1 && idx >= publishedLegislationIndex) {\n                                if (idx !== publishedLegislationIndex) { newExpanded[idx - 1] = expanded; }\n                                delete newExpanded[idx];\n                                if (expanded) {\n                                    this.createEDoc(idx - 1);\n                                }\n                            } else if (expanded) {\n                                this.createEDoc(idx);\n                            }\n                        })\n                        this.setState({ expandedBills: newExpanded });\n                    }\n                    if (this.state.billFilter) {\n                        this.filterBills({ target: { value: this.state.billFilter } }, (publishedLegislationIndex ? true : false), callback)\n                    } else {\n                        this.setState({\n                            filteredBillList: this.props.bills.legislationAmendmentList\n                        }, () => {\n                            callback();\n                        })\n                    }\n                    if (this.state.eDocFiltered) {\n                        this.filterToEDocReady()\n                    }\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    isLoaded: true\n                });\n            });\n    }\n\n    handleChamberChange(val) {\n        this.setState({\n            selectedChamber: val,\n        });\n        if (this.state.sessionID) {\n            const params = \"?sessionID=\" + this.state.sessionID + \"&chamberCode=\" + val.value\n            this.setState({\n                isLoaded: false,\n                selectedBill: '',\n                amendmentFieldsetIsActive: false,\n                reviewFieldsetIsActive: false\n            }, () => {\n                this.props.actions.getLegislationAmendmentList(params)\n                    .then(() => {\n                        this.setState({\n                            billList: this.props.bills.legislationAmendmentList,\n                            isLoaded: true\n                        }, () => {\n                            if (this.state.billFilter) {\n                                this.filterBills({ target: { value: this.state.billFilter } })\n                            } else {\n                                this.setState({\n                                    filteredBillList: this.props.bills.legislationAmendmentList\n                                })\n                            }\n                            if (this.state.eDocFiltered) {\n                                this.filterToEDocReady()\n                            }\n                        });\n                    }).catch(err => {\n                        if (err === 'Aborted') {\n                            return;\n                        }\n                        this.setState({\n                            isLoaded: true\n                        });\n                    });\n            })\n        }\n    }\n\n    async appendEdoc(amendment, amendments) {\n        let draftText = amendment.DraftText;\n        let amendmentNumber = 1;\n        let amendmentTexts = [];\n        let amendmentItems = [];\n\n        for (let i = 0; i < amendments.length; i++) {\n            if (amendments[i].IsActive) {\n                let billTextParams = \"?legislationTextID=\" + amendments[i].LegislationTextID;\n                await this.props.actions.getBillText(billTextParams, true)\n                    .then(() => {\n                        amendmentTexts.push(this.props.bills.billText[0]);\n                    })\n            }\n        }\n\n        await amendmentTexts.forEach((amendmentText, i) => {\n            amendmentItems.push(...amendmentText.AmendmentItems)\n        })\n\n        await amendmentItems.sort((a, b) => {\n            return a.LineNumber - b.LineNumber\n        })\n\n        for (let k = 0; k < amendmentItems.length; k++) {\n            let thisDraftText = '';\n            //Sponsor\n            thisDraftText = thisDraftText + '<p class=\"' + amendmentItems[k].Sponsor.ClassName + '\">' + amendmentItems[k].Sponsor.Name + '</p>';\n            //Line\n            thisDraftText = thisDraftText + '<p class=\"' + amendmentItems[k].LineClassName + '\">' + (amendmentNumber) + \". \" + amendmentItems[k].Line + '</p>';\n            amendmentNumber++;\n            //Changes\n            if (amendmentItems[k].amendmentChanges) {\n                for (let l = 0; l < amendmentItems[k].amendmentChanges.length; l++) {\n                    for (let m = 0; m < amendmentItems[k].amendmentChanges[l].AmendmentActions.length; m++) {\n                        if (amendmentItems[k].amendmentChanges[l].AmendmentActions[m].text !== \"\") {\n                            thisDraftText = thisDraftText + '<p class=\"' + amendmentItems[k].amendmentChanges[l].ClassName + '\">' + amendmentItems[k].amendmentChanges[l].AmendmentActions[m].action + '</p>';\n                            thisDraftText = thisDraftText + '<p class=\"' + amendmentItems[k].amendmentChanges[l].AmendmentActions[m].TextClassName + '\">' + amendmentItems[k].amendmentChanges[l].AmendmentActions[m].text + '</p>';\n                        } else {\n                            thisDraftText = thisDraftText + '<p class=\"' + amendmentItems[k].amendmentChanges[l].ClassName + '\">' + amendmentItems[k].amendmentChanges[l].AmendmentActions[m].action + '</p>';\n                            for (let n = 0; n < amendmentItems[k].amendmentChanges[l].AmendmentActions[m].Lines.length; n++) {\n                                thisDraftText = thisDraftText + '<p class=\"' + amendmentItems[k].amendmentChanges[l].AmendmentActions[m].TextClassName + '\">' + amendmentItems[k].amendmentChanges[l].AmendmentActions[m].Lines[n] + '</p>';\n                            }\n                        }\n                    }\n                }\n            }\n\n            //We check to see if the exact amendment text already exists in the edoc. If it does then skip over it so as to not add it into the edoc a second time\n            if (draftText.replace(/(\\r\\n|\\n|\\r)/gm, \"\").indexOf(thisDraftText) === -1) {\n                draftText = draftText + thisDraftText;\n            }\n        }\n\n        amendment.DraftText = draftText;\n        amendment.AmendmentItems = amendmentItems\n\n        return amendment;\n    }\n\n    async getEDoc(billTextParams) {\n        await this.props.actions.getBillText(billTextParams, true)\n        return this.props.bills.billText[0];\n    }\n\n    async selectAmendment(billIndex, amendment) {\n        //If the amendment has a LegislationTextID then fetch it and start editing\n        if (amendment.LegislationTextID && amendment.TextDispositionID !== 12) {\n            let billTextParams = \"?legislationTextID=\" + amendment.LegislationTextID;\n            this.setState({\n                billDataIsLoading: billIndex\n            });\n            this.props.actions.getBillText(billTextParams, true)\n                .then(() => {\n                    if (this.props.bills.billText.length === 0) {\n                        throw 'No bill text found for this text ID';\n                    }\n                    if (this.props.bills.billText.length > 1) {\n                        throw 'There is more than one bill text for this text id';\n                    }\n                    const amendment = this.props.bills.billText[0];\n                    this.setState({\n                        wasEmpty: false,\n                        replaced: false,\n                        billDataIsLoading: null,\n                        selectedAmendment: amendment,\n                        reviewFieldsetIsActive: true,\n                        //billFieldsetIsActive: false,\n                        reviewContent: amendment.DraftText || '',\n                        isDirty: false,\n                        firstPass: true,\n                        unpublished: amendment.LegislationTextID && amendment.IsPublic ? false : true\n                    }, () => {\n                        this.reviewRef.current.scrollIntoView();\n                    });\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    console.log(err.toString());\n                    this.setState({\n                        billDataIsLoading: null\n                    });\n                    this.props.actions.makeToast([{ message: \"Failed to get Bill Text\", type: \"failure\" }]);\n                });\n        } else if (amendment.TextDispositionID === 12\n            && amendment.LegislationTextID //Else if we find an edoc that was previously saved and there is at least one adopted/adopted in part amendment that's still active we need to add it to the edoc\n            && (this.state.filteredBillList.length != this.state.billList.length\n                ? this.state.filteredBillList[billIndex].Amendments.find(x => x.IsActive && [7, 6].includes(x.TextDispositionID))\n                : this.state.billList[billIndex].Amendments.find(x => x.IsActive && [7, 6].includes(x.TextDispositionID)))) {\n\n            this.setState({\n                billDataIsLoading: true\n            })\n\n            let filtered = this.state.filteredBillList.length != this.state.billList.length;\n            let billList = filtered ? [...this.state.filteredBillList] : [...this.state.billList];\n            let amendments = billList[billIndex].Amendments.filter(x => x.IsActive && [7, 6].includes(x.TextDispositionID))\n\n            let billTextParams = \"?legislationTextID=\" + amendment.LegislationTextID;\n\n            //We have to go back across the wire a bunch to fetch the needed edoc draft text and amendment items to build the appended edoc\n            //If we didn't use async/await setting the state below outruns the building of the document\n            let eDocText = await this.getEDoc(billTextParams);\n            let appendedEDoc = await this.appendEdoc(eDocText, amendments);\n\n            amendment = appendedEDoc;\n\n            this.setState({\n                billDataIsLoading: null,\n                selectedAmendment: amendment,\n                reviewFieldsetIsActive: true,\n                reviewContent: amendment && amendment.DraftText || '',\n                isDirty: false,\n                firstPass: true,\n                wasEmpty: false,\n                replaced: false,\n                unpublished: amendment.LegislationTextID && amendment.IsPublic ? false : true\n            }, () => {\n                this.reviewRef.current.scrollIntoView();\n            });\n        } else {\n            let filtered = this.state.filteredBillList.length != this.state.billList.length;\n            let billList = filtered ? [...this.state.filteredBillList] : [...this.state.billList];\n            let billTextParams = \"?legislationID=\" + billList[billIndex].LegislationID;\n            let amendmentItems = [];\n\n            this.setState({\n                billDataIsLoading: billIndex\n            }, () => {\n                this.props.actions.getBillText(billTextParams, true)\n                    .then(() => {\n                        //If we don't have the LegislationTextID then this is an auto-generated document containing all adopted/adopted in part amendments\n                        //Build the document to be passed into the editor\n                        if (!amendment.LegislationTextID) {\n                            for (let i = 0; i < this.props.bills.billText.length; i++) {\n                                if (this.props.bills.billText[i].ChamberCode !== billList[billIndex].ChamberCode && (this.props.bills.billText[i].TextDispositionID === 6 || this.props.bills.billText[i].TextDispositionID === 7)) {\n                                    for (let j = 0; j < this.props.bills.billText[i].AmendmentItems.length; j++) {\n                                        amendmentItems.push(this.props.bills.billText[i].AmendmentItems[j]);\n                                    }\n                                }\n                            }\n\n                            let amendment = billList[billIndex].Amendments.find(x => !x.LegislationTextID);\n                            amendment.AmendmentItems = amendmentItems.sort((a, b) => a.LineNumber - b.LineNumber);\n\n                            //Build the doc\n                            let draftText = '<p class=\"textbl\">(' + billList[billIndex].LegislationNumber + ')</p> <p class=\"textbl\">AMENDMENT(S) PROPOSED BY THE ' + (billList[billIndex].ChamberCode === 'H' ? 'SENATE' : 'HOUSE') + '</p>';\n\n                            for (let k = 0; k < amendment.AmendmentItems.length; k++) {\n                                //Sponsor\n                                draftText = draftText + '<p class=\"' + amendment.AmendmentItems[k].Sponsor.ClassName + '\">' + amendment.AmendmentItems[k].Sponsor.Name + '</p>';\n                                //Line\n                                draftText = draftText + '<p class=\"' + amendment.AmendmentItems[k].LineClassName + '\">' + (k + 1) + \". \" + amendment.AmendmentItems[k].Line + '</p>';\n                                //Changes\n                                if (amendment.AmendmentItems[k] && amendment.AmendmentItems[k].amendmentChanges) {\n                                    for (let l = 0; l < amendment.AmendmentItems[k].amendmentChanges.length; l++) {\n                                        for (let m = 0; m < amendment.AmendmentItems[k].amendmentChanges[l].AmendmentActions.length; m++) {\n                                            if (amendment.AmendmentItems[k].amendmentChanges[l].AmendmentActions[m].text !== \"\") {\n                                                draftText = draftText + '<p class=\"' + amendment.AmendmentItems[k].amendmentChanges[l].ClassName + '\">' + amendment.AmendmentItems[k].amendmentChanges[l].AmendmentActions[m].action + '</p>';\n                                                draftText = draftText + '<p class=\"' + amendment.AmendmentItems[k].amendmentChanges[l].AmendmentActions[m].TextClassName + '\">' + amendment.AmendmentItems[k].amendmentChanges[l].AmendmentActions[m].text + '</p>';\n                                            } else {\n                                                draftText = draftText + '<p class=\"' + amendment.AmendmentItems[k].amendmentChanges[l].ClassName + '\">' + amendment.AmendmentItems[k].amendmentChanges[l].AmendmentActions[m].action + '</p>';\n                                                for (let n = 0; n < amendment.AmendmentItems[k].amendmentChanges[l].AmendmentActions[m].Lines.length; n++) {\n                                                    draftText = draftText + '<p class=\"' + amendment.AmendmentItems[k].amendmentChanges[l].AmendmentActions[m].TextClassName + '\">' + amendment.AmendmentItems[k].amendmentChanges[l].AmendmentActions[m].Lines[n] + '</p>';\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n\n                            amendment.DraftText = draftText;\n                            let amendments = this.props.bills.billText.filter(x => x.LegislationVersionID === 8);\n                            amendments.push(amendment);\n                            //Need to pick out the amendments specifically\n                            billList[billIndex].Amendments = amendments\n                            //Else if we are opening the edoc and there are previously unpublished adopted/adopted in part amendments present in the list then add them to the edoc\n                        } else {\n                            amendment = this.props.bills.billText.find(x => x.LegislationTextID === amendment.LegislationTextID)\n                            //We only want the amendments\n                            billList[billIndex].Amendments = this.props.bills.billText.filter(x => x.LegislationVersionID === 8);\n                        }\n\n                        if (filtered) {\n                            this.setState({\n                                filteredBillList: billList\n                            })\n                        } else {\n                            this.setState({\n                                billList: billList\n                            })\n                        }\n                        this.setState({\n                            billDataIsLoading: null,\n                            selectedAmendment: amendment,\n                            reviewFieldsetIsActive: true,\n                            //billFieldsetIsActive: false,\n                            reviewContent: amendment && amendment.DraftText || '',\n                            wasEmpty: false,\n                            replaced: false,\n                            isDirty: false,\n                            firstPass: true,\n                            unpublished: amendment.LegislationTextID && amendment.IsPublic ? false : true\n                        }, () => {\n                            this.reviewRef.current.scrollIntoView();\n                        });\n                    })\n            });\n\n            this.setState({\n                billDataIsLoading: false\n            })\n        }\n    }\n\n    filterBills(e, keepExpanded, callback) {\n        const val = e?.target?.value?.toUpperCase();\n        let filteredBillList = val ? this.state.billList.filter(bill => bill.LegislationNumber.toUpperCase().includes(val)) : this.state.billList;\n        const resultsChanged = filteredBillList.length !== this.state.billList.length;\n        this.setState({\n            filteredBillList: filteredBillList,\n            eDocFiltered: false,\n            billFilter: val\n        }, () => {\n            if (resultsChanged) {\n                //reset page to 0 since results have changed\n                this.onPageChange(0, keepExpanded);\n            }\n            if (callback)\n                callback();\n        });\n    }\n\n    toggleExpandedBills(newExpanded, pageIndex) {\n        let index, billIndex;\n        for (let key in newExpanded) {\n            //Find the key where the current expanded bills and the new expanded bills differs\n            if (newExpanded[key] && !this.state.expandedBills[key] || !newExpanded[key] && this.state.expandedBills[key]) {\n                index = key;\n                billIndex = parseInt(key) + (parseInt(pageIndex) * this.state.pageSize);\n            }\n        }\n\n        this.setState({\n            expandedBills: newExpanded\n        }, () => {\n            if (this.state.expandedBills[index]) {\n                this.createEDoc(billIndex);\n            }\n        })\n    }\n\n    filterToEDocReady() {\n        let billList = [...this.state.billList];\n\n        const filteredBillList = billList.filter((_, billIndex) => this.isEDocReady(billList, billIndex));\n        this.setState({ filteredBillList, eDocFiltered: true, billFilter: '' });\n    }\n\n    isEDocReady(billList, billIndex) {\n        //If we have not already created the new consolidated amendment\n        //And If, from the opposing chamber, there is any active Adopted In Part amendment OR there is at least one active Adopted amendment \n        //Then create the new consolidated amendment\n        const amendmentsFilteredByOpposingChamber = billList[billIndex]?.Amendments?.filter(x => x.ChamberCode !== billList[billIndex].ChamberCode);\n\n        return !amendmentsFilteredByOpposingChamber?.find(x => x.TextDispositionID === 12) &&\n            (amendmentsFilteredByOpposingChamber?.find(x => x.TextDispositionID === 7)\n                || amendmentsFilteredByOpposingChamber?.find(x => x.TextDispositionID === 6))\n    }\n\n    createEDoc(billIndex) {\n        let filtered = this.state.filteredBillList.length != this.state.billList.length ? true : false\n        let billList = filtered ? [...this.state.filteredBillList] : [...this.state.billList];\n\n        if (this.isEDocReady(billList, billIndex)) {\n            let eDoc = {\n                ChamberCode: billList[billIndex].ChamberCode === \"H\" ? \"S\" : \"H\", //Opposite of the bill's originating chamber\n                Description: (billList[billIndex].ChamberCode === \"H\" ? \"Senate\" : \"House\") + \" Amendments\", //Opposite of the bill's originating chamber\n                DocumentCode: null,\n                IsActive: true,\n                IsPublic: false,\n                LDNumber: null,\n                LegislationID: billList[billIndex].LegislationID,\n                LegislationTextID: null,\n                LegislationVersion: \"Amendment\",\n                LegislationVersionID: 8,\n                TextDisposition: \"Engrossed\",\n                TextDispositionID: 12,\n                VersionDate: \"\",\n                SessionCode: this.state.selectedSession.SessionCode,\n                SponsorType: billList[billIndex].ChamberCode === \"H\" ? \"Senate\" : \"House\", //Opposite of the bill's originating chamber\n            }\n            billList[billIndex].Amendments.push(eDoc)\n\n            if (filtered) {\n                this.setState({\n                    filteredBillList: billList\n                })\n            } else {\n                this.setState({\n                    billList: billList\n                });\n            }\n        }\n    }\n\n    componentDidMount() {\n        //Get the list of active sessions for the session dropdown\n        this.props.actions.getSessionShallowList(\"IsActive=true\")\n            .then(() => {\n                let sessionList = [...this.props.session.sessionShallowList];\n                sessionList.forEach(session => {\n                    session.label = session.SessionYear + ' ' + session.DisplayName;\n                    session.value = session.SessionID;\n                    //Set the last session in the list as the selected session\n                    if (session.IsDefault) {\n                        this.handleSessionChange(session);\n                    }\n                });\n                this.setState({\n                    sessionOptions: sessionList\n                });\n            });\n\n        //Find if user has access to house and/or senate and add option to chamber selector as applicable\n        let chamberOptions = [];\n\n        if (this.props.login.userClaims.claims.find(x => x.Resource === \"LegislationText\" && x.Scope == 'House')) {\n            chamberOptions.push({ label: \"House Amendment Activity\", value: \"H\" });\n        }\n        if (this.props.login.userClaims.claims.find(x => x.Resource === \"LegislationText\" && x.Scope == 'Senate')) {\n            chamberOptions.push({ label: \"Senate Amendment Activity\", value: \"S\" })\n        }\n\n        this.setState({\n            chamberOptions: chamberOptions,\n            disableChamberSelector: chamberOptions.length === 1\n        }, () => {\n            if (this.state.chamberOptions.length === 1) {\n                this.handleChamberChange(chamberOptions[0])\n            }\n        })\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    onPageChange(pageIndex, keepExpanded) {\n        this.setState({\n            currentPage: pageIndex\n        }, () => {\n            //Reset the expanded bills so we don't have bills that weren't clicked on expanded as the user tabs through the pages of the table\n            if (!keepExpanded) {\n                this.toggleExpandedBills({}, this.state.currentPage)\n            }\n        })\n    }\n\n    onPageSizeChange(pageSize) {\n        this.setState({ pageSize: pageSize }, () => {\n            this.toggleExpandedBills({}, this.state.currentPage)\n        })\n    }\n\n    render() {\n        const { selectedAmendment } = this.state;\n        if (this.state.isPreviewVisible) {\n            return (\n                <div>\n                    <div className=\"flex-row align-center bottomline\">\n                        <h2>{this.state.selectedSession.SessionYear} {this.state.selectedSession.DisplayName} / {selectedAmendment.DocumentCode}</h2>\n                        <ReactToPrint\n                            trigger={() => <span><button type=\"button\" className=\"button print\">Print</button></span>}\n                            content={() => this.componentRef}\n                            pageStyle={\"break-inside: avoid\"}\n                        />\n                    </div>\n                    <div className=\"inner-grid two-col-sidebar\" ref={el => (this.componentRef = el)}>\n                        <div>\n                            {this.state.reviewContent ? renderHTML(this.state.reviewContent) : ''}\n                        </div>\n                    </div>\n                    <div className=\"button-bar\">\n                        <div></div>\n                        <div className=\"align-right\">\n                            <button disabled={this.state.isSaving} onClick={this.togglePreview} className=\"button secondary\">Edit</button>\n                            <button disabled={this.state.isSaving} onClick={() => this.handleSave(true)} className=\"button\">{this.state.isSaving ? \"Publishing...\" : \"Publish\"}</button>\n                        </div>\n                    </div>\n                </div>\n            );\n        } else {\n            return (\n                <div>\n                    <div>\n                        <Prompt\n                            when={this.state.isDirty}\n                            message={`You have unsaved changes. Are you sure you would like to leave?`}\n                        />\n                    </div>\n                    <h1>Amendment Management</h1>\n                    <div className=\"user-forms dlas-forms\">\n                        <fieldset className={this.state.billFieldsetIsActive ? 'fieldset-collapse fieldset-open' : 'fieldset-collapse fieldset-closed'} >\n                            <legend onClick={this.toggleFieldsetCollapse.bind(this, 'billFieldsetIsActive')}>Bills {this.state.processingFile && <span> | <i>Creating file...</i></span>}</legend>\n                            <div>\n                                <SelectorSection\n                                    onSessionChange={this.handleSessionChange}\n                                    sessionOptions={this.state.sessionOptions}\n                                    selectedSession={this.state.selectedSession}\n\n                                    onChamberChange={this.handleChamberChange}\n                                    chamberOptions={this.state.chamberOptions}\n                                    selectedChamber={this.state.selectedChamber}\n                                    chamberIsDisabled={this.state.disableChamberSelector}\n\n                                    isDisabled={this.state.sessionID === \"\"}\n                                />\n                                <span className=\"insert-message small-text fail\">{this.props.bills.legislationAmendmentListError}</span>\n                                <div style={{ display: 'flex', gap: '10px' }}>\n                                    <input type=\"text\" disabled={!this.state.isLoaded || this.state.eDocFiltered} onChange={this.filterBills} value={this.state.billFilter} placeholder=\"Filter by bill number\" />\n                                    <button type=\"button\" className=\"button\" disabled={!this.state.isLoaded} onClick={() => !this.state.eDocFiltered ? this.filterToEDocReady() : this.filterBills()}>{!this.state.eDocFiltered ? 'Show Bills Ready For Second Chamber Engrossed Doc' : 'All Bills'}</button>\n                                </div>\n                                <BillGridSection\n                                    billList={this.state.filteredBillList && this.state.filteredBillList.sort((a, b) => {\n                                        let aPrefix = a.LegislationNumber.substr(0, 2);\n                                        let bPrefix = b.LegislationNumber.substr(0, 2);\n                                        let aNumber = parseInt(a.LegislationNumber.substr(2, a.LegislationNumber.length));\n                                        let bNumber = parseInt(b.LegislationNumber.substr(2, b.LegislationNumber.length));\n\n                                        return aPrefix > bPrefix ? 1 : aNumber > bNumber ? 1 : -1;\n                                    })}\n                                    selectAmendment={this.selectAmendment}\n                                    isLoaded={this.state.isLoaded}\n                                    billDataIsLoading={this.state.billDataIsLoading}\n                                    expandedBills={this.state.expandedBills}\n                                    toggleExpandedBills={this.toggleExpandedBills}\n                                    pageSize={this.state.pageSize}\n                                    currentPage={this.state.currentPage}\n                                    onPageChange={this.onPageChange}\n                                    onPageSizeChange={this.onPageSizeChange}\n                                    selectedChamber={this.state.selectedChamber.value}\n                                />\n                            </div>\n                        </fieldset>\n                        <fieldset ref={this.reviewRef} className={this.state.reviewFieldsetIsActive ? 'fieldset-collapse fieldset-open' : 'fieldset-collapse fieldset-closed'} >\n                            <legend onClick={this.toggleFieldsetCollapse.bind(this, 'reviewFieldsetIsActive')}><span>Review </span>\n                                {selectedAmendment &&\n                                    <span>\n                                        | {selectedAmendment.DocumentCode}\n                                    </span>\n                                }</legend>\n                            <div>\n                                <ReviewSection\n                                    editorContent={this.state.reviewContent}\n                                    handleEditorChange={this.handleEditorChange}\n                                    sessionId={this.state.selectedSession.SessionID}\n                                    allowAmendmentActions={true}\n                                    userChamber={this.props.login.userClaims.roles.find((x) => x === \"Admin\") ? \"Admin\" : this.props.login.userClaims.roles.find((x) => x === \"HouseLegislationAuthor\") ? \"H\" : \"S\"}\n                                    billNumber={this.state.selectedAmendment ? this.state.selectedAmendment.LegislationNumber : ''}\n                                    location={this.props.location.pathname}\n                                    pasteAsText={false}\n                                    setWasEmpty={this.setWasEmpty}\n                                    wasEmpty={this.state.wasEmpty}\n                                    setReplaced={this.setReplaced}\n                                    replaced={this.state.replaced}\n                                />\n                                <div className=\"button-bar\">\n                                    <div />\n                                    <div className=\"align-right\">\n                                        <button type=\"button\" className=\"button\" disabled={this.state.isSaving || !this.state.selectedAmendment} onClick={() => this.handleSave(this.state.unpublished ? false : true)}>{this.state.isSaving ? !this.state.unpublished ? \"Republishing...\" : \"Saving...\" : !this.state.unpublished ? \"Republish\" : \"Save\"}</button>\n                                        {this.state.unpublished && <button type=\"button\" className=\"button\" disabled={!this.state.selectedAmendment || this.state.isSaving || this.state.isDirty} onClick={this.togglePreview}>Preview</button>}\n                                    </div>\n                                </div>\n                            </div>\n                        </fieldset>\n                    </div>\n                </div>\n            );\n        }\n    }\n}\nexport default connect(\n    (state) => {\n        const { bills, session, nav, login } = state;\n        return {\n            bills,\n            session,\n            nav,\n            login\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, billActionCreators, sessionActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(AmendmentManagement)","import React from 'react';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\nimport Popout from '../../../lis-shared/lis-layout/components/lis-popout-component';\n\nclass AdminDashboard extends React.Component {\n    constructor(props) {\n        super(props)\n        this.state = {\n            showPortal: false\n        }\n        this.togglePortal = this.togglePortal.bind(this);\n    }\n\n\n    togglePortal(state) {\n        this.setState({\n            showPortal: !state\n        });\n    }\n\n    render() {\n        return(\n            <div>\n                <h1>Dashboard</h1>\n                <p>This is the user dashboard view.</p>\n                <button onClick={() => this.togglePortal(this.state.showPortal)}>Test </button>\n                {this.state.showPortal &&\n                    <Popout togglePortal={this.togglePortal} windowTitle=\"test\">\n                        <p>Even though I render in a different window, I share state!</p>\n                    </Popout>\n                }\n            </div>\n        );\n    }\n}\n\n\nexport default connect(\n    (state) => {\n        const { committee } = state;\n        return {\n            committee\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, committeeActionCreators), dispatch)\n        }\n    }\n)(AdminDashboard)","import React, { useEffect, useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { billActionCreators } from '../../../stores/lis-legislation-store';\nimport { collectionActionCreators } from '../../../stores/lis-collection-store';\nimport queryString from 'query-string';\nimport moment from 'moment-timezone';\nimport Select from 'react-select';\nimport { voteActionCreators } from '../../../stores/lis-votes-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\n\nconst criteriaTypeWeights = {\n    \"Introduced\": 1,\n    \"Patron\": 2,\n    \"Keyword\": 3,\n    \"Committee\": 4,\n    \"Status Change\": 5,\n    \"Docket/Agenda\": 6,\n    \"New Version\": 7,\n    \"Impact Statements\": 8,\n}\n\nconst sortLegNumbers = (a, b) => {\n    if (a && !b) {\n        return 1;\n    }\n\n    if (!a && b) {\n        return -1;\n    }\n\n    //chamber, type, number\n    return a[0].localeCompare(b[0]) || a[1].localeCompare(b[1]) || parseInt(a.substr(2) - b.substr(2));\n}\n\nconst LegEvent = props => {\n    const { item, bill } = props;\n    const [showLinks, toggleLinks] = useState(false);\n    const [isLoading, toggleLoading] = useState(false);\n    const [voteLinks, setVoteLinks] = useState('');\n    const getVoteLinks = () => {\n        if (voteLinks) {\n            toggleLinks(!showLinks);\n        } else {\n            toggleLoading(true);\n            props.getVoteLinks(item, res => {\n                setVoteLinks(res);\n                toggleLoading(false);\n                toggleLinks(true);\n            })\n        }\n    }\n    const linkStyle = {\n        fontSize: '1em',\n        margin: '0 5px 0 0'\n    };\n    return <tr className='parent-tr slidedown-closed bill-details-table-row'>\n        <td className=\"left\">{moment(item.EventDate).format('l')}</td>\n        <td className=\"left\">{item.ChamberCode === 'H' && 'House'} {item.ChamberCode === \"S\" && \"Senate\"}</td>\n        <td className=\"left\">\n            {item.Description}\n            {voteLinks && showLinks &&\n                <div className=\"link-row\">\n                    {voteLinks.map((link, index) =>\n                        <div key={index}>\n                            {link.VoteID ? link.IsPublic ? <Link to={`/vote-details/${bill.LegislationNumber}/${bill.SessionCode}/${link.VoteNumber}`}>Vote</Link> : <span>Vote Detail Pending</span> : ''}\n                            {link.CommitteeID ? <Link to={`/session-details/${bill.SessionCode}/committee-information/${link.CommitteeNumber}/committee-details`}>{link.ParentCommitteeID ? 'Subcommittee' : 'Committee'}</Link> : ''}\n                            {link.LegislationNumber && (link.SessionCode || item.SessionCode) ? <Link to={`/bill-details/${link.SessionCode || item.SessionCode}/${link.LegislationNumber}`}>Legislation</Link> : ''}\n                        </div>\n                    )}\n                </div>\n            }\n        </td>\n        <td className=\"button-container\">\n            {item.ReferenceID &&\n                <React.Fragment>\n                    {isLoading ?\n                        <React.Fragment>\n                            <label className=\"arrow-down-label\"></label>\n                            <span className=\"small-spinner\"></span>\n                        </React.Fragment>\n                        :\n                        <React.Fragment>\n                            <button className={`${showLinks ? \"arrow-up\" : \"arrow-down\"}`} onClick={getVoteLinks}></button>\n                        </React.Fragment>\n                    }\n                </React.Fragment>\n            }\n        </td>\n    </tr>\n}\n\nconst BillInfo = props => {\n    const { reasonGrouping, bill, checked, isAdding, allBillsExpanded } = props;\n    const [showInfo, toggleInfo] = useState(false);\n\n    useEffect(() => {\n        toggleInfo(allBillsExpanded);\n    }, [allBillsExpanded])\n\n    return (\n        <div className=\"flex-row flex-start bill-theme\">\n            {!props.selectedCollection ? <div></div> :\n                <div className=\"collection-buttons\">\n                    {collectionBillIndex !== -1 ?\n                        <button type=\"button\" onClick={deleteBillFromCollection} className='button remove'></button>\n                        :\n                        <button type=\"button\" onClick={addBillToCollection} className='button add'></button>\n                    }\n                </div>\n            }\n            <div className='parent-li se-bill-search-result'>\n                <div className=\"small-gap-grid two-col-sidebar-alt\">\n                    <div className=\"description notification\">\n                        <input disabled={isAdding} checked={checked || false} onChange={props.handleCheckbox} type=\"checkbox\" />\n                        <div className=\"docket-agenda-link-container\">\n                            <Link to={`/bill-details/${bill.SessionCode}/${bill.LegislationNumber}`}>{bill.LegislationNumber}</Link>\n                            {reasonGrouping?.CriteriaType === \"Docket/Agenda\" && bill.CommitteeNumber && bill.CommitteeNumber.startsWith('H') && <a className=\"docket-agenda-link\" href={`https://virginiageneralassembly.gov/house/agendas/agendaDates.php?id=${bill.CommitteeNumber}&ses=${bill.SessionCode.substr(2)}`}>(Agenda)</a>}\n                            {reasonGrouping?.CriteriaType === \"Docket/Agenda\" && bill.CommitteeNumber && bill.CommitteeNumber.startsWith('S') && bill.ReferenceID && <Link className=\"docket-agenda-link\" to={`/session-details/${bill.SessionCode}/committee-information/${bill.CommitteeNumber}/dockets/${bill.ReferenceID}`}>(Docket)</Link>}\n                        </div>\n                        <h3 className=\"small-text\">{bill.LegislationDescription}</h3>\n                    </div>\n                    <div className=\"button-container\">\n                        <button className={showInfo ? 'arrow-up' : 'arrow-down'} onClick={() => toggleInfo(!showInfo)}>More info</button>\n                    </div>\n                    {showInfo &&\n                        <div>\n                            {bill.LegislationTextID && reasonGrouping?.CriteriaType === \"Keyword\" ?\n                                <button\n                                    className=\"button-link\"\n                                    onClick={() => props.pushWithKeywords(bill.SessionCode, bill.LegislationNumber, bill.DocumentCode, bill.WatchListID)}>\n                                    View Keyword Hits for {bill.DocumentCode}</button>\n                                : null}\n                            <table className=\"line-table\">\n                                <tbody>\n                                    {bill.LegislationEvents.map((item, index) =>\n                                        <LegEvent\n                                            key={index}\n                                            item={item}\n                                            bill={bill}\n                                            getVoteLinks={props.getVoteLinks}\n                                        />\n                                    )}\n                                </tbody>\n                            </table>\n                        </div>\n                    }\n                </div>\n                <hr className=\"faded-line\" />\n            </div>\n        </div >\n    );\n}\n\nclass NotificationManagement extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            isLoaded: false,\n            errorMessage: '',\n            notifications: [],\n            watchlists: [],\n            selectedWatchlists: [],\n            checkedBills: [],\n            isAdding: false,\n            expandLatestHistory: false\n        }\n\n        this.getWatchlists = this.getWatchlists.bind(this);\n        this.getVoteLinks = this.getVoteLinks.bind(this);\n        this.handleCheckbox = this.handleCheckbox.bind(this);\n        this.selectWatchlist = this.selectWatchlist.bind(this);\n        this.addBillsToWatchlist = this.addBillsToWatchlist.bind(this);\n        this.pushWithKeywords = this.pushWithKeywords.bind(this);\n        this.expandLatestHistory = this.expandLatestHistory.bind(this);\n\n        this.stickyHeader = React.createRef();\n        this.notificationsRef = React.createRef();\n    }\n\n    getVoteLinks(item, callback) {\n        const params = '?legislationEventID=' + item.LegislationEventID;\n        this.props.actions.getVoteLink(params).then(() => {\n            let links = [...this.props.votes.voteLinkResponse];\n            let linkPromises = [];\n            links.forEach(link => {\n                if (link.CommitteeID) {\n                    const cmtePromise = this.props.actions.getCommitteeById(\"?id=\" + link.CommitteeID + \"&sessionCode=\" + vote.SessionCode)\n                        .then(() => {\n                            link.CommitteeNumber = this.props.committee.committeeByIdData.CommitteeNumber;\n                        }).catch((err) => {\n                            console.error(err);\n                            // Don't care if it fails. That committee won't be visible\n                            return Promise.resolve();\n                        })\n                    linkPromises.push(cmtePromise);\n                }\n                // If there are any vote links of type 'Legislation' then the legislation ID needs to be turned into a legislation number to form the link\n                if (link.ReferenceType === \"Legislation\") {\n                    const promise = this.props.actions.getBill(link.ReferenceID)\n                        .then(() => {\n                            link.LegislationNumber = this.props.bills.bill.LegislationNumber;\n                            link.SessionCode = link.SessionCode || vote.SessionCode;\n                            return Promise.resolve();\n                        }).catch(err => {\n                            console.error(err);\n                            // Don't care if it fails. That legislation won't be visible\n                            return Promise.resolve();\n                        });\n                    linkPromises.push(promise);\n                }\n            });\n            Promise.all(linkPromises)\n                .then(() => {\n                    callback(this.props.votes.voteLinkResponse);\n                });\n\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            console.error(err);\n            callback(null);\n        });\n    }\n\n    handleCheckbox(notificationIDs, selectAll) {\n        let checkedBills = [...this.state.checkedBills];\n        notificationIDs.forEach(notificationID => {\n            let checkedBillIdx = checkedBills.findIndex(b => b.NotificationID === notificationID);\n            if (checkedBillIdx > -1) {\n                checkedBills[checkedBillIdx].checked = selectAll === true || !Boolean(checkedBills[checkedBillIdx].checked);\n            } else {\n                checkedBills.push({ NotificationID: notificationID, checked: true })\n            }\n        })\n        this.setState({\n            checkedBills: checkedBills\n        });\n    }\n\n    selectWatchlist(val) {\n        this.setState({\n            selectedWatchlists: val\n        });\n    }\n\n    addBillsToWatchlist() {\n        this.setState({\n            isAdding: true\n        });\n        let selectedWatchlists = [...this.state.selectedWatchlists];\n        selectedWatchlists.forEach(wl => wl.WatchListLegislation = wl.WatchListLegislation || []);\n        let billsFound = false;\n        let duplicate = false;\n        [...this.state.checkedBills].filter(c => c.checked).forEach((c) => {\n            const bill = this.state.notifications.flatMap(n => n.Committees).flatMap(c => c.Reasons).flatMap(r => r.Bills).find(b => b.NotificationID === c.NotificationID);\n            if (bill) {\n                selectedWatchlists.forEach(wl => {\n                    if (!wl.WatchListLegislation.find(b => b.LegislationID === bill.LegislationID && b.WatchListLegislationID && !b.DeletionDate)) {\n                        billsFound = true;\n                        wl.WatchListLegislation.push({\n                            LegislationID: bill.LegislationID,\n                            WatchListID: wl.WatchListID\n                        });\n                    } else {\n                        duplicate = true;\n                    }\n                });\n            }\n        })\n        if (!billsFound && !duplicate) {\n            this.setState({\n                isAdding: false\n            });\n            return;\n        } else if (!billsFound && duplicate) {\n            this.props.actions.makeToast([{ message: ([...this.state.checkedBills].filter(c => c.checked).length > 1 ? \"These bills already exist\" : \"This bill already exists\") + \" in \" + (selectedWatchlists.length > 1 ? \"these watchlists\" : \"this watchlist\"), type: \"failure\" }]);\n            this.setState({\n                isAdding: false\n            });\n            return;\n        }\n\n        this.props.actions.saveCollections({ WatchLists: selectedWatchlists })\n            .then(() => {\n                let selectedWatchlists = [...this.props.collection.collectionSave];\n                let watchlists = [...this.state.watchlists];\n                selectedWatchlists.forEach(wl => {\n                    const savedWatchlistIndex = watchlists.findIndex(w => w.WatchListID === wl.WatchListID);\n                    watchlists[savedWatchlistIndex] = wl;\n                    wl.WatchListLegislation = wl.WatchListLegislation || [];\n                })\n                this.setState({\n                    isAdding: false,\n                    selectedWatchlists: selectedWatchlists,\n                    watchlists: watchlists\n                });\n                this.props.actions.makeToast([{ message: \"Save Successful\", type: \"success\" }]);\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    isAdding: false\n                });\n                console.error(err);\n                this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n            });\n    }\n\n    organizeNotifications(notifications) {\n        notifications.sort(a => a.CommitteeName === undefined ? -1 : 1);\n        notifications.sort((a, b) => a.WatchListID - b.WatchListID || (a.CriteriaType !== b.CriteriaType && criteriaTypeWeights[a.CriteriaType] && criteriaTypeWeights[b.CriteriaType] && criteriaTypeWeights[a.CriteriaType] - criteriaTypeWeights[b.CriteriaType]) || sortLegNumbers(a.LegislationNumber, b.LegislationNumber));\n        let organizedNotifications = new Notifications();\n        let committeesArr = new Committees();\n        let previousNotification = notifications[0];\n        notifications.forEach(notification => {\n            if (previousNotification.WatchListID !== notification.WatchListID) {\n                const newNotificationContainer = new Notification(\n                    [...committeesArr.NotificationGroupings],\n                    previousNotification.Name,\n                    previousNotification.Description,\n                    previousNotification.WatchListID\n                );\n                organizedNotifications.notifications.push(newNotificationContainer);\n                committeesArr = new Committees();\n                const objName = notification.CommitteeName || \"nonCommitteeBills\";\n                committeesArr.NotificationGroupings.push(new NotificationGrouping(objName, notification.CommitteeNumber, [new NotificationReason(notification.CriteriaType, notification.NotificationReason, [notification])]));\n            } else {\n                // Notification items are organized by watchlist but also organized by committee. The object name is the committee name which is used to display to the user what committee the notification comes from\n                const objName = notification.CommitteeName || \"nonCommitteeBills\";\n                if (!committeesArr.NotificationGroupings.find(cmte => cmte.CommitteeName === objName)) {\n                    committeesArr.NotificationGroupings.push(new NotificationGrouping(objName, notification.CommitteeNumber, []));\n                }\n                let reasonObjIdx = committeesArr.NotificationGroupings.find(group => group.CommitteeName === objName).Reasons.findIndex(legListing => legListing.CriteriaType === notification.CriteriaType);\n                if (reasonObjIdx < 0) {\n                    committeesArr.NotificationGroupings.find(cmte => cmte.CommitteeName === objName).Reasons.push(new NotificationReason(notification.CriteriaType, notification.NotificationReason, [notification]));\n                } else if (!committeesArr.NotificationGroupings.find(cmte => cmte.CommitteeName === objName).Reasons[reasonObjIdx].Bills.find(b => b.LegislationNumber === notification.LegislationNumber)) { //don't insert duplicate leg numbers\n                    committeesArr.NotificationGroupings.find(cmte => cmte.CommitteeName === objName).Reasons[reasonObjIdx].Bills.push(notification)\n                }\n            }\n            previousNotification = notification;\n        });\n        //If the object is not empty then that means not every element in the results have been added to a container\n        //So, check to see if the object has keys and if so create another container\n        if (committeesArr.NotificationGroupings.length > 0) {\n            const newNotificationContainer = new Notification(\n                [...committeesArr.NotificationGroupings],\n                previousNotification.Name,\n                previousNotification.Description,\n                previousNotification.WatchListID\n            );\n            organizedNotifications.notifications.push(newNotificationContainer);\n        }\n\n        return organizedNotifications.notifications;\n    }\n\n    pushWithKeywords(sessionCode, legislationNumber, documentCode, watchlistId) {\n        const selectedWatchlist = this.state.watchlists.find(w => w.WatchListID === watchlistId);\n        if (selectedWatchlist) {\n            const keywordsList = selectedWatchlist.NotificationCriterias.filter(c => c.CriteriaType === \"Keyword\");\n            // Need to seperate each criteria value into an array of words. That is the purpose of the join followed by the split\n            const keywordExpression = keywordsList.map(k => k.CriteriaValue).join(\" \");\n            const partsRegex = /(\\().*?(\\)+)|(\").*?(\"+)|(').*?('+)|['a-zA-Z*]*/g;\n            const keywordParts = keywordExpression.match(partsRegex);\n            let foundAnOperator = false;\n            for (const keywordPart of keywordParts) {\n                if (keywordPart && (keywordPart.toLowerCase() === \"and\" || keywordPart.toLowerCase() === \"or\")) { foundAnOperator = true; break; }\n            }\n\n            let sanitizedKeywords = [];\n            var chars = { \"(\": \"\", \")\": \"\", '\"': \"\" };\n            if (!foundAnOperator) {\n                //need to behave like API to keep it consistent:\n                //per API, no operators so just clean expression from single quote operators and treat it as single keyword\n                let phraseToInsert = keywordExpression.replace(/[()\"]/g, m => chars[m]);\n                if (phraseToInsert.startsWith(\"'\") && phraseToInsert.endsWith(\"'\")) { phraseToInsert = phraseToInsert.substr(1, phraseToInsert.length - 2) }\n                if (phraseToInsert) { sanitizedKeywords.push(phraseToInsert); }\n            } else {\n                for (const keywordPart of keywordParts) {\n                    if (keywordPart && keywordPart.toLowerCase() != \"and\" && keywordPart.toLowerCase() != \"or\") {\n                        let wordToInsert = keywordPart.replace(/[()\"]/g, m => chars[m]);\n                        if (wordToInsert.startsWith(\"'\") && wordToInsert.endsWith(\"'\")) { wordToInsert = wordToInsert.substr(1, wordToInsert.length - 2) }\n                        if (wordToInsert) { sanitizedKeywords.push(wordToInsert); }\n                    }\n                }\n            }\n            window.open(`/bill-details/${sessionCode}/${legislationNumber}/text/${documentCode}?keywords=${encodeURIComponent(sanitizedKeywords.join(\" \"))}`, '_blank');\n        }\n    }\n\n    componentDidMount() {\n        const parsed = queryString.parse(this.props.location.search, { decode: true });\n        if (parsed.date) {\n            this.props.actions.getNotifications(`?notificationDate=${encodeURIComponent(parsed.date)}`)\n                .then(() => {\n                    const organizedNotifications = this.organizeNotifications(this.props.collection.notifications)\n                    this.setState({\n                        notifications: organizedNotifications,\n                        isLoaded: true\n                    }, () => {\n                        if (this.stickyHeader.current && this.notificationsRef.current) {\n                            const scrollTop = this.notificationsRef.current.getBoundingClientRect().top;\n                            const self = this;\n                            window.onscroll = function () {\n                                if (window.scrollY >= scrollTop) {\n                                    self.stickyHeader.current?.classList?.add('background-color');\n                                } else {\n                                    self.stickyHeader.current?.classList?.remove('background-color');\n                                }\n                            }\n                        }\n                    });\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.setState({\n                        errorMessage: err.toString(),\n                        isLoaded: true\n                    });\n                });\n            // Get the user's watchlists\n            if (!this.props.session.sessionList || !this.props.session.sessionList.length) {\n                this.props.actions.getSessionList()\n                    .then(() => {\n                        this.setState({\n                            sessionOptions: this.props.session.sessionList\n                        }, () => {\n                            this.getWatchlists();\n                        })\n                    }).catch(err => {\n                        if (err === 'Aborted') {\n                            return;\n                        }\n                        console.log(err)\n                    });\n            } else {\n                this.setState({\n                    sessionOptions: this.props.session.sessionList\n                }, () => {\n                    this.getWatchlists();\n                })\n            }\n        } else {\n            this.setState({ errorMessage: 'No date has been provided.', isLoaded: true })\n        }\n    }\n\n    componentDidUpdate(prevProps) {\n        if (prevProps.nav.session != this.props.nav.session && this.state.sessionOptions) {\n            this.getWatchlists();\n        }\n    }\n\n    getWatchlists() {\n        const selectedSession = this.state.sessionOptions.find(s => s.SessionCode === this.props.nav.session);\n        if (selectedSession) {\n            this.props.actions.getCollections(\"?SessionID=\" + selectedSession.SessionID)\n                .then(() => {\n                    this.setState({\n                        watchlists: this.props.collection.collections\n                    });\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return\n                    }\n                });\n        }\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    expandLatestHistory() {\n        this.setState({ expandLatestHistory: !this.state.expandLatestHistory })\n    }\n\n    render() {\n        const { isLoaded, errorMessage, notifications, watchlists, selectedWatchlists, checkedBills, isAdding } = this.state;\n        return (<div>\n            {!isLoaded && !errorMessage &&\n                <div className=\"center-spinner spinner\"></div>\n            }\n            {isLoaded &&\n                <div>\n                    <h2>{Boolean(this.props.login.userClaims.claims.find(claim => claim.Scope === \"Paid\" && claim.Resource === \"LegislationCollections\" && claim.RoleName === \"PaidLegislationCollectionsAuthor\")) || Boolean(this.props.login.userClaims.resources.find(resource => resource === \"PaidLegislationCollectionsAuthor\" || resource === \"All\")) ? 'Watchlists - Notifications' : 'Watchlist - Notification'}</h2>\n                    {\n                        errorMessage ?\n                            <h4>{errorMessage}</h4>\n                            :\n                            !notifications.length ?\n                                <h4>You do not have any notifications for the provided date.</h4>\n                                :\n                                <>\n                                    <div className=\"sticky\" ref={this.stickyHeader}>\n                                        <div className=\"inner-grid two align-center padding\">\n                                            <div>\n                                                <button onClick={this.expandLatestHistory} type=\"button\" className=\"button mobile-w-100 mobile-mb-10\">{this.state.expandLatestHistory ? 'Hide' : 'Show'} Latest History</button>\n                                            </div>\n                                            <div className=\"inner-grid three-and-one\">\n                                                <Select\n                                                    options={watchlists}\n                                                    value={selectedWatchlists}\n                                                    onChange={this.selectWatchlist}\n                                                    isClearable\n                                                    isMulti\n                                                    getOptionLabel={opt => opt.Name}\n                                                    getOptionValue={opt => opt.WatchListID}\n                                                />\n                                                <button onClick={this.addBillsToWatchlist} disabled={!selectedWatchlists || !selectedWatchlists.length || checkedBills.every(b => !b) || isAdding} type=\"button\" className=\"button\">{isAdding ? \"Adding\" : \"Add\"} Bills To Watchlist(s)</button>\n                                            </div>\n                                        </div>\n                                    </div>\n                                    <div ref={this.notificationsRef}>\n                                        {notifications.map((notification, notificationIndex) =>\n                                            <div key={notificationIndex}>\n                                                {notification.Name &&\n                                                    <Link className=\"notification-watchlist-name\" to={`/bill-search?collection=${notification.WatchListID}`}><h2>{notification.Name}{notification.Description ? <small> - {notification.Description}</small> : ''}</h2></Link>\n                                                }\n                                                <ul className=\"slidedown-list\">\n                                                    {notification.Committees.map((committeeGrouping, committeeGroupingIndex) =>\n                                                        <React.Fragment key={committeeGroupingIndex}>\n                                                            {committeeGrouping.CommitteeName !== \"nonCommitteeBills\" &&\n                                                                <h3>{committeeGrouping.CommitteeNumber ? '(' + committeeGrouping.CommitteeNumber[0] + ') ' : ''}{committeeGrouping.CommitteeName}</h3>\n                                                            }\n                                                            <div style={committeeGrouping.CommitteeName != \"nonCommitteeBills\" ? { paddingLeft: '1em' } : {}}>\n                                                                {committeeGrouping?.Reasons?.map((reasonGrouping, reasonGroupingIndex) => {\n                                                                    const selectAll = !reasonGrouping.Bills.map(b => b.NotificationID).find(n => !checkedBills.filter(c => c.checked).map(b => b.NotificationID).includes(n));\n                                                                    return (\n                                                                        <React.Fragment key={reasonGroupingIndex}>\n                                                                            {reasonGrouping.Reason &&\n                                                                                <h4>{reasonGrouping.Reason}</h4>\n                                                                            }\n                                                                            <div className=\"small-gap-grid two-col-sidebar-alt\" style={{ marginBottom: '5px' }}>\n                                                                                <div className=\"description notification\" style={{ alignItems: 'center' }}>\n                                                                                    <input disabled={isAdding} checked={selectAll} onChange={() => this.handleCheckbox(reasonGrouping.Bills.map(b => b.NotificationID), !selectAll)} type=\"checkbox\" />\n                                                                                    <span style={{ fontSize: '0.75em' }}>Select all</span>\n                                                                                </div>\n                                                                            </div>\n                                                                            {reasonGrouping.Bills.map(((bill, billIndex) =>\n                                                                                <BillInfo\n                                                                                    reasonGrouping={reasonGrouping}\n                                                                                    key={billIndex}\n                                                                                    bill={bill}\n                                                                                    checked={checkedBills.find(b => b.NotificationID === bill.NotificationID) && checkedBills.find(b => b.NotificationID === bill.NotificationID).checked}\n                                                                                    isAdding={isAdding}\n                                                                                    handleCheckbox={() => this.handleCheckbox([bill.NotificationID])}\n                                                                                    getVoteLinks={this.getVoteLinks}\n                                                                                    pushWithKeywords={this.pushWithKeywords}\n                                                                                    allBillsExpanded={this.state.expandLatestHistory}\n                                                                                />\n                                                                            ))}\n                                                                        </React.Fragment>\n                                                                    )\n                                                                }\n                                                                )}\n                                                            </div>\n                                                        </React.Fragment>\n                                                    )}\n                                                </ul>\n                                            </div>\n                                        )}\n                                    </div>\n                                </>\n                    }\n                </div>\n            }\n        </div>)\n    }\n}\n\nclass Notifications {\n    constructor(notifications) {\n        this.notifications = notifications || [];\n    }\n\n    notifications;\n}\n\nclass Notification {\n    constructor(committees, name, description, watchlistID) {\n        this.Committees = committees;\n        this.Name = name;\n        this.Description = description;\n        this.WatchListID = watchlistID;\n    }\n\n    Committees;\n    Name;\n    Description;\n    WatchListID;\n}\n\nclass Committees {\n    constructor(notificationGroupings) {\n        this.NotificationGroupings = notificationGroupings || [];\n    }\n\n    NotificationGroupings;\n}\n\nclass NotificationGrouping {\n    constructor(committee, committeeNumber, reasons) {\n        this.CommitteeName = committee;\n        this.CommitteeNumber = committeeNumber;\n        this.Reasons = reasons;\n    }\n\n    CommitteeName;\n    CommitteeNumber;\n    Reasons;\n}\n\nclass NotificationReason {\n    constructor(criteriaType, reason, bills) {\n        this.CriteriaType = criteriaType;\n        this.Reason = reason;\n        this.Bills = bills;\n    }\n\n    CriteriaType;\n    Reason;\n    Bills;\n}\n\nexport default connect(\n    (state) => {\n        const { collection, bills, votes, nav, session, login } = state;\n        return {\n            collection,\n            bills,\n            votes,\n            nav,\n            session,\n            login\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, billActionCreators, collectionActionCreators, voteActionCreators, navActionCreators, sessionActionCreators), dispatch)\n        }\n    }\n)(NotificationManagement)","import { partnerRequest, publicRequest } from \"../services/request.service\";\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst docListSuccess = 'DOC_LIST_SUCCESS';\nconst docListFailure = 'DOC_LIST_FAILURE';\n\nconst docSuccess = 'DOC_SUCCESS';\nconst docFailure = 'DOC_FAILURE';\n\nconst keyRegistrationSuccess = \"KEY_REGISTRATION_SUCCESS\";\nconst keyRegistrationFailure = \"KEY_REGISTRATION_FAILURE\";\n\nconst confirmKeyRegistrationSuccess = \"CONFIRM_KEY_REGISTRATION_SUCCESS\";\nconst confirmKeyRegistrationFailure = \"CONFIRM_KEY_REGISTRATION_FAILURE\";\n\nconst savePartnerSuccess = \"SAVE_PARTNER_SUCCESS\";\nconst savePartnerFailure = \"SAVE_PARTNER_FAILURE\";\n\nconst partnerListSuccess = 'PARTNER_LIST_SUCCESS';\nconst partnerListFailure = 'PARTNER_LIST_FAILURE';\n\nconst getPartnerSuccess = 'GET_PARTNER_SUCCESS';\nconst getPartnerFailure = 'GET_PARTNER_FAILURE';\n\nconst getPartnerKeySuccess = 'GET_PARTNER_KEY_SUCCESS';\nconst getPartnerKeyFailure = 'GET_PARTNER_KEY_FAILURE';\n\nconst initialState = {\n    docList: [],\n    doc: '',\n    docListError: '',\n    docError: '',\n    savePartnerError: '',\n    keyRegistrationError: '',\n    partnerListError: '',\n    partnerError: '',\n    partnerKeyError: ''\n};\n\nexport const developersActionCreators = {\n\n    receiveDocList: (content) => ({\n        type: docListSuccess,\n        docList: content\n    }),\n\n    docListError: (message) => ({\n        type: docListFailure,\n        docListError: message\n    }),\n\n    getDocList: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            };\n\n            return publicRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/ReportFileGeneration/api/GetApiListAsync', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(developersActionCreators.docListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(developersActionCreators.receiveDocList(result[1].ApiDocumentations))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(developersActionCreators.docListError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveDoc: (content) => ({\n        type: docSuccess,\n        doc: content\n    }),\n\n    docError: (message) => ({\n        type: docFailure,\n        docError: message\n    }),\n\n    getDoc: (params, partner) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            };\n\n            return partner ? partnerRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/ReportFileGeneration/api/getpartnerapidocumentationasync', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(developersActionCreators.docError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(developersActionCreators.receiveDoc(result[1].ApiDocumentations[0].Documentation))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(developersActionCreators.docError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n                : publicRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/ReportFileGeneration/api/getapidocumentationasync', 'GET', headers, '', params)\n                    .then(result => {\n                        if (result[0] === REQUEST_FAILURE) {\n                            dispatch(developersActionCreators.docError(result[1]))\n                            return Promise.reject(result[1])\n                        } else if (result[0] === REQUEST_SUCCESS) {\n                            dispatch(developersActionCreators.receiveDoc(result[1].ApiDocumentations[0].Documentation))\n                        } else if (result[0] === NO_CONTENT) {\n                            dispatch(developersActionCreators.docError('No Content'))\n                            return Promise.reject('No Content')\n                        } else if (result.name === 'AbortError') {\n                            return Promise.reject(\"Aborted\");\n                        }\n                    }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveKeyRegistration: (content) => ({\n        type: keyRegistrationSuccess\n    }),\n\n    keyRegistrationError: (message) => ({\n        type: keyRegistrationFailure,\n        keyRegistrationError: message\n    }),\n\n    submitKeyRegistration: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/PartnerAuthentication/api/RegisterPartnerAsync', 'POST', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(developersActionCreators.keyRegistrationError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(developersActionCreators.receiveKeyRegistration(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(developersActionCreators.keyRegistrationError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveConfirmKeyRegistration: (content) => ({\n        type: confirmKeyRegistrationSuccess\n    }),\n\n    confirmKeyRegistrationError: (message) => ({\n        type: confirmKeyRegistrationFailure,\n        confirmKeyRegistrationError: message\n    }),\n\n    submitConfirmKeyRegistration: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/PartnerAuthentication/api/CompletePartnerRegistrationAsync', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(developersActionCreators.confirmKeyRegistrationError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(developersActionCreators.receiveConfirmKeyRegistration(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(developersActionCreators.confirmKeyRegistrationError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveSavePartner: (content) => ({\n        type: savePartnerSuccess\n    }),\n\n    savePartnerError: (message) => ({\n        type: savePartnerFailure,\n        savePartnerError: message\n    }),\n\n    savePartner: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/PartnerAuthentication/api/SavePartnerAsync', 'POST', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(developersActionCreators.savePartnerError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(developersActionCreators.receiveSavePartner(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(developersActionCreators.savePartnerError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receivePartnerList: (content) => ({\n        type: partnerListSuccess,\n        partnerList: content\n    }),\n\n    partnerListError: (message) => ({\n        type: partnerListFailure,\n        partnerListError: message\n    }),\n\n    getPartnerList: () => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/PartnerAuthentication/api/GetPartnersAsync', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(developersActionCreators.partnerListError(result));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(developersActionCreators.receivePartnerList(result[1].PartnerList));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(developersActionCreators.receivePartnerList([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receivePartner: (content) => ({\n        type: getPartnerSuccess,\n        partner: content\n    }),\n\n    getPartnerError: (message) => ({\n        type: getPartnerFailure,\n        partnerError: message\n    }),\n\n    getPartner: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/PartnerAuthentication/api/GetPartnerAsync', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(developersActionCreators.getPartnerError(result));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(developersActionCreators.receivePartner(result[1].PartnerList[0]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(developersActionCreators.receivePartner([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receivePartnerKey: (content) => ({\n        type: getPartnerKeySuccess,\n        partnerKey: content\n    }),\n\n    getPartnerKeyError: (message) => ({\n        type: getPartnerKeyFailure,\n        partnerKeyError: message\n    }),\n\n    getPartnerKey: () => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_USER_API_URL) + '/PartnerAuthentication/api/CheckForPartnerKeyAsync', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(developersActionCreators.getPartnerKeyError(result));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(developersActionCreators.receivePartnerKey(result[1]));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(developersActionCreators.receivePartnerKey([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n}\n\nexport const reducer = (state, action) => {\n\n    state = state || initialState;\n    switch (action.type) {\n        case docListSuccess:\n            return Object.assign({}, state, {\n                docList: action.docList,\n                docListError: ''\n            })\n        case docListFailure:\n            return Object.assign({}, state, {\n                docListError: action.docListError\n            })\n        case docSuccess:\n            return Object.assign({}, state, {\n                doc: action.doc,\n                docError: ''\n            })\n        case docFailure:\n            return Object.assign({}, state, {\n                docError: action.docError\n            })\n        case keyRegistrationSuccess:\n            return Object.assign({}, state, {\n                keyRegistrationError: ''\n            })\n        case keyRegistrationFailure:\n            return Object.assign({}, state, {\n                keyRegistrationError: action.keyRegistrationError\n            })\n        case confirmKeyRegistrationSuccess:\n            return Object.assign({}, state, {\n                confirmKeyRegistrationError: ''\n            })\n        case confirmKeyRegistrationFailure:\n            return Object.assign({}, state, {\n                confirmKeyRegistrationError: action.confirmKeyRegistrationError\n            })\n        case savePartnerSuccess:\n            return Object.assign({}, state, {\n                savePartnerError: ''\n            })\n        case savePartnerFailure:\n            return Object.assign({}, state, {\n                savePartnerError: action.savePartnerError\n            })\n        case partnerListSuccess:\n            return Object.assign({}, state, {\n                partnerList: action.partnerList,\n                partnerListError: ''\n            })\n        case partnerListFailure:\n            return Object.assign({}, state, {\n                partnerListError: action.partnerListError\n            })\n        case getPartnerSuccess:\n            return Object.assign({}, state, {\n                partner: action.partner,\n                partnerError: ''\n            })\n        case getPartnerFailure:\n            return Object.assign({}, state, {\n                partnerError: action.partnerError\n            })\n        case getPartnerKeySuccess:\n            return Object.assign({}, state, {\n                partnerKey: action.partnerKey,\n                partnerKeyError: ''\n            })\n        case getPartnerFailure:\n            return Object.assign({}, state, {\n                partnerKeyError: action.partnerKeyError\n            })\n        default:\n            return state\n    }\n};","import React from 'react';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { developersActionCreators } from '../../../stores/lis-developers-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { Link } from 'react-router-dom';\nimport ReactTable from 'react-table';\n\nclass PartnerGridComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            isLoaded: false,\n            partnerList: [],\n            filtered: [],\n            nameSearch: \"\",\n            orgSearch: \"\"\n        }\n\n        this.handleSearchChange = this.handleSearchChange.bind(this);\n        this.onFilteredChange = this.onFilteredChange.bind(this);\n    }\n\n    componentDidMount() {\n        this.props.actions.getPartnerList()\n            .then(() => {\n                this.setState({\n                    isLoaded: true,\n                    partnerList: this.props.developers.partnerList\n                })\n            })\n    }\n\n    handleSearchChange(state, value) {\n        this.setState({\n            [state]: value\n        }, () => {\n            let filtered = [...this.state.filtered];\n            if (filtered.find(x => x.id === state)) {\n                filtered.splice(filtered.indexOf(x => x.id === state), 1, { id: state, value: value })\n            } else {\n                filtered.push({ id: state, value: value })\n            }\n            this.onFilteredChange(filtered)\n        })\n    }\n\n    onFilteredChange(filtered) {\n        this.setState({ filtered });\n    }\n\n    render() {\n        const { partnerList, nameSearch, orgSearch } = this.state;\n\n        return (\n            <div>\n                <h1>Partner Management</h1>\n                <form className='dlas-forms'>\n                    <div className=\"inner-grid five\">\n                        <div>\n                            <label>Search by Name: </label>\n                            <input\n                                type=\"text\"\n                                value={nameSearch}\n                                onChange={(e) => this.handleSearchChange(\"nameSearch\", e.target.value)}\n                            />\n                        </div>\n                        <div>\n                            <label>Search by Organization: </label>\n                            <input\n                                type=\"text\"\n                                value={orgSearch}\n                                onChange={(e) => this.handleSearchChange(\"orgSearch\", e.target.value)}\n                            />\n                        </div>\n                    </div>\n                </form>\n                {<ReactTable\n                    loading={!this.state.isLoaded}\n                    data={partnerList}\n                    filtered={this.state.filtered}\n                    onFilteredChange={this.onFilteredChange.bind(this)}\n                    columns={[\n                        {\n                            Header: \"Partner Name\",\n                            accessor: \"ContactName\",\n                            id: \"nameSearch\",\n                            width: 250,\n                            filterMethod: (filter, row, column) => {\n                                // convert to lowercase before comparing\n                                let partnerName = row._original.ContactName.toLowerCase();\n                                let nameFilter = this.state.nameSearch.toLowerCase();\n                                if (partnerName.includes(nameFilter)) {\n                                    return true\n                                }\n                            }\n                        },\n                        {\n                            Header: \"Partner Email\",\n                            accessor: \"EmailAddress\",\n                            width: 250\n                        },\n                        {\n                            Header: \"Partner Organization\",\n                            accessor: \"OrganizationName\",\n                            id: \"orgSearch\",\n                            filterMethod: (filter, row, column) => {\n                                // convert to lowercase before comparing\n                                let partnerOrg = row._original.OrganizationName.toLowerCase();\n                                let orgFilter = this.state.orgSearch.toLowerCase();\n                                if (partnerOrg.includes(orgFilter)) {\n                                    return true\n                                }\n                            }\n                        },\n                        {\n                            Header: \"Is Active\",\n                            accessor: \"IsActive\",\n                            width: 80,\n                            Cell: row => (\n                                row.original.IsActive ? \"True\" : \"False\"\n                            )\n                        },\n                        {\n                            Header: \"Edit\",\n                            accessor: \"edit\",\n                            width: 40,\n                            Cell: row => {\n                                return (\n                                    <Link to={`/partner-management/edit-partner/${row.original.PartnerID}`} className=\"button edit\">Edit</Link>\n                                )\n                            }\n                        },\n                        {\n                            Header: \"All\",\n                            id: 'all',\n                            className: \"all-column\",\n                            headerClassName: \"all-header\",\n                            width: 0,\n                            resizable: false,\n                            sortable: false,\n                            Filter: () => { },\n                            getProps: () => {\n                                return {\n                                    style: { padding: \"0px\" }\n                                }\n                            },\n                            filterMethod: (filter, row, column) => {\n                                // convert to lowercase before comparing\n                                let partnerName = row.ContactName.toLowerCase();\n                                let partnerOrg = row.OrganizationName.toLowerCase();\n                                let nameFilter = this.state.nameSearch.toLowerCase();\n                                let orgFilter = this.state.orgSearch.toLowerCase();\n                                console.log(partnerName, partnerOrg, nameFilter, orgFilter)\n                                if (partnerName.includes(nameFilter) || partnerOrg.includes(orgFilter)) {\n                                    return true\n                                }\n                            },\n                        }\n                    ]}\n                    defaultPageSize={10}\n                    className=\"-striped -highlight\"\n                />}\n            </div>\n        )\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { nav, developers } = state;\n        return {\n            nav,\n            developers\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, developersActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(PartnerGridComponent)","import React from \"react\";\nimport { connect } from 'react-redux';\nimport { withRouter } from \"react-router\";\nimport { bindActionCreators } from 'redux';\nimport { developersActionCreators } from \"../../../stores/lis-developers-store\";\nimport { navActionCreators } from \"../../../stores/lis-nav-store\";\n\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,}))$/;\nconst phoneRegex = /^[\\+]?[(]?[0-9]{3}[)]?[-\\s\\.]?[0-9]{3}[-\\s\\.]?[0-9]{4,6}$/im;\n\nclass PartnerForm extends React.Component {\n    constructor(props) {\n        super(props)\n        this.state = {\n            isSaving: false,\n            isLoading: true,\n            partner: {},\n            initIsActive: false\n        }\n\n        this.checkEmail = this.checkEmail.bind(this);\n        this.checkPhone = this.checkPhone.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n        this.save = this.save.bind(this);\n    }\n\n    componentDidMount() {\n        //Fetch the partner by the ID\n        this.props.actions.getPartner(\"?partnerID=\" + this.props.match.params.partnerId)\n            .then(() => {\n                this.setState({\n                    partner: this.props.developers.partner,\n                    initIsActive: this.props.developers.partner.IsActive,\n                    isLoading: false\n                })\n            })\n    }\n\n    checkEmail() {\n        const email = this.state.partner.EmailAddress.toLowerCase();\n\n        if (!emailRegex.test(email)) {\n            this.setState({\n                emailError: 'Invalid email address'\n            }, () => {\n                this.props.actions.makeToast([{ message: this.state.emailError, type: \"failure\" }])\n            });\n            return true;\n        }\n        this.setState({\n            emailError: ''\n        });\n    }\n\n    checkPhone() {\n        if (!phoneRegex.test(this.state.partner.PhoneNumber)) {\n            this.setState({\n                phoneError: 'Invalid phone number'\n            }, () => {\n                this.props.actions.makeToast([{ message: this.state.phoneError, type: \"failure\" }])\n            });\n            return true;\n        }\n        this.setState({\n            phoneError: ''\n        });\n    }\n\n    handleChange(state, value) {\n        let partner = { ...this.state.partner };\n        partner[state] = value;\n        this.setState({\n            partner\n        });\n    }\n\n    save() {\n        this.setState({\n            isSaving: true\n        }, () => {\n            let error = false\n            error = this.checkEmail();\n            error = this.checkPhone();\n\n            if (!error) {\n                let params = \"\";\n\n                params = params + \"?PartnerID=\" + this.state.partner.PartnerID\n                params = params + \"&contactName=\" + this.state.partner.ContactName;\n                params = params + \"&organizationName=\" + this.state.partner.OrganizationName;\n                params = params + \"&phone=\" + this.state.partner.PhoneNumber;\n                params = params + \"&email=\" + this.state.partner.EmailAddress;\n                params = params + \"&identityId=\" + this.state.partner.IdentityID;\n                params = params + \"&isActive=\" + this.state.partner.IsActive;\n                params = params + \"&isActiveChanged=\" + (this.state.partner.IsActive !== this.state.initIsActive ? \"true\" : \"false\");\n\n                this.props.actions.savePartner(params)\n                    .then(() => {\n                        this.setState({\n                            isSaving: false\n                        }, () => {\n                            this.props.actions.makeToast([{ message: \"Partner Saved\", type: \"success\" }])\n                            this.props.history.push(\"/partner-management\")\n                        })\n                    })\n                    .catch((err) => {\n                        this.props.actions.makeToast([{ message: this.props.developers.savePartnerError, type: \"failure\" }])\n                    })\n            }\n        })\n    }\n\n    render() {\n        const { partner, isSaving, isLoading } = this.state;\n\n        return (\n            <div>\n                <form className=\"dlas-forms key-registration-form\">\n                    <h3>Manage Partner</h3>\n                    <div className=\"inner-grid short-one-three\">\n                        <label htmlFor=\"name\">Name*</label>\n                        <input\n                            id=\"name\"\n                            type=\"text\"\n                            value={partner.ContactName}\n                            onChange={(e) => this.handleChange(\"ContactName\", e.target.value)}\n                            disabled={isLoading || isSaving}\n                        />\n                    </div>\n                    <div className=\"inner-grid short-one-three\">\n                        <label htmlFor=\"organization\">Organization</label>\n                        <input\n                            id=\"organization\"\n                            type=\"text\"\n                            value={partner.OrganizationName}\n                            onChange={(e) => this.handleChange(\"OrganizationName\", e.target.value)}\n                            disabled={isLoading || isSaving}\n                        />\n                    </div>\n                    <div className=\"inner-grid short-one-three\">\n                        <label htmlFor=\"email\">Email*</label>\n                        <input\n                            id=\"email\"\n                            type=\"text\"\n                            value={partner.EmailAddress}\n                            onChange={(e) => this.handleChange(\"EmailAddress\", e.target.value)}\n                            disabled={isLoading || isSaving}\n                        />\n                    </div>\n                    <div className=\"inner-grid short-one-three\">\n                        <label htmlFor=\"phone\">Phone Number*</label>\n                        <input\n                            id=\"phone\"\n                            type=\"text\"\n                            value={partner.PhoneNumber}\n                            onChange={(e) => this.handleChange(\"PhoneNumber\", e.target.value)}\n                            disabled={isLoading || isSaving}\n                        />\n                    </div>\n                    <div className=\"inner-grid reverse-short-one-three\">\n                        <div className=\"checkbox flex-row flex-vertical-center flex-start\">\n                            <div className=\"toggle-switch\" onClick={() => this.handleChange(\"IsActive\", !partner.IsActive)}>\n                                <input id=\"is-active-button\" checked={partner.IsActive} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                <span className=\"slider\"></span>\n                            </div>\n                            <label htmlFor=\"is-active-button\" className=\"checkbox-label no-background\">Is Active?</label>\n                        </div>\n                        <div className=\"align-right\">\n                            <button onClick={() => this.save()} disabled={isSaving || isLoading || (!partner.ContactName || !partner.EmailAddress || !partner.PhoneNumber)} type=\"button\" className=\"button\">Submit</button>\n                        </div>\n                    </div>\n                </form>\n            </div>\n        )\n    }\n}\n\nconst PartnerFormWrapper = connect(\n    (state) => {\n        const { nav, developers } = state;\n        return {\n            nav,\n            developers\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, developersActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(PartnerForm)\n\nexport default withRouter(PartnerFormWrapper)","import React from 'react';\nimport { Route } from 'react-router';\nimport PartnerManagementGrid from './lis-partner-grid';\nimport PartnerManagementForm from './lis-partner-form';\n\nclass PartnerManagement extends React.Component {\n\n    render() {\n        return (\n            <div>\n                <Route exact path={this.props.match.path} component={PartnerManagementGrid} />\n                <Route exact path={`${this.props.match.path}/edit-partner/:partnerId`} component={PartnerManagementForm} />\n            </div>\n        )\n    }\n}\n\nexport default PartnerManagement;","import React from 'react';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { userActionCreators } from '../../../stores/lis-user-store';\n\nclass UserManagement extends React.Component {\n    constructor(props) {\n        super(props)\n        this.state = {\n            newUser: false,\n            existingUser: false,\n            person: {\n                FirstName: \"\",\n                LastName: \"\",\n                EmailAddress: \"\"\n            },\n            searching: false,\n            saving: false\n        }\n\n        this.cancel = this.cancel.bind(this);\n        this.create = this.create.bind(this);\n        this.handleInputChange = this.handleInputChange.bind(this);\n        this.handleSubmit = this.handleSubmit.bind(this);\n        this.onSubmit = this.onSubmit.bind(this);\n        this.save = this.save.bind(this);\n    }\n\n    cancel() {\n        this.setState({\n            newUser: false,\n            existingUser: false,\n            person: {\n                EmailAddress: \"\",\n                FirstName: \"\",\n                LastName: \"\"\n            }\n        })\n    }\n\n    create() {\n        this.setState({\n            saving: true\n        }, () => {\n            let person = { ...this.state.person }\n\n            person.Name = this.state.person.FirstName.trim() + \" \" + this.state.person.LastName.trim();\n            delete person.FirstName;\n            delete person.LastName;\n\n            this.props.actions.createNewUser(person)\n                .then(() => {\n                    this.props.actions.getPerson(this.props.users.newUserCreate)\n                        .then(() => {\n                            let person = { ...this.props.users.person };\n                            if (!person.FirstName && !person.LastName) {\n                                let splitName = person.FullName.split(\" \");\n                                person.FirstName = splitName[0];\n                                person.LastName = splitName[1];\n                            }\n                            this.setState({\n                                person: person,\n                                newUser: false,\n                                existingUser: true,\n                                saving: false\n                            }, () => {\n                                this.props.actions.makeToast([{ message: \"Save Successful\", type: \"success\" }]);\n                            })\n                        })\n                })\n        })\n    }\n\n    handleInputChange(e, state) {\n        let person = { ...this.state.person };\n        person[state] = e.target.value;\n        this.setState({\n            person\n        })\n    }\n\n    handleSubmit() {\n        this.setState({\n            searching: true\n        }, () => {\n            this.props.actions.getUserByEmail(\"?emailAddress=\" + this.state.person.EmailAddress.trim())\n                .then(() => {\n                    if (this.props.users.userByEmail != \"\") {\n                        this.props.actions.getPerson(this.props.users.userByEmail.IdentityID)\n                            .then(() => {\n                                let person = { ...this.props.users.person };\n                                if (!person.FirstName && !person.LastName) {\n                                    let splitName = person.FullName.split(\" \");\n                                    person.FirstName = splitName[0];\n                                    person.LastName = splitName[1];\n                                }\n                                this.setState({\n                                    existingUser: true,\n                                    newUser: false,\n                                    person: person,\n                                    searching: false\n                                })\n                            })\n                    } else {\n                        this.setState({\n                            newUser: true,\n                            existingUser: false,\n                            searching: false\n                        })\n                    }\n                })\n        })\n    }\n\n    onSubmit(e) {\n        e.preventDefault();\n    }\n\n    save() {\n        this.setState({\n            saving: true\n        }, () => {\n            let person = { ...this.state.person };\n            person.FullName = (person.FirstName || \"\") + \" \" + (person.LastName || \"\");\n            this.props.actions.savePerson(this.state.person)\n                .then(() => {\n                    this.props.actions.getPerson(this.state.person.IdentityID)\n                        .then(() => {\n                            let person = { ...this.props.users.person };\n                            this.setState({\n                                person: person,\n                                saving: false\n                            }, () => {\n                                this.props.actions.makeToast([{ message: \"Save Successful\", type: \"success\" }]);\n                            })\n                        })\n                })\n        })\n    }\n\n    render() {\n        return (\n            <div>\n                <h2>User Management</h2>\n                <form className=\"dlas-forms\" onSubmit={this.onSubmit}>\n                    {!this.state.existingUser &&\n                        <React.Fragment>\n                            <label>Search for a user by email address</label>\n                            <div className=\"inner-grid three-one-and-two\">\n                                <input onChange={(e) => this.handleInputChange(e, \"EmailAddress\")} value={this.state.person.EmailAddress} />\n                                <button disabled={this.state.searching} className=\"button primary\" type=\"submit\" onClick={() => this.handleSubmit()}>{this.state.searching ? \"Searching...\" : \"Search\"}</button>\n                            </div>\n                        </React.Fragment>\n                    }\n                    {this.state.newUser &&\n                        <React.Fragment>\n                            <p>User not found. You may either search for a different email address, or enter a first name and last name then click create user to create a new user account for the provided email address.</p>\n                            <div className=\"inner-grid six\">\n                                <input\n                                    placeholder=\"First Name\"\n                                    onChange={(e) => this.handleInputChange(e, \"FirstName\")}\n                                    value={this.state.person.FirstName}\n                                />\n                                <input\n                                    placeholder=\"Last Name\"\n                                    onChange={(e) => this.handleInputChange(e, \"LastName\")}\n                                    value={this.state.person.LastName}\n                                />\n                                <button disabled={this.state.saving} className=\"button primary\" type=\"button\" onClick={() => this.create()}>{this.state.saving ? \"Saving...\" : \"Create User\"}</button>\n                            </div>\n                        </React.Fragment>\n                    }\n                    {this.state.existingUser &&\n                        <React.Fragment>\n                            <div className=\"multi-row sixth-even no-margin\">\n                                <div>\n                                    <label>Prefix</label>\n                                    <input type=\"text\"\n                                        placeholder=\"Prefix\"\n                                        value={this.state.person.Prefix}\n                                        onChange={(e) => this.handleInputChange(e, 'Prefix')}\n                                    />\n                                </div>\n                                <div>\n                                    <label>First Name</label>\n                                    <input type=\"text\"\n                                        placeholder=\"First Name\"\n                                        value={this.state.person.FirstName}\n                                        onChange={(e) => this.handleInputChange(e, 'FirstName')}\n                                    />\n                                </div>\n                                <div>\n                                    <label>Middle Name</label>\n                                    <input type=\"text\"\n                                        placeholder=\"Middle Name\"\n                                        value={this.state.person.MiddleName}\n                                        onChange={(e) => this.handleInputChange(e, 'MiddleName')}\n                                    />\n                                </div>\n                                <div>\n                                    <label>Nickname</label>\n                                    <input type=\"text\"\n                                        placeholder=\"Nickname\"\n                                        value={this.state.person.AlternateName}\n                                        onChange={(e) => this.handleInputChange(e, 'AlternateName')}\n                                    />\n                                </div>\n                                <div>\n                                    <label>Last Name</label>\n                                    <input type=\"text\"\n                                        placeholder=\"Last Name\"\n                                        value={this.state.person.LastName}\n                                        onChange={(e) => this.handleInputChange(e, 'LastName')}\n                                    />\n                                </div>\n                                <div>\n                                    <label>Suffix</label>\n                                    <input type=\"text\"\n                                        placeholder=\"Suffix\"\n                                        value={this.state.person.Suffix}\n                                        onChange={(e) => this.handleInputChange(e.target.value, 'Suffix')}\n                                    />\n                                </div>\n                            </div>\n                            <button className=\"button secondary float-right\" type=\"button\" onClick={() => this.cancel()}>Cancel</button>\n                            <button disabled={this.state.saving} style={{ marginRight: \"10px\" }} className=\"button primary float-right\" type=\"button\" onClick={() => this.save()}>{this.state.saving ? \"Saving...\" : \"Save\"}</button>\n                        </React.Fragment>\n                    }\n                </form>\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { nav, users } = state;\n        return {\n            nav,\n            users\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, navActionCreators, userActionCreators), dispatch)\n        }\n    }\n)(UserManagement)","import React from 'react';\nimport Select from 'react-select';\nimport DatePicker from 'react-datepicker';\nimport '../../../stylesheets/lis-public-view/public-view.css';\nimport moment from 'moment-timezone';\n\nclass Search extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            search: '',\n            selectedMember: '',\n            selectedSubject: '',\n            selectedDate: null\n        };\n        this.handleMemberDropdownChange = this.handleMemberDropdownChange.bind(this);\n        this.handleSubjectDropdownChange = this.handleSubjectDropdownChange.bind(this);\n        this.handleDateChange = this.handleDateChange.bind(this);\n    }\n\n    handleMemberDropdownChange(val) {\n        this.setState({\n            selectedMember: val\n        }, () => {\n            //The next step is done after the state change to make sure the user sees what member was selected before going to the advanced search page\n            let param = {\n                selectedPatron: this.state.selectedMember.MemberID,\n                selectedSession: this.props.sessionList.find(s => s.SessionCode === this.props.session),\n                chamberCode: this.state.selectedMember.ChamberCode,\n                selectedPatronType: [1]\n            }\n\n            const link = window.btoa(JSON.stringify(param));\n            this.props.history.push('/bill-search?q=' + link);\n\n        });\n    }\n\n    handleSubjectDropdownChange(val) {\n        this.setState({\n            selectedSubject: val\n        }, () => {\n            //The next step is done after the state change to make sure the user sees what member was selected before going to the advanced search page\n            const param = {\n                selectedSubject: this.state.selectedSubject.SubjectIndexID,\n                selectedSession: this.props.sessionList.find(s => s.SessionCode === this.props.session),\n            }\n            const link = window.btoa(JSON.stringify(param));\n            this.props.history.push('/bill-search?q=' + link);\n        });\n    }\n\n    handleDateChange(val) {\n        this.setState({\n            selectedDate: val\n        }, () => {\n            const introDate = this.state.selectedDate.clone();\n            introDate.hour(0);\n            const param = {\n                introductionDate: introDate\n            };\n            const link = window.btoa(JSON.stringify(param));\n            this.props.history.push('/bill-search?q=' + link);\n        });\n    }\n\n    render() {\n        const customStyles = {\n            container: base => ({\n                ...base,\n                lineHeight: 'normal',\n            }),\n            option: (base, state) => ({\n                ...base,\n                fontSize: '0.8em',\n            }),\n            control: (base) => ({\n                ...base,\n                padding: '1px',\n                margin: 0,\n                minHeight: 0,\n                fontSize: '0.8em',\n            }),\n            dropdownIndicator: base => ({\n                ...base,\n                padding: '0px 8px'\n            }),\n            indicatorSeparator: (base) => ({\n                ...base,\n                display: \"none\"\n            })\n        };\n        const memberList = [...this.props.memberList]\n        memberList.forEach((member) => {\n            member.label = \"(\" + member.ChamberCode + \") \" + member.ListDisplayName;\n            member.value = member.MemberID;\n        });\n        let datesList = [];\n        this.props.datesList.forEach(date => datesList.push(moment(date.IntroductionDate)));\n        datesList.push(moment());\n        const openToDate = datesList[datesList.length - 1];\n        return (\n            <div className=\"dlas-forms home-search-section\">\n                <br />\n                <div id=\"search-selectors\">\n                    <div className=\"selector\">\n                        <div className=\"subject\">\n                            <label htmlFor=\"bills-by-subject\" className=\"search-option-label\">Bills by Subject</label>\n                        </div>\n                        <div>\n                            <Select\n                                id=\"bills-by-subject\"\n                                styles={customStyles}\n                                isDisabled={!this.props.isLoaded}\n                                options={this.props.subjectList}\n                                value={this.state.selectedSubject}\n                                onChange={this.handleSubjectDropdownChange}\n                            />\n                        </div>\n                    </div>\n                    <div className=\"selector\">\n                        <div className=\"member\">\n                            <label htmlFor=\"bills-by-member\" className=\"search-option-label\">Bills by Member</label>\n                        </div>\n                        <div>\n                            <Select\n                                id=\"bills-by-member\"\n                                styles={customStyles}\n                                isDisabled={!this.props.isLoaded}\n                                options={memberList}\n                                onChange={this.handleMemberDropdownChange}\n                                value={this.state.selectedMember}\n                            />\n                        </div>\n                    </div>\n                    <div className=\"selector\">\n                        <div className=\"introduced\">\n                            <label htmlFor=\"bills-by-date\" className=\"search-option-label\">Bills Introduced by Day</label>\n                        </div>\n                        <div>\n                            <DatePicker\n                                id=\"bills-by-date\"\n                                disabled={!this.props.isLoaded || !openToDate}\n                                selected={this.state.selectedDate}\n                                onChange={this.handleDateChange}\n                                includeDates={datesList}\n                                openToDate={openToDate}\n                            />\n                        </div>\n                    </div>\n                </div>\n                <hr />\n            </div>\n\n        )\n    }\n}\n\nexport default Search","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport '../../../stylesheets/lis-public-view/public-view.css';\n\nclass ResourcesComponent extends React.Component {\n    constructor(props) {\n        super(props)\n\n    }\n\n    render() {\n        const { session, isAuthenticated } = this.props;\n\n        return (\n            <div>\n                <h3 className=\"homepage-header\">Bills & Resolutions</h3>\n                <hr />\n                {!this.props.isLoaded ?\n                    <div className=\"center-spinner spinner small-height\" />\n                    :\n                    <div className=\"homepage-links\">\n                        <div className=\"homepage-content-group\">\n                            <span>{session.selectedSession.SessionYear + \" Session: \"}</span>\n                            <Link to=\"/bill-search\">Browse Bills by Category</Link>\n                        </div>\n                        <div className=\"homepage-content-group\">\n                            <span>Budget Bill: </span>\n                            <a href={\"http://budget.lis.virginia.gov/\"}>State Budget</a>\n                        </div>\n                        <div className=\"homepage-content-group\">\n                            <span>Bill Indexes: </span>\n                            <a href={\"https://index.lis.virginia.gov?ses=\" + session.selectedSession.SessionCode}>Cumulative Index</a>\n                        </div>\n                        <div style={{ marginTop: \"8px\", marginBottom: \"4px\" }}>\n                            <Link to={isAuthenticated ? \"/bill-search\" : \"/register-account\"}>LOBBYIST in a BOX</Link>\n                        </div>\n                    </div>\n                }\n                <h3 className=\"homepage-header\" style={{ marginTop: \"14px\" }}>Virginia Law</h3>\n                <hr />\n                <div className=\"homepage-links\">\n                    <div className=\"homepage-content-group\">\n                        <a href=\"https://law.lis.virginia.gov/vacode/\">Code of Virginia</a>\n                    </div>\n                    <div className=\"homepage-content-group\">\n                        <a href=\"https://law.lis.virginia.gov/admincode/\">Virginia Administrative Code</a>\n                    </div>\n                    <div className=\"homepage-content-group\">\n                        <a href=\"https://law.lis.virginia.gov/constitution/\">Constitution of Virginia</a>\n                    </div>\n                </div>\n                <h3 className=\"homepage-header\" style={{ marginTop: \"14px\" }}>Legislative Resources</h3>\n                <hr />\n                <div className=\"homepage-links\">\n                    <div className=\"homepage-content-group\">\n                        <a href=\"https://liaison.lis.virginia.gov/\">State Agency Legislative Liaisons</a>\n                    </div>\n                    <div className=\"homepage-content-group\">\n                        <a href=\"https://rga.lis.virginia.gov/\">Reports to the General Assembly</a>\n                    </div>\n                    <div className=\"homepage-content-group\">\n                        <a href=\"http://dls.virginia.gov/pubs_calendar.html\">Procedural Calendars</a>\n                    </div>\n                </div>\n            </div>\n        )\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { nav, session } = state;\n        return {\n            nav,\n            session\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, navActionCreators, sessionActionCreators), dispatch)\n        }\n    }\n)(ResourcesComponent)","import React from 'react';\nimport '../../../stylesheets/lis-public-view/public-view.css';\nimport { Link } from 'react-router-dom';\nimport moment from 'moment-timezone';\nimport { withRouter } from 'react-router';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\n\nclass SessionInfo extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {};\n        this.handleSessionChange = this.handleSessionChange.bind(this);\n    }\n\n    handleSessionChange(value) {\n        if (window.env && window.env.HISTORICAL_DATA_REDIRECT && value && !value.IsDefault && value.LegacySessionID) {\n            this.setState({\n                historicalSessionRedirect: (redirect) => {\n                    if (redirect) {\n                        let a = document.createElement('a');\n                        a.target = '_blank';\n                        a.href = `https://legacylis.virginia.gov/cgi-bin/legp604.exe?ses=${value.SessionCode.substring(2)}&typ=lnk&val=${value.LegacySessionID}`;\n                        document.body.appendChild(a);\n                        a.click();\n                        document.body.removeChild(a);\n                    }\n                    this.setState({ historicalSessionRedirect: false })\n                }\n            })\n            return;\n        }\n        if (value && value.SessionCode) {\n            this.props.actions.changeSession(value.SessionCode);\n        }\n    }\n\n    render() {\n        const session = this.props.selectedSession;\n        const adjournment = session ? session.SessionEvents.find(event => event.DisplayName === \"Adjournment\") : null;\n        const reconvene = session ? session.SessionEvents.find(event => event.DisplayName === \"Reconvene\") : null;\n        const start = session ? session.SessionEvents.find(event => event.DisplayName === \"Session Start\") : null;\n\n        let activeSessions = [];\n        if (session.IsActive) {\n            activeSessions = this.props.sessionList.filter(s => s.IsActive && s.SessionID !== session.SessionID);\n        }\n        return (\n            <div>\n                {this.state.historicalSessionRedirect &&\n                    <div className=\"schedule-modal\">\n                        <div className=\"schedule-modal-content fit-content center-content\">\n                            <p>For historical data, please use <b>Legacy LIS</b>, available at <b><a href=\"https://legacylis.virginia.gov\" target=\"_blank\" rel=\"noreferrer\">https://legacylis.virginia.gov</a></b>.</p>\n                            <p>Click 'Go' to be taken to Legacy LIS, or 'Close' to remain here.</p>\n                            <div className=\"inline-list\">\n                                <button className=\"button primary float-right\" onClick={() => this.state.historicalSessionRedirect(true)}>Go</button>\n                                <button className=\"button secondary float-right\" onClick={() => this.state.historicalSessionRedirect(false)}>Close</button>\n                            </div>\n                            <br />\n                        </div>\n                    </div>\n                }\n                <h3 className=\"homepage-header\">{session.SessionYear} {session.SessionType === \"Special\" ? session.DisplayName : \"Session\"} Information</h3>\n                <hr />\n                {!this.props.isLoaded ?\n                    <div className=\"center-spinner spinner small-height\" />\n                    :\n                    <div className=\"homepage-links\">\n                        <div className=\"homepage-content-group\">\n                            <span>Session dates: {moment(start ? start.ActualDate : '').format('MMMM D, YYYY')}</span>\n                            {adjournment &&\n                                <span> - {moment(adjournment ? adjournment.ActualDate : '').format('MMMM D, YYYY')}</span>\n                            }\n                        </div>\n                        <div>\n                            {reconvene &&\n                                <React.Fragment>\n                                    <span>Reconvened: </span>\n                                    <span>{moment(reconvene.ActualDate).format('MMMM D, YYYY')}</span>\n                                </React.Fragment>\n                            }\n                        </div>\n                        <div>\n                            <div className=\"homepage-content-group\">\n                                <Link to={`/session-details/${session.SessionCode}/member-information`}>Delegates & Senators</Link>\n                            </div>\n                            <div className=\"homepage-content-group\">\n                                <Link to={`/session-details/${session.SessionCode}/committee-information`}>Standing Committees</Link>\n                            </div>\n                            <div className=\"homepage-content-group\">\n                                <Link to={`/session-details/${session.SessionCode}/calendar`}>Daily Floor Calendars</Link>\n                            </div>\n                            <div className=\"homepage-content-group\">\n                                <Link to={`/session-details/${session.SessionCode}/communications`}>Communications</Link>\n                            </div>\n                        </div>\n                        <div>\n                            <div className=\"homepage-content-group\">\n                                <span>Minutes: </span>\n                                {session.SessionYear < 2010\n                                    ? <Link to={`/session-details/${session.SessionCode}/minutes-list/house`}>House</Link>\n                                    : <a href={\"https://virginiageneralassembly.gov/house/minutes/list.php?ses=\" + session.SessionCode.toString().substr(2, 3)}>House</a>}\n                                <span style={{ margin: '0px 5px' }}>|</span>\n                                <Link to={`/session-details/${session.SessionCode}/minutes-list/senate`}>Senate</Link>\n                            </div>\n                            <div className=\"homepage-content-group\">\n                                <span>Video: </span>\n                                <span>\n                                    <a href=\"https://virginiageneralassembly.gov/house/chamber/chamberstream.php\">House</a>\n                                    <span style={{ margin: '0px 5px' }}>|</span>\n                                    <a href=\"https://virginia-senate.granicus.com/ViewPublisher.php?view_id=3\">Senate</a>\n                                </span>\n                            </div>\n                            <div>\n                                <div className=\"homepage-content-group\">\n                                    <span>Committee Statistics: </span>\n                                    <Link to={`/session-details/${session.SessionCode}/statistics/committee/h`}>House</Link>\n                                    <span> | </span>\n                                    <Link to={`/session-details/${session.SessionCode}/statistics/committee/s`}>Senate</Link>\n                                </div>\n                                <div className=\"homepage-content-group\">\n                                    <span>Session Statistics: </span>\n                                    <Link to={`/session-details/${session.SessionCode}/statistics/status`}>By Status</Link>\n                                </div>\n                            </div>\n\n                        </div>\n                    </div>\n                }\n                {this.props.isLoaded && activeSessions.length > 0 &&\n                    <div className=\"homepage-content-group\">\n                        <span className=\"homepage-links\">Concurrent Sessions:</span>\n                        <div className=\"homepage-links\">\n                            {activeSessions.map(activeSession =>\n                                <div key={activeSession.SessionID}>\n                                    <a style={{ cursor: 'pointer' }} href={void (0)} onClick={() => this.handleSessionChange(activeSession)}>{activeSession.SessionYear} {activeSession.DisplayName}</a>\n                                </div>\n                            )}\n                        </div>\n                    </div>\n                }\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { nav } = state;\n        return {\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, navActionCreators), dispatch)\n        }\n    }\n)(withRouter(SessionInfo))","import React from 'react';\nimport '../../../stylesheets/lis-public-view/public-view.css';\nimport { Link } from 'react-router-dom';\nimport moment from 'moment-timezone';\nimport renderHtml from 'react-render-html';\n\nconst tz = moment.tz.guess();\n\nconst TIME_REGEX = /[0-9]:[0-9]{2}\\s[AP]M/i;\n\nclass Schedule extends React.Component {\n\n    render() {\n        return (\n            <div>\n                <h3 className=\"homepage-header\">Upcoming Schedule{tz !== \"America/New_York\" && <small>*</small>}</h3>\n                <hr />\n                {!this.props.isLoaded ?\n                    <div className=\"center-spinner spinner small-height\" />\n                    :\n                    <>\n                        {this.props.schedule.length === 0 &&\n                            <div className=\"center\" style={{ fontFamily: \"Lato\" }}>\n                                <span>Nothing Scheduled</span>\n                            </div>\n                        }\n                        <div style={{ maxHeight: '370px', overflowY: 'auto' }}>\n                            {this.props.schedule.map((date, dateIndex) =>\n                                <div className=\"homepage-schedule-item\" key={dateIndex}>\n                                    <div className=\"homepage-schedule-date\">\n                                        <span>{moment(date.Date).format('MMMM D, YYYY')}</span>\n                                    </div>\n                                    {date.Times.map((time, timeIndex) => {\n                                        return <div>\n                                            {time.Items.length > 0 &&\n                                                <React.Fragment>\n                                                    <ul className=\"small-text\" key={timeIndex}>\n                                                        {time.Items.map((item, itemIndex) =>\n                                                            <li key={itemIndex}>\n                                                                <span className=\"schedule-time\">{TIME_REGEX.test(item.ScheduleTime) && item.ScheduleTime}</span>\n                                                                <div className='schedule-info'>\n                                                                    <div>\n                                                                        <span className=\"schedule-owner\">{item.OwnerName} {item.IsCancelled && <span className=\"fail\"> CANCELLED</span>}</span>\n                                                                    </div>\n                                                                    <div>\n                                                                        <span style={{ whiteSpace: 'pre-wrap' }}>{!TIME_REGEX.test(item.ScheduleTime) && item.ScheduleTime}</span>\n                                                                        <span style={{ whiteSpace: 'pre-wrap' }}>{item.Description && renderHtml(item.Description)}</span>\n                                                                    </div>\n                                                                </div>\n                                                            </li>\n                                                        )}\n                                                    </ul>\n                                                </React.Fragment>\n                                            }\n                                        </div>\n                                    }\n                                    )}\n                                </div>\n                            )}\n                        </div>\n                        <div className=\"homepage-links\">\n                            <Link to=\"/schedule\">Full Schedule</Link>\n                        </div>\n                        {tz !== \"America/New_York\" && <div><small><em>*Times are displayed in your local timezone ({moment().tz(tz).format(\"zz\")})</em></small></div>}\n                    </>\n                }\n            </div>\n        );\n    }\n}\n\nexport default Schedule;\n","import React from 'react';\nimport '../../../stylesheets/lis-public-view/public-view.css';\nimport moment from 'moment-timezone';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport DatePicker from 'react-datepicker';\nimport 'tinymce/themes/silver/theme';\nimport 'tinymce/icons/default'\nimport 'tinymce/plugins/paste/plugin';\nimport 'tinymce/plugins/link/plugin';\nimport 'tinymce/plugins/save/plugin';\nimport 'tinymce/plugins/lists/plugin';\nimport 'tinymce/plugins/code/plugin';\nimport 'tinymce/plugins/preview/plugin';\nimport 'tinymce/plugins/searchreplace/plugin';\nimport 'tinymce/plugins/pagebreak/plugin';\nimport 'tinymce/plugins/table/plugin';\nimport '../../../stylesheets/tinymce/oxide/skin.min.css';\nimport { Editor } from '@tinymce/tinymce-react';\nimport renderHTML from 'react-render-html';\nimport { collectionActionCreators } from '../../../stores/lis-collection-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\n\nconst defaultStyle = \"primary\";\nconst freshMessage = (style) => ({ IsActive: true, BulletinMessage: `<div class=\"alert alert-${style ?? 'primary'} mb-0\"><p></p></div>`, StartDate: moment(), EndDate: moment().add(1, 'day') });\n\nclass MessageOfTheDay extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            adminView: false,\n            editing: false,\n            previewing: false,\n            linking: false,\n            linkText: '',\n            linkUrl: '',\n            editMessage: freshMessage(defaultStyle),\n            style: defaultStyle,\n            showAll: false\n        }\n\n        this.toggleEdit = this.toggleEdit.bind(this);\n        this.selectStyle = this.selectStyle.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n        this.toggleLink = this.toggleLink.bind(this);\n        this.handleLink = this.handleLink.bind(this);\n        this.toggleAdminView = this.toggleAdminView.bind(this);\n        this.togglePreview = this.togglePreview.bind(this);\n        this.saveMessage = this.saveMessage.bind(this);\n        this.toggleShowAll = this.toggleShowAll.bind(this);\n\n        this.newMessageRef = React.createRef();\n    }\n\n    toggleShowAll() {\n        this.setState({ showAll: !this.state.showAll })\n    }\n\n    toggleEdit(bulletinID) {\n        const messages = this.state.adminView ? [...this.props.adminMessages] : [...this.props.messages];\n        const editMessage = bulletinID ? messages.find(b => b.BulletinID === bulletinID) : freshMessage(defaultStyle);\n        let style = defaultStyle;\n        try {\n            if (bulletinID) {\n                const el = document.createElement('div');\n                el.innerHTML = editMessage.BulletinMessage;\n                const alert = el.querySelector('.alert');\n                const classes = alert.classList;\n                for (const c of classes) {\n                    switch (c) {\n                        case 'alert-default':\n                            style = \"default\";\n                            break;\n                        case 'alert-primary':\n                            style = \"primary\";\n                            break;\n                        case 'alert-info':\n                            style = \"info\";\n                            break;\n                        case 'alert-warning':\n                            style = \"warning\";\n                            break;\n                        case 'alert-danger':\n                            style = \"danger\";\n                            break;\n                        case 'alert-success':\n                            style = \"success\";\n                            break;\n                        default:\n                            break;\n                    }\n                }\n            }\n        } catch (e) {\n            console.error(e);\n        }\n        this.setState({\n            editMessage,\n            style,\n            editing: !this.state.editing,\n            previewing: false\n        })\n    }\n\n    toggleAdminView() {\n        if (!this.state.adminView) {\n            this.setState({ adminView: true }, () => {\n                this.props.getAdminMessages();\n            });\n        } else {\n            this.setState({ adminView: false })\n        }\n    }\n\n    togglePreview() {\n        this.setState({ previewing: !this.state.previewing })\n    }\n\n    selectStyle(style) {\n        this.setState({ style }, () => {\n            let editMessage = { ...this.state.editMessage };\n            const el = document.createElement('div');\n            el.innerHTML = editMessage.BulletinMessage;\n            const alert = el.querySelector('.alert');\n            alert.classList = `alert alert-${this.state.style} mb-0`;\n            editMessage.BulletinMessage = el.innerHTML;\n            this.setState({ editMessage })\n        })\n    }\n\n    handleChange(key, value) {\n        if (key === \"BulletinMessage\" && !value)\n            value = freshMessage(this.state.style).BulletinMessage;\n\n        let editMessage = { ...this.state.editMessage };\n        editMessage[key] = value;\n        this.setState({ editMessage })\n    }\n\n    handleBold = (e) => {\n        e.preventDefault();\n        document.execCommand('bold');\n    };\n\n    handleItalic = (e) => {\n        e.preventDefault();\n        document.execCommand('italic', false, null);\n    };\n\n    toggleLink = () => {\n        const selected = document.getSelection();\n        this.setState({ selected, linking: !this.state.linking, linkUrl: '', linkText: '' })\n    }\n\n    setLinkUrl = (e) => {\n        this.setState({ linkUrl: e.target.value })\n    }\n\n    setLinkText = (e) => {\n        this.setState({ linkText: e.target.value })\n    }\n\n    handleLink = () => {\n        let editMessage = { ...this.state.editMessage };\n        const el = document.createElement('div');\n        el.innerHTML = editMessage.BulletinMessage;\n        let alert = el.querySelector('.alert');\n        const anchor = document.createElement('a');\n        anchor.href = this.state.linkUrl;\n        anchor.textContent = this.state.linkText;\n        alert.appendChild(anchor);\n        this.handleChange('BulletinMessage', el.innerHTML);\n        this.toggleLink();\n    };\n\n    saveMessage() {\n        this.setState({ saving: true }, () => {\n            let message = { ...this.state.editMessage }\n            let apiCall = message.BulletinID ? this.props.actions.saveMessage : this.props.actions.createMessage;\n            apiCall(message).then(() => {\n                this.props.actions.makeToast([{ message: \"Save Successful\", type: \"success\" }]);\n                this.setState({ saving: false }, () => {\n                    this.toggleEdit();\n                    this.props.getAdminMessages();\n                    this.props.getMessages();\n                })\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n                this.setState({ saving: false })\n            })\n        })\n    }\n\n    render() {\n        const { editMessage } = this.state;\n\n        const filteredMessages = (this.state.adminView ? [...this.props.adminMessages] : [...this.props.messages]).filter(m => (this.state.adminView || moment.utc(m.StartDate).isBefore(moment())) && moment.utc(m.EndDate).isAfter(moment()));\n        const messagesToDisplay = this.state.adminView ? filteredMessages.slice(0, this.state.showAll ? undefined : 5) : filteredMessages;\n\n        return (\n            <div className=\"dlas-forms message-of-the-day\">\n                {!this.state.previewing && this.props.login.userClaims.roles.find((x) => x === \"Admin\") &&\n                    <div className=\"message-header\">\n                        <h3 className=\"homepage-header\">Message of the Day</h3>\n                        <a className={`icon ${this.state.editing ? 'delete' : 'add'}`} onClick={() => this.toggleEdit()} />\n                        {!this.state.editing && this.props.login.userClaims.roles.find((x) => x === \"Admin\") && <a className={`icon ${this.state.adminView ? 'button view' : ' search'}`} onClick={this.toggleAdminView} title={this.state.adminView ? \"View Public Messages\" : \"View All Messages As Admin\"} />}\n                    </div>\n                }\n                {!this.state.editing ?\n                    <div>\n                        {\n                            (this.props.login.userClaims.roles.find((x) => x === \"Admin\") && ((this.state.adminView && this.props.gettingAdminMessages) || (!this.state.adminView && this.props.gettingMessages))) ? <div className=\"spinner center-spinner small-spinner small-height\" />\n                                :\n                                (this.props.login.userClaims.roles.find((x) => x === \"Admin\") && !messagesToDisplay?.length) ?\n                                    <p style={{ margin: '0px' }}>No {this.state.adminView ? \"admin\" : \"public\"} messages.</p>\n                                    :\n                                    <MessageList showAll={this.state.adminView && filteredMessages.length > 5 ? this.state.showAll : true} admin={this.props.login.userClaims.roles.find((x) => x === \"Admin\")} toggleShowAll={this.state.adminView && filteredMessages.length > 5 ? this.toggleShowAll : null} messages={messagesToDisplay} toggleEdit={this.toggleEdit} />\n                        }\n                    </div>\n                    :\n                    <div>\n                        {!this.state.previewing ?\n                            <>\n                                <div className=\"date-pickers\">\n                                    <div>\n                                        <label>Start Date</label>\n                                        <DatePicker\n                                            id=\"motd-start-date\"\n                                            selected={moment.utc(editMessage.StartDate).local()}\n                                            onChange={(val) => this.handleChange('StartDate', val.utc())}\n                                            showTimeSelect\n                                            dateFormat=\"MM/DD/yyyy h:mm a\"\n                                            popperPlacement='bottom'\n                                        />\n                                    </div>\n                                    <div>\n                                        <label>End Date</label>\n                                        <DatePicker\n                                            id=\"motd-end-date\"\n                                            selected={moment.utc(editMessage.EndDate).local()}\n                                            onChange={(val) => this.handleChange('EndDate', val.utc())}\n                                            showTimeSelect\n                                            dateFormat=\"MM/DD/yyyy h:mm a\"\n                                            popperPlacement='bottom'\n                                        />\n                                    </div>\n                                </div>\n                                <div className=\"color-pickers\">\n                                    <div className={`color-picker alert-default${this.state.style === 'default' ? ' selected' : ''}`} onClick={() => this.selectStyle('default')} />\n                                    <div className={`color-picker alert-danger${this.state.style === 'danger' ? ' selected' : ''}`} onClick={() => this.selectStyle('danger')} />\n                                    <div className={`color-picker alert-warning${this.state.style === 'warning' ? ' selected' : ''}`} onClick={() => this.selectStyle('warning')} />\n                                    <div className={`color-picker alert-success${this.state.style === 'success' ? ' selected' : ''}`} onClick={() => this.selectStyle('success')} />\n                                    <div className={`color-picker alert-primary${this.state.style === 'primary' ? ' selected' : ''}`} onClick={() => this.selectStyle('primary')} />\n                                    <div className={`color-picker alert-info${this.state.style === 'info' ? ' selected' : ''}`} onClick={() => this.selectStyle('info')} />\n                                </div>\n                                <div style={{ margin: 'auto', width: '80%' }}>\n                                    <Editor\n                                        value={editMessage.BulletinMessage}\n                                        init={{\n                                            browser_spellcheck: true,\n                                            plugins: 'link paste save lists preview searchreplace pagebreak code copyheadstyle',\n                                            toolbar: 'undo redo | bold italic strikethrough link',\n                                            skin: false,\n                                            valid_children: '+body[style]',\n                                            content_css: false,\n                                            content_style: 'table { border-collapse: collapse; border: 1px solid #FFFFFF }' + 'td { padding: 12px 0px }' + 'a {color: #196090 !important; text-decoration: underline !important}',\n                                        }}\n                                        onEditorChange={content => this.handleChange('BulletinMessage', content)}\n                                    />\n                                </div>\n                            </>\n                            :\n                            <MessageList admin={false} messages={[editMessage]} />\n                        }\n                        <div className=\"inline-list align-right\" style={{ marginTop: '5px', maxWidth: this.state.previewing ? '75%' : '90%' }}>\n                            {!this.state.previewing &&\n                                <div className=\"checkbox flex-row flex-vertical-center flex-start\" style={{ display: 'inline-flex' }}>\n                                    <label htmlFor=\"report-current-status\" className=\"checkbox-label no-background\">Is Active</label>\n                                    <div className=\"toggle-switch\" onClick={() => this.handleChange(\"IsActive\", !editMessage.IsActive)}>\n                                        <input id=\"report-current-status\" checked={editMessage.IsActive} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                </div>\n                            }\n                            <button type=\"button\" className='button' disabled={this.state.saving} onClick={this.togglePreview}>{this.state.previewing ? \"Edit\" : \"Preview\"}</button>\n                            <button type=\"button\" className='button' disabled={this.state.saving} onClick={this.saveMessage}>Save</button>\n                        </div>\n                        {this.state.previewing && <br />}\n                        {this.state.editing && <hr />}\n                    </div>\n                }\n            </div>\n        );\n    }\n}\n\nconst MessageList = (props) => {\n    const { messages, admin, showAll, toggleEdit, toggleShowAll } = props;\n    return (\n        <div className=\"message-list\">\n            {admin && toggleShowAll &&\n                <div>\n                    <button onClick={toggleShowAll} className=\"expander button-link\" type=\"button\">Show {showAll ? \"Less\" : \"All\"}</button>\n                </div>\n            }\n            {messages.map((message, idx) =>\n                <div className=\"message-item\" key={idx}>\n                    {renderHTML(message.BulletinMessage)}\n                    {admin && <a className=\"icon edit\" style={{ marginLeft: '7px' }} onClick={() => toggleEdit(message.BulletinID)} />}\n                </div>\n            )}\n        </div>\n    )\n}\n\nexport default connect(\n    (state) => {\n        const { login, nav, collection } = state;\n        return {\n            login,\n            nav,\n            collection\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, authActionCreators, navActionCreators, collectionActionCreators), dispatch)\n        }\n    }\n)(MessageOfTheDay)","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { scheduleActionCreators } from '../../../stores/lis-schedule-store';\nimport Search from './lis-public-home-search';\nimport Resources from './lis-public-home-resources';\nimport SessionInfo from './lis-public-home-session-info';\nimport Schedule from './lis-public-home-schedule';\nimport moment from 'moment-timezone';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { memberActionCreators } from '../../../stores/lis-members-store';\nimport { billActionCreators } from '../../../stores/lis-legislation-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\nimport MessageOfTheDay from './lis-public-message-of-the-day';\nimport { collectionActionCreators } from '../../../stores/lis-collection-store';\n\nclass HomeComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            searchIsLoaded: true,\n            sessionInfoIsLoaded: this.props.nav.session && !isNaN(this.props.nav.session),\n            scheduleIsLoaded: false,\n            schedule: [],\n            gettingMessages: true,\n            gettingAdminMessages: true\n        };\n        this.setupPage = this.setupPage.bind(this);\n        this.getMessages = this.getMessages.bind(this);\n        this.getAdminMessages = this.getAdminMessages.bind(this);\n    }\n\n    setupPage(sessionCode) {\n        this.setState({\n            searchIsLoaded: false,\n            sessionInfoIsLoaded: false\n        });\n\n        //Get the session information\n        this.props.actions.getSessionByCode(sessionCode)\n            .then(() => {\n                this.setState({\n                    sessionInfoIsLoaded: true\n                });\n            })\n\n        // Get a list of members for the search\n        const getMembers = this.props.actions.getMemberList('sessionCode=' + sessionCode)\n            .then(() => {\n                return Promise.resolve();\n            });\n        const getSubjects = this.props.actions.getSubjectList('?sessionCode=' + sessionCode)\n            .then(() => {\n                return Promise.resolve();\n            })\n        const getDates = this.props.actions.getIntroDateList('?sessionCode=' + sessionCode)\n            .then(() => {\n                return Promise.resolve;\n            })\n        const getStatusCategories = this.props.actions.getBillStatusCategoryReferences()\n            .then(() => {\n                return Promise.resolve;\n            });\n        Promise.all([\n            getMembers,\n            getSubjects,\n            getDates,\n            getStatusCategories\n        ]).then(() => {\n            this.setState({\n                searchIsLoaded: true\n            });\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n        });\n    }\n\n    organizeSchedule(scheduleList) {\n        // Turn the list of schedule items into a list of dates each containing a list of schedule items\n        // This formatting is done so the schedule can be listed in the table with a date as a container\n        scheduleList.sort((a, b) => {\n            const dateComp = new Date(a.ScheduleDate) - new Date(b.ScheduleDate);\n            if (dateComp !== 0) {\n                return dateComp;\n            }\n\n            const timeA = moment(a.TimeDescription, \"h:mm A\");\n            const timeB = moment(b.TimeDescription, \"h:mm A\");\n            if (timeA.isValid() && timeB.isValid()) {\n                if (timeA.isBefore(timeB)) return -1;\n                if (timeA.isAfter(timeB)) return 1;\n            }\n            return 0;\n        });\n        let organizedSchedule = [];\n        let scheduleArray = [];\n        let previousSchedule = scheduleList[0];\n        scheduleList.forEach(schedule => {\n            const scheduleDateTime = this.getScheduleDateTime(schedule);\n            const previousScheduleDateTime = this.getScheduleDateTime(previousSchedule);\n\n            if(!schedule.DisplaySequence) {\n                schedule.DisplaySequence = 999;\n            }\n\n            if (!previousScheduleDateTime.isSame(scheduleDateTime, 'day')) {\n                //Add the list of legislation to the category\n                //Organize the times so that the hour/minute times are in their seperate containers, this is done to help with formatting\n                let newDateContainer = {\n                    Times: this.organizeTimes(scheduleArray),\n                    Date: previousScheduleDateTime.format(\"L\"),\n                };\n                organizedSchedule.push(newDateContainer);\n                //Empty out the leg array so we can use it for another category\n                scheduleArray = [];\n                //Add the first item to the next category\n                scheduleArray.push(schedule);\n            } else {\n                scheduleArray.push(schedule);\n            }\n            //Set this variable so the next iteration will know what the schedule date of the previous iteration was\n            previousSchedule = schedule;\n        });\n        //If the schedule array still has elements then that means not every schedule item in the results has been added to a container\n        //So, check to see if the schedule array has elements and if so create another container\n        if (scheduleArray.length > 0) {\n            let newDateContainer = {\n                Times: this.organizeTimes(scheduleArray),\n                Date: this.getScheduleDateTime(scheduleArray[0]).format(\"L\")\n            };\n            organizedSchedule.push(newDateContainer);\n        }\n\n        return organizedSchedule;\n    }\n\n    organizeTimes(itemsList) {\n        itemsList.sort((a, b) => {\n            return a.DisplaySequence < b.DisplaySequence ? -1 : a.DisplaySequence > b.DisplaySequence ? 1 : 0\n        })\n\n        let organizedTimes = [];\n        let items = [];\n        let time = \"\";\n\n        for (let i = 0; i < itemsList.length; i++) {\n            //If a ScheduleTime has been specified then use that, otherwise get the time from the ScheduleDate but do not display it in the list\n            let currentTime = \"\";\n\n            //If we've entered a new time then push the current time and sorted items into organizedTimes and reset variables\n            if (currentTime !== time) {\n                if (items.length > 0) {\n                    items.sort((a, b) => a.DisplaySequence - b.DisplaySequence);\n                    organizedTimes.push({\n                        Items: items,\n                        Time: time\n                    });\n                }\n\n                time = currentTime;\n                items = [itemsList[i]];\n            } else {\n                items.push(itemsList[i]);\n            }\n        }\n\n        //Sort and push the last time and sorted items\n        items.sort((a, b) => a.DisplaySequence - b.DisplaySequence);\n        organizedTimes.push({\n            Items: items,\n            Time: time\n        })\n\n        return organizedTimes;\n    }\n\n    getScheduleDateTime(schedule) {\n        const scheduleDate = moment(schedule.ScheduleDate);\n        const scheduleTime = moment(schedule.ScheduleTime, \"h:mm A\").isValid() && moment(schedule.ScheduleTime, \"h:mm A\");\n        return scheduleDate.hour(scheduleTime ? scheduleTime.hour() : scheduleDate.hour()).minute(scheduleTime ? scheduleTime.minute() : scheduleDate.minute()).second(scheduleTime ? scheduleTime.second() : scheduleDate.second()).tz('America/New_York', true).local();\n    }\n\n    componentDidMount() {\n        //if another portal has directed the user to this page with a session code url param, persist that session as the selected session\n        let session, getSessionPromise;\n        const sessionCodeParam = this.props.match.params.sessionCode\n        if (parseInt(sessionCodeParam) > 0) {\n            //if the sessionlist is already obtained, use that - otherwise, perform a GET\n            if (this.props.session.sessionList && this.props.session.sessionList.length) {\n                session = this.props.session.sessionList.find(session => session.SessionCode === sessionCodeParam);\n            } else {\n                getSessionPromise = this.props.actions.getSessionByCode(sessionCodeParam)\n                    .then(() => {\n                        session = this.props.session.selectedSession;\n                    })\n            }\n            Promise.all([getSessionPromise]).finally(() => {\n                if (session) {\n                    this.props.actions.changeSession(session.SessionCode)\n                    this.setupPage(session.SessionCode);\n                }\n            })\n        }\n\n        //otherwise, setup the page if another page has changed the value of the selected session\n        if (!session && this.props.session.selectedSession.SessionCode !== this.props.nav.session) {\n            const sessionCode = parseInt(this.props.nav.session, 10);\n            if (!isNaN(sessionCode)) {\n                this.setupPage(sessionCode);\n            }\n        }\n\n        //Get the schedule for the day\n        const startDate = moment().tz('America/New_York').format('MM/DD/YYYY')\n        let params = \"startDate=\" + startDate;\n        this.props.actions.getScheduleList(params)\n            .then(() => {\n                // Remove all the schedules that happened before the current hour - 2\n                const currentDay = moment();\n                const currentHour = currentDay.subtract(2, \"hours\");\n                //filter schedule to those that are after today, or are today but after the current hour\n                const schedule = this.props.schedule.scheduleList.filter(item => (item.ScheduleDate && moment(item.ScheduleDate).isValid() && moment(item.ScheduleDate).isAfter(moment(), 'day')) || (item.ScheduleTime && moment(item.ScheduleTime, \"h:mm A\").isValid() && moment(item.ScheduleTime, \"h:mm A\").tz('America/New_York', true).local().isSameOrAfter(moment().subtract(2, \"hours\"), 'hour')) || ((!item.ScheduleTime || !moment(item.ScheduleTime, \"h:mm A\").isValid()) && new Date(item.ScheduleDate).getTime() > currentHour))\n                //organize the schedule (set meetings in proper order), and then filter to display the next 3 meetings\n                let organizedSchedule = this.organizeSchedule(schedule);\n                let filteredOrganizedEvents = [];\n                organizedSchedule.forEach(day => {\n                    let times = day.Times;\n                    let thisDayMeetings = { Date: day.Date, Times: [] };\n                    times.forEach(time => {\n                        let timeObj = { Time: time.Time, Items: time.Items };\n                        thisDayMeetings.Times.push(timeObj);\n                    })\n                    filteredOrganizedEvents.push(thisDayMeetings);\n                })\n                this.setState({\n                    scheduleIsLoaded: true,\n                    schedule: filteredOrganizedEvents\n                });\n            });\n\n        this.getMessages();\n    }\n\n    componentDidUpdate(prevProps) {\n        // Setup the page if the global selected session changes. Change the URL to reflect the session change\n        if (prevProps.nav.session !== this.props.nav.session) {\n            const sessionCode = parseInt(this.props.nav.session, 10);\n            if (!isNaN(sessionCode)) {\n                this.setupPage(sessionCode);\n            }\n        }\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    getMessages() {\n        this.setState({ gettingMessages: true }, () => {\n            this.props.actions.getMessages().then(() => {\n                this.setState({ gettingMessages: false })\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({ gettingMessages: false })\n            })\n        })\n    }\n\n    getAdminMessages() {\n        this.setState({ gettingAdminMessages: true }, () => {\n            this.props.actions.getAdminMessages().then(() => {\n                this.setState({ gettingAdminMessages: false })\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.props.actions.makeToast([{ message: \"Failed to get admin messages\", type: \"failure\" }]);\n                this.setState({ gettingAdminMessages: false })\n            })\n        })\n    }\n\n    render() {\n        return (\n            <div className=\"homepage-wrapper\">\n                <MessageOfTheDay messages={[...this.props.collection.messages].reverse()} adminMessages={[...this.props.collection.adminMessages].reverse()} gettingMessages={this.state.gettingMessages} gettingAdminMessages={this.state.gettingAdminMessages} getMessages={this.getMessages} getAdminMessages={this.getAdminMessages} />\n                <Search\n                    memberList={this.props.members.memberList}\n                    subjectList={this.props.bills.subjectList}\n                    datesList={this.props.bills.introDateList}\n                    statusCategoriesList={this.props.bills.billStatusCategoryReferences}\n                    isLoaded={this.state.searchIsLoaded && this.state.sessionInfoIsLoaded}\n                    session={this.props.nav.session}\n                    selectedSession={this.props.session.selectedSession}\n                    sessionList={this.props.session.sessionList}\n                    history={this.props.history}\n                />\n                <div className=\"session-info grid-wrapper three\" style={{ minHeight: '422px', overflowWrap: 'anywhere' }}>\n                    <Resources\n                        isLoaded={this.state.sessionInfoIsLoaded}\n                        session={this.props.nav.session}\n                        selectedSession={this.props.session.selectedSession}\n                        isAuthenticated={this.props.login.isAuthenticated}\n                    />\n                    <div className=\"center-column\">\n                        <SessionInfo\n                            isLoaded={this.state.sessionInfoIsLoaded}\n                            selectedSession={this.props.session.selectedSession}\n                            sessionList={this.props.session.sessionList}\n                        />\n                    </div>\n                    <Schedule\n                        schedule={this.state.schedule}\n                        isLoaded={this.state.scheduleIsLoaded}\n                    />\n                </div>\n            </div>\n\n        )\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { bills, session, nav, schedule, members, login, collection } = state;\n        return {\n            bills,\n            session,\n            nav,\n            schedule,\n            members,\n            login,\n            collection\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, billActionCreators, sessionActionCreators, navActionCreators, scheduleActionCreators, memberActionCreators, authActionCreators, collectionActionCreators), dispatch)\n        }\n    }\n)(HomeComponent)","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { sessionActionCreators } from '../../stores/lis-session-store';\n\nimport { cancelRequest } from '../../services/request.service';\n\nclass SessionInformationComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            data: []\n        };\n    }\n\n    //When component has mounted, make the call to list the sessions\n    componentDidMount() {\n        this.props.getSessionList().then(() =>\n            this.setState({\n                data: this.props.sessionList\n            })\n        )\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { data } = this.state;\n        const listSessions = data.map((session, i) =>\n            <li key={i}>\n                <Link to={`/session-details/${session.SessionID}`}>{session.SessionYear} {session.DisplayName}</Link>\n            </li>\n        );\n        return (\n            <div className=\"public-list inner-grid three-and-one\">\n                <div>\n                </div>\n                <div>\n                    <h3>Other Sessions</h3>\n                    <ul>\n                        {listSessions}\n                    </ul>\n                </div>\n            </div>\n            )\n    }\n}\n\nconst PublicSessionInformation = connect(\n    state => state.session,\n    dispatch => bindActionCreators(sessionActionCreators, dispatch)\n)(SessionInformationComponent)\n\nexport default PublicSessionInformation;\n","import React from 'react';\nimport moment from 'moment-timezone';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\n\nimport LoaderComponent from '../../../lis-shared/lis-layout/components/lis-loader-component';\nimport { cancelRequest } from '../../../services/request.service';\nimport { memberActionCreators } from '../../../stores/lis-members-store';\n\nclass CommitteeListComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            activeKey: '',\n            listMembers: [],\n            houseCommitteesIsLoaded: false,\n            senateCommitteesIsLoaded: false,\n            sessionData: '',\n            houseCommittees: [],\n            senateCommittees: [],\n            conveneDate: moment().format(),\n            showSenateChamber: true,\n            showHouseChamber: true\n        };\n        this.getCommitteeLists = this.getCommitteeLists.bind(this);\n        this.toggleChamber = this.toggleChamber.bind(this);\n        this.toggleGetMembers = this.toggleGetMembers.bind(this);\n        this.setupPage = this.setupPage.bind(this);\n    }\n\n    getCommitteeLists(sessionID, chamberCode, listName) {\n        var params = 'sessionID=' + sessionID + '&' + 'chamberCode=' + chamberCode\n\n        this.props.actions.getCommitteeList(params).then(() =>\n            this.setState({\n                [listName]: this.props.committee.committeeList,\n                [listName + 'IsLoaded']: true\n            })\n        )\n    }\n\n    toggleChamber(chamber) {\n        this.setState(state => ({\n            [chamber]: !state[chamber]\n        }));\n    }\n\n    toggleGetMembers(committeeId) {\n        const sessionData = this.state.sessionData;\n        var params = 'sessionCode=' + sessionData.SessionCode + '&CommitteeID=' + committeeId;\n        if (this.state[committeeId]) {\n            this.setState(prevState => ({\n                [committeeId + 'isActive']: !prevState[committeeId + 'isActive']\n            }));\n            return;\n        }\n        this.props.actions.getMembersByCommittee(params).then(() => {\n            // The Chairman needs to be the at the top of the list\n            const chairmanIndex = this.props.members.membersByCommittee.findIndex(member => member.CommitteeRoleTitle === 'Chairman');\n            let membersByCommittee = [...this.props.members.membersByCommittee];\n            if (chairmanIndex !== -1) {\n                let chairman = membersByCommittee[chairmanIndex];\n                membersByCommittee.splice(chairmanIndex, 1);\n                membersByCommittee.unshift(chairman);\n            }\n            const sessionStartObj = sessionData.SessionEvents && sessionData.SessionEvents.length && sessionData.SessionEvents.find(date => date.DisplayName === \"Session Start\");\n            const startDate = sessionStartObj ? moment(sessionStartObj.ActualDate) : '';\n            const adjournmentEvent = sessionData ? sessionData.SessionEvents.find(event => event.DisplayName === 'Adjournment') : '';\n            const endDate = adjournmentEvent ? moment(adjournmentEvent.ActualDate) : moment();\n            const memberString = membersByCommittee.map((member, memberIndex) => {\n                let detailString = '';\n                if (member.CommitteeRoleTitle === \"Chairman\") {\n                    detailString += '(' + member.CommitteeRoleTitle;\n                }\n                if (member.EffectiveBeginDate && moment(member.EffectiveBeginDate).isAfter(startDate)) {\n                    detailString = detailString ? detailString + ', ' : '(';\n                    detailString += 'Arrived: ' + moment(member.EffectiveBeginDate).format('MM/DD/YYYY');\n                }\n                if (member.EffectiveEndDate && moment(member.EffectiveEndDate).isBefore(endDate)) {\n                    detailString = detailString ? detailString + ', ' : '(';\n                    detailString += 'Left: ' + moment(member.EffectiveEndDate).format('MM/DD/YYYY');\n                }\n                if (detailString) {\n                    detailString = ' ' + detailString + ')';\n                };\n                return (<React.Fragment key={memberIndex}>\n                    <Link style={{ display: 'inline', margin: 0 }} to={`/session-details/${sessionData.SessionCode}/member-information/${member.MemberNumber}/member-details`}>{member.PatronDisplayName}</Link>\n                    {detailString}\n                    {memberIndex !== membersByCommittee.length - 1 && \", \"}\n                </React.Fragment>)\n            })\n            this.setState(prevState => ({\n                [committeeId]: memberString,\n                [committeeId + 'isActive']: !prevState[committeeId + 'isActive']\n            }));\n        });\n    }\n\n    //When component has mounted, make the call to list the committees\n    componentDidMount() {\n        if (parseInt(this.props.match.params.sessioncode, 10) > 0) {\n            //Update the session selector component, which will run componentDidUpdate and call setupPage on its own\n            const sessionCode = this.props.match.params.sessioncode\n            if (this.props.nav.session !== sessionCode) {\n                this.props.actions.changeSession(sessionCode)\n            } else {\n                this.setupPage(sessionCode);\n            }\n        }\n    }\n\n    componentDidUpdate(prevProps) {\n        // Setup the page if the global selected session changes. Change the URL to reflect the session change\n        if (prevProps.nav.session !== this.props.nav.session) {\n            this.props.history.push('/session-details/' + this.props.nav.session + '/committee-information');\n            this.setupPage(this.props.nav.session);\n        } else if (this.props.nav.session !== this.props.match.params.sessioncode) {\n            // If the url changes then update the global selected session with whatever the url is\n            const sessionCode = this.props.match.params.sessioncode;\n            if (!isNaN(sessionCode)) {\n                this.props.actions.changeSession(sessionCode);\n            }\n        }\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    setupPage(sessionCode) {\n        this.props.actions.getSessionByCode(sessionCode).then(() => {\n            const sessionStartObj = this.props.session.selectedSession.SessionEvents && this.props.session.selectedSession.SessionEvents.length && this.props.session.selectedSession.SessionEvents.find(date => date.DisplayName === \"Session Start\");\n            const startDate = sessionStartObj ? moment(sessionStartObj.ActualDate) : '';\n            this.setState({\n                sessionData: this.props.session.selectedSession,\n                conveneDate: startDate\n            }, () => {\n                this.getCommitteeLists(this.state.sessionData.SessionID, 'H', 'houseCommittees')\n                this.getCommitteeLists(this.state.sessionData.SessionID, 'S', 'senateCommittees')\n            })\n        });\n    }\n\n    render() {\n        const { sessionData, houseCommittees, senateCommittees } = this.state;\n        const sessionHeader = sessionData ? sessionData.SessionYear + ' ' + sessionData.DisplayName : '';\n        const listCommittee = (committee, i) => {\n            const legislationObj = {\n                selectedSession: sessionData.SessionID,\n                selectedBillStatus: 2,\n                selectedCommittee: committee.CommitteeID,\n            };\n            const legislationLink = window.btoa(JSON.stringify(legislationObj));\n            return (<div key={i} className={this.state[committee.CommitteeID + 'isActive'] ? 'parent-li slidedown-open' : 'parent-li slidedown-closed'}>\n                <div className=\"toggle-row\">\n                    <Link to={`/session-details/${sessionData.SessionCode}/committee-information/${committee.CommitteeNumber}/committee-details`}>{committee.Name}</Link>\n                    <div className=\"button-container\">\n                        <button aria-expanded={!!this.state[committee.CommitteeID + 'isActive']} className=\"arrow-down\" onClick={() => this.toggleGetMembers(committee.CommitteeID, sessionData.SessionCode)}>Show members</button>\n                    </div>\n                </div>\n                {this.state[committee.CommitteeID + 'isActive'] &&\n                    <div className=\"list-desc\">\n                        Members: {this.state[committee.CommitteeID]}\n                    </div>\n                }\n                <div className=\"list-links\">\n                    <Link to={`/bill-search?q=${legislationLink}`}>Legislation</Link>\n                </div>\n            </div>)\n        }\n        const listHouseCommittees = houseCommittees.map(listCommittee);\n        const listSenateCommittees = senateCommittees.map(listCommittee);\n\n        return (\n            <div className=\"public-chamber-data\">\n                <div>\n                    <h2>{sessionHeader}</h2>\n                </div>\n                <div className=\"public-list inner-grid two\">\n                    <div>\n                        <h3 role=\"button\" onClick={() => this.toggleChamber(\"showHouseChamber\")} aria-expanded={this.state.showHouseChamber} className={`chamber-name ${this.state.showHouseChamber ? \"opened\" : \"\"}`}>House Committees</h3>\n                        <LoaderComponent data={this.state.houseCommitteesIsLoaded} />\n                        <ul className=\"slidedown-list\">\n                            {this.state.showHouseChamber &&\n                                <>\n                                    {listHouseCommittees}\n                                </>\n                            }\n                        </ul>\n                    </div>\n                    <div>\n                        <h3 role=\"button\" onClick={() => this.toggleChamber(\"showSenateChamber\")} aria-expanded={this.state.showSenateChamber} className={`chamber-name ${this.state.showHouseChamber ? \"opened\" : \"\"}`}>Senate Committees</h3>\n                        <LoaderComponent data={this.state.senateCommitteesIsLoaded} />\n                        <ul className=\"slidedown-list\">\n                            {this.state.showSenateChamber &&\n                                <>\n                                    {listSenateCommittees}\n                                </>\n                            }\n                        </ul>\n                    </div>\n                </div>\n            </div>\n        )\n    }\n}\n\nconst PublicCommitteeList = connect(\n    (state) => {\n        const { committee, members, session, nav } = state;\n        return {\n            committee,\n            members,\n            session,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, committeeActionCreators, memberActionCreators, sessionActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(CommitteeListComponent)\n\nexport default PublicCommitteeList;\n","import React from 'react';\nimport moment from 'moment-timezone';\nimport { Link, withRouter } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport renderHTML from 'react-render-html';\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { calendarActionCreators } from '../../../stores/lis-calendar-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\n\nimport LoaderComponent from '../../../lis-shared/lis-layout/components/lis-loader-component'\nimport { minutesActionCreators } from '../../../stores/lis-minutes-store';\nimport { memberActionCreators } from '../../../stores/lis-members-store';\n\nconst CURRENTLY_IN = 'Bills in subcommittee <em>today</em>';\nconst ASSIGNED_TO = 'Bills that have ever been in this subcommittee';\n\nfunction MinutesData(props) {\n    return (\n        <tr className=\"inner-grid one-and-three\">\n            <td className=\"no-gap-grid\" style={{ gridTemplateColumns: '150px 110px' }}>\n                <span>{moment(props.MinutesDate).format(\"MMMM D[,] YYYY\")} {props.MinutesNumber > 1 ? \"(\" + props.MinutesNumber + \")\" : \"\"}</span>\n                <div className=\"flex-row\">\n                    {(props.IsPublic || this.props.login.userClaims.scopes.find(x => x === \"Senate\")) ? <Link to={`/session-details/${props.sessionCode}/committee-information/${props.committeeNumber}/meetings/${props.MinutesBookID}/1`}>\n                        Meeting\n                    </Link> : <div />}\n                    {props.MinutesCalendars && props.MinutesCalendars.length > 0 ?\n                        <React.Fragment>{(props.IsPublic || this.props.login.userClaims.scopes.find(x => x === \"Senate\")) && \"|\"}\n                            <Link to={`/session-details/${props.sessionCode}/committee-information/${props.committeeNumber}/dockets/${props.MinutesCalendars[0].CalendarID}`}>\n                                Docket\n                            </Link>\n                        </React.Fragment> : null}\n                </div>\n            </td>\n        </tr >\n    )\n}\n\nfunction MinutesList(props) {\n    const listMinutes = props.minutes.map((minute, i) => {\n        return (\n            <MinutesData key={i} {...minute} sessionCode={props.sessionCode} committeeNumber={props.committeeNumber} />\n        )\n    });\n    return (<React.Fragment>{listMinutes}</React.Fragment>)\n}\n\nfunction DocketData(props) {\n    const { docket, formattedSessionCode, committeeNumber } = props;\n\n    if (!docket) {\n        return <div />;\n    }\n\n    let url = '';\n    if (docket.ChamberCode === \"H\") {\n        if (docket.ReferenceNumber) {\n            url = `https://virginiageneralassembly.gov/house/agendas/agendaItem.php?id=${docket.ReferenceNumber}&ses=${formattedSessionCode}`\n        } else {\n            url = `https://virginiageneralassembly.gov/house/agendas/agendaDates.php?id=${committeeNumber}&ses=${formattedSessionCode}`\n        }\n    } else {\n        url = `/session-details/` + docket.SessionCode + `/committee-information/` + committeeNumber + `/dockets/` + docket.DocketID;\n    }\n\n    return (\n        <tr className=\"inner-grid one-and-three\">\n            <td className=\"no-gap-grid\" style={{ gridTemplateColumns: '150px 110px' }}>\n                <span>{moment(docket.HouseAgendaDate ? docket.HouseAgendaDate : docket.DocketDate).format(\"MMMM D[,] YYYY\")}</span>\n                <Link to={url}>\n                    Docket</Link>\n            </td>\n        </tr>\n    )\n}\n\nfunction DocketList(props) {\n    let count = 1;\n    const listDockets = props.dockets.map((docket, i) => {\n        //Proceed with adding the docket if there is not a minutes on the same day as the docket\n        //Unless it's a past session in which case show the docket no matter what \n        if ((!props.maxSize || count < props.maxSize) && ((!props.sessionData.IsActive && i !== 0) || (i !== 0 && props.minutes && props.minutes.length > 0 && !props.minutes.find(y => moment(docket.DocketDate).isSame(y.MinutesDate, \"days\"))))) {\n            count++;\n            return (\n                <DocketData key={i} docket={docket} formattedSessionCode={props.formattedSessionCode} committeeNumber={props.committeeNumber} />\n            )\n        }\n    });\n    return (<React.Fragment>{listDockets}</React.Fragment>)\n}\n\nfunction SubCommittees(props) {\n    return (\n        <li>\n            {props.parentCommitteeNumber !== \"S05\"\n                ? <Link to={`/session-details/${props.sessionCode}/committee-information/${props.CommitteeNumber}/committee-details`}>{props.Name}</Link>\n                : props.Name === \"Capital Outlay & Transportation\"\n                    ? <a href='https://sfac.virginia.gov/subcommittees/capital-outlay-transport.shtml'>Capital Outlay & Transportation</a>\n                    : props.Name === \"Education\"\n                        ? <a href='https://sfac.virginia.gov/subcommittees/education.shtml'>Education</a>\n                        : <Link to={`/session-details/${props.sessionCode}/committee-information/${props.CommitteeNumber}/committee-details`}>{props.Name}</Link>\n            }\n        </li>\n    );\n}\n\nfunction SubCommitteesList(props) {\n    const listCommittees = props.committees.map((committee, i) => <SubCommittees key={i} sessionCode={props.sessionCode} parentCommitteeNumber={props.parentCommitteeNumber} {...committee} />);\n    return listCommittees;\n}\n\nclass CommitteeDetailsComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            committeeData: { Name: '' },\n            parentCommitteeData: {},\n            memberList: [],\n            subcommitteesList: [],\n            sessionData: '',\n            minutesList: [],\n            docketList: [],\n            showTooltip: {}\n        };\n        this.getCommitteeDetails = this.getCommitteeDetails.bind(this);\n        this.getCommitteeMembers = this.getCommitteeMembers.bind(this);\n        this.getSubcommittees = this.getSubcommittees.bind(this);\n        this.getMeetings = this.getMeetings.bind(this);\n        this.setupDoc = this.setupDoc.bind(this);\n        this.makeLink = this.makeLink.bind(this);\n        this.toggleTooltip = this.toggleTooltip.bind(this);\n    }\n\n    // When component has mounted:\n    // 1. Get session info, add to state\n    // 2. Get committee by ID\n    // 3. Get committee members\n    // 4. Get subcommittees (if any)\n    setupDoc(sessionCode) {\n        const committeeNumber = this.props.match.params.committeenumber\n        this.props.actions.getSessionByCode(sessionCode).then(() => {\n            const sessionData = this.props.session.selectedSession;\n            this.setState({\n                sessionData: sessionData,\n                committeeNumber: committeeNumber\n            }, () => {\n                this.getCommitteeDetails(committeeNumber, sessionData.SessionID);\n            });\n        });\n    }\n\n\n    componentDidUpdate(prevProps) {\n        //If the user clicks a link to a subcommittee then the setup function needs to run again\n        if (this.props.match.params.committeenumber !== prevProps.match.params.committeenumber) {\n            this.setupDoc(this.props.nav.session);\n        }\n        // Setup the page if the global selected session changes. Change the URL to reflect the session change\n        if (prevProps.nav.session !== this.props.nav.session) {\n            this.props.history.push('/session-details/' + this.props.nav.session + '/committee-information/' + this.props.match.params.committeenumber + '/committee-details');\n            this.setupDoc(this.props.nav.session);\n        } else if (this.props.nav.session !== this.props.match.params.sessioncode) {\n            // If the url changes then update the global selected session with whatever the url is\n            const sessionCode = this.props.match.params.sessioncode;\n            if (!isNaN(sessionCode)) {\n                this.props.actions.changeSession(sessionCode);\n            }\n        }\n    }\n\n    componentDidMount() {\n        window.scrollTo(0, 0);\n        const sessionCode = this.props.match.params.sessioncode;\n        //Update the session selector component, which will run componentDidUpdate and call setupDoc on its own\n        if (this.props.nav.session !== sessionCode) {\n            this.props.actions.changeSession(sessionCode)\n        } else {\n            this.setupDoc(sessionCode);\n        }\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    getCommitteeDetails(committeeNumber, sessionId) {\n        const sessionStartObj = this.props.session.selectedSession.SessionEvents && this.props.session.selectedSession.SessionEvents.length && this.props.session.selectedSession.SessionEvents.find(date => date.DisplayName === \"Session Start\");\n        const startDate = sessionStartObj ? moment(sessionStartObj.ActualDate) : '';\n\n        this.props.actions.getCommitteeByNumber(\"?committeeNumber=\" + committeeNumber + \"&sessionId=\" + sessionId).then(() => {\n            this.setState({\n                committeeData: this.props.committee.committeeByNumberData,\n                detailsIsLoaded: true\n            });\n\n            //Attempt to get any meetings or dockets for the committee\n            this.getMeetings(this.state.sessionData, this.props.committee.committeeByNumberData.CommitteeID);\n            if (this.props.committee.committeeByNumberData.ChamberCode === \"S\")\n                this.getDockets(this.state.sessionData, this.props.committee.committeeByNumberData);\n\n            if (this.props.committee.committeeByNumberData.ParentCommitteeID) {\n                this.props.actions.getCommitteeById(\"?sessionId=\" + sessionId + \"&id=\" + this.props.committee.committeeByNumberData.ParentCommitteeID + \"&effectiveDate=\" + moment(this.props.session.selectedSession.StartDate).format(\"MM/DD/YYYY\")).then(() => {\n                    this.setState({\n                        parentCommitteeData: this.props.committee.committeeByIdData\n                    })\n                })\n            }\n\n            this.getCommitteeMembers(this.props.committee.committeeByNumberData.CommitteeID, sessionId);\n            this.getSubcommittees(this.props.committee.committeeByNumberData.CommitteeID, sessionId);\n        }\n        )\n    }\n\n\n    getCommitteeMembers(committeeID, sessionId) {\n        var params = 'sessionID=' + sessionId + '&' + 'CommitteeID=' + committeeID;\n        this.props.actions.getMembersByCommittee(params).then(() => {\n            // The Chairman needs to be the at the top of the list\n            const chairmanIndex = this.props.members.membersByCommittee.findIndex(member => member.CommitteeRoleTitle === 'Chairman');\n            let membersByCommittee = [...this.props.members.membersByCommittee];\n            if (chairmanIndex !== -1) {\n                let chairman = membersByCommittee[chairmanIndex];\n                membersByCommittee.splice(chairmanIndex, 1);\n                membersByCommittee.unshift(chairman);\n            }\n            this.setState({\n                memberList: membersByCommittee,\n                membersIsLoaded: true\n            });\n        });\n    }\n\n    getSubcommittees(parentID, sessionID) {\n        var params = 'sessionID=' + sessionID + '&' + 'parentCommitteeID=' + parentID;\n\n        this.props.actions.getCommitteeList(params).then(() =>\n            this.setState({\n                subcommitteesList: this.props.committee.committeeList,\n                subcommitteesIsLoaded: true\n            })\n        );\n    }\n\n    getMeetings(sessionData, committeeId) {\n        const meetingParam = \"sessionID=\" + sessionData.SessionID + \"&committeeID=\" + committeeId;\n        this.props.actions.getMinutesList(meetingParam, false)\n            .then(() => {\n                let minutesList = [...this.props.minutes.minutesList];\n                this.setState({\n                    minutesList: minutesList,\n                    minutesListIsLoaded: true\n                });\n            });\n    }\n\n    getDockets(sessionData, committeeData) {\n        const docketParams = \"?sessionID=\" + sessionData.SessionID + \"&chamberCode=\" + committeeData.ChamberCode + \"&committeeID=\" + committeeData.CommitteeID;\n        this.props.actions.getDocketList(docketParams, false)\n            .then(() => {\n                this.setState({\n                    docketList: this.props.calendar.docketList,\n                    docketListIsLoaded: true\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err);\n                this.setState({\n                    docketListIsLoaded: true\n                });\n            });\n    }\n\n    makeLink(statusCategoryId, currentStatus) {\n        let params = {\n            selectedSession: this.state.sessionData ? this.state.sessionData.SessionID : '',\n            selectedBillStatusCategory: statusCategoryId,\n            selectedCommittee: this.state.committeeData.ParentCommitteeID || this.state.committeeData.CommitteeID,\n            selectedSubcommittee: this.state.committeeData.ParentCommitteeID ? this.state.committeeData.CommitteeID : '',\n            currentStatus: currentStatus ?? false\n        };\n\n        const json = JSON.stringify(params);\n        const query = window.btoa(json);\n        return '/bill-search?q=' + query;\n    }\n\n    toggleTooltip(text) {\n        let showTooltip = { ...this.state.showTooltip };\n\n        //Close all open tooltips\n        if (typeof showTooltip === \"object\") {\n            for (const x in showTooltip) {\n                if (x !== text)\n                    showTooltip[x] = false;\n            };\n        }\n\n        showTooltip[text] = showTooltip[text] ? false : true;\n\n        this.setState({\n            showTooltip: showTooltip\n        })\n    }\n\n    render() {\n        const { sessionData, committeeData, parentCommitteeData, memberList, subcommitteesList, minutesList, docketList } = this.state;\n        const formattedSessionCode = sessionData.SessionCode ? sessionData.SessionCode.substr(2) : '';\n        const sessionStartObj = sessionData && sessionData.SessionEvents && sessionData.SessionEvents.length ? sessionData.SessionEvents.find(date => date.DisplayName === \"Session Start\") : '';\n        const startDate = sessionStartObj ? moment(sessionStartObj.ActualDate) : moment();\n        const closingEvent = sessionData && sessionData.SessionEvents && sessionData.SessionEvents.length ? sessionData.SessionEvents.find(event => event.DisplayName === 'Closing') : '';\n        const reconveneEvent = !closingEvent && sessionData && sessionData.SessionEvents && sessionData.SessionEvents.length ? sessionData.SessionEvents.find(event => event.DisplayName === 'Reconvene') : '';\n        const adjournmentEvent = !closingEvent && !reconveneEvent && sessionData && sessionData.SessionEvents && sessionData.SessionEvents.length ? sessionData.SessionEvents.find(event => event.DisplayName === 'Adjournment') : '';\n        const endDate = closingEvent ? moment(closingEvent.ActualDate) : reconveneEvent ? moment(reconveneEvent.ActualDate) : adjournmentEvent ? moment(adjournmentEvent.ActualDate) : moment();\n        //Find the first docket that doesn't have a minutes on the same day\n        const defaultDocket = docketList.find(x => !minutesList.find(y => moment(x.DocketDate).isSame(y.MinutesDate, \"days\")));\n\n        const committeeLabel = (!committeeData.ParentCommitteeID ? committeeData.ChamberCode === \"H\" ? \"House \" : \"Senate \" : \"Subcommittee: \") + committeeData.Name\n\n        const buildMembers = (memberList) => {\n            let members = [];\n            let changedMembers = [];\n            for (let i = 0; i < memberList.length; i++) {\n                if (memberList[i].RemoveDate && moment(memberList[i].RemoveDate).isBefore(endDate)) {\n                    memberList[i].Change = \"Left\"\n                    memberList[i].ChangeDate = memberList[i].RemoveDate;\n                    changedMembers.push(memberList[i])\n                } else if (memberList[i].AssignDate && moment(memberList[i].AssignDate).isAfter(startDate) && moment(memberList[i].AssignDate).isBefore(endDate)) {\n                    members.push(memberList[i])\n                    memberList[i].Change = \"Joined\"\n                    memberList[i].ChangeDate = memberList[i].AssignDate\n                    changedMembers.push(memberList[i])\n                } else {\n                    members.push(memberList[i])\n                }\n            }\n\n            changedMembers.sort((a, b) => (a.ChangeDate > b.ChangeDate) ? 1 : ((b.ChangeDate > a.ChangeDate) ? -1 : 0))\n\n            return <React.Fragment>\n                <p>\n                    {members.map((member, memberIndex) =>\n                        <React.Fragment key={memberIndex}>\n                            <Link style={{ display: 'inline' }} to={`/session-details/${sessionData.SessionCode}/member-information/${member.MemberNumber}/member-details`}>{member.PatronDisplayName}</Link>\n                            {member.CommitteeRoleTitle && member.CommitteeRoleTitle === \"Vice-Chair\"\n                                ? this.state.committeeData.ChamberCode === \"H\"\n                                    ? \" (Vice Chair)\"\n                                    : \" (Co-Chair)\"\n                                : member.CommitteeRoleTitle !== \"Member\" && member.CommitteeRoleTitle !== \"Ex-Officio\" && \" (\" + member.CommitteeRoleTitle + \")\"\n                            }\n                            {memberIndex !== members.length - 1 && \", \"}\n                        </React.Fragment>\n                    )}\n                </p>\n                <p className=\"committee-member-details\">\n                    {changedMembers.map((member, memberIndex) =>\n                        <React.Fragment key={memberIndex}>\n                            {member.Change === \"Joined\"\n                                ? moment(member.AssignDate).format('MM/DD/YYYY') + \" \" + member.PatronDisplayName + \" joined\\n\"\n                                : moment(member.RemoveDate).format('MM/DD/YYYY') + \" \" + member.PatronDisplayName + \" left\\n\"\n                            }\n                        </React.Fragment>\n                    )}\n                </p>\n            </React.Fragment>;\n        }\n\n        return (\n            <div className=\"committee-details-page generic-details-page public-details inner-grid\">\n                <div>\n                    <h2 style={{ marginBottom: \"7px\" }}>{sessionData.SessionYear} {sessionData.DisplayName}</h2>\n                </div>\n                {committeeData.ParentCommitteeID && <Link className=\"parent-committee-link\" to={`/session-details/${sessionData.SessionCode}/committee-information/${parentCommitteeData.CommitteeNumber}/committee-details`}><i className=\"icon button-left\" style={{ marginRight: \"2px\" }} />{(parentCommitteeData.ChamberCode === \"H\" ? \"House \" : \"Senate \") + parentCommitteeData.Name}</Link>}\n                <div className=\"details-header\">\n                    <h3 style={{ marginBottom: \"10px\" }}>{committeeLabel}</h3>\n                    <LoaderComponent data={this.state.detailsIsLoaded} />\n                </div>\n                <div className=\"details-section\">\n                    <h4 >Membership</h4>\n                    <LoaderComponent data={this.state.membersIsLoaded} />\n                    {memberList.length === 0 &&\n                        <p>No Members</p>\n                    }\n                    <React.Fragment>\n                        {buildMembers(memberList)}\n                    </React.Fragment>\n                </div>\n                {this.state.minutesListIsLoaded || this.state.docketListIsLoaded ?\n                    <React.Fragment>\n                        {committeeData.ChamberCode === \"H\" ?\n                            <div className={this.state['slideDockets'] ? 'parent-li slidedown-open' : 'parent-li slidedown-closed'}>\n                                {committeeData.ParentCommitteeID && <p>Committee chairs serve as ex officio members of House subcommittees.</p>}\n                                {docketList.length === 0 ?\n                                    this.state.sessionData && this.state.sessionData.IsActive &&\n                                    <div className=\"table-container description\">\n                                        <p style={{ marginBottom: \"0px\" }}>{committeeData.MeetingNote}</p>\n                                        <a target=\"_blank\" href={`https://virginiageneralassembly.gov/house/agendas/agendaDates.php?id=${committeeData.CommitteeNumber}&ses=${formattedSessionCode}`} >{committeeData.ParentCommitteeID ? \"Subcommittee Agendas\" : \"Committee Agendas\"}</a>\n                                    </div>\n                                    :\n                                    <React.Fragment>\n                                        <div className={this.state['slideDockets'] ? 'parent-li slidedown-open' : 'parent-li slidedown-closed'}>\n                                            <div className=\"toggle-row\">\n                                                <div className=\"table-container description\">\n                                                    <h4>Agendas</h4>\n                                                    <p>{committeeData.MeetingNote}</p>\n                                                </div>\n                                                {docketList.length > 3 &&\n                                                    <div className=\"button-container text-align-left\">\n                                                        <label aria-expanded={this.props.slideDockets} className=\"arrow-down-label\" onClick={this.props.toggleShowData.bind(this, 'slideDockets')}>All Agendas</label>\n                                                        <button aria-expanded={this.props.slideDockets} className=\"arrow-down\" onClick={this.props.toggleShowData.bind(this, 'slideDockets')}>All Agendas</button>\n                                                    </div>\n                                                }\n                                            </div>\n                                        </div>\n                                        {!this.state.sessionData.IsActive &&\n                                            <div>\n                                                <table className=\"line-table\">\n                                                    <tbody className=\"toggle-table\">\n                                                        {!this.props.slideDockets &&\n                                                            <DocketList dockets={docketList.slice(0, 3)} formattedSessionCode={formattedSessionCode} committeeNumber={committeeData.CommitteeNumber} />\n                                                        }\n                                                        {this.props.slideDockets && docketList.length > 3 &&\n                                                            <div className=\"list-desc\">\n                                                                <DocketList dockets={docketList} formattedSessionCode={formattedSessionCode} committeeNumber={committeeData.CommitteeNumber} />\n                                                            </div>\n                                                        }\n                                                    </tbody>\n                                                </table>\n                                            </div>\n                                        }\n                                    </React.Fragment>\n                                }\n                                <div className=\"details-section\">\n                                    {this.state.sessionData && this.state.sessionData.IsActive &&\n                                        <a rel=\"noreferrer\" target=\"_blank\" href={`https://virginiageneralassembly.gov/house/reports/reportsDates.php?id=${this.state.committeeData.CommitteeNumber}&ses=${formattedSessionCode}`} >{committeeData.ParentCommitteeID ? \"Subcommittee Reports\" : \"Committee Reports\"}</a>\n                                    }\n                                    {this.state.sessionData && this.state.sessionData.IsActive &&\n                                        <p><a rel=\"noreferrer\" target=\"_blank\" href={`https://hodspeak.house.virginia.gov/committees/${this.state.committeeData.CommitteeNumber}/bill_feedback?ses=${formattedSessionCode}`} >Comments on Bills</a></p>\n                                    }\n                                </div>\n                            </div>\n                            :\n                            <React.Fragment>\n                                <div className={this.state['slideDockets'] ? 'parent-li slidedown-open' : 'parent-li slidedown-closed'}>\n                                    {committeeData.ParentCommitteeID && <p>The Chair of the full Committee shall be an ex officio member of all subcommittees and entitled to vote, but shall not be counted as a member for purposes of a quorum. </p>}\n                                    <div className=\"toggle-row\">\n                                        <div className=\"table-container description\">\n                                            <h4>Meetings (Dockets, Votes, Reports)</h4>\n                                            <p>{this.state.committeeData.MeetingNote}</p>\n                                        </div>\n                                    </div>\n                                    {minutesList.length > 3 &&\n                                        <div className=\"button-container text-align-left\">\n                                            <label aria-expanded={this.props.slideDockets} className=\"arrow-down-label\" onClick={this.props.toggleShowData.bind(this, 'slideDockets')}>All Meetings</label>\n                                            <button aria-expanded={this.props.slideDockets} className=\"arrow-down\" onClick={this.props.toggleShowData.bind(this, 'slideDockets')}>All Meetings</button>\n                                        </div>\n                                    }\n                                    {this.state.committeeData.AgendaURL &&\n                                        <div className=\"table-container description\">\n                                            <p>\n                                                <a href={this.state.committeeData.AgendaURL} target=\"_blank\">Agendas</a>\n                                            </p>\n                                        </div>\n                                    }\n                                    {this.state.committeeData.CommitteeID === 26 && //Senate Finance\n                                        <div className=\"table-container description\">\n                                            <p>\n                                                <a href={\"http://sfac.virginia.gov/about.shtml\"} target=\"_blank\">Staff/Information</a>\n                                            </p>\n                                        </div>\n                                    }\n                                    {this.state.docketList.length > 0 && defaultDocket && !this.state.sessionData.IsActive &&\n                                        <div>\n                                            {/*don't show the 'All Meetings' button twice -- already shown if minutesList.length > 3*/\n                                                minutesList.length <= 3 &&\n                                                <div className=\"button-container text-align-left\">\n                                                    <label aria-expanded={this.props.slideDockets} className=\"arrow-down-label\" onClick={this.props.toggleShowData.bind(this, 'slideDockets')}>All Meetings</label>\n                                                    <button aria-expanded={this.props.slideDockets} className=\"arrow-down\" onClick={this.props.toggleShowData.bind(this, 'slideDockets')}>All Meetings</button>\n                                                </div>\n                                            }\n                                            <table className=\"line-table\">\n                                                <tbody className=\"toggle-table\">\n                                                    <DocketData\n                                                        docket={defaultDocket}\n                                                        formattedSessionCode={formattedSessionCode}\n                                                        committeeNumber={committeeData.CommitteeNumber}\n                                                    />\n                                                    {this.props.slideDockets && !this.state.sessionData.IsActive && docketList.length > 3 ?\n                                                        <div className=\"list-desc\">\n                                                            <DocketList sessionData={this.state.sessionData} minutes={minutesList} dockets={docketList} formattedSessionCode={formattedSessionCode} committeeNumber={committeeData.CommitteeNumber} />\n                                                        </div>\n                                                        :\n                                                        <div className=\"list-desc\">\n                                                            <DocketList sessionData={this.state.sessionData} maxSize={3} minutes={minutesList} dockets={docketList} formattedSessionCode={formattedSessionCode} committeeNumber={committeeData.CommitteeNumber} />\n                                                        </div>\n                                                    }\n                                                </tbody>\n                                            </table>\n                                        </div>\n                                    }\n                                </div>\n                                {minutesList.length > 0 &&\n                                    <div>\n                                        <table className=\"line-table\">\n                                            <tbody className=\"toggle-table\">\n                                                {this.props.slideDockets\n                                                    ? <div className=\"list-desc\">\n                                                        <MinutesList minutes={minutesList} sessionCode={sessionData.SessionCode} committeeNumber={committeeData.CommitteeNumber} />\n                                                    </div>\n                                                    : <MinutesList minutes={minutesList.slice(0, 3)} sessionCode={sessionData.SessionCode} committeeNumber={committeeData.CommitteeNumber} />}\n                                            </tbody>\n                                        </table>\n                                    </div>\n                                }\n                            </React.Fragment>\n                        }\n                    </React.Fragment>\n                    :\n                    <div aria-label=\"Loading\" className=\"spinner\"></div>\n                }\n                {committeeData.CommitteeFiles && committeeData.CommitteeFiles.length > 0 &&\n                    <div className=\"details-section\">\n                        <p>\n                            {committeeData.CommitteeFiles.map((link, linkIndex) =>\n                                <a key={linkIndex} target=\"_blank\" href={link.FileURL}>{link.Description}</a>\n                            )}\n                        </p>\n                    </div>\n                }\n                {committeeData.ParentCommitteeID ? (\n                    <div className=\"details-section\">\n                        <h4>Subcommittee Legislation</h4>\n                        <p>\n                            <Link to={this.makeLink(3, false)} style={{ display: 'inline-block' }}>Assigned-To</Link><a onClick={() => this.toggleTooltip(ASSIGNED_TO)} className=\"button info\" style={{ display: 'inline-block' }}>Info</a>\n                            {this.state.showTooltip[ASSIGNED_TO] &&\n                                <div className=\"info-box committee-tooltip\">\n                                    <p>{ASSIGNED_TO}</p>\n                                </div>\n                            }\n                            <br />\n                            <Link to={this.makeLink(null, true)} style={{ display: 'inline-block' }}>Currently In</Link><a onClick={(e) => { e.stopPropagation(e); this.toggleTooltip(CURRENTLY_IN) }} className=\"button info\" style={{ display: 'inline-block' }}>Info</a>\n                            {this.state.showTooltip[CURRENTLY_IN] &&\n                                <div className=\"info-box committee-tooltip\">\n                                    <p>{renderHTML(CURRENTLY_IN)}</p>\n                                </div>\n                            }\n                        </p>\n                    </div>\n                ) : (\n                    <div className=\"details-section\">\n                        <h4>Committee Legislation</h4>\n                        <p>\n                            <Link to={this.makeLink(3, false)}>Referred</Link>\n                            <Link to={this.makeLink(null, true)}>In Committee</Link>\n                            <Link to={this.makeLink(null, true)}>In sub-committee</Link>\n                            <Link to={this.makeLink(5, false)}>Reported Out</Link>\n                            <Link to={this.makeLink(11, true)}>Continued</Link>\n                            <Link to={this.makeLink(12, false)}>Failed</Link>\n                        </p>\n                    </div>\n                )}\n                {subcommitteesList.length > 0 &&\n                    <div className=\"details-section\">\n                        <h4>Subcommittees</h4>\n                        <LoaderComponent data={this.state.subcommitteesIsLoaded} />\n                        <p>\n                            <SubCommitteesList parentCommitteeNumber={this.state.committeeNumber} sessionCode={this.props.match.params.sessioncode} committees={subcommitteesList} />\n                        </p>\n                    </div>\n                }\n            </div>\n        )\n    }\n}\n\nconst PublicCommitteeDetails = withRouter(connect(\n    (state) => {\n        const { committee, session, nav, calendar, minutes, members, login } = state;\n        return {\n            committee,\n            session,\n            nav,\n            calendar,\n            minutes,\n            members,\n            login\n        };\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, committeeActionCreators, sessionActionCreators, navActionCreators, calendarActionCreators, minutesActionCreators, memberActionCreators), dispatch)\n        };\n    }\n)(CommitteeDetailsComponent));\n\nexport default PublicCommitteeDetails;\n","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { Link } from 'react-router-dom';\nimport ReactToPrint from 'react-to-print';\nimport moment from 'moment-timezone';\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { connect } from 'react-redux';\nimport LoaderComponent from '../../../lis-shared/lis-layout/components/lis-loader-component'\nimport { minutesActionCreators } from '../../../stores/lis-minutes-store';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport { voteActionCreators } from '../../../stores/lis-votes-store';\nimport { billActionCreators } from '../../../stores/lis-legislation-store';\nimport striptags from 'striptags';\n\nconst MEETING = 1;\nconst CHAIRMANS_REPORT = 2;\nconst VOTE_SHEET = 3;\n\nconst Entry = props => {\n    return (\n        <React.Fragment>\n            <div className=\"inner-grid two-col-sidebar-backwards\">\n                <div>\n                    <Link to={`/bill-details/${props.session.SessionCode}/${props.entry.LegislationNumber}`}>{props.entry.LegislationNumber}</Link>\n                </div>\n                <div>\n                    <b>{props.entry.LegislationDescription}</b>\n                    {props.entry.MinutesActivities && props.entry.MinutesActivities.filter(ma => !ma.DeletionDate).map((activity, index) =>\n                        <ul key={index} style={{ marginLeft: '1em' }}>\n                            {(activity.VoteIsPublic || props.senateUser) && <li>{activity.VoteID &&\n                                <Link to={`/vote-details/${props.entry.LegislationNumber}/${props.session.SessionCode}/${activity.VoteNumber}`}>{activity.Description}</Link>\n                            }</li>}\n                        </ul>\n                    )}\n                </div>\n            </div>\n            <br />\n        </React.Fragment>\n    );\n}\n\nclass PublicMeetingDetails extends React.Component {\n    constructor(props) {\n        super(props)\n        this.state = {\n            session: '',\n            minutesBook: '',\n            committee: '',\n            isLoaded: false,\n            subformIsLoaded: true,\n            view: parseInt(this.props.match.params.view),\n            chairmanReport: [],\n            voteSheet: []\n        }\n        this.setView = this.setView.bind(this);\n        this.toggleMeetingStatus = this.toggleMeetingStatus.bind(this);\n    }\n\n    setView(view) {\n        this.setState({ view, subformIsLoaded: false }, () => {\n            if (this.state.view === CHAIRMANS_REPORT && this.state.chairmanReport.length === 0) {\n                let chairmanReport = [...this.state.chairmanReport];\n                this.props.actions.getChairReport(this.state.minutesBook.MinutesBookID).then(() => {\n                    chairmanReport = this.props.minutes.chairReport.ChairmansCategory;\n                    this.setState({ chairmanReport, subformIsLoaded: true })\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    console.error(err);\n                    this.setState({ subformIsLoaded: true })\n                });\n            } else if (this.state.view === VOTE_SHEET && this.state.voteSheet.length === 0) {\n                let voteSheet = [...this.state.voteSheet];\n                this.state.minutesBook.MinutesCategories.forEach(category => {\n                    category.MinutesEntries.forEach(entry => {\n                        entry.MinutesActivities.filter(ma => !ma.DeletionDate).forEach(activity => {\n                            if (activity.VoteID) {\n                                voteSheet.push({\n                                    LegislationNumber: entry.LegislationNumber,\n                                    LegislationID: entry.LegislationID,\n                                    VoteID: activity.VoteID\n                                });\n                            }\n                        });\n                    });\n                });\n\n                if (voteSheet.length) {\n                    this.getVoteSheetData(voteSheet).then((res) => {\n                        this.setState({ voteSheet: res || [], subformIsLoaded: true })\n                    });\n                } else {\n                    this.setState({ voteSheet: [], subformIsLoaded: true })\n                }\n            } else {\n                this.setState({ subformIsLoaded: true })\n            }\n        });\n    }\n\n    getBillDetailData(voteSheet) {\n        return this.props.actions.getBillListByIds({ \"LegislationIds\": voteSheet.map(v => ({ LegislationID: v.LegislationID, SessionID: this.state.minutesBook.SessionID })) });\n    }\n\n    getVoteDetailData(voteSheet) {\n        return this.props.actions.getVoteDetails('?' + voteSheet.map((v, i) => 'voteIDs=' + v.VoteID + (i !== voteSheet.length - 1 ? '&' : '')).join(''), true);\n    }\n\n    async getVoteSheetData(voteSheet) {\n        return await Promise.all([this.getBillDetailData(voteSheet), this.getVoteDetailData(voteSheet)]).then(() => {\n            const voteData = this.props.votes.voteDetailsResponse;\n            voteData.forEach(vote => {\n                const voteIndex = voteSheet.findIndex(v => v.VoteID === vote.VoteID);\n                let voteDetails = voteSheet[voteIndex];\n\n                voteDetails = { ...vote, ...voteDetails };\n                voteDetails.memberYeas = vote.VoteMember.filter(nObj => nObj.ResponseCode === 'Y');\n                voteDetails.memberNays = vote.VoteMember.filter(nObj => nObj.ResponseCode === 'N');\n                voteDetails.memberAbstentions = vote.VoteMember.filter(nObj => nObj.ResponseCode === 'A');\n                voteDetails.memberNoVote = vote.VoteMember.filter(nObj => nObj.ResponseCode === 'X');\n                voteDetails.voteStatements = vote.VoteMember.filter(member => member.VoteStatement);\n                // Abstentions appear as rule 36 on senate floor tally sheets\n                if (vote.ChamberCode === \"S\" && vote.VoteType === \"Floor\") {\n                    voteDetails.memberRule36 = vote.VoteMember.filter(nObj => nObj.ResponseCode === 'A');\n                } else {\n                    voteDetails.memberRule36 = vote.VoteMember.filter(nObj => nObj.ResponseCode === 'R');\n                }\n                voteSheet[voteIndex] = voteDetails;\n            });\n\n            //if a vote didn't get returned in the request, fill out some of the data to prevent NREs\n            voteSheet.filter(v => !voteData.find(vote => vote.VoteID === v.VoteID)).forEach(voteDetails => {\n                voteDetails.memberYeas = [];\n                voteDetails.memberNays = [];\n                voteDetails.memberAbstentions = [];\n                voteDetails.memberNoVote = [];\n                voteDetails.voteStatements = [];\n                voteDetails.memberRule36 = [];\n            });\n\n            const billData = [...this.props.bills.billListByIds];\n            billData.forEach(bill => {\n                voteSheet.forEach((v, i) => {\n                    if (v.LegislationID === bill.LegislationID) {\n                        voteSheet[i] = { ...v, ...bill };\n\n                        if (!voteSheet[i].VoteMember && voteSheet.find(x => x.VoteID === v.VoteID && x.VoteMember && x.VoteMember.length > 0)) {\n                            voteSheet[i].VoteMember = voteSheet.find(x => x.VoteID === v.VoteID && x.VoteMember && x.VoteMember.length > 0).VoteMember;\n                            voteSheet[i].memberYeas = voteSheet.find(x => x.VoteID === v.VoteID && x.VoteMember && x.VoteMember.length > 0).memberYeas;\n                            voteSheet[i].memberNays = voteSheet.find(x => x.VoteID === v.VoteID && x.VoteMember && x.VoteMember.length > 0).memberNays;\n                            voteSheet[i].memberAbstentions = voteSheet.find(x => x.VoteID === v.VoteID && x.VoteMember && x.VoteMember.length > 0).memberAbstentions;\n                            voteSheet[i].memberNoVote = voteSheet.find(x => x.VoteID === v.VoteID && x.VoteMember && x.VoteMember.length > 0).memberNoVote;\n                            voteSheet[i].voteStatements = voteSheet.find(x => x.VoteID === v.VoteID && x.VoteMember && x.VoteMember.length > 0).voteStatements\n                            voteSheet[i].memberRule36 = voteSheet.find(x => x.VoteID === v.VoteID && x.VoteMember && x.VoteMember.length > 0).memberRule36;\n                            voteSheet[i].LegislationActionDescription = !voteSheet[i].LegislationActionDescription ? voteSheet.find(x => x.VoteID === v.VoteID).LegislationActionDescription : voteSheet[i].LegislationActionDescription;\n                        }\n                    }\n                });\n            });\n            return voteSheet;\n        }).catch(err => {\n            console.error(err)\n        });\n    }\n\n    toggleMeetingStatus() {\n        let minutes = { ...this.state.minutesBook }\n        if (minutes.MinutesStatusID === 4) {\n            minutes.MinutesStatusID = 2;\n        } else {\n            minutes.MinutesStatusID = 4\n        }\n\n        this.props.actions.saveMinutesBook(minutes)\n            .then(() => {\n                const minutesBookId = this.props.match.params.meetingid;\n                const committee = this.props.match.params.committeenumber;\n                this.getMinutesBook(minutesBookId, committee);\n            })\n    }\n\n    getMinutesBook(minutesBookId, committee) {\n        this.props.actions.getMinutesBook('?minutesbookID=' + minutesBookId, (this.props.login.userClaims.roles.find(role => role === \"SenateCommitteeReportReader\") ? true : false))\n            .then(() => {\n                if (this.props.minutes.minutesBook) {\n                    const minutesBook = { ...this.props.minutes.minutesBook }\n                    this.setState({\n                        minutesBook: minutesBook,\n                    }, () => {\n                        this.setView(this.state.view);\n                        this.props.actions.getSessionById(this.state.minutesBook.SessionID)\n                            .then(() => {\n                                this.setState({\n                                    session: this.props.session.selectedSession\n                                }, () => {\n                                    this.props.actions.getCommitteeByNumber(\"?committeeNumber=\" + committee + \"&effectiveDate=\" + moment(this.state.minutesBook.MinutesDate).format(\"MM/DD/YYYY\") + \"&sessionId=\" + this.props.session.selectedSession.SessionID)\n                                        .then(() => {\n                                            this.setState({\n                                                committee: this.props.committee.committeeByNumberData,\n                                                isLoaded: true\n                                            }, () => {\n                                                if (this.state.committee.ParentCommitteeID) {\n                                                    const sessionStartObj = this.props.session.selectedSession.SessionEvents && this.props.session.selectedSession.SessionEvents.length && this.props.session.selectedSession.SessionEvents.find(date => date.DisplayName === \"Session Start\");\n                                                    const startDate = sessionStartObj ? moment(sessionStartObj.ActualDate).format(\"MM/DD/YYYY\") : '';\n                                                    this.props.actions.getCommitteeById(\"?id=\" + this.state.committee.ParentCommitteeID + \"&effectiveDate=\" + moment(startDate).format(\"MM/DD/YYYY\") + \"&sessionId=\" + this.props.session.selectedSession.SessionID)\n                                                        .then(() => {\n                                                            this.setState({\n                                                                parentCommittee: this.props.committee.committeeByIdData\n                                                            })\n                                                        })\n                                                }\n                                            });\n                                        });\n                                });\n                            });\n                    });\n                }\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n            });\n    }\n\n    componentDidMount() {\n        window.scrollTo(0, 0);\n        const minutesBookId = this.props.match.params.meetingid;\n        const committee = this.props.match.params.committeenumber;\n        this.getMinutesBook(minutesBookId, committee)\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        if (this.state.isLoaded) {\n            const { chairmanReport, voteSheet } = this.state;\n            // Chairman reports are a formatted minutes book that only contains entries that have been completed.\n            // The organization is how they were completed (e.g. Reported Without Amendment) followed by the list of bills that share the same completion type\n            // An example:\n            /* \n            REPORTED WITHOUT AMENDMENT:\n            SB44, SB112, SB186, SB238 \n            */\n            const sessionHeader = this.state.session.SessionYear + \" \" + this.state.session.DisplayName;\n            //Find the minutes calendar if it exists\n            let calendar = '';\n            if (this.state.minutesBook.MinutesCalendars && this.state.minutesBook.MinutesCalendars.length > 0) {\n                calendar = this.state.minutesBook.MinutesCalendars[0].CalendarID;\n            }\n            return (<div className='generic-details-page meetings-details-page'>\n                <div className=\"flex-row \">\n                    <br />\n                    <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 8fr 1fr 1fr 1fr 1fr\", marginTop: \"10px\" }}>\n                        {this.props.login.userClaims.roles.find(role => role === \"SenateCommitteeReportReader\") ?\n                            <React.Fragment>\n                                <button type=\"button\" className=\"button primary\" onClick={() => this.toggleMeetingStatus()}>{(this.state.minutesBook.MinutesStatusID === 4 ? \"Open\" : \"Close\") + \" Meeting\"}</button>\n                                <label style={{ marginLeft: \"10px\" }}>Meeting Status: <span className={this.state.minutesBook.MinutesStatusID === 4 ? \"fail\" : \"txt-green\"}>{this.state.minutesBook.MinutesStatusID === 4 ? \"Closed\" : \"Open\"}</span></label>\n                                <button type=\"button\" className=\"button meetings-page-toggle\" aria-current={this.state.view === MEETING} onClick={() => this.setView(MEETING)}>Meeting View</button>\n                                <button type=\"button\" className=\"button meetings-page-toggle\" aria-current={this.state.view === CHAIRMANS_REPORT} onClick={() => this.setView(CHAIRMANS_REPORT)}>Chair's Report</button>\n                                {this.state.committee.ChamberCode === \"S\" && <button type=\"button\" className=\"button meetings-page-toggle\" aria-current={this.state.view === VOTE_SHEET} onClick={() => this.setView(VOTE_SHEET)}>Vote Sheet</button>}\n                            </React.Fragment>\n                            : <>\n                                <div />\n                                <div />\n                                <div />\n                                <div />\n                                <div />\n                            </>}\n                        <ReactToPrint\n                            trigger={() => <button type=\"button\" className=\"button print\"> Print</button>}\n                            content={() => this.componentRef}\n                        />\n                    </div>\n                </div>\n                {this.state.subformIsLoaded ?\n                    <div className=\"bill-theme public-details inner-grid\" ref={el => (this.componentRef = el)}>\n                        {this.state.view === MEETING &&\n                            <div>\n                                <div>\n                                    <h2>{sessionHeader}</h2>\n                                </div>\n                                <div>\n                                    <h3>{(\n                                        this.state.committee.ChamberCode === \"H\"\n                                            ? \"House Committee \"\n                                            : \"Senate Committee \") +\n                                        (this.state.parentCommittee\n                                            ? this.state.parentCommittee.Name === \"Judiciary\"\n                                                ? \"on the \" + this.state.parentCommittee.Name\n                                                : this.state.parentCommittee.Name === \"Courts of Justice\"\n                                                    ? \"for \" + this.state.parentCommittee.Name\n                                                    : \"on \" + this.state.parentCommittee.Name\n                                            : this.state.committee.Name\n                                                ? this.state.committee.Name === \"Judiciary\"\n                                                    ? \"on the \" + this.state.committee.Name\n                                                    : this.state.committee.Name === \"Courts of Justice\"\n                                                        ? \"for \" + this.state.committee.Name\n                                                        : \"on \" + this.state.committee.Name\n                                                : this.state.minutesBook.CommitteeName === \"Judiciary\"\n                                                    ? \"on the \" + this.state.minutesBook.CommitteeName\n                                                    : this.state.minutesBook.CommitteeName === \"Courts of Justice\"\n                                                        ? \"for \" + this.state.minutesBook.CommitteeName\n                                                        : \"on \" + this.state.minutesBook.CommitteeName\n                                        )\n                                    }</h3>\n                                    {this.state.parentCommittee &&\n                                        <h3>{\"Subcommittee on \" + this.state.committee.Name}</h3>\n                                    }\n                                </div>\n                                <hr />\n                                <div>\n                                    <div className=\"parent-li\">\n                                        <h4>\n                                            {moment(this.state.minutesBook.MinutesDate).format(\"MMMM D[,] YYYY\")}\n                                            {calendar && <Link to={`/session-details/${this.props.session.selectedSession.SessionCode}/committee-information/${this.state.committee.CommitteeNumber}/dockets/${calendar}`} style={{ marginLeft: \"1em\" }}>View Docket</Link>}\n                                        </h4>\n                                    </div>\n                                </div>\n                                <br />\n                                {this.state.minutesBook.MinutesCategories.map((category, catIndex) =>\n                                    <div key={catIndex}>\n                                        {category.MinutesEntries && category.MinutesEntries.map((entry, entIndex) =>\n                                            <Entry key={entIndex} entry={entry} session={this.state.session} senateUser={this.props.login.userClaims.scopes.find(x => x === \"Senate\") ? true : false} />\n                                        )}\n                                    </div>\n                                )}\n                            </div>\n                        }\n                        {this.state.view === CHAIRMANS_REPORT &&\n                            <React.Fragment>\n                                <br />\n                                <div>\n                                    <span style={{ float: \"right\", fontSize: '20px' }}>{moment(this.state.minutesBook.MinutesDate).format(\"MMMM D[,] YYYY\")}</span>\n                                </div>\n                                <div className=\"center\">\n                                    <span className=\"chair-report-header\">Chair's Report</span>\n                                </div>\n                                <div style={{ margin: \"15px 0 25px\", fontSize: '20px' }}>\n                                    <span>The committee on </span> <b>{this.state.committee ? this.state.committee.Name : this.state.minutesBook.CommitteeName}</b> <span>reports the following:</span>\n                                </div>\n                                <div>\n                                    {chairmanReport.sort((a, b) => a.Sequence - b.Sequence).map((action, actionIndex) =>\n                                        <div key={actionIndex}>\n                                            <div>\n                                                <p className=\"chair-report-category\">{action.CategoryDescription && action.CategoryDescription.endsWith(':') ? action.CategoryDescription.toUpperCase() : action.CategoryDescription && action.CategoryDescription.toUpperCase() + \":\"}</p>\n                                            </div>\n                                            <p className=\"chair-report-bills\">\n                                                {action.ChairmansLegislation.map((bill, billIndex) => {\n                                                    let formattedBill = !bill.ReferToCommitteeName && billIndex != action.ChairmansLegislation.length - 1 ? bill.LegislationNumber + \", \" : bill.LegislationNumber\n                                                    return (\n                                                        <React.Fragment>\n                                                            <b key={billIndex}>{formattedBill}{bill.ReferToCommitteeName && (\" to Committee \" + (bill.ReferToCommitteeName === \"Judiciary\" ? \"on the \" : bill.ReferToCommitteeName === \"Courts of Justice\" ? \"for \" : \"on \") + bill.ReferToCommitteeName)}</b>\n                                                            {bill.ReferToCommitteeName && <br />}\n                                                        </React.Fragment>\n                                                    )\n                                                })\n                                                }\n                                            </p>\n                                            <br />\n                                        </div>\n                                    )}\n                                </div>\n                            </React.Fragment>\n                        }\n                        {this.state.view === VOTE_SHEET &&\n                            <div id=\"vote-sheet-container\">\n                                {voteSheet.map((action, actionIndex) => {\n                                    let legNumber = action.LegislationNumber;\n                                    //Add dots in between the characters because that is how they want it displayed\n                                    const billType = legNumber.slice(0, 2);\n                                    const numbers = legNumber.slice(2);\n                                    legNumber = billType.split('').map(char => {\n                                        char += '.'\n                                        // Senate Joint and House Joint Resolutions are displayed as 'H.J.R.' and 'S.J.R.' on this page rather than 'HJ' and 'SJ'\n                                        // If the bill has a 'J' in the bill number then it is a joint resolution\n                                        if (char === 'J.') {\n                                            char += 'R.'\n                                        }\n                                        return char;\n                                    }).join('');\n                                    legNumber += ' ' + numbers;\n\n                                    return (\n                                        <div key={actionIndex}>\n                                            <br />\n                                            <div>\n                                                <p className=\"vote-sheet-header\">\n                                                    <span>{this.state.session.SessionYear} - {this.state.session.SessionCode.substring(4)}</span>\n                                                    <span>Senate of Virginia  - Committee Voting System</span>\n                                                    <span>{moment().format(\"MM/DD/YY HH:mm\")}</span>\n                                                </p>\n                                            </div>\n                                            <div>\n                                                <p>Committee on {this.state.committee ? this.state.committee.Name : this.state.minutesBook.CommitteeName}</p>\n                                            </div>\n                                            <div>\n                                                <p><b>{legNumber.toUpperCase()}</b><span className=\"ldtitle\">{striptags(action.LegislationTitle)}</span></p>\n                                            </div>\n                                            {action.Patrons &&\n                                                <p>{action.Patrons.length > 1 ? \"Patrons--\" : \"Patron--\"}\n                                                    {action.Patrons.map((patron, patronIndex) => {\n                                                        let patronString = '';\n                                                        if (action.Patrons[patronIndex + 1] && action.Patrons[patronIndex + 1].ChamberCode !== action.ChamberCode && action.Patrons[patronIndex].ChamberCode === action.ChamberCode) {\n                                                            patronString = (patronIndex !== 0 ? \" and \" : \"\") + patron.PatronDisplayName + (action.ChamberCode === \"H\" ? patronIndex + 2 === action.Patrons.length ? \"; Senator: \" : \"; Senators: \" : patronIndex + 2 === action.Patrons.length ? \"; Delegate: \" : \"; Delegates: \");\n                                                        } else if (patronIndex + 1 === action.Patrons.length && action.Patrons.length > 1 && action.Patrons[patronIndex].ChamberCode === action.Patrons[patronIndex - 1].ChamberCode) {\n                                                            patronString = \" and \" + patron.PatronDisplayName;\n                                                        } else if (patronIndex != 0 && action.Patrons[patronIndex - 1].ChamberCode === action.Patrons[patronIndex].ChamberCode) {\n                                                            patronString = \", \" + patron.PatronDisplayName;\n                                                        } else {\n                                                            patronString = patron.PatronDisplayName\n                                                        }\n                                                        return (<React.Fragment key={patronIndex}>{patronString}{patron.ByRequest ? ' (By Request)' : null}</React.Fragment>)\n                                                    })}\n                                                </p>\n                                            }\n                                            <p><b>{action.LegislationActionDescription}</b></p>\n                                            <p>\n                                                YEAS--\n                                                {action.memberYeas && action.memberYeas.map((item, index) => (\n                                                    <span key={index}>{item.PatronDisplayName}{action.memberYeas.length === index + 1 ? '--' : ', '}</span>\n                                                ))}\n                                                {action.memberYeas && action.memberYeas.length}.\n                                            </p>\n                                            <p>\n                                                NAYS--\n                                                {action.memberNays && action.memberNays.map((item, index) => (\n                                                    <span key={index}>{item.PatronDisplayName}{action.memberNays.length === index + 1 ? '--' : ', '}</span>\n                                                ))}\n                                                {action.memberNays && action.memberNays.length}.\n                                            </p>\n                                            <p>\n                                                {(action.VoteType === \"Floor\" && action.ChamberCode === \"S\") ? \"RULE 36--\" : \"ABSTENTIONS--\"}\n                                                {action.memberAbstentions && action.memberAbstentions.map((item, index) => (\n                                                    <span key={index}>{item.PatronDisplayName}{action.memberAbstentions.length === index + 1 ? '--' : ', '}</span>\n                                                ))}\n                                                {action.memberAbstentions && action.memberAbstentions.length}.\n                                            </p>\n                                            <p>(vote sequence: {action.VoteNumber}, {moment(action.VoteDate).format(\"MM/DD/YY HH.mm\")})</p>\n                                            <br />\n                                            <footer />\n                                        </div>\n                                    )\n                                })}\n                            </div>\n                        }\n                    </div>\n                    :\n                    <LoaderComponent data={this.state.subformIsLoaded} />\n                }\n            </div>\n            );\n        }\n        else {\n            return (<LoaderComponent data={this.state.isLoaded} />);\n        }\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { bills, committee, session, minutes, login, votes } = state;\n        return {\n            bills,\n            committee,\n            session,\n            minutes,\n            login,\n            votes\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, billActionCreators, committeeActionCreators, sessionActionCreators, minutesActionCreators, authActionCreators, voteActionCreators), dispatch)\n        }\n    }\n)(PublicMeetingDetails)","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport DocketDetailsComponent from '../../../lis-shared/lis-dockets/lis-docket-details';\nimport ReactToPrint from 'react-to-print';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { calendarActionCreators } from '../../../stores/lis-calendar-store';\nimport { connect } from 'react-redux';\nimport { cancelRequest } from '../../../services/request.service';\nimport LoaderComponent from '../../../lis-shared/lis-layout/components/lis-loader-component'\nimport renderHTML from 'react-render-html';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\n\nclass PublicDocketDetails extends React.Component {\n    constructor(props) {\n        super(props)\n        this.state = {\n            data: '',\n            selectedSession: '',\n            categories: '',\n            hideClerk: false,\n            hideStaff: false,\n            hidePatron: false,\n            hideSummary: false,\n            hideTitle: false,\n            hideLDNumber: false,\n            hideCaption: false\n        }\n    }\n\n    componentDidMount() {\n        window.scrollTo(0, 0);\n        //Imporant to make sure that things load in the correct order. \n        //First I get the docket data, then I get the session data (for the printoff header), followed by the room references (to display the VoteRoomID's name)\n        const docketId = this.props.match.params.docketid;\n        let committeeNumber = this.props.match.params.committeenumber;\n        const chamberCode = this.props.match.url.includes(\"dockets\") ? \"S\" : \"H\"\n        const params = '?docketId=' + docketId\n        this.props.actions.getDocketById(params, false, chamberCode)\n            .then(() => {\n                if (this.props.calendar.docketByIdData) {\n                    const data = this.props.calendar.docketByIdData;\n                    // Just in case that the committee number is not in the url\n                    if (!committeeNumber) {\n                        this.props.history.push(`/session-details/${data.SessionCode}/committee-information/${data.CommitteeNumber}/dockets/${data.DocketID}`);\n                    }\n                    this.props.actions.getSessionById(data.SessionID)\n                        .then(() => {\n                            this.setState({\n                                selectedSession: this.props.session.selectedSession,\n                                sessionIsLoaded: true\n                            }, () => {\n                                const htmlFile = this.props.calendar.docketByIdData.DocketFiles.find(file => file.FileURL.toUpperCase().includes('.HTM'));\n                                if (htmlFile && !this.state.selectedSession.IsActive && !data.Schedules?.length) {\n                                    this.props.actions.getFile(htmlFile.FileURL)\n                                        .then(() => {\n                                            let html = this.props.nav.file;\n                                            if (html) {\n                                                html = html.replaceAll('href=\"#', 'href=\"' + window.location.pathname + \"#\")\n                                            }\n                                            this.setState({\n                                                docketFile: html,\n                                                dataIsLoaded: true\n                                            });\n                                        }).catch(err => {\n                                            if (err !== 'Aborted') {\n                                                this.setState({\n                                                    dataIsLoaded: true,\n                                                    message: \"Failed to get HTML file\"\n                                                });\n                                                console.error(err);\n                                            }\n                                        });\n                                } else {\n                                    const categories = data.DocketCategories || data.HouseAgendaCategories;\n\n                                    for (let i = 0; i < data.CalendarDisplay.length; i++) {\n                                        switch (data.CalendarDisplay[i].DisplayColumn) {\n                                            case (\"Staffs Name\"):\n                                                this.setState({\n                                                    hideClerk: !data.CalendarDisplay[i].IsDisplayed\n                                                });\n                                                break;\n                                            case (\"Clerk Name\"):\n                                                this.setState({\n                                                    hideStaff: !data.CalendarDisplay[i].IsDisplayed\n                                                });\n                                                break;\n                                            case (\"Chief Patron\"):\n                                                this.setState({\n                                                    hidePatron: !data.CalendarDisplay[i].IsDisplayed\n                                                });\n                                                break;\n                                            case (\"Summary\"):\n                                                this.setState({\n                                                    hideSummary: !data.CalendarDisplay[i].IsDisplayed\n                                                });\n                                                break;\n                                            case (\"Title\"):\n                                                this.setState({\n                                                    hideTitle: !data.CalendarDisplay[i].IsDisplayed\n                                                });\n                                                break;\n                                            case (\"LD Number\"):\n                                                this.setState({\n                                                    hideLDNumber: !data.CalendarDisplay[i].IsDisplayed\n                                                });\n                                                break;\n                                            case (\"Caption\"):\n                                                this.setState({\n                                                    hideCaption: !data.CalendarDisplay[i].IsDisplayed\n                                                });\n                                                break;\n                                            default:\n                                                break;\n                                        }\n                                    }\n                                    this.setState({\n                                        data: data,\n                                        categories: categories,\n                                        dataIsLoaded: true\n                                    });\n                                }\n                            });\n                        }).catch(err => {\n                            if (err !== 'Aborted') {\n                                this.setState({\n                                    dataIsLoaded: true,\n                                    message: \"Failed to get HTML file\"\n                                });\n                                console.error(err);\n                            }\n                        });\n                } else {\n                    this.setState({\n                        dataIsLoaded: true,\n                        message: \"No docket data found\"\n                    });\n                }\n            }).catch(err => {\n                if (err !== 'Aborted') {\n                    this.setState({\n                        dataIsLoaded: true,\n                        message: \"No docket data found\"\n                    });\n                    console.error(err);\n                }\n            });\n    }\n\n    removeZeros(doc) {\n        let dom = document.createElement('div');\n        dom.innerHTML = doc;\n\n        let all = document.getElementsByTagName(\"*\");\n\n        for (let i = 0; i < all.length; i++) {\n            let trimmedUrl = \"\"\n            //If it's an href with a bill or resolution number in it then slice off the end, remove the zeros, and append it back to the href\n            if (all[i].href && all[i].href != \"\" && all[i].href.match(/[H|S][B|J|R][0-9]{4}/)) {\n                trimmedUrl = all[i].href.slice(all[i].href.length - 7, all[i].href.length - 1)\n                trimmedUrl = trimmedUrl.slice(0, 2) + parseInt(trimmedUrl.slice(2))\n                all[i].href = all[i].href.slice(0, all[i].href.length - 7) + trimmedUrl + \"/\";\n            }\n        }\n\n        return doc;\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        if (this.state.message) {\n            return (<div className=\"center\">{this.state.message}</div>)\n        }\n        if (this.state.docketFile) {\n            return (\n                <div className='details-page-data-container'>\n                    {renderHTML(this.removeZeros(this.state.docketFile))}\n                </div>\n            );\n        }\n        if (this.state.dataIsLoaded && this.state.sessionIsLoaded) {\n            return (\n                <div className='generic-details-page docket-details-page'>\n                    <div className=\"flex-row\">\n                        <br />\n                        <ReactToPrint\n                            trigger={() => <button type=\"button\" className=\"button print\"> Print</button>}\n                            content={() => this.componentRef}\n                            pageStyle={\"break-inside: avoid\"}\n                        />\n                    </div>\n                    <div ref={el => (this.componentRef = el)}>\n                        <DocketDetailsComponent\n                            data={this.state.data}\n                            dockets={this.state.categories}\n                            session={this.state.selectedSession}\n                            hideClerk={this.state.hideClerk}\n                            hideStaff={this.state.hideStaff}\n                            hidePatron={this.state.hidePatron}\n                            hideSummary={this.state.hideSummary}\n                            hideTitle={this.state.hideTitle}\n                            hideLDNumber={this.state.hideLDNumber}\n                            hideCaption={this.state.hideCaption}\n                        />\n                    </div>\n                </div>\n            );\n        } else {\n            return (<LoaderComponent data={false} />)\n        }\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { nav, session, calendar } = state;\n        return {\n            nav,\n            session,\n            calendar\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, navActionCreators, sessionActionCreators, calendarActionCreators), dispatch)\n        }\n    }\n)(PublicDocketDetails)","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport PublicCommitteeList from './lis-public-committee-list';\nimport PublicCommitteeDetails from './lis-public-committee-details';\nimport PublicMeetingDetails from './lis-public-meeting-details';\nimport PublicDocketDetails from './lis-public-docket-details';\nimport { Route } from 'react-router';\nimport { memberActionCreators } from '../../../stores/lis-members-store';\n\nclass CommitteeInformationComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            slideDockets: false,\n        }\n\n        this.toggleShowData = this.toggleShowData.bind(this);\n    }\n\n    toggleShowData(slide) {\n        this.setState(prevState => ({\n            [slide]: !prevState[slide]\n        }));\n    }\n\n    render() {\n        return             <div>\n        <Route exact path={this.props.match.path} render={props => <PublicCommitteeList {...props} />} />\n        <Route path='/session-details/:sessioncode/committee-information/:committeenumber/committee-details' render={props => <PublicCommitteeDetails {...props} slideDockets={this.state.slideDockets} toggleShowData={this.toggleShowData} />} />\n        <Route path='/session-details/:sessioncode/committee-information/:committeenumber/meetings/:meetingid/:view' component={PublicMeetingDetails} />\n        <Route path='/session-details/:sessioncode/committee-information/:committeenumber/dockets/:docketid' component={PublicDocketDetails} />\n        <Route path='/session-details/:sessioncode/committee-information/:committeenumber/agendas/:docketid' component={PublicDocketDetails} />\n    </div>\n\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { committee, members, session, nav } = state;\n        return {\n            committee,\n            members,\n            session,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, committeeActionCreators, memberActionCreators, sessionActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(CommitteeInformationComponent)\n\n","import React from 'react';\nimport moment from 'moment-timezone';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { memberActionCreators } from '../../stores/lis-members-store';\nimport { sessionActionCreators } from '../../stores/lis-session-store';\nimport { patronActionCreators } from '../../stores/lis-patron-store';\nimport { navActionCreators } from '../../stores/lis-nav-store';\nimport { cancelRequest } from '../../services/request.service';\n\n\nclass MemberInfoComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {};\n        this.toggleShowData = this.toggleShowData.bind(this);\n    }\n\n    toggleShowData(memberID) {\n        this.setState(prevState => ({\n            [memberID]: !prevState[memberID]\n        }));\n    }\n\n    render() {\n        const { member, sessionData, patronRoles } = this.props;\n        const prefileEvent = sessionData ? sessionData.SessionEvents.find(event => event.DisplayName === 'Prefile Date') : '';\n        const closingEvent = sessionData ? sessionData.SessionEvents.find(event => event.DisplayName === 'Closing') : '';\n        const startDate = prefileEvent ? moment(prefileEvent.ActualDate) : '';\n        const endDate = closingEvent ? moment(closingEvent.ActualDate) : moment();\n        const memberDetails = (member, startDate, endDate) => {\n            let detailString = '';\n            if (member.ServiceEndDate && moment(member.ServiceEndDate).isAfter(startDate) && moment(member.ServiceEndDate).isBefore(endDate) && member.ServiceEndReason) {\n                detailString = detailString ? detailString + ', ' : '(';\n                detailString += member.ServiceEndReason;\n            }\n            if (detailString) detailString += ')';\n            if (member.MemberStatus === \"Elect\") detailString += \"(Elect)\";\n            return <React.Fragment>{detailString}</React.Fragment>;\n        }\n        const info = member.ContactInformation.map(contact => {\n            return (\n                <p>{contact.Address1}, {member.RoomNumber}<br />\n                    {contact.Address2}, {contact.City}, {contact.StateCode} {contact.ZipCode}<br />\n                    {contact.PhoneNumber}<br />\n                    {contact.EmailAddress &&\n                        <span>email: {contact.EmailAddress}</span>\n                    }\n                </p>\n            );\n        });\n        return (\n            <div className={this.state[member.MemberNumber] ? 'parent-li slidedown-open' : 'parent-li slidedown-closed'}>\n                <div className=\"toggle-row\">\n                    <div>\n                        <Link to={`/session-details/${sessionData.SessionCode}/member-information/${member.MemberNumber}/member-details`}>{member.MemberDisplayName}</Link>\n                        <span className=\"txt-greyed\">{memberDetails(member, startDate, endDate)}</span>\n                    </div>\n                    <div className=\"button-container\">\n                        <button aria-expanded={!!this.state[member.MemberNumber]} className=\"arrow-down\" onClick={this.toggleShowData.bind(this, member.MemberNumber)}>More info</button>\n                    </div>\n                </div>\n                {this.state[member.MemberNumber] &&\n                    <div className=\"list-desc\">\n                        <p>{member.PartyName} / {member.Chamber} - {member.DistrictName} District</p>\n                        {info}\n                    </div>\n                }\n                <div className=\"list-links\">\n                    {/* Search for member's legislation by all patron roles except Sponsor */}\n                    <Link to={'/bill-search/?q=' + window.btoa(JSON.stringify({ \n                        selectedPatron: member.MemberID,\n                        selectedSession: sessionData.SessionCode,\n                        chamberCode: member.ChamberCode,\n                        selectedPatronType: [1]\n                     }))} style={{ pointerEvents: patronRoles && patronRoles.length ? null : 'none' }}>Legislation</Link>\n                    <Link to={`/vote-search/${sessionData.SessionCode}/${member.MemberNumber}`}>Votes</Link>\n                </div>\n            </div>\n        )\n    }\n}\n\n\nclass MemberInformationComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            sessionData: [],\n            houseMembers: [],\n            senateMembers: [],\n            value: \"\",\n            showHouseChamber: true,\n            showSenateChamber: true\n        };\n        this.getMembersLists = this.getMembersLists.bind(this);\n        this.toggleChamber = this.toggleChamber.bind(this);\n        this.setupPage = this.setupPage.bind(this);\n    }\n\n    getMembersLists(sessionData, chamberCode, listName) {\n        var params = 'sessionID=' + sessionData.SessionID + '&chamberCode=' + chamberCode + '&contactTypeID=8'\n\n        this.props.actions.getMemberContact(params).then(() =>\n            this.setState({\n                [listName]: this.props.members.memberContactData,\n                [listName + 'IsLoaded']: true\n            })\n        )\n    }\n\n    toggleChamber(chamber) {\n        this.setState(state => ({\n            [chamber]: !state[chamber]\n        }));\n    }\n\n    componentDidMount() {\n        //Update the session selector component, which will run componentDidUpdate and call setupPage on its own\n        const sessionCode = this.props.match.params.sessioncode\n        if (sessionCode) {\n            if (this.props.nav.session !== sessionCode) {\n                this.props.actions.changeSession(sessionCode);\n            } else {\n                this.setupPage(sessionCode);\n            }\n        }\n    }\n\n    componentDidUpdate(prevProps) {\n        // Setup the page if the global selected session changes. Change the URL to reflect the session change\n        if (prevProps.nav.session !== this.props.nav.session) {\n            this.props.history.push('/session-details/' + this.props.nav.session + '/member-information')\n            this.setupPage(this.props.nav.session);\n        } else if (this.props.nav.session !== this.props.match.params.sessioncode) {\n            // If the url changes then update the global selected session with whatever the url is\n            if (this.props.match.params.sessioncode) {\n                this.props.actions.changeSession(this.props.match.params.sessioncode);\n            }\n        }\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    setupPage(sessionCode) {\n        this.setState({\n            houseMembersIsLoaded: false,\n            senateMembersIsLoaded: false\n        })\n        this.props.actions.getSessionByCode(sessionCode).then(() => {\n            this.setState({\n                sessionData: this.props.session.selectedSession\n            });\n            this.getMembersLists(this.props.session.selectedSession, 'H', 'houseMembers')\n            this.getMembersLists(this.props.session.selectedSession, 'S', 'senateMembers')\n        });\n\n        this.props.actions.getPatronRoles()\n            .then(() => {\n                const patronRoles = [...this.props.patrons.patronRoles];\n                this.setState({\n                    patronRoles: patronRoles\n                });\n            });\n    }\n\n    render() {\n        const { sessionData, houseMembers, senateMembers, patronRoles } = this.state;\n        const listHouseMembers = houseMembers.map((member, i) =>\n            <MemberInfoComponent key={i} member={member} sessionData={sessionData} patronRoles={patronRoles} />\n        );\n        const listSenateMembers = senateMembers.map((member, i) =>\n            <MemberInfoComponent key={i} member={member} sessionData={sessionData} patronRoles={patronRoles} />\n        );\n\n        return (\n            <div className=\"public-chamber-data\">\n                <div>\n                    <h2>{sessionData.SessionYear} {sessionData.DisplayName}</h2>\n                </div>\n                <div id=\"chamber-vote-leg-links\">\n                    {/*TODO: Temporarily removing these links for historical data per User Story 13242*/}\n                    {sessionData.IsActive &&\n                        <>\n                            <Link to={`/session-details/${sessionData.SessionCode}/member-legislation/S`}>Senate Member Legislation</Link>\n                            <br />\n                            <Link to={`/session-details/${sessionData.SessionCode}/member-legislation/H`}>House Member Legislation</Link>\n                            <br />\n                        </>\n                    }\n                    <Link to={`/vote-search/${sessionData.SessionCode}`}>Member Vote Search</Link>\n                    <br />\n                    <a rel=\"noreferrer\" target=\"_blank\" href=\"https://whosmy.virginiageneralassembly.gov\">Who's My Legislator?</a>\n                </div>\n                <div className=\"public-list inner-grid two\">\n                    <div>\n                        <h3 role=\"button\" onClick={() => this.toggleChamber(\"showHouseChamber\")} aria-expanded={this.state.showHouseChamber} className={`chamber-name ${this.state.showHouseChamber ? \"opened\" : \"\"}`}>House Members</h3>\n                        {this.state.houseMembersIsLoaded ?\n                            <ul className=\"slidedown-list\">\n                                {this.state.showHouseChamber &&\n                                    <>\n                                        {listHouseMembers}\n                                    </>\n                                }\n                            </ul>\n                            :\n                            <div className=\"spinner\">Fetching results...</div>\n                        }\n                    </div>\n                    <div>\n                        <h3 role=\"button\" onClick={() => this.toggleChamber(\"showSenateChamber\")} aria-expanded={this.state.showSenateChamber} className={`chamber-name ${this.state.showSenateChamber ? \"opened\" : \"\"}`}>Senate Members</h3>\n                        {this.state.senateMembersIsLoaded ?\n                            <ul className=\"slidedown-list\">\n                                {this.state.showSenateChamber &&\n                                    <>\n                                        {listSenateMembers}\n                                    </>\n                                }\n                            </ul>\n                            :\n                            <div className=\"spinner\">Fetching results...</div>\n                        }\n                    </div>\n                </div>\n            </div>\n        )\n    }\n}\n\nconst PublicMemberInformation = connect(\n    (state) => {\n        const { members, session, patrons, nav } = state;\n        return {\n            members,\n            session,\n            patrons,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, memberActionCreators, sessionActionCreators, patronActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(MemberInformationComponent)\n\nexport default PublicMemberInformation;\n","import React from 'react';\nimport moment from 'moment-timezone';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { memberActionCreators } from '../../stores/lis-members-store';\nimport { committeeActionCreators } from '../../stores/lis-committee-store';\nimport { sessionActionCreators } from '../../stores/lis-session-store';\nimport { patronActionCreators } from '../../stores/lis-patron-store';\nimport { navActionCreators } from '../../stores/lis-nav-store';\n\nimport { cancelRequest } from '../../services/request.service';\nimport jwtDecode from 'jwt-decode';\n\nfunction Committees(props) {\n    //Person doesn't have to be a member of the committee's subcommmittees so this check must be made\n    let subcommittees = [];\n    if (props.subcommittees && props.subcommittees.length > 0) {\n        subcommittees = props.subcommittees.sort((a, b) => a.Name.localeCompare(b.Name)).map(subcomm => {\n            return (\n                <li key={subcomm.CommitteeID}>\n                    <Link style={{ marginLeft: '1.5em' }} to={`/session-details/${props.session}/committee-information/${subcomm.CommitteeNumber}/committee-details`}>{subcomm.Name}</Link>\n                </li>\n            )\n        })\n    }\n    return (\n        <span>\n            <Link to={`/session-details/${props.session}/committee-information/${props.CommitteeNumber}/committee-details`}>{props.Name}</Link>\n            {subcommittees && subcommittees}\n        </span>\n    );\n}\n\nfunction CommitteeAssignments(props) {\n    const listCommittees = props.committees.sort((a, b) => a.Name.localeCompare(b.Name)).map((committee, i) => <Committees key={i} session={props.session} {...committee} />);\n    if (listCommittees.length === 0) {\n        return (<p className=\"small-text\">None</p>)\n    }\n    return <ul style={{ marginTop: \"0px\" }}>{listCommittees}</ul>;\n}\n\nconst PatronRoles = props => {\n    let roleLinks = []\n    props.roles.forEach((role, roleIndex) => {\n        if (role.Name === \"Budget Amendment Requests\") {\n            const sessionCode = props.sessionData.SessionCode[props.sessionData.SessionCode.length - 1]\n            //Need to get rid of leading zeros for the link to work on the budget site\n            const memberNumber = props.memberData.MemberNumber;\n            // The first char is the chamber. Need to get rid of that so parseInt doesn't return NaN. It will be added back later to make the member number without the leading zeros\n            const memberChamber = memberNumber[0];\n            const memberNumberWithoutChamber = memberNumber.substr(1);\n            const formattedMemberNumber = memberChamber + String(parseInt(memberNumberWithoutChamber, 10));\n\n            const link = `https://budget.lis.virginia.gov/mbramendment/${props.sessionData.SessionYear}/${sessionCode}/${formattedMemberNumber}/`\n            roleLinks.push(<a key={roleIndex} target=\"_blank\" href={link}>{role.Name}</a>)\n        } else {\n            //Add the link to the object\n            const link = {\n                selectedPatronType: [role.PatronTypeID],\n                selectedPatron: props.memberData.MemberID,\n                selectedSession: props.sessionData.SessionID\n            }\n            //Convert to base64 so when the link is clicked the adv search page can interpret it\n            const b64Link = window.btoa(JSON.stringify(link))\n            roleLinks.push(<Link key={roleIndex} to={\"/bill-search/?q=\" + b64Link}>{role.Name}</Link>)\n        }\n    });\n    if (roleLinks.length === 0) {\n        return (<p>None</p>);\n    }\n    return (<p>{roleLinks}</p>);\n}\n\nclass MemberDetailsComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            sessionData: [],\n            memberCommittees: [],\n            memberNumber: '',\n            memberData: '',\n            patronRoles: [],\n            memberSessionContact: [],\n            memberDistrictContact: [],\n            memberConferenceBills: []\n        };\n        this.getMemberContact = this.getMemberContact.bind(this);\n        this.getMemberCommittees = this.getMemberCommittees.bind(this);\n        this.getPatronTypes = this.getPatronTypes.bind(this);\n        this.getMemberConferenceBills = this.getMemberConferenceBills.bind(this);\n        this.setupPage = this.setupPage.bind(this);\n    }\n\n    getMemberCommittees(memberID, effectiveDate) {\n        var params = 'effectiveDate=' + effectiveDate + '&MemberID=' + memberID\n\n        this.props.actions.getCommitteesByMember(params).then(() => {\n            let committees = this.props.committee.committeesByMember;\n            for (let i = 0; i < committees.length; i++) {\n                let comm = committees[i];\n                //Find the subcommittees by checking if they have a parent ID\n                if (comm.ParentCommitteeID) {\n                    //Find the parent based the parent ID\n                    let parent = committees.find(committee => comm.ParentCommitteeID === committee.CommitteeID);\n                    //Just in case something odd is happening and the person is only a member of the subcommittee (possible in api 1.0)\n                    if (parent) {\n                        if (!parent.subcommittees) parent.subcommittees = [];\n                        //Add the subcommittee as a child to the parent object\n                        parent.subcommittees.push(comm);\n                        //Remove the subcommittee from the list\n                        committees.splice(i, 1);\n                        //index is displaced because an element is deleted. This will put it back on track\n                        i--;\n                    }\n                }\n            }\n            this.setState({\n                memberCommittees: committees,\n                memberCommitteesIsLoaded: true\n            })\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return\n            }\n            this.setState({\n                memberCommitteesIsLoaded: true\n            })\n        })\n    }\n\n\n    getMemberContact(memberNumber, sessionData) {\n        const params = 'sessionID=' + sessionData.SessionID + '&memberNumber=' + memberNumber;\n        this.props.actions.getMemberContact(params).then(() => {\n            if (this.props.members.memberContactData[0]) {\n                const memberData = this.props.members.memberContactData[0];\n                const gaAddress = memberData.ContactInformation.filter(contact => contact.ContactType === 'GA');\n                const mailingAddress = memberData.ContactInformation.filter(contact => contact.ContactType === 'Mailing');\n                const sessionStartObj = sessionData.SessionEvents && sessionData.SessionEvents.length && sessionData.SessionEvents.find(date => date.DisplayName === \"Session Start\");\n                const startDate = sessionStartObj ? moment(sessionStartObj.ActualDate).format('MM/DD/YYYY') : '';\n                this.setState({\n                    memberSessionContact: gaAddress,\n                    memberDistrictContact: mailingAddress,\n                    memberData: memberData,\n                    contactIsLoaded: true\n\n                });\n                this.getPatronTypes(memberData.MemberID, sessionData.SessionID);\n                this.getMemberCommittees(memberData.MemberID, startDate);\n                this.getMemberConferenceBills(memberData.MemberID, sessionData.SessionID)\n            } else {\n                throw 'Member data not found';\n            }\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            this.setState({\n                message: err,\n                contactIsLoaded: true,\n                memberConferenceBillsIsLoaded: true,\n                patronRolesIsLoaded: true,\n                memberCommitteesIsLoaded: true\n            });\n        });\n    }\n\n    getPatronTypes(memberId, sessionId) {\n        this.props.actions.getPatronTypes(`?memberID=${memberId}&sessionID=${sessionId}`)\n            .then(() => {\n                this.setState({\n                    patronRoles: this.props.patrons.patronTypes,\n                    patronRolesIsLoaded: true\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    patronRolesIsLoaded: true\n                });\n            });\n    }\n\n    getMemberConferenceBills(memberId, sessionId) {\n        const params = `?sessionID=${sessionId}&memberID=${memberId}`\n        this.props.actions.getMemberConferenceBills(params)\n            .then(() => {\n                this.setState({\n                    memberConferenceBills: this.props.members.memberConferenceBills,\n                    memberConferenceBillsIsLoaded: true\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    memberConferenceBillsIsLoaded: true\n                });\n            })\n    }\n\n    // When component has mounted:\n    // 1. Get session info, add to state\n    // 2. Get member by ID\n    // 3. Get committees\n    componentDidMount() {\n        window.scrollTo(0, 0);\n        //Update the session selector component, which will run componentDidUpdate and call setupDoc on its own\n        const sessionCode = this.props.match.params.sessioncode\n        if (sessionCode) {\n            if (this.props.nav.session !== sessionCode) {\n                this.props.actions.changeSession(sessionCode)\n            } else {\n                this.setupPage(sessionCode);\n            }\n        }\n    }\n\n    setupPage(sessionCode) {\n        const memberNumber = this.props.match.params.membernumber\n        this.props.actions.getSessionByCode(sessionCode).then(() => {\n            this.setState({\n                sessionData: this.props.session.selectedSession,\n                memberNumber: memberNumber\n            });\n            this.getMemberContact(memberNumber, this.props.session.selectedSession);\n            //If a signed in member is viewing their details page then provide a link to the member status report page.\n            const jwt = localStorage.getItem(\"LIS_ID_TOKEN\");\n            if (jwt) {\n                try {\n                    const parsedToken = jwtDecode(jwt);\n                    const mNumber = parsedToken.MemberNumber;\n                    if (mNumber === memberNumber) {\n                        this.setState({\n                            showMemberStatusPageLink: true\n                        })\n                    }\n                } catch (e) {\n                    if (Object.getPrototypeOf(e).toString() === 'InvalidTokenError') {\n                        //Token is malformed..nothing to do\n                    } else {\n                        console.error(e);\n                    }\n                }\n            }\n        });\n    }\n\n    componentDidUpdate(prevProps) {\n        // Setup the page if the global selected session changes. Change the URL to reflect the session change\n        if (prevProps.nav.session !== this.props.nav.session) {\n            this.props.history.push('/session-details/' + this.props.nav.session + '/member-information/' + this.props.match.params.membernumber + \"/member-details\");\n            this.setupPage(this.props.nav.session);\n        } else if (this.props.nav.session !== this.props.match.params.sessioncode) {\n            // If the url changes then update the global selected session with whatever the url is\n            if (this.props.match.params.sessioncode) {\n                this.props.actions.changeSession(this.props.match.params.sessioncode);\n            }\n        } else if (this.props.match.params.membernumber !== prevProps.match.params.membernumber) {\n            this.setupPage(this.props.nav.session);\n        }\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { sessionData, memberData, memberDistrictContact, memberSessionContact, memberCommittees, memberConferenceBillsIsLoaded, memberConferenceBills } = this.state;\n        const sessionContactInfo = sessionData && sessionData.IsActive && memberSessionContact.map((contact, contactIndex) =>\n            <React.Fragment key={contactIndex}>\n                <p>{contact.Address1}, Room {memberData.RoomNumber}<br />\n                    {contact.Address2}<br />\n                    {contact.City}, {contact.StateCode} {contact.ZipCode}<br />\n                    {contact.ContactType === \"GA\" ? memberData.GABPhoneNumber : contact.PhoneNumber}\n                    {memberData.GABEmailAddress && memberData.GABEmailAddress.length > 0 &&\n                        <React.Fragment>\n                            <h3 style={{ marginTop: \"8px\", paddingLeft: \"0px\" }}>Email Address</h3>\n                            <a href={`mailto:${memberData.GABEmailAddress}`}>{memberData.GABEmailAddress}</a>\n                        </React.Fragment>\n                    }\n                </p>\n            </React.Fragment>\n        );\n        //Decision was made to only display the specified contact mailing address here -JGB        \n        const districtContactInfo = sessionData && sessionData.IsActive && memberData && memberData.ContactInformation.map((contact, contactIndex) =>\n            contact.ContactType === \"Mailing\" &&\n            <React.Fragment key={contactIndex}>\n                <p>\n                    {contact.Address1}<br />\n                    {contact.Address2 && <>{contact.Address2}<br /></>}\n                    {contact.City}, {contact.StateCode} {contact.ZipCode}<br />\n                    {contact.PhoneNumber}\n                </p>\n            </React.Fragment>\n        );\n        return (\n            <div className=\"generic-details-page public-details inner-grid\">\n                <div>\n                    <h2 style={{ marginBottom: '10px' }}>{sessionData.SessionYear} {sessionData.DisplayName}</h2>\n                </div>\n                {this.state.message &&\n                    <p>{this.state.message}</p>\n                }\n                {(!this.state.message || this.state.message !== \"Member data not found\") &&\n                    <React.Fragment>\n                        {!this.state.contactIsLoaded\n                            ? <div aria-label=\"Loading\" className=\"spinner\"></div>\n                            : <div className=\"details-header\">\n                                <div>\n                                    <h3>{memberData.MemberDisplayName}<span style={{ marginLeft: \"0.5em\" }}>({memberData.PartyCode}) - {memberData.Chamber} District {memberData.DistrictID}</span></h3>\n                                    <div className=\"details-section\">\n                                        {this.state.showMemberStatusPageLink &&\n                                            <a href=\"http://efile.dlas.virginia.gov/frmMemberBD.aspx\">Patron status report</a>\n                                        }\n                                    </div>\n                                </div>\n                                <div className=\"list-links\" style={{ padding: '5px 10px' }}>\n                                    <Link to={`/vote-search/${sessionData.SessionCode}/${memberData.MemberNumber}`}>Votes</Link>\n                                </div>\n                            </div>\n                        }\n                        {!this.state.contactIsLoaded\n                            ? <div aria-label=\"Loading\" className=\"spinner\"></div>\n                            : sessionContactInfo.length > 0 && <div className=\"details-section\">\n                                <h4>In Session Address</h4>\n                                <React.Fragment>{sessionContactInfo}</React.Fragment>\n                            </div>\n                        }\n                        {!this.state.contactIsLoaded\n                            ? <div aria-label=\"Loading\" className=\"spinner\"></div>\n                            : districtContactInfo && districtContactInfo.find(c => c !== false) && <div className=\"details-section\">\n                                <h4>Mailing Address</h4>\n                                <React.Fragment>{districtContactInfo}</React.Fragment>\n                            </div>\n                        }\n                        {!this.state.memberCommitteesIsLoaded\n                            ? <div aria-label=\"Loading\" className=\"spinner\"></div>\n                            : <div className=\"details-section\">\n                                <h4>Committee Assignments</h4>\n                                <CommitteeAssignments session={sessionData.SessionCode} committees={memberCommittees} />\n                            </div>\n                        }\n                        {!this.state.patronRolesIsLoaded\n                            ? <div aria-label=\"Loading\" className=\"spinner\"></div>\n                            : <div className=\"details-section\">\n                                <h4>Sponsored Legislation</h4>\n                                <PatronRoles\n                                    roles={this.state.patronRoles}\n                                    memberData={this.state.memberData}\n                                    sessionData={sessionData}\n                                />\n                            </div>\n                        }\n                        {!memberConferenceBillsIsLoaded\n                            ? <div aria-label=\"Loading\" className=\"spinner\"></div>\n                            : <div className=\"details-section\" style={{ minHeight: '150px' }}>\n                                {memberConferenceBills.length !== 0 && <h4>Conference Assignments</h4>}\n                                {memberConferenceBills.map((bill, billIndex) =>\n                                    <div key={billIndex}>\n                                        {billIndex !== 0 && <hr className=\"faded-line\" />}\n                                        <Link to={`/bill-details/${sessionData.SessionCode}/${bill.LegislationNumber}`}>{bill.LegislationNumber} {bill.Description}</Link>\n                                    </div>\n                                )}\n                            </div>\n                        }\n                    </React.Fragment>\n                }\n            </div>\n        )\n    }\n}\n\nconst PublicMemberDetails = connect(\n    (state) => {\n        const { members, session, committee, patrons, nav } = state;\n        return {\n            members,\n            session,\n            committee,\n            patrons,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, memberActionCreators, sessionActionCreators, committeeActionCreators, patronActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(MemberDetailsComponent)\n\nexport default PublicMemberDetails;\n","import React from 'react';\nimport Select from 'react-select';\n\nconst WATCHLIST_LEGISLATION = \"WATCHLIST_LEGISLATION\";\nconst ALL_LEGISLATION = \"ALL_LEGISLATION\";\n\nclass WatchlistNotifications extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            hideNotifications: true,\n            newKeywords: [],\n            showTooltip: false\n        };\n        this.toggleNotifications = this.toggleNotifications.bind(this);\n        this.handleFrequenyChange = this.handleFrequenyChange.bind(this);\n        this.handleMemberChange = this.handleMemberChange.bind(this);\n        this.handleCommitteeChange = this.handleCommitteeChange.bind(this);\n        this.toggleEditKeywords = this.toggleEditKeywords.bind(this);\n        this.handleKeywordChange = this.handleKeywordChange.bind(this);\n        this.handleKeywordSave = this.handleKeywordSave.bind(this);\n        this.handleCheckboxChange = this.handleCheckboxChange.bind(this);\n        this.toggleTooltip = this.toggleTooltip.bind(this);\n    }\n\n    toggleNotifications() {\n        this.setState(state => ({\n            hideNotifications: !state.hideNotifications\n        }));\n    }\n\n    toggleTooltip(state) {\n        let showTooltip = { ...this.state.showTooltip };\n\n        //Close all open tooltips\n        if (typeof showTooltip === \"object\") {\n            for (const x in showTooltip) {\n                if (x !== state)\n                    showTooltip[x] = false;\n            };\n        }\n\n        showTooltip[state] = showTooltip[state] ? false : true;\n\n        this.setState({\n            showTooltip: showTooltip\n        })\n    }\n\n    handleFrequenyChange(e) {\n        const value = e.target.value;\n        let selectedCollection = { ...this.props.selectedCollection };\n        selectedCollection.Frequency = value;\n        delete selectedCollection.NotificationFrequencyID\n        this.props.handleCollectionChange(selectedCollection);\n    }\n\n    handleMemberChange(val) {\n        let selectedCollection = { ...this.props.selectedCollection };\n        const criteriaTypeObj = this.props.criteriaTypes.find(type => type.CriteriaType === 'Patron');\n        let newCriteria = [];\n        selectedCollection.NotificationCriterias.forEach(criteria => {\n            if (criteria.CriteriaType !== 'Patron') {\n                newCriteria.push(criteria);\n            } else {\n                const indexOfCriteriaInValue = val.findIndex(v => parseInt(criteria.CriteriaValue) === v.MemberID);\n                if (indexOfCriteriaInValue !== -1) {\n                    // This criteria is in value. Add it to the new criteria array and make sure it is active\n                    newCriteria.push({ ...criteria, IsActive: true });\n                    // Remove the value from the val array since it is already added\n                    val.splice(indexOfCriteriaInValue, 1);\n                } else {\n                    // This criteria is not part of val so make it inactive\n                    newCriteria.push({ ...criteria, IsActive: false });\n                }\n            }\n        });\n        // Anything left in val will be new criterias. Add them to the new criteria array\n        val.forEach(v => {\n            newCriteria.push({\n                CriteriaValue: v.MemberID,\n                CriteriaType: \"Patron\",\n                CriteriaTypeID: criteriaTypeObj ? criteriaTypeObj.CriteriaTypeID : null,\n                IsActive: true\n            });\n        });\n        selectedCollection.NotificationCriterias = newCriteria;\n        this.props.handleCollectionChange(selectedCollection);\n    }\n\n    handleCommitteeChange(val) {\n        let selectedCollection = { ...this.props.selectedCollection };\n        const criteriaTypeObj = this.props.criteriaTypes.find(type => type.CriteriaType === 'Committee');\n        let newCriteria = [];\n        selectedCollection.NotificationCriterias.forEach(criteria => {\n            if (criteria.CriteriaType !== 'Committee') {\n                newCriteria.push(criteria);\n            } else {\n                const indexOfCriteriaInValue = val.findIndex(v => parseInt(criteria.CriteriaValue) === v.CommitteeID);\n                if (indexOfCriteriaInValue !== -1) {\n                    // This criteria is in value. Add it to the new criteria array and make sure it is active\n                    newCriteria.push({ ...criteria, IsActive: true });\n                    // Remove the value from the val array since it is already added\n                    val.splice(indexOfCriteriaInValue, 1);\n                } else {\n                    // This criteria is not part of val so make it inactive\n                    newCriteria.push({ ...criteria, IsActive: false });\n                }\n            }\n        });\n        // Anything left in val will be new criterias. Add them to the new criteria array\n        val.forEach(v => {\n            newCriteria.push({\n                CriteriaValue: v.CommitteeID,\n                CriteriaType: \"Committee\",\n                CriteriaTypeID: criteriaTypeObj ? criteriaTypeObj.CriteriaTypeID : null,\n                IsActive: true\n            });\n        });\n        selectedCollection.NotificationCriterias = newCriteria;\n        this.props.handleCollectionChange(selectedCollection);\n    }\n\n    toggleEditKeywords() {\n        let keywordCriteria = this.props.selectedCollection.NotificationCriterias.filter(criteria => criteria.IsActive && criteria.CriteriaType === 'Keyword');\n        // Make sure there are at least one keyword so the input appears\n        if (keywordCriteria.length === 0) {\n            const criteriaTypeObj = this.props.criteriaTypes.find(type => type.CriteriaType === 'Keyword')\n            keywordCriteria.push({\n                CriteriaType: 'Keyword',\n                CriteriaTypeID: criteriaTypeObj ? criteriaTypeObj.CriteriaTypeID : null,\n                CriteriaValue: '',\n                IsActive: true\n            });\n        }\n        this.setState(state => ({\n            newKeywords: keywordCriteria,\n            showKeywordEditor: !state.showKeywordEditor\n        }));\n    }\n\n    handleKeywordChange(e, index) {\n        const val = e.target.value;\n        let newKeywords = [...this.state.newKeywords];\n        newKeywords[index].CriteriaValue = val\n        this.setState({\n            keywordCriteria: newKeywords\n        })\n    }\n\n    handleKeywordSave(isDelete) {\n        let selectedCollection = { ...this.props.selectedCollection };\n        let newKeywords = [...this.state.newKeywords];\n        selectedCollection.NotificationCriterias.forEach(criteria => {\n            if (criteria.CriteriaType === \"Keyword\") {\n                const criteriaToUseIndex = newKeywords.findIndex(kc => kc.CriteriaTypeID === criteria.CriteriaTypeID)\n                if (criteriaToUseIndex !== -1) {\n                    criteria.IsActive = true;\n                    criteria.CriteriaValue = newKeywords[criteriaToUseIndex].CriteriaValue;\n                    newKeywords.splice(criteriaToUseIndex, 1);\n                }\n                if (isDelete || !criteria.CriteriaValue || !criteria.CriteriaValue.trim()) {\n                    criteria.IsActive = false;\n                }\n            }\n        });\n        if (newKeywords.filter(nk => nk.IsActive).length > 0) {\n            // If there are some left over then these don't have IDs and need to be created\n            selectedCollection.NotificationCriterias = selectedCollection.NotificationCriterias.concat(newKeywords.filter(nk => nk.IsActive));\n        }\n        this.props.handleCollectionChange(selectedCollection, () => {\n            this.setState({\n                showKeywordEditor: false\n            })\n        });\n\n    }\n\n    handleCheckboxChange(criteriaType) {\n        let selectedCollection = { ...this.props.selectedCollection };\n        let criteriaIndices = [];\n        // Since notificaion criteria is an array the entire array needs to be checked to see if any of the criteria type exist\n        this.props.selectedCollection.NotificationCriterias.forEach((criteria, criteriaIndex) => {\n            if (criteria.CriteriaType === criteriaType) {\n                criteriaIndices.push(criteriaIndex);\n                // If it exists then it needs to be 'checked' or 'unchecked' by setting isActive\n                selectedCollection.NotificationCriterias[criteriaIndex].IsActive = !selectedCollection.NotificationCriterias[criteriaIndex].IsActive;\n            }\n        });\n        //If none were found then add one to make the box checked\n        if (criteriaIndices.length === 0) {\n            const criteriaTypeObj = this.props.criteriaTypes.find(type => type.CriteriaType === criteriaType)\n            selectedCollection.NotificationCriterias.push({\n                CriteriaType: criteriaType,\n                CriteriaTypeID: criteriaTypeObj ? criteriaTypeObj.CriteriaTypeID : null,\n                IsActive: true\n            });\n        }\n        this.props.handleCollectionChange(selectedCollection);\n    }\n\n    componentDidUpdate(prevProps) {\n        if (this.props.selectedCollection.WatchListID !== prevProps.selectedCollection.WatchListID) {\n            this.setState({\n                newKeywords: []\n            })\n        }\n    }\n\n    render() {\n        const { selectedCollection, memberList, committeeList, collectionIsSaving } = this.props;\n        const { hideNotifications, newKeywords, showKeywordEditor } = this.state;\n\n        if (!selectedCollection) {\n            return false;\n        }\n\n        const houseMembers = memberList.filter(member => member.ChamberCode === \"H\");\n        const senateMembers = memberList.filter(member => member.ChamberCode === \"S\");\n        const houseCommittees = committeeList.filter(committee => committee.ChamberCode === \"H\");\n        const senateCommittees = committeeList.filter(committee => committee.ChamberCode === \"S\");\n\n        const selectedHousePatrons = houseMembers.filter(member => selectedCollection.NotificationCriterias.find(criteria => criteria.IsActive && criteria.CriteriaType === \"Patron\" && parseInt(criteria.CriteriaValue) === member.MemberID))\n        const selectedSenatePatrons = senateMembers.filter(member => selectedCollection.NotificationCriterias.find(criteria => criteria.IsActive && criteria.CriteriaType === \"Patron\" && parseInt(criteria.CriteriaValue) === member.MemberID))\n        const selectedHouseCommittees = houseCommittees.flatMap(x => x.options || x).filter(committee => selectedCollection.NotificationCriterias.find(criteria => criteria.IsActive && criteria.CriteriaType === \"Committee\" && parseInt(criteria.CriteriaValue) === committee.CommitteeID))\n        const selectedSenateCommittees = senateCommittees.flatMap(x => x.options || x).filter(committee => selectedCollection.NotificationCriterias.find(criteria => criteria.IsActive && criteria.CriteriaType === \"Committee\" && parseInt(criteria.CriteriaValue) === committee.CommitteeID))\n\n        const getSelectedCommitteesLabel = (val) => {\n            let newCmte = JSON.parse(JSON.stringify(val)); //don't modify existing committee values stored at state level & used in dropdown\n            newCmte.forEach(cmte => {\n                cmte.label = '(' + cmte.ChamberCode + ') ' + cmte.label;\n            });\n            return newCmte;\n        }\n\n        let statusChangeCheck = false;\n        let docketCheck = false;\n        let versionCheck = false;\n        let impactStatementCheck = false;\n        let keywords = [];\n        let introducedCheck = false;\n        selectedCollection.NotificationCriterias.forEach(criteria => {\n            if (!criteria.IsActive) {\n                return;\n            }\n            switch (criteria.CriteriaType) {\n                case (\"Status Change\"):\n                    statusChangeCheck = true;\n                    break;\n                case (\"Docket/Agenda\"):\n                    docketCheck = true;\n                    break;\n                case (\"New Version\"):\n                    versionCheck = true;\n                    break;\n                case (\"Impact Statement\"):\n                    impactStatementCheck = true;\n                    break;\n                case (\"Keyword\"):\n                    keywords.push(criteria);\n                    break;\n                case (\"Introduced\"):\n                    introducedCheck = true;\n                    break;\n            }\n        });\n        return (\n            <div className=\"collection-notification-box dlas-forms user-forms\">\n                <div className=\"flex-row notification-first-section\">\n                    <span className=\"txt-lighter-blue\">Notifications</span>\n                    <button aria-expanded={!hideNotifications} onClick={this.toggleNotifications} className={`${hideNotifications ? \"arrow-down\" : \"arrow-up\"} light-blue-chevron`}></button>\n                </div>\n                {!hideNotifications &&\n                    <div>\n                        <div className=\"notification-section flex-row flex-start inline-list flex-vertical-center\">\n                            <div>Notification frequency</div>\n                            <div className=\"flex-vertical-center flex-row\">\n                                <label htmlFor=\"sr-frequency-hourly\">Hourly</label>\n                                <input id=\"sr-frequency-hourly\" disabled={collectionIsSaving} value=\"Hourly\" onChange={this.handleFrequenyChange} checked={selectedCollection.Frequency === \"Hourly\"} name=\"notifcation-frequency\" type=\"radio\" />\n                            </div>\n                            <div className=\"flex-vertical-center flex-row\">\n                                <label htmlFor=\"sr-frequency-daily\">Daily</label>\n                                <input id=\"sr-frequency-daily\" disabled={collectionIsSaving} value=\"Daily\" onChange={this.handleFrequenyChange} checked={selectedCollection.Frequency === \"Daily\"} name=\"notifcation-frequency\" type=\"radio\" />\n                            </div>\n                            <div className=\"flex-vertical-center flex-row\">\n                                <label htmlFor=\"sr-frequency-none\">None</label>\n                                <input id=\"sr-frequency-none\" disabled={collectionIsSaving} value=\"None\" onChange={this.handleFrequenyChange} checked={selectedCollection.Frequency === \"None\" || !selectedCollection.Frequency} name=\"notifcation-frequency\" type=\"radio\" />\n                            </div>\n                        </div>\n                        <hr className=\"faded-line full-width\" />\n                        <div className=\"no-gap-grid two\">\n                            <div className=\"notification-section\">\n                                <strong className=\"txt-lighter-blue\">My Watchlist Legislation</strong>\n                                <a onClick={(e) => { e.stopPropagation(e); this.toggleTooltip(WATCHLIST_LEGISLATION) }} className=\"button info\">Info</a>\n                                {this.state.showTooltip[WATCHLIST_LEGISLATION] &&\n                                    <div className=\"info-box notification-tooltip\">\n                                        <p><b>Status Change</b>{\": Legislation receives one or more notable events that trigger a status change. Ex: In Committee, Passed, Failed, etc. -  this DOES NOT include notice of when a bill you are tracking is placed on a docket or agenda, has a new text version or has a new impact statement. - Use those options below to be notified for each.\"}</p>\n                                        <p><b>Placed on Docket/Agenda</b>{\": Legislation is placed on a Senate committee docket or House committee agenda.\"}</p>\n                                        <p><b>New text versions</b>{\": Legislation receives a new version such as Substitute, Engrossed, Enrolled, etc. *excludes amendments and Governor's text.\"}</p>\n                                        <p><b>Impact Statements</b>{\": Legislation receives a new impact statement.\"}</p>\n                                    </div>\n                                }\n                                <div className=\"flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleCheckboxChange(\"Status Change\")}>\n                                        <input id=\"sr-status-change\" disabled={collectionIsSaving} checked={statusChangeCheck} type=\"checkbox\" />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"sr-status-change\" className=\"checkbox-label\" >Notify me when a bill in this watchlist has any status change.</label>\n                                </div>\n                                <div className=\"flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleCheckboxChange(\"Docket/Agenda\")}>\n                                        <input id=\"sr-docket\" disabled={collectionIsSaving} checked={docketCheck} type=\"checkbox\" />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"sr-docket\" className=\"checkbox-label\">Notify me when a bill in this watchlist appears on a docket/agenda.</label>\n                                </div>\n                                <div className=\"flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleCheckboxChange(\"New Version\")}>\n                                        <input id=\"sr-new-version\" disabled={collectionIsSaving} checked={versionCheck} type=\"checkbox\" />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"sr-new-version\" className=\"checkbox-label\">Notify me when a bill in this watchlist has new text versions.</label>\n                                </div>\n\n                                <div className=\"flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleCheckboxChange(\"Impact Statement\")}>\n                                        <input id=\"sr-impact-statement\" disabled={collectionIsSaving} checked={impactStatementCheck} type=\"checkbox\" />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"sr-impact-statement\" className=\"checkbox-label\">Notify me when a bill in this watchlist has impact statements.</label>\n                                </div>\n                            </div>\n                            <div className=\"notification-section\">\n                                <strong className=\"txt-lighter-blue\">All Legislation</strong>\n                                <a onClick={(e) => { e.stopPropagation(e); this.toggleTooltip(ALL_LEGISLATION) }} className=\"button info\">Info</a>\n                                {this.state.showTooltip[ALL_LEGISLATION] &&\n                                    <div className=\"info-box notification-tooltip all-legislation\">\n                                        <p><b>Any new bill introduced</b>{\": All bills, joints, and resolutions introduced by House or Senate.\"}</p>\n                                        <p><b>Any bill offered by patron</b>{\": Legislation introduced by a particular patron as Chief Patron.\"}</p>\n                                        <p><b>Any bill with keyword phrase</b>{\": Legislation contains a particular keyword or keyword phrase in any version text available.\"}</p>\n                                        <p><b>Any bill referred to a committee</b>{\": Legislation referred, rereferred, and/or recommitted to a particular committee.\"}</p>\n                                    </div>\n                                }\n                                <div className=\"flex-row flex-vertical-center flex-start\">\n                                    <div className=\"toggle-switch\" onClick={() => this.handleCheckboxChange(\"Introduced\")}>\n                                        <input id=\"sr-introduced\" disabled={collectionIsSaving} checked={introducedCheck} type=\"checkbox\" />\n                                        <span className=\"slider\"></span>\n                                    </div>\n                                    <label htmlFor=\"sr-introduced\" className=\"checkbox-label\">Notify me when <strong>any</strong> new bill is introduced.</label>\n                                </div>\n                                <br />\n                                <div>\n                                    <label>Notify me when <strong>any</strong> new bill is offered by a patron.</label>\n                                    <div className=\"inner-grid\" style={{ gap: '5px' }}>\n                                        <Select\n                                            aria-label=\"House Members\"\n                                            id=\"sr-patron-house\"\n                                            isDisabled={collectionIsSaving}\n                                            placeholder=\"House Members\"\n                                            options={houseMembers}\n                                            value={selectedHousePatrons}\n                                            getOptionLabel={opt => opt.ListDisplayName}\n                                            //The senate patrons needs to be concatenated because the list is split in two to accomadate the design of two seperate dropdowns\n                                            onChange={val => this.handleMemberChange((val || []).concat(selectedSenatePatrons))}\n                                            styles={selectStyle}\n                                            isMulti />\n                                        <Select\n                                            aria-label=\"Senate Members\"\n                                            id=\"sr-patron-senate\"\n                                            isDisabled={collectionIsSaving}\n                                            placeholder=\"Senate Members\"\n                                            options={senateMembers}\n                                            value={selectedSenatePatrons}\n                                            onChange={val => this.handleMemberChange((val || []).concat(selectedHousePatrons))}\n                                            styles={selectStyle}\n                                            getOptionLabel={opt => opt.ListDisplayName}\n                                            isMulti />\n                                    </div>\n                                </div>\n                                <br />\n                                <div>\n                                    <label id=\"sr-keyword-label\">Notify me when <strong>any</strong> new introduced, engrossed, enrolled, chaptered, or substitute legislation is offered with a keyword phrase.</label>\n                                    {showKeywordEditor ?\n                                        <div className=\"flex-row flex-vertical-center\">\n                                            {newKeywords.map((keyword, keywordIndex) =>\n                                                <input\n                                                    aria-label=\"Enter phrase\"\n                                                    key={keywordIndex}\n                                                    disabled={collectionIsSaving}\n                                                    type=\"text\"\n                                                    value={keyword.CriteriaValue}\n                                                    onChange={e => this.handleKeywordChange(e, keywordIndex)}\n                                                    placeholder=\"Enter phrase\" />\n                                            )}\n                                            <div>\n                                                {collectionIsSaving ?\n                                                    <div className=\"small-spinner\"></div>\n                                                    :\n                                                    <div className=\"inline-list\">\n                                                        <span role=\"button\" aria-label=\"save\" onClick={() => this.handleKeywordSave(false)} className=\"icon save\"></span>\n                                                        <span role=\"button\" aria-label=\"cancel\" onClick={this.toggleEditKeywords} className=\"icon delete\"></span>\n                                                    </div>\n                                                }\n                                            </div>\n                                        </div>\n                                        :\n                                        <div>\n                                            {keywords.map((keyword, keywordIndex) =>\n                                                <div className=\"bold\" key={keywordIndex}>\n                                                    <span>{keyword.CriteriaValue}</span>\n                                                    <span role=\"button\" aria-label=\"delete\" onClick={() => this.handleKeywordSave(true)} style={{ marginLeft: '5px', verticalAlign: 'text-bottom' }} className=\"icon delete\"></span>\n                                                </div>\n                                            )}\n                                            <button onClick={() => !this.props.collectionIsSaving && this.toggleEditKeywords()} className=\"button-link\" type=\"button\">Edit keywords</button>\n                                        </div>\n                                    }\n                                </div>\n                                <br />\n                                <div>\n                                    <label>Notify me when <strong>any</strong> bill is referred to a committee.</label>\n                                    <div className=\"inner-grid\" style={{ gap: '5px' }}>\n                                        <Select\n                                            aria-label=\"House Committees\"\n                                            isDisabled={collectionIsSaving}\n                                            placeholder=\"House Committees\"\n                                            options={houseCommittees}\n                                            value={getSelectedCommitteesLabel(selectedHouseCommittees)}\n                                            onChange={val => this.handleCommitteeChange((val || []).concat(selectedSenateCommittees))}\n                                            styles={selectStyle}\n                                            isMulti />\n                                        <Select\n                                            aria-label=\"Senate Committees\"\n                                            isDisabled={collectionIsSaving}\n                                            placeholder=\"Senate Committees\"\n                                            options={senateCommittees}\n                                            value={getSelectedCommitteesLabel(selectedSenateCommittees)}\n                                            onChange={val => this.handleCommitteeChange((val || []).concat(selectedHouseCommittees))}\n                                            styles={selectStyle}\n                                            isMulti />\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>}\n            </div>);\n    }\n\n}\n\nconst selectStyle = {\n    menuList: (base, state) => ({\n        ...base,\n        paddingTop: '0px',\n    }),\n    group: (base, state) => ({\n        ...base,\n        paddingTop: '0px',\n    }),\n    groupHeading: (base, state) => ({\n        ...base,\n        paddingTop: '7px',\n        paddingBottom: '7px',\n        marginBottom: '0px',\n        position: 'sticky',\n        top: '0px',\n        backgroundColor: 'hsl(0,0%,100%)'\n    }),\n    control: styles => ({\n        ...styles,\n        minHeight: '0px',\n        padding: '0.12em 0.6em !important',\n    }),\n    valueContainer: styles => ({\n        ...styles,\n        padding: 0,\n    }),\n    input: styles => ({\n        ...styles,\n        fontSize: '0.8em',\n        lineHeight: 'normal',\n    }),\n    singleValue: styles => ({\n        ...styles,\n        fontSize: '0.8em'\n    }),\n    placeholder: styles => ({\n        ...styles,\n        fontSize: '0.8em'\n    }),\n    option: styles => ({\n        ...styles,\n        fontSize: '0.8em'\n    }),\n    dropdownIndicator: styles => ({\n        ...styles,\n        padding: '1px'\n    }),\n}\n\nexport default WatchlistNotifications;","import React from 'react';\n\nconst HelpPage = () => {\n    return (\n        <div className=\"long-paragraph-text\">\n            <div>\n                <h2 className=\"txt-dark-blue\">Single Search Word</h2>\n                <p>Example using Single Word: distilled</p>\n                <p>A single search word is the simplest of all search statement constructions. For a document to qualify for the search, it must contain an occurrence of the exact character string specified as the search word. For example; the search word \"distilled\" only retrieves the documents that contain occurrences of the word \"distilled\". The words \"distill\" and \"distillery\", for example, do not qualify. </p>\n            </div>\n            <div>\n                <h2 className=\"txt-dark-blue\">Phrase Search</h2>\n                <p>Phrase example: 'state child fatality review team'</p>\n                <p>A search phrase is constructed of two or more search words. To perform a phrase search, surround the phrase with single or double quotes.</p>\n            </div>\n            <div>\n                <h2 className=\"txt-dark-blue\">Logic Conditions</h2>\n                <p>Search statements can be entered using any of three logic conditions: \"and\", \"or\", and \"and not\". Use of a logic condition requires two search statements. For example: \"A or B\", or \"A and (B or C)\". The logic conditions must be positioned between two search words or statements.</p>\n                <p>When you use \"and\" in your search statement (example: \"A and B\"), all documents that contain references of both A and B are displayed. Documents containing references of only A or only B will not qualify.</p>\n                <p>When you use \"or\" in your search statement (example: \"A or B\"), all documents with references of either A or B will display. Unlike \"and\" it is not necessary for both statements to be present in a document for it to qualify, but documents containing both \"A and B\" will also qualify.</p>\n                <p>When you use \"and not\" in your search statement (\"A and not B\"), documents must first contain references of A. Of the documents containing A, only those without references of B will qualify.</p>\n                <p>With \"and\" or \"or\" the order of the statements will not affect the outcome of the search. When using \"and not\", the results of the search depend on the order of the statements. Compound search statements (those with more than one logic condition) can also be read several ways.</p>\n                <p>Search statements are normally read from left to right. Simple statements such as the example \"A or B\" will not be misinterpreted. When additional logic conditions are added, the order and groupings of the statements may be defined with parentheses. </p>\n            </div>\n            <div>\n                <h2 className=\"txt-dark-blue\">Parentheses</h2>\n                <p>Parentheses can be used to affect the order in which the statement is read. The examples below show how the placement of the parentheses can change the intent of the statement:</p>\n                <p> 1 ==&gt; (A or B) and C:</p>\n                <p>This statement reads: Display all documents containing references of either A or B that also contain references of C.</p>\n                <p> 2 ==&gt; A or (B and C):</p>\n                <p>This statement is the same as the one above. Only the placement of the parentheses is changed. The statement reads: Display documents with either references of both B and C or the documents with references of A.</p>\n                <p>If additional parentheses are used, the statement contained in the deepest set of parentheses is resolved first. For example in \"D and (B or (A and C))\", \"A and C\" is resolved first, despite its rightmost position in the statement.</p>\n                <p>Logic conditions can be combined with any kind of search words or search phrases to create a search statement as broad or specific as you desire. </p>\n            </div>\n        </div>\n    );\n}\n\nexport default HelpPage;","import { useState } from 'react';\n\nconst QuickAdd = props => {\n    const [addBill, handleAddBillChange] = useState('')\n    const [isAddingBill, toggleIsAddingBill] = useState(false)\n    const quickAddBills = () => {\n        if (!addBill.replace(/\\s/g), \"\") {\n            return;\n        }\n        toggleIsAddingBill(true);\n        props.quickAddBills(addBill, err => {\n            toggleIsAddingBill(false);\n            if (!err) { handleAddBillChange('') };\n        });\n    }\n\n    return (\n        <>\n            <div className=\"quick-add-container\" style={{ marginRight: \"0px\" }}>\n                {props.quickAddErr &&\n                    <span className=\"small-text fail\" style={{ paddingRight: '5px' }}>{props.quickAddErr}</span>\n                }\n                <label className=\"screen-reader-only\" htmlFor=\"bill-quick-add\">Bill quick add</label>\n                <input\n                    id=\"bill-quick-add\"\n                    type=\"text\"\n                    onKeyDown={e => {\n                        if (e.key === \"Enter\") {\n                            e.stopPropagation();\n                            quickAddBills()\n                        }\n                    }}\n                    autoFocus={props.autoFocus}\n                    placeholder=\"Bill quick add\"\n                    value={addBill}\n                    onChange={e => handleAddBillChange(e.target.value)}\n                />\n                {isAddingBill ?\n                    <span className=\"small-spinner\"></span>\n                    :\n                    <button style={{ marginLeft: \"7px\" }} type=\"button\" disabled={props.collectionIsSaving} onClick={quickAddBills} id=\"bill-quick-add-button\" className=\"small-button button\">Add</button>\n                }\n            </div>\n        </>\n    );\n}\n\nexport default QuickAdd;\n","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\nimport { memberActionCreators } from '../../../stores/lis-members-store';\nimport { billActionCreators } from '../../../stores/lis-legislation-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { patronActionCreators } from '../../../stores/lis-patron-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport AdvancedSearchBox from '../../../lis-shared/lis-search/lis-advanced-search-box';\nimport moment from 'moment-timezone';\nimport queryString from 'query-string';\nimport '../../../stylesheets/lis-public-view/public-view.css';\nimport BillCategories from '../../../lis-shared/lis-search/lis-search-categories';\nimport SearchSelections from '../../../lis-shared/lis-search/lis-search-selections';\nimport LegislationWatchlists from '../../../lis-shared/lis-search/lis-legislation-watchlists';\nimport WatchlistNotifications from '../../../lis-shared/lis-search/lis-watchlist-notifications';\nimport CollectionControls from '../../../lis-shared/lis-search/lis-collection-controls'\nimport { cancelRequest } from '../../../services/request.service';\nimport { collectionActionCreators } from '../../../stores/lis-collection-store';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\nimport ReportMaker from './lis-report-maker';\nimport BillInfoComponent from '../../../lis-shared/lis-search/lis-bill-info';\nimport SearchHelp from './lis-search-help';\nimport QuickAdd from './quick-add-bills';\nimport { reportActionCreators } from '../../../stores/lis-report-store';\n\nconst BILL_COLLECTION_AUTHOR = \"LegislationCollections\";\nconst PageSize = 50;\n\nconst sortLegislations = (a, b) => {\n    if (a.LegislationNumber[0] !== b.LegislationNumber[0]) {\n        return a.LegislationNumber[0].localeCompare(b.LegislationNumber[0]);\n    } else if (a.LegislationNumber[1] !== b.LegislationNumber[1]) {\n        return a.LegislationNumber[1].localeCompare(b.LegislationNumber[1]);\n    } else {\n        const aLegislationKey = a.LegislationNumber.substr(2);\n        const bLegislationKey = b.LegislationNumber.substr(2);\n        return parseInt(aLegislationKey - bLegislationKey);\n    }\n}\n\nconst validLegPrefixes = [\"HB\", \"SB\", \"HJ\", \"SJ\", \"HR\", \"SR\"];\n\nclass BillSearchComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            showCategories: false,\n            billList: [],\n            billStatusCategoryList: [],\n            billStatusCategoryListIsLoading: true,\n            billEventOptions: [],\n            selectedBillEvent: '',\n            selectedBill: '',\n            selectedKeywords: '',\n            searchedKeywords: '',\n            selectedBillAction: '',\n            billEventStartDate: null,\n            billEventEndDate: null,\n            selectedBillSession: '',\n            selectedBillType: '',\n            previousSearch: '',\n            searchType: { value: 'all', label: 'All' },\n            selectedChamber: '',\n            patronList: [],\n            patronRoles: [],\n            selectedBillNumbers: '',\n            selectedBillRangeBeginning: '',\n            selectedBillRangeEnd: '',\n            selectedChapterNumber: '',\n            filteredPatronList: [],\n            selectedPatron: '',\n            selectedPatronType: [],\n            selectedBillStatusCategory: '',\n            sessionOptions: [],\n            billStatusStartDate: null,\n            billStatusEndDate: null,\n            committeeList: [],\n            groupedCommitteeList: [],\n            filteredCommitteeList: [],\n            selectedCommittee: '',\n            selectedSubcommittee: '',\n            subcommitteeList: [],\n            subjectList: [],\n            selectedSubject: '',\n            introDateList: [],\n            collections: [],\n            selectedCollection: '',\n            selectedCollectionIndex: -1,\n            billVersionList: [],\n            selectedBillVersion: 'All',\n            billSummaryList: [],\n            selectedSummaryVersion: 'All',\n            selectedLocation: 'Caption',\n            criteriaTypes: [],\n            checkedBills: [],\n            lastCheckedBill: -1,\n            showAllNotes: false,\n            selectAllBills: false,\n            collectionIsSaving: false,\n            keywordUseGlobalSessionSearch: false,\n            displayCrossSession: false,\n            currentStatus: true,\n            excludeFailed: false,\n            autoReport: false,\n            showSidebar: true,\n            height: 1,\n            showModal: false,\n            introductionDate: null,\n            showHelpModal: false,\n            showUpdateSearchButton: false,\n            compositeView: false\n        };\n        this.searchOnEnterPress = this.searchOnEnterPress.bind(this);\n        this.toggleGroup = this.toggleGroup.bind(this);\n        this.toggleShowCategories = this.toggleShowCategories.bind(this);\n        this.clearForm = this.clearForm.bind(this);\n        this.handleSubmit = this.handleSubmit.bind(this);\n        this.handleSearch = this.handleSearch.bind(this);\n        this.getBillsResults = this.getBillsResults.bind(this);\n        this.chamberChange = this.chamberChange.bind(this);\n        this.sessionChange = this.sessionChange.bind(this);\n        this.committeeChange = this.committeeChange.bind(this);\n        this.handlePatronChange = this.handlePatronChange.bind(this);\n        this.handlePatronTypeChange = this.handlePatronTypeChange.bind(this);\n        this.handleDateChange = this.handleDateChange.bind(this);\n        this.handleSelectionClear = this.handleSelectionClear.bind(this);\n        this.handleMultiSelectionClear = this.handleMultiSelectionClear.bind(this);\n        this.handleRadioChange = this.handleRadioChange.bind(this);\n        this.getCollections = this.getCollections.bind(this);\n        this.selectCollection = this.selectCollection.bind(this);\n        this.handleCollectionChange = this.handleCollectionChange.bind(this);\n        this.createCollection = this.createCollection.bind(this);\n        this.deleteCollection = this.deleteCollection.bind(this);\n        this.addToWatchlists = this.addToWatchlists.bind(this);\n        this.removeWatchlistBills = this.removeWatchlistBills.bind(this);\n        this.toggleReportMaker = this.toggleReportMaker.bind(this);\n        this.toggleAllBills = this.toggleAllBills.bind(this);\n        this.handleBillCheckbox = this.handleBillCheckbox.bind(this);\n        this.quickAddBills = this.quickAddBills.bind(this);\n        this.toggleAllNotes = this.toggleAllNotes.bind(this);\n        this.handleCurrentStatusChange = this.handleCurrentStatusChange.bind(this);\n        this.handleExcludeFailedChange = this.handleExcludeFailedChange.bind(this);\n        this.unload = this.unload.bind(this);\n        this.toggleSidebar = this.toggleSidebar.bind(this);\n        this.getSessions = this.getSessions.bind(this);\n        this.toggleShowData = this.toggleShowData.bind(this);\n        this.executeSearch = this.executeSearch.bind(this);\n        this.toggleModal = this.toggleModal.bind(this);\n        this.toggleHelpModal = this.toggleHelpModal.bind(this);\n        this.getReportTitle = this.getReportTitle.bind(this);\n        this.handleToggleCompositeView = this.handleToggleCompositeView.bind(this);\n\n        // The div that sorrounds the page is in this component but the function that needs to run to be able to make a search is in the child component.\n        // This ref is used to call the child component's function.\n        this.searchBox = React.createRef();\n        this._billResultRefs = [];\n    }\n\n    componentDidMount() {\n        // IF A SEARCH QUERY EXISTS\n        let queryObj = '';\n        const parsed = queryString.parse(this.props.location.search, { decode: false });\n        if (parsed.q) {\n            const base64 = parsed.q;\n            const decodedSearch = window.atob(base64);\n            queryObj = JSON.parse(decodedSearch);\n            this.setState(state => ({\n                ...state,\n                ...queryObj\n            }), () => {\n                if (!parsed.autoReport) {\n                    this.getSessions(queryObj);\n                } else {\n                    this.getSessions(null, parsed.autoReport == 1);\n                }\n            });\n        } else {\n            this.getSessions(null, parsed.autoReport == 1);\n        }\n        this.getBillStatusCategoryOptions();\n        this.getBillVersionOptions();\n        this.getBillSummaryOptions();\n        this.getBillEventOptions();\n        this.getPatronRoles();\n    }\n\n    componentDidUpdate(prevProps, prevState) {\n        if (this.props.location.search !== prevProps.location.search) {\n            this.executeSearch();\n        }\n        if (this.props.nav.session !== prevProps.nav.session) {\n            if (!isNaN(parseInt(this.props.nav.session))) {\n                this.sessionChange(this.props.nav.session);\n            }\n        }\n\n        //get collections if user logs in/logged in user changes\n        if (this.props.login.userProfile.email && this.props.login.userProfile.email !== prevProps.login.userProfile.email) {\n            if (this.state.selectedSession.SessionID && this.props.login.userClaims.resources.find(resource => resource === BILL_COLLECTION_AUTHOR)) {\n                this.getCollections(\"?SessionID=\" + this.state.selectedSession.SessionID);\n            } else if (this.state.collections && this.state.collections.length) {\n                this.setState({ collections: [] })\n            }\n        }\n\n        if (this.state.billList !== prevState.billList || this.state.showCategories !== prevState.showCategories) {\n            if (window.innerWidth > 900) { //breaks mobile otherwise, and the sidebar toggle isn't shown on mobile anyways\n                let height = document.getElementById('results-div');\n                if (height && (height.scrollHeight / 540) !== this.state.height) {\n                    this.setState({\n                        height: (height.scrollHeight / 540) >= 1 ? (height.scrollHeight / 540) : 1\n                    })\n                } else {\n                    this.setState({\n                        height: 1\n                    })\n                }\n            }\n        }\n    }\n\n    executeSearch() {\n        let queryObj = '';\n        const parsed = queryString.parse(this.props.location.search, { decode: false });\n        if (parsed.q) {\n            const base64 = parsed.q;\n            const decodedSearch = window.atob(base64);\n            queryObj = JSON.parse(decodedSearch);\n            //Remove any existing entries in the form and replace it with the content of the url\n            this.clearForm();\n            this.setState(state => ({\n                ...state,\n                ...queryObj\n            }), () => {\n                //If a member is already selected and there are no patron types selected then select them all by default for senators and all but sponsor and incorporated for delegates \n                if (this.state.selectedPatron && this.state.selectedPatronType.length === 0) {\n                    const patronRoles = [];\n                    this.state.patronRoles.filter(x => x.PatronTypeID !== 3 && x.PatronTypeID !== 5).forEach(role => patronRoles.push(role.PatronTypeID));\n                    this.setState({\n                        selectedPatronType: patronRoles\n                    });\n                }\n                //If a committee is already selected and there is no legislation status then select 'In Committee' as the status\n                if (this.state.selectedCommittee && !this.state.selectedBillStatusCategory) {\n                    const selectedBillStatusCategory = this.state.billStatusCategoryList.find(status => status.Name === 'In Committee');\n                    this.setState({\n                        selectedBillStatusCategory: selectedBillStatusCategory ? selectedBillStatusCategory.LegislationCategoryID : ''\n                    });\n                }\n                this.getSessions(queryObj);\n            });\n        } else if (!parsed.collection) {\n            //this means the user hit the back button from a query and there are no longer any params in the url, \n            //and the user should be back at the base search page with categories\n            this.clearForm(true);\n        }\n    }\n\n    getSessions(queryObj, autoReport) {\n        let sessions = ''\n        if (!this.state.sessionOptions.length) {\n            sessions = this.props.actions.getSessionList()\n                .then(() => {\n                    this.setState({\n                        sessionOptions: this.props.session.sessionList\n                    })\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    console.log(err)\n                });\n        } else {\n            sessions = () => Promise.resolve();\n        }\n\n        Promise.all([sessions]).then(() => {\n            let selectedSession = '';\n            let defaultSession = '';\n            this.state.sessionOptions.forEach(session => {\n                if (queryObj && session.SessionID === queryObj.selectedSession) {\n                    selectedSession = session;\n                    this.props.actions.changeSession(session.SessionCode);\n                } else if (session.SessionCode === this.props.nav.session && !selectedSession) {\n                    selectedSession = session;\n                }\n                if (session.IsDefault) {\n                    defaultSession = session;\n                }\n            });\n            //Only set the session to default if the queryObj doesn't have a sessionID and the the session selector doesn't have a sessionID\n            if (!selectedSession) {\n                selectedSession = defaultSession;\n            }\n\n            if (selectedSession) {\n                const sessionStartObj = selectedSession.SessionEvents && selectedSession.SessionEvents.length && selectedSession.SessionEvents.find(date => date.DisplayName === \"Session Start\");\n                const startDate = sessionStartObj ? moment(sessionStartObj.ActualDate).format(\"MM/DD/YYYY\") : '';\n                const dateParam = 'effectiveDate=' + encodeURIComponent(startDate);\n                const sessionParam = 'sessionID=' + selectedSession.SessionID;\n                this.getPatrons(sessionParam);\n                this.getSubjects(sessionParam);\n                this.getCommittees(sessionParam);\n                this.getIntroDates(sessionParam)\n\n                this.setState({ selectedSession }, () => {\n                    if (this.props.login.userClaims.resources.find(resource => resource === BILL_COLLECTION_AUTHOR)) {\n                        this.getCollections(\"?SessionID=\" + this.state.selectedSession.SessionID);\n                        if (autoReport) {\n                            window.addEventListener(\"beforeunload\", this.unload);\n                            this.toggleReportMaker();\n                            this.setState({\n                                autoReport: true\n                            })\n                        }\n                    }\n                    if (queryObj && !queryObj.sessionOnly) {\n                        this.setState({ billList: [], fullLegislationList: [], skippedRecords: 0 }, () => {\n                            this.handleSearch()\n                        })\n                    } else {\n                        this.setState({ showCategories: true })\n                    }\n\n                    document.querySelector('body').addEventListener('keydown', this.searchOnEnterPress);\n                })\n            } else {\n                this.setState({ failedToGetSessions: true })\n            }\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            console.log(err)\n        });\n    }\n\n    componentWillUnmount() {\n        document.querySelector('body').removeEventListener('keydown', this.searchOnEnterPress);\n        cancelRequest();\n        //Handle leaving the page when we arrived here from the Create Report button in the calendar        \n        if (this.state.autoReport && this.state.selectedCollection != '' && this.state.showReportMaker) {\n            window.removeEventListener(\"beforeunload\", this.unload);\n        }\n    }\n\n    searchOnEnterPress(event) {\n        if (event.key === 'Enter' && !this.state.isFetching) {\n            //Pressing enter while on a react-select will select an option. A search should not happen because of that.\n            if (!event.target.id.includes('react-select') && !event.target.className.includes('note-area') && !event.target.className.includes('quick-search') && event.target.id !== \"userId\" && event.target.id !== \"userPassword\" && event.target.id !== \"report-personal-message\") {\n                if (!this.state.selectedChamber && !this.state.selectedBillEvent && !this.state.selectedBillType && !this.state.selectedCommittee && !this.state.selectedSubcommittee && !this.state.selectedPatron && !this.state.selectedSubject && !this.state.selectedKeywords && !this.state.selectedBillNumbers && !this.state.selectedBillRangeBeginning && !this.state.selectedBillRangeEnd && !this.state.selectedSubject && !this.state.selectedChapterNumber && !this.state.selectedBillStatusCategory) {\n                    //there are not any search parameters provided, don't execute a search\n                    return;\n                }\n                this.searchBox.current.handleSubmit();\n            }\n        }\n    }\n\n    toggleShowCategories(val) {\n        this.setState({\n            showCategories: val\n        }, () => {\n            if (this.state.showCategories) {\n                this.props.history.push(\"/bill-search\");\n            }\n        });\n    }\n\n    toggleGroup(groupName) {\n        this.setState(state => ({\n            [groupName]: !state[groupName]\n        }));\n    }\n\n    toggleShowData(billID, bool) {\n        if (bool === undefined) {\n            this.setState(prevState => ({\n                [billID]: !prevState[billID]\n            }));\n        } else {\n            //not just toggling, we're explicitly setting (e.g. if searching by keyword, and a bill has been expanded, if the keyword search location changes to bill text,\n            //don't just toggle all (which would reset that bill to false), set them all to true)\n            this.setState({\n                [billID]: bool\n            })\n        }\n    }\n\n    clearForm(clearUrl, clearBillData) {\n        this.setState({\n            selectedBillEvent: '',\n            selectedBill: '',\n            selectedKeywords: '',\n            searchedKeywords: '',\n            selectedBillAction: '',\n            billEventStartDate: null,\n            billEventEndDate: null,\n            selectedBillSession: '',\n            selectedBillType: '',\n            selectedBillNumbers: '',\n            selectedBillRangeBeginning: '',\n            selectedBillRangeEnd: '',\n            selectedChapterNumber: '',\n            subcommitteeList: [],\n            selectedPatron: '',\n            selectedPatronType: '',\n            selectedChamber: '',\n            selectedBillStatusCategory: '',\n            billStatusStartDate: null,\n            billStatusEndDate: null,\n            selectedCommittee: '',\n            selectedSubcommittee: '',\n            selectedSubject: '',\n            isPending: null,\n            mostFrequent: null,\n            allLegislation: null,\n            excludeFailed: false,\n            selectedBillVersion: 'All',\n            selectedSummaryVersion: 'All',\n            selectedLocation: 'Caption',\n            displaySelectedLocation: \"Caption\",\n            introductionDate: null\n        }, () => {\n            if (clearUrl) {\n                this.props.history.push('/bill-search');\n                this.setState({ billList: [], fullLegislationList: [], skippedRecords: 0, showCategories: true })\n            }\n            if (clearBillData) {\n                this.setState({\n                    billList: []\n                })\n            }\n        });\n\n    }\n\n    handleSubmit(queryObj) {\n        let encodedSearch = window.btoa(JSON.stringify(queryObj));\n        //if it is the same search (i.e. same parameters) as the current one, updating the url won't work since it will be the same, just execute it manually\n        const parsed = queryString.parse(this.props.location.search, { decode: false });\n        if (parsed.q && parsed.q === encodedSearch) {\n            this.executeSearch();\n        } else {\n            this.props.history.push('/bill-search?q=' + encodedSearch + (this.state.selectedCollection ? '&collection=' + this.state.selectedCollection.WatchListID : ''));\n        }\n    }\n\n    handleSearch(skipIdsCall) {\n        if (this.state.failedToGetSessions) { return; }\n        //Format the selected options to be sent to the API\n        //Add bill range to list of bills\n        let selectedBillNumbers = this.state.selectedBillNumbers.trim();\n        if (this.state.selectedBillRangeBeginning && this.state.selectedBillRangeEnd) {\n            selectedBillNumbers = selectedBillNumbers ? selectedBillNumbers + ',' : selectedBillNumbers;\n            selectedBillNumbers += this.state.selectedBillRangeBeginning + '-' + this.state.selectedBillRangeEnd;\n        }\n        let keywordVersion = null;\n        switch (this.state.selectedLocation) {\n            case ('Bill Text'):\n                if (this.state.selectedBillVersion !== 'All') {\n                    keywordVersion = { KeywordLegislationVersionID: this.state.selectedBillVersion }\n                }\n                break;\n            case ('Summary'):\n                if (this.state.selectedSummaryVersion !== 'All') {\n                    keywordVersion = { KeywordSummaryVersionID: this.state.selectedSummaryVersion }\n                }\n                break;\n        }\n\n        // Build the param array with param names as the keys\n        const params = {\n            ChamberCode: this.state.selectedChamber ? this.state.selectedChamber.value : null,\n            CommitteeID: this.state.selectedSubcommittee || this.state.selectedCommittee || null,\n            PatronTypes: this.state.selectedPatronType || null,\n            LegislationNumbers: selectedBillNumbers ? [{ LegislationNumber: selectedBillNumbers.replaceAll(\" \", \"\") }] : null,\n            ChapterNumber: this.state.selectedChapterNumber,\n            SessionID: this.state.keywordUseGlobalSessionSearch ? null : this.state.selectedSession.SessionID,\n            StartDate: this.state.billStatusStartDate ? moment(this.state.billStatusStartDate).format('MM/DD/YYYY') : null,\n            EndDate: this.state.billStatusEndDate ? moment(this.state.billStatusEndDate).format() : null,\n            KeywordExpression: this.state.selectedKeywords || null,\n            KeywordLocation: this.state.selectedLocation || null,\n            ...keywordVersion,\n            MemberID: this.state.selectedPatron,\n            SubjectIndexID: this.state.selectedSubject,\n            LegislationCategoryID: this.state.selectedBillStatusCategory,\n            LegislationEventTypeID: this.state.selectedBillEvent,\n            EventStartDate: this.state.billEventStartDate ? moment(this.state.billEventStartDate).format(\"MM/DD/YYYY\") : null,\n            EventEndDate: this.state.billEventEndDate ? moment(this.state.billEventEndDate).format(\"MM/DD/YYYY\") : null,\n            IsPending: this.state.isPending || null,\n            MostFrequent: this.state.mostFrequent || null,\n            AllLegislation: this.state.allLegislation || null,\n            KeywordUseGlobalSessionSearch: this.state.keywordUseGlobalSessionSearch,\n            CurrentStatus: this.state.currentStatus,\n            ExcludeFailed: this.state.excludeFailed,\n            IntroductionDate: this.state.introductionDate\n        }\n        //Open the fieldset if one of the form inputs is filled out\n        if (params.LegislationNumbers) {\n            this.setState({\n                billFieldset: true\n            });\n        }\n        if (params.KeywordExpression) {\n            this.setState({\n                keywordFieldset: true\n            });\n        }\n        if (params.LegislationCategoryID || params.ChamberCode) {\n            this.setState({\n                statusFieldset: true\n            });\n        }\n        if (params.EventStartDate || params.EventEndDate) {\n            this.setState({\n                activityFieldset: true\n            });\n        }\n        if (params.MemberID) {\n            this.setState({\n                membersFieldset: true\n            });\n        }\n        if (params.CommitteeID) {\n            this.setState({\n                committeesFieldset: true\n            });\n        }\n        if (params.SubjectIndexID) {\n            this.setState({\n                subjectFieldset: true\n            });\n        }\n\n        this.setState({\n            searchMade: true,\n            displaySelectedLocation: this.state.selectedLocation,\n            showUpdateSearchButton: false\n        });\n\n        //use existing search params if the user has scrolled to the next page (i.e. ignore any possible changes to the params on the side)\n        this.getBillsResults(skipIdsCall && this.state.params ? this.state.params : params, skipIdsCall);\n    }\n\n    getBillsResults(params, skipIdsCall) {\n\n        //if the user searches hb1-hb4 and expands all of these bills to see further info, and then search hb1-hb5, leave open their previously expanded bills for them;\n        //however, if the existing search (if there is one, i.e. this new one is not the first search they're making) is a bill text keyword search, which automatically expands all of them in order to show bill text matches,\n        //then close these in the new search results as there's a good chance they don't care for the expanded info regarding patrons/summary/etc\n        const closeBillInfo = this.state.params?.KeywordLocation === \"Bill Text\" && this.state.params?.KeywordExpression && (params?.KeywordLocation !== \"Bill Text\" || !params?.KeywordExpression);\n\n        this.setState({\n            isFetching: true,\n            showCategories: false,\n            searchedKeywords: params.KeywordExpression //without this, if the user edits the keyword in the adv search box but does not submit, the existing bill version hit count links will nonetheless use the new value and not work\n        })\n\n        if (!this.state.skippedRecords) {\n            window.scrollTo(0, 0);\n        }\n\n        let getResultsPromise;\n        let hasResults = true;\n        let numSearchedIds;\n        if (params.MostFrequent) {\n            getResultsPromise = this.props.actions.getMostFrequentBillList(\"?sessionID=\" + params.SessionID + \"&excludeFailed=\" + params.ExcludeFailed);\n        } else {\n            //break this up into three calls: 1) get the legislation numbers (i.e. 'skinny list') of all results, 2) get the full list of objects with pagination, 3) get the hit counts if it's a billtext keyword search\n            //we need the skinny list to know all the legislation numbers for creating reports, but don't want to get all the data for each yet (i.e. paginate)\n            if (skipIdsCall) {\n                const paginatedLegislationIds = [...this.state.fullLegislationList].slice(this.state.skippedRecords, this.state.skippedRecords + PageSize);\n                getResultsPromise = this.props.actions.getBillListByIds({ \"LegislationIds\": paginatedLegislationIds });\n                numSearchedIds = this.state.numSearchedIds + paginatedLegislationIds.length;\n            } else {\n                getResultsPromise = this.props.actions.getLegislationIdsList(params).then(() => {\n                    let legislationIdsResponse = { ... this.props.bills.legislationIdsList };\n                    //Filter to only one result per bill per session since DB sometimes returns duplicates which messes up pagination\n                    legislationIdsResponse.LegislationIds = legislationIdsResponse.LegislationIds.filter((item, pos) => legislationIdsResponse.LegislationIds.findIndex(i => i.LegislationNumber === item.LegislationNumber && i.SessionID === item.SessionID) === pos);\n                    this.setState({ fullLegislationList: legislationIdsResponse.LegislationIds })\n                    const paginatedLegislationIds = [...legislationIdsResponse.LegislationIds].slice(0, PageSize);\n                    numSearchedIds = paginatedLegislationIds.length;\n                    if (paginatedLegislationIds.length) {\n                        return this.props.actions.getBillListByIds({ \"LegislationIds\": paginatedLegislationIds });\n                    } else {\n                        hasResults = false;\n                        return Promise.resolve();\n                    }\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.setState({\n                        isFetching: false\n                    });\n                })\n            }\n        }\n\n        getResultsPromise.then(() => {\n            let billList;\n            if (!params.MostFrequent && this.state.skippedRecords) {\n                billList = [...this.state.billList.concat(hasResults ? this.props.bills.billListByIds : [])];\n            } else if (!params.MostFrequent) {\n                billList = hasResults ? [...this.props.bills.billListByIds] : [];\n            } else {\n                billList = [...this.props.bills.mostFrequentBillList];\n            }\n            //Filter to only one result per bill per session since DB sometimes returns duplicates which messes up pagination\n            billList = billList.filter((item, pos) => billList.findIndex(i => i.LegislationNumber === item.LegislationNumber && i.SessionID === item.SessionID) === pos);\n            this.setState({\n                params: params,\n                billList: billList,\n                numSearchedIds,\n                totalResults: billList && billList.length ? params.MostFrequent ? billList.length : this.state.fullLegislationList.length : 0, //if we got IDs back but no full legislation object results, display '0 Results' since none are actually being shown. Example of this is when you search a bill number with cross session turned on\n                hasNextPage: numSearchedIds && this.state.fullLegislationList.length > numSearchedIds ? true : false,\n                isFetching: false,\n                checkedBills: !params.MostFrequent && this.state.skippedRecords ? this.state.checkedBills : [],\n                lastCheckedBill: !params.MostFrequent && this.state.skippedRecords ? this.state.lastCheckedBill : -1,\n                selectAllBills: false,\n                displayCrossSession: this.state.keywordUseGlobalSessionSearch\n            }, () => {\n                if (closeBillInfo)\n                    [...this.state.billList].forEach(b => this.toggleShowData(b.LegislationID, false))\n                const options = {\n                    root: null,\n                    rootMargin: \"0px\",\n                    threshold: 1.0\n                };\n\n                this.observer = new IntersectionObserver(\n                    this.handleObserver.bind(this),\n                    options\n                );\n                this.observer.observe(this.loadingRef);\n\n                //if bill text search, get hit counts\n                if (params.KeywordLocation === 'Bill Text' && params.KeywordExpression && hasResults) {\n                    const LOADING = 'LOADING';\n                    const legislationTextIDs = [...this.props.bills.billListByIds].map(bill => bill.SearchText && bill.SearchText.map(text => { text.countMatches = LOADING; return { \"LegislationTextID\": text.LegislationTextID } })).flat();\n                    let hitCountRequestBody = {\n                        \"Documents\": legislationTextIDs,\n                        \"Location\": \"Bill Text\",\n                        \"KeywordExpression\": params.KeywordExpression\n                    };\n\n                    this.props.actions.getLegislationTextsHitCounts(hitCountRequestBody).then(() => {\n                        const hitCounts = [...this.props.bills.legislationTextsHitCounts];\n                        billList = [...this.state.billList];\n                        hitCounts.forEach(hitCount => {\n                            const associatedBillSearchTextIndexes = billList.reduce((r, b, i) => r.concat(b.SearchText && b.SearchText.find(st => st.LegislationTextID === hitCount.LegislationTextID) ? i : []), []);\n                            associatedBillSearchTextIndexes.forEach(index => {\n                                billList[index].SearchText.find(st => st.LegislationTextID === hitCount.LegislationTextID).countMatches = hitCount.HitCount;\n                            })\n                        })\n                        billList.filter(bill => bill.SearchText && bill.SearchText.find(st => st.countMatches === LOADING)).forEach(bill => {\n                            bill.SearchText.filter(st => st.countMatches === LOADING).forEach(st => { st.countMatches = null })\n                        })\n\n                        this.setState({ billList })\n                    }).catch(err => {\n                        if (err === 'Aborted') {\n                            return;\n                        }\n                        this.setState({\n                            isFetching: false\n                        });\n                    })\n                }\n            })\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            this.setState({\n                isFetching: false\n            });\n        })\n    }\n\n    handleObserver(entities, observer) {\n        const y = entities[0].boundingClientRect.y;\n        if (!this.state.showCategories && this.state.billList.length && this.state.hasNextPage && !this.state.isFetching && this.state.prevY > y) {\n            this.setState({ skippedRecords: this.state.numSearchedIds }, () => {\n                if (!this.state.selectedCollection || this.state.searchMade) {\n                    this.handleSearch(true);\n                } else {\n                    const bills = [...this.state.selectedCollection.WatchListLegislation].filter(l => !l.DeletionDate).map(l => l.LegislationID);\n                    if (bills.length > 0) {\n                        let legislationIds = [];\n                        for (let i = 0; i < bills.length; i++) {\n                            legislationIds.push({ LegislationId: bills[i] });\n                        }\n\n                        const params = {\n                            LegislationIDs: legislationIds,\n                            SessionID: this.state.selectedSession.SessionID\n                        }\n\n                        this.setState({ searchMade: false }, () => {\n                            this.getBillsResults(params, true);\n                        })\n                    }\n                }\n            });\n        }\n        this.setState({ prevY: y });\n    }\n\n    getBillStatusCategoryOptions() {\n        // Get Bill Status references for bill status typeahead\n        this.props.actions.getBillStatusCategoryReferences().then(() => {\n            let billStatusReferences = [...this.props.bills.billStatusCategoryReferences];\n            billStatusReferences.forEach(ref => {\n                ref.label = ref.Name\n                ref.value = ref.LegislationCategoryID\n            });\n            if (this.state.selectedCommittee && !this.state.selectedBillStatusCategory) {\n                const selectedBillStatusCategory = billStatusReferences.find(status => status.Name === 'In Committee');\n                this.setState({\n                    selectedBillStatusCategory: selectedBillStatusCategory ? selectedBillStatusCategory.LegislationCategoryID : ''\n                });\n            }\n            this.setState({\n                billStatusCategoryList: billStatusReferences,\n                billStatusCategoryListIsLoading: false\n            });\n        });\n    }\n\n    getBillVersionOptions() {\n        this.props.actions.getBillVersionRef().then(() => {\n            let topOfList = [{ Name: 'All Versions', LegislationVersionID: 'All' }];\n            let billVersionReferences = topOfList.concat(this.props.bills.billVersionRef);\n            billVersionReferences.forEach(ref => {\n                ref.label = ref.Name\n                ref.value = ref.LegislationVersionID\n            });\n            this.setState({\n                billVersionList: billVersionReferences,\n            });\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n        });\n    }\n\n    getBillSummaryOptions() {\n        this.props.actions.getBillSummaryRef().then(() => {\n            let topOfList = [{ Name: 'All Summary Versions', SummaryVersionID: 'All' }];\n            let billSummaryReferences = topOfList.concat(this.props.bills.billSummaryRef);\n            billSummaryReferences.forEach(ref => {\n                ref.label = ref.Name\n                ref.value = ref.SummaryVersionID\n            });\n            this.setState({\n                billSummaryList: billSummaryReferences,\n            });\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n        });\n    }\n\n    getBillEventOptions() {\n        this.props.actions.getBillEventReferences(\"?isSearchable=true&isActive=true\").then(() => {\n            let billEventReferences = [...this.props.bills.billEventRef];\n            billEventReferences.forEach(ref => {\n                ref.label = ref.LegislationDescription\n                ref.value = `${ref.EventCode}-${ref.IsPassed}`\n            });\n            this.setState({\n                billEventOptions: billEventReferences\n            });\n        });\n    }\n\n    getPatrons(sessionParam) {\n        // Get Patrons list for typeahead\n        this.props.actions.getMemberList(sessionParam).then(() => {\n            let memberList = [...this.props.members.memberList];\n            memberList.forEach(patron => {\n                patron.label = patron.ListDisplayName + ' ' + '(' + patron.ChamberCode + ')';\n                patron.value = patron.MemberID;\n            });\n            const member = memberList.find(member => member.MemberID === this.state.selectedPatron);\n            let selectedPatronType = [];\n            if (member && this.state.selectedPatronType.length === 0) {\n                this.state.patronRoles.filter(x => x.PatronTypeID !== 3 && x.PatronTypeID !== 5).forEach(role => selectedPatronType.push(role.PatronTypeID));\n                this.setState({\n                    selectedPatronType: selectedPatronType\n                });\n            }\n            this.setState({\n                patronList: memberList,\n                filteredPatronList: memberList,\n            });\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            console.log(err)\n        });\n    }\n\n    getSubjects(sessionParam) {\n        this.props.actions.getSubjectList('?' + sessionParam)\n            .then(() => {\n                this.setState({\n                    subjectList: this.props.bills.subjectList\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n            });\n    }\n\n    getPatronRoles() {\n        this.props.actions.getPatronRoles()\n            .then(() => {\n                const patronRoles = [...this.props.patrons.patronRoles];\n                patronRoles.forEach(role => {\n                    role.label = role.Name;\n                    role.value = role.PatronTypeID;\n                });\n                this.setState({\n                    patronRoles: patronRoles,\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n            });\n    }\n\n    getCommittees(sessionParam) {\n        this.props.actions.getCommitteeList(sessionParam).then(() => {\n            let committeeList = [...this.props.committee.committeeList];\n            committeeList.forEach(committee => {\n                committee.label = committee.Name;\n                committee.value = committee.CommitteeID;\n            });\n            let groupedCommitteeList = [{ \"label\": \"House Committees\", \"ChamberCode\": \"H\", \"options\": committeeList.filter(c => c.ChamberCode === \"H\") }, { \"label\": \"Senate Committees\", \"ChamberCode\": \"S\", \"options\": committeeList.filter(c => c.ChamberCode === \"S\") }]\n            this.setState({\n                committeeList: committeeList.map(c => ({ ...c, label: c.label + ' ' + '(' + c.ChamberCode + ')' })),\n                groupedCommitteeList: groupedCommitteeList,\n                filteredCommitteeList: groupedCommitteeList\n            });\n            //If a committee is already selected then that committee's subcommittees need to be retrieved\n            if (this.state.selectedCommittee) {\n                this.getSubcommittees(this.state.selectedCommittee);\n            }\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            console.log(err)\n        });\n    }\n\n    getSubcommittees(id) {\n        this.props.actions.getCommitteeList(\"parentCommitteeID=\" + id)\n            .then(() => {\n                let committeeList = [...this.props.committee.committeeList];\n                committeeList.forEach(committee => {\n                    committee.label = '(' + committee.ChamberCode + ') ' + committee.Name;\n                    committee.value = committee.CommitteeID;\n                });\n                this.setState({\n                    subcommitteeList: committeeList\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n            });\n    }\n\n    getIntroDates(sessionParam) {\n        this.props.actions.getIntroDateList('?' + sessionParam)\n            .then(() => {\n                let datesList = [];\n                this.props.bills.introDateList.forEach(date => datesList.push(moment(date.IntroductionDate)));\n                this.setState({\n                    introDateList: datesList\n                })\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n            });\n    }\n\n    sessionChange(code) {\n        const selectedSession = this.state.sessionOptions.find(session => session.SessionCode === code);\n        if (!selectedSession) {\n            return;\n        }\n        const sessionParam = 'sessionID=' + selectedSession.SessionID;\n        this.getPatrons(sessionParam);\n        this.getSubjects(sessionParam);\n        this.getCommittees(sessionParam);\n        this.getIntroDates(sessionParam);\n        this.getCollections(\"?SessionID=\" + selectedSession.SessionID);\n\n        const parsed = queryString.parse(this.props.location.search, { decode: false });\n        if (parsed.q) {\n            const base64 = parsed.q;\n            const decodedSearch = window.atob(base64);\n            let queryObj = JSON.parse(decodedSearch);\n            if (queryObj.selectedSession) {\n                queryObj.selectedSession = selectedSession.SessionID;\n                this.handleSubmit(queryObj);\n                return;\n            }\n        } else {\n            this.setState({ currentStatus: selectedSession.IsActive })\n        }\n\n        if (this.state.selectedBillStatusCategory) {\n            this.setState({\n                selectedPatron: '',\n                selectedPatronType: '',\n                selectedCommittee: '',\n                selectedSubcommittee: '',\n                selectedSubject: '',\n                selectedSession: selectedSession,\n                billList: [],\n                fullLegislationList: [],\n                skippedRecords: 0\n            }, () => {\n                this.handleSearch();\n            });\n        } else {\n            this.setState({\n                selectedPatron: '',\n                selectedPatronType: '',\n                selectedCommittee: '',\n                selectedSubcommittee: '',\n                selectedSubject: '',\n                selectedSession: selectedSession,\n                billList: [],\n                fullLegislationList: [],\n                skippedRecords: 0\n            }, () => {\n                const parsed = queryString.parse(this.props.location.search, { decode: false });\n                if (parsed.q) {\n                    this.handleSearch();\n                }\n            });\n        }\n    }\n\n    chamberChange(value) {\n        this.setState({\n            selectedChamber: value\n        });\n        if (value) {\n            const patronList = [...this.state.patronList];\n            const committeeList = [...this.state.groupedCommitteeList];\n            //Remove the patrons from the patronList that do not fit the current selected chamber\n            //Remove the committees from the committee list that do not fit the current selected chamber\n            let filteredPatronList = patronList.filter(patron => patron.ChamberCode === value.value);\n            let filteredCommitteeList = committeeList.filter(committee => committee.ChamberCode === value.value);\n            this.setState({\n                filteredPatronList: filteredPatronList,\n                filteredCommitteeList: filteredCommitteeList,\n            });\n        } else {\n            // 'all' has been selected so show all patrons/committees\n            this.setState({\n                filteredPatronList: this.state.patronList,\n                filteredCommitteeList: this.state.groupedCommitteeList,\n            });\n        }\n        // Reset all the values that are chamber specific\n        this.setState({\n            selectedPatron: '',\n            selectedPatronType: '',\n            selectedCommittee: '',\n            selectedSubcommittee: ''\n        });\n    }\n\n    committeeChange(opt) {\n        this.setState({\n            selectedCommittee: opt ? opt.value : null,\n            selectedSubcommittee: null\n        });\n        if (opt) {\n            if (!this.state.selectedBillStatusCategory) {\n                const selectedBillStatusCategory = this.state.billStatusCategoryList.find(status => status.Name === 'In Committee');\n                this.setState({\n                    selectedBillStatusCategory: selectedBillStatusCategory ? selectedBillStatusCategory.LegislationCategoryID : ''\n                });\n            }\n            this.getSubcommittees(opt.CommitteeID)\n        };\n    }\n\n    handlePatronChange(opt) {\n        let patronTypes = [];\n        if (opt) {\n            this.state.patronRoles.filter(x => x.PatronTypeID !== 3 && x.PatronTypeID !== 5).forEach(role => patronTypes.push(role.PatronTypeID));\n        }\n        this.setState({\n            selectedPatron: opt ? opt.value : null,\n            selectedPatronType: patronTypes\n        });\n    }\n\n    handlePatronTypeChange(options) {\n        let values = [];\n        if (options) {\n            options.forEach(opt => values.push(opt.value));\n        }\n        this.setState({\n            selectedPatronType: values\n        });\n    }\n\n    handleSelectChange = (opt, name) => {\n        this.setState({\n            [name]: opt ? opt.value : null\n        });\n        if (name === 'selectedBillStatusCategory') {\n            if (opt === null || (opt && [2, 3, 4, 6, 7, 11, 22, 16, 17, 21, 27].includes(opt.LegislationCategoryID))) {\n                this.setState({\n                    currentStatus: true,\n                    billStatusStartDate: null,\n                    billStatusEndDate: null\n                });\n            } else if ([1, 5, 23, 24, 18, 26, 29, 8, 9, 10, 19, 14, 20, 25, 13, 15, 28].includes(opt.LegislationCategoryID)) {\n                this.setState({\n                    currentStatus: false\n                });\n            }\n        }\n    }\n\n    handleDateChange = (val, name) => {\n        this.setState({\n            [name]: val\n        });\n    }\n\n    handleTextChange = (evt, name) => {\n        let value = evt.target.value;\n        if (['selectedChapterNumber', 'selectedBillRangeBeginning', 'selectedBillRangeEnd'].includes(name)) {\n            value = value.replace(/[^a-zA-Z0-9]/, \"\");\n        }\n        this.setState({ [name]: value });\n    }\n\n    handleSelectionClear(key) {\n        //Clearing some form inputs changes the value of other form inputs. Handle them here.\n        this.setState({ showUpdateSearchButton: true }, () => {\n            switch (key) {\n                case \"selectedBillStatusCategory\":\n                    this.handleSelectChange(null, \"selectedBillStatusCategory\");\n                    break;\n                case \"selectedPatron\":\n                    this.handlePatronChange(null);\n                    break;\n                case \"selectedCommittee\":\n                    this.committeeChange(null);\n                    break;\n                case \"selectedChamber\":\n                    this.chamberChange(null);\n                    break;\n                default:\n                    this.setState({\n                        [key]: ''\n                    });\n            }\n\n            if (!localStorage.getItem('searchModalDismissed')) {\n                this.toggleModal();\n                localStorage.setItem('searchModalDismissed', true);\n            }\n        })\n    }\n\n    handleMultiSelectionClear(key, index) {\n        let value = [...this.state[key]];\n        value.splice(index, 1);\n        this.setState({\n            [key]: value,\n            showUpdateSearchButton: true\n        })\n    }\n\n    handleRadioChange() {\n        if (window.env && window.env.HISTORICAL_DATA_REDIRECT && !this.state.keywordUseGlobalSessionSearch && !this.props.login.userClaims.roles.find(role => role === \"CrossSearch\")) {\n            this.setState({\n                historicalSessionRedirect: (redirect) => {\n                    if (redirect) {\n                        let a = document.createElement('a');\n                        a.target = '_blank';\n                        a.href = `https://legacylis.virginia.gov`;\n                        document.body.appendChild(a);\n                        a.click();\n                        document.body.removeChild(a);\n                    }\n                    this.setState({ historicalSessionRedirect: false })\n                }\n            })\n            return;\n        }\n        this.setState({\n            keywordUseGlobalSessionSearch: !this.state.keywordUseGlobalSessionSearch\n        }, () => {\n            if (this.state.keywordUseGlobalSessionSearch) {\n                this.setState({\n                    excludeFailed: false\n                })\n            }\n        })\n    }\n\n    handleCurrentStatusChange() {\n        this.setState({\n            currentStatus: !this.state.currentStatus\n        }, () => {\n            if (this.state.currentStatus) {\n                this.setState({\n                    billStatusStartDate: null,\n                    billStatusEndDate: null\n                })\n            }\n        })\n    }\n\n    handleExcludeFailedChange() {\n        this.setState({\n            excludeFailed: !this.state.excludeFailed,\n            showUpdateSearchButton: true\n        })\n    }\n\n    getCollections(params) {\n        this.setState({\n            collectionIsLoading: true\n        });\n        this.props.actions.getCollections(params)\n            .then(() => {\n                const parsed = queryString.parse(this.props.location.search);\n                const collectionIndex = this.props.collection.collections.findIndex(coll => coll.WatchListID === parseInt(parsed.collection))\n                this.setState({\n                    collections: this.props.collection.collections,\n                    collectionIsLoading: false,\n                }, () => {\n                    if (collectionIndex !== -1) {\n                        this.selectCollection(collectionIndex)\n                    }\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return\n                }\n                this.setState({\n                    collectionIsLoading: false\n                });\n            });\n        this.props.actions.getCriteriaTypes()\n            .then(() => {\n                this.setState({\n                    criteriaTypes: this.props.collection.criteriaTypes\n                })\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n            });\n    }\n\n    selectCollection(collectionIndex, returningFromSearch) {\n        if (collectionIndex === -1) {\n            this.setState({\n                selectedCollectionIndex: -1,\n                quickAddErr: '',\n                selectedCollection: '',\n                billList: [],\n                fullLegislationList: [],\n                skippedRecords: 0,\n                searchMade: true\n            })\n            this.props.history.push('/bill-search');\n            this.clearForm();\n        } else {\n            // Remove object references so the state does not mutate\n            const selectedCollection = JSON.parse(JSON.stringify(this.state.collections[collectionIndex] || ''))\n            if (selectedCollection.IsPaid && !Boolean(this.props.login.userClaims.claims.find(claim => claim.Scope === \"Paid\" && claim.Resource === \"LegislationCollections\" && claim.RoleName === \"PaidLegislationCollectionsAuthor\")) && !Boolean(this.props.login.userClaims.resources.find(resource => resource === \"PaidLegislationCollectionsAuthor\" || resource === \"All\"))) {\n                alert(\"The watchlist you are trying to access is a paid watchlist. As a free user, you are no longer able to access this watchlist.\");\n                return;\n            }\n            const parsed = queryString.parse(this.props.location.search, { decode: false });\n            let sessionOnly = false;\n            if (parsed.q) {\n                const base64 = parsed.q;\n                const decodedSearch = window.atob(base64);\n                const queryObj = JSON.parse(decodedSearch);\n                sessionOnly = queryObj.sessionOnly || false;\n            }\n            if (returningFromSearch || !parsed.q || sessionOnly)\n                this.props.history.push(`/bill-search?collection=${selectedCollection.WatchListID}`)\n            this.setState({\n                selectedCollectionIndex: collectionIndex,\n                selectedCollection: selectedCollection,\n                showCategories: false,\n                billList: !returningFromSearch && parsed.q ? this.state.billList : [],\n                fullLegislationList: !returningFromSearch && parsed.q ? this.state.fullLegislationList : [],\n                skippedRecords: !returningFromSearch && parsed.q ? this.state.skippedRecords : 0,\n                searchMade: !returningFromSearch && parsed.q ? this.state.searchMade : false,\n                showAllNotes: !returningFromSearch && parsed.q ? this.state.showAllNotes : false\n            });\n            if (returningFromSearch || !parsed.q || sessionOnly) {\n                const bills = selectedCollection.WatchListLegislation.filter(l => !l.DeletionDate).sort(sortLegislations).map(l => l.LegislationID);\n                if (bills.length > 0) {\n                    let legislationIds = [];\n                    for (let i = 0; i < bills.length; i++) {\n                        legislationIds.push({ LegislationId: bills[i] });\n                    }\n\n                    const params = {\n                        LegislationIDs: legislationIds,\n                        SessionID: this.state.selectedSession.SessionID\n                    }\n                    this.getBillsResults(params);\n                }\n                this.clearForm();\n            }\n        }\n    }\n\n    handleCollectionChange(collection, callback) {\n        if (this.state.collectionIsSaving) {\n            return\n        }\n        this.setState({\n            collectionIsSaving: true\n        });\n        this.props.actions.saveCollections({ WatchLists: [collection] })\n            .then(() => {\n                let collectionSave = [...this.props.collection.collectionSave][0];\n                // The api does not return WatchListLegislation or NotificationCriterias at all if it is empty. To stop it from being undefined it is set to a blank array.\n                collectionSave.WatchListLegislation = collectionSave.WatchListLegislation || [];\n                collectionSave.NotificationCriterias = collectionSave.NotificationCriterias || [];\n                let collections = [...this.state.collections];\n                const savedCollectionIndex = collections.findIndex(coll => coll.WatchListID === collectionSave.WatchListID);\n                collections[savedCollectionIndex] = collectionSave;\n                this.setState({\n                    collectionIsSaving: false,\n                    collections: collections,\n                    selectedCollection: collectionSave\n                }, () => {\n                    if (callback) {\n                        callback();\n                    }\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                if (callback) {\n                    callback(err);\n                }\n                this.setState({\n                    collectionIsSaving: false\n                });\n                let message;\n                if (err && JSON.parse(err)) {\n                    const errorMsg = JSON.parse(err).Name;\n                    message = errorMsg && errorMsg.includes('Public users are') ? errorMsg : 'Save Failed'\n                } else {\n                    message = \"Save Failed\";\n                }\n                this.props.actions.makeToast([{ message: message, type: \"failure\", long: message.includes('Public users are') }]);\n            });\n    }\n\n    createCollection(collection) {\n        this.setState({\n            collectionIsSaving: true\n        });\n        this.props.actions.saveCollections({ WatchLists: [collection] }, true)\n            .then(() => {\n                let collections = [...this.state.collections];\n                let selectedCollection = [...this.props.collection.collectionSave][0]\n                // The api does not return WatchListLegislation or NotificationCriterias at all if it is empty. To stop it from being undefined it is set to a blank array.\n                selectedCollection.WatchListLegislation = selectedCollection.WatchListLegislation || [];\n                selectedCollection.NotificationCriterias = selectedCollection.NotificationCriterias || [];\n                collections.unshift(selectedCollection);\n                this.setState({\n                    collections: collections,\n                    collectionIsSaving: false,\n                    showCategories: false\n                }, () => {\n                    this.selectCollection(0)\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    collectionIsSaving: false\n                });\n                let message;\n                if (err && JSON.parse(err)) {\n                    const errorMsg = JSON.parse(err).Name;\n                    message = errorMsg && errorMsg.includes('Public users are') ? errorMsg : 'Save Failed'\n                } else {\n                    message = \"Save Failed\";\n                }\n                this.props.actions.makeToast([{ message: message, type: \"failure\", long: message.includes('Public users are') }]);\n            });\n    }\n\n    deleteCollection() {\n        this.setState({\n            collectionIsSaving: true\n        });\n        let collection = { ...this.state.selectedCollection };\n        let selectedCollectionIndex = this.state.selectedCollectionIndex;\n        collection.DeletionDate = new Date();\n        this.props.actions.saveCollections({ WatchLists: [collection] })\n            .then(() => {\n                let collections = [...this.state.collections];\n                const idx = collections.findIndex(coll => coll.WatchListID === collection.WatchListID);\n                if (idx > -1)\n                    collections.splice(idx, 1);\n                else\n                    collections.splice(selectedCollectionIndex, 1);\n                this.setState({\n                    selectedCollection: '',\n                    selectedCollectionIndex: -1,\n                    collections: collections,\n                    collectionIsSaving: false,\n                    searchMade: true,\n                    billList: [],\n                    fullLegislationList: [],\n                    skippedRecords: 0\n                });\n\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                this.setState({\n                    collectionIsSaving: false,\n                });\n                this.props.actions.makeToast([{ message: \"Delete Failed\", type: \"failure\" }]);\n            });\n    }\n\n    addToWatchlists(watchlists, merge, callback) {\n        let billsToAdd = [];\n        if (merge) {\n            let selectedCollection = { ...this.state.selectedCollection };\n            if (selectedCollection) {\n                selectedCollection.WatchListLegislation.filter(l => !l.DeletionDate).forEach(leg => { billsToAdd.push(leg) })\n            } else {\n                return;\n            }\n        } else {\n            this.state.checkedBills.forEach((c, i) => {\n                if (c) {\n                    billsToAdd.push(this.state.billList[i])\n                }\n            });\n        }\n        let duplicatedBills = [];\n        watchlists.forEach(watchlist => {\n            billsToAdd.forEach(bill => {\n                if (watchlist.__isNew__) {\n                    watchlist.Name = watchlist.label;\n                    watchlist.Description = `Created on ${moment().format('MM/DD/YYYY')}`;\n                    watchlist.WatchListLegislation = [];\n                    delete watchlist.label;\n                    delete watchlist.__isNew__;\n                    delete watchlist.value;\n                }\n                // Make sure the bill isn't already a part of the watchlist\n                if (!watchlist.WatchListLegislation.find(leg => leg.LegislationID === bill.LegislationID) || watchlist.WatchListLegislation.find(leg => leg.LegislationID === bill.LegislationID).DeletionDate) {\n                    watchlist.WatchListLegislation.push({\n                        LegislationID: bill.LegislationID,\n                        LegislationNumber: bill.LegislationNumber,\n                        Sessions: [{ SessionID: bill.SessionID }],\n                        WatchListID: watchlist.WatchListID,\n                        Note: merge ? bill.Note : null\n                    });\n                } else if (merge && bill.Note && !watchlist.WatchListLegislation.find(leg => leg.LegislationID === bill.LegislationID).Note) { //merge note if there is not already one in the target watchlist for that bill\n                    const leg = watchlist.WatchListLegislation.find(leg => leg.LegislationID === bill.LegislationID);\n                    leg.Note = bill.Note;\n                } else {\n                    duplicatedBills.push({ \"Watchlist\": watchlist.Name, \"LegislationNumber\": bill.LegislationNumber });\n                }\n            });\n        })\n\n        this.setState({\n            collectionIsSaving: true\n        }, () => {\n            let collections = [...this.state.collections];\n            this.props.actions.saveCollections({ WatchLists: watchlists })\n                .then(() => {\n                    let watchlistSave = [...this.props.collection.collectionSave];\n                    let savedCollectionIndex;\n                    watchlistSave.forEach(res => {\n                        if (!collections.find(coll => coll.WatchListID === res.WatchListID)) {\n                            collections.unshift(res);\n                            savedCollectionIndex = 0;\n                        } else {\n                            savedCollectionIndex = collections.findIndex(coll => coll.WatchListID === res.WatchListID);\n                            collections[savedCollectionIndex] = res;\n                        }\n                        res.WatchListLegislation = res.WatchListLegislation || [];\n                        res.NotificationCriterias = res.NotificationCriterias || [];\n                    })\n\n                    this.setState({\n                        collectionIsSaving: false,\n                        collections: collections,\n                        selectedCollection: watchlists.length === 1 && !merge ? collections[savedCollectionIndex] : this.state.selectedCollection,\n                        selectedCollectionIndex: watchlists.length === 1 && !merge ? savedCollectionIndex : this.state.selectedCollectionIndex\n                    });\n                    if (duplicatedBills.length && !merge) {\n                        this.props.actions.makeToast([{ message: (new Set(duplicatedBills.map(b => b.LegislationNumber)).size === 1 ? (duplicatedBills[0].LegislationNumber + \" is \") : \"Multiple added bills were \") + \"already in \" + (watchlists.length === 1 ? \"this watchlist. \" : \"one or more of these watchlists. \") + (watchlists.length === 1 ? ((billsToAdd.length - duplicatedBills.length) + \" bills were added to your watchlist \" + watchlists[0].Name) : \"All other bills were added.\"), type: \"warning\", long: true }]);\n                    } else if (!merge) {\n                        this.props.actions.makeToast([{ message: (billsToAdd.length === 1 ? billsToAdd[0].LegislationNumber + \" was \" : billsToAdd.length + \" bills were \") + \"added to your watchlist\" + (watchlists.length > 1 ? \"s\" : (\" \" + watchlists[0].Name)), type: \"success\" }]);\n                    } else {\n                        this.props.actions.makeToast([{ message: \"Watchlists have successfully been merged\", type: \"success\" }]);\n                    }\n                    if (callback) {\n                        callback(collections)\n                    }\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    console.log(err)\n                    this.setState({\n                        collectionIsSaving: false\n                    });\n                    let message;\n                    if (err && JSON.parse(err)) {\n                        const errorMsg = JSON.parse(err).Name;\n                        message = errorMsg && errorMsg.includes('Public users are') ? errorMsg : 'Save Failed'\n                    } else {\n                        message = \"Save Failed\";\n                    }\n                    this.props.actions.makeToast([{ message: message, type: \"failure\", long: message.includes('Public users are') }]);\n                })\n        });\n    }\n\n    removeWatchlistBills() {\n        let selectedCollection = { ...this.state.selectedCollection };\n        let billList = [...this.state.billList];\n        let fullLegislationList = [...this.state.fullLegislationList];\n        let removedBillCount = 0;\n        this.state.checkedBills.forEach((_cb, cbIndex) => {\n            if (_cb) { //sometimes the value will be undefined, don't use those\n                const legislationIndex = selectedCollection.WatchListLegislation.findIndex(leg => !leg.DeletionDate && leg.LegislationID === this.state.billList[cbIndex].LegislationID);\n                if (legislationIndex !== -1) {\n                    selectedCollection.WatchListLegislation[legislationIndex].DeletionDate = new Date().toISOString();\n                    billList.splice(cbIndex - removedBillCount, 1);\n                    fullLegislationList.splice(cbIndex - removedBillCount, 1);\n                    removedBillCount++; //need to know how many we've removed since the index for billList won't be accurate anymore the next time through\n                }\n            }\n        });\n        this.setState({\n            checkedBills: [],\n            billList: billList,\n            fullLegislationList: fullLegislationList,\n            totalResults: billList.length\n        });\n        this.handleCollectionChange(selectedCollection);\n    }\n\n    toggleReportMaker(autoReport) {\n        this.setState(state => ({\n            showReportMaker: !state.showReportMaker,\n        }), () => {\n            //Delete the watchlist if we arrived at this report from the interactive calendar Create Report button\n            //Should only be triggered by closing a report maker that was opened automatically\n            if (autoReport) {\n                this.deleteCollection();\n            }\n        });\n    }\n\n    toggleAllBills() {\n        const opposite = !this.state.selectAllBills;\n        let checkedBills = [...this.state.checkedBills];\n        checkedBills = new Array(this.state.billList.length).fill(opposite);\n        this.setState({\n            selectAllBills: opposite,\n            checkedBills: checkedBills,\n            lastCheckedBill: -1\n        });\n    }\n\n    handleBillCheckbox(billIndex, e) {\n        let checkedBills = [...this.state.checkedBills];\n        let lastCheckedBill = this.state.lastCheckedBill;\n        if (e.nativeEvent.shiftKey && this.state.lastCheckedBill !== -1) {\n            checkedBills = checkedBills.fill(false);\n            for (let i = 0; i < Math.abs(billIndex - this.state.lastCheckedBill); i++) {\n                const index = this.state.lastCheckedBill + i * (billIndex - this.state.lastCheckedBill) / Math.abs(billIndex - this.state.lastCheckedBill);\n                checkedBills[index] = true;\n            }\n        } else {\n            lastCheckedBill = !checkedBills[billIndex] ? billIndex : this.state.lastCheckedBill;\n        }\n        checkedBills[billIndex] = !checkedBills[billIndex]\n        this.setState({\n            checkedBills: checkedBills,\n            lastCheckedBill: lastCheckedBill\n        });\n    }\n\n    quickAddBills(billsToAdd, callback) {\n        let billsToSearchFor = \"\";\n        let duplicatedBills = [];\n        let ranges = [];\n        let exitFn = false;\n        this.setState({ quickAddErr: null });\n        if (this.state.selectedCollection.WatchListLegislation && this.state.selectedCollection.WatchListLegislation.filter(l => !l.DeletionDate).length > 0) {\n            const existingWatchListLegislation = [...new Set(this.state.selectedCollection.WatchListLegislation.filter(l => !l.DeletionDate).map(l => l.LegislationNumber.toUpperCase()))];\n            billsToSearchFor += existingWatchListLegislation.join(\", \");\n            let billsToAddArray = billsToAdd.split(\",\");\n            billsToAddArray.every(b => {\n                if (b.includes('-')) { //range (e.g. hb5-hb10)\n                    const rangeStartAndEnd = b.split('-'); // e.g. ['hb5', 'hb10']\n                    const rangeStart = rangeStartAndEnd[0]; // e.g. 'hb5'\n                    const rangeStartNumber = Number.parseInt(rangeStart.replace(/^\\D+/g, '')); // e.g. 5\n                    const rangeEnd = rangeStartAndEnd[1];\n                    const rangeEndNumber = Number.parseInt(rangeEnd.replace(/^\\D+/g, '')); // e.g. 10\n                    const prefix = rangeStart.replace(/\\d+/, \"\").trim().toUpperCase();\n\n                    if (!prefix || !validLegPrefixes.includes(prefix) || !rangeStartNumber || !rangeEndNumber || Number.isNaN(rangeStartNumber) || Number.isNaN(rangeEndNumber) || rangeStartNumber > rangeEndNumber) {\n                        this.setState({ quickAddErr: 'Invalid range. No bills added.' }); //return this message to the user\n                        callback(true);\n                        exitFn = true; //can't quit the outer function from within every(), forEach(), etc., so store as bool to use later\n                        return false; //exit the every()\n                    }\n                    for (let i = rangeStartNumber; i <= rangeEndNumber; i++) {\n                        const billNumber = prefix + i.toString().trim().toUpperCase();\n                        if (!existingWatchListLegislation.includes(billNumber)) {\n                            billsToSearchFor += \", \" + billNumber;\n                        } else {\n                            duplicatedBills.push(billNumber);\n                        }\n                    }\n                    ranges.push({ prefix: prefix, rangeStart: rangeStartNumber, rangeEnd: rangeEndNumber })\n                } else { //individual\n                    const billKey = Number.parseInt(b.replace(/^\\D+/g, '')); // e.g. 5\n                    if (!billKey) {\n                        this.setState({ quickAddErr: 'Invalid bill number: ' + b.trim() + ' (No bills added)' }); //return this message to the user\n                        callback(true);\n                        exitFn = true; //can't quit the outer function from within every(), forEach(), etc., so store as bool to use later\n                        return false; //exit the every()\n                    }\n\n                    const prefix = b.replace(/\\d+/, \"\").trim().toUpperCase();\n                    if (!validLegPrefixes.includes(prefix)) {\n                        this.setState({ quickAddErr: 'Invalid bill prefix: ' + prefix + ' (No bills added)' });\n                        callback(true);\n                        exitFn = true;\n                        return false;\n                    }\n\n                    if (!existingWatchListLegislation.includes(b.trim().toUpperCase())) {\n                        billsToSearchFor += \", \" + b.trim();\n                    } else {\n                        duplicatedBills.push(b.trim().toUpperCase())\n                    }\n                }\n                return true;\n            })\n        } else { //no legislation currently in the existing watchlist\n            if (billsToAdd.includes('-')) { //includes at least one range (e.g. hb5-hb10)\n                let billsToAddArray = billsToAdd.split(\",\");\n                billsToAddArray.every(b => {\n                    if (b.includes('-')) { //range (e.g. hb5-hb10)    \n                        const rangeStartAndEnd = b.split('-'); // e.g. ['hb5', 'hb10']\n                        const rangeStart = rangeStartAndEnd[0]; // e.g. 'hb5'\n                        const rangeStartNumber = Number.parseInt(rangeStart.replace(/^\\D+/g, '')); // e.g. 5\n                        const rangeEnd = rangeStartAndEnd[1];\n                        const rangeEndNumber = Number.parseInt(rangeEnd.replace(/^\\D+/g, '')); // e.g. 10\n                        const prefix = rangeStart.replace(/\\d+/, \"\").trim().toUpperCase();\n                        if (!prefix || !validLegPrefixes.includes(prefix) || !rangeStartNumber || !rangeEndNumber || Number.isNaN(rangeStartNumber) || Number.isNaN(rangeEndNumber) || rangeStartNumber > rangeEndNumber) {\n                            this.setState({ quickAddErr: 'Invalid range. No bills added.' }); //return this message to the user\n                            callback(true);\n                            exitFn = true; //can't quit the outer function from within every(), forEach(), etc., so store as bool to use later\n                            return false; //exit the every()\n                        }\n                        for (let i = rangeStartNumber; i <= rangeEndNumber; i++) {\n                            const billNumber = prefix + i.toString().trim().toUpperCase();\n                            if (billsToSearchFor.length) { billsToSearchFor += \", \" }\n                            billsToSearchFor += billNumber;\n                        }\n                        ranges.push({ prefix: prefix, rangeStart: rangeStartNumber, rangeEnd: rangeEndNumber })\n                    } else {\n                        billsToSearchFor += (billsToSearchFor.length ? \", \" : \"\") + b.trim();\n                    }\n                    return true;\n                })\n            } else {\n                let billsToAddArray = billsToAdd.split(\",\");\n                billsToAddArray.every(b => {\n\n                    const billKey = Number.parseInt(b.replace(/^\\D+/g, '')); // e.g. 5\n                    if (!billKey) {\n                        this.setState({ quickAddErr: 'Invalid bill number: ' + b.trim() + ' (No bills added)' }); //return this message to the user\n                        callback(true);\n                        exitFn = true; //can't quit the outer function from within every(), forEach(), etc., so store as bool to use later\n                        return false; //exit the every()\n                    }\n\n                    const prefix = b.replace(/\\d+/, \"\").trim().toUpperCase();\n                    if (!validLegPrefixes.includes(prefix)) {\n                        this.setState({ quickAddErr: 'Invalid bill prefix: ' + prefix + ' (No bills added)' });\n                        callback(true);\n                        exitFn = true;\n                        return false;\n                    }\n\n                    if (billsToSearchFor.length) { billsToSearchFor += \", \" }\n                    billsToSearchFor += b;\n                    return true;\n                })\n            }\n        }\n        if (exitFn) { return; }\n        const params = {\n            LegislationNumbers: [{\n                LegislationNumber: billsToSearchFor\n            }],\n            SessionID: this.state.selectedSession.SessionID\n        };\n        this.props.actions.getBillList(params).then(() => {\n            let billList = this.props.bills.billList;\n            //Filter to only one result per bill per session since DB sometimes returns duplicates\n            billList = billList.filter((item, pos) => billList.findIndex(i => i.LegislationNumber === item.LegislationNumber && i.SessionID === item.SessionID) === pos);\n            let watchlist = JSON.parse(JSON.stringify(this.state.selectedCollection));\n            //Check to see if some of the bills the user wanted to add don't exist\n            let missedBills = [];\n            // Match text that has two letters followed by numbers. There can be white space between them.\n            const foundBills = billsToSearchFor.match(/[a-zA-Z]{2}\\s*(?=[0-9])[0-9]*/ig) || [];\n\n            foundBills.forEach(fb => {\n                const noWhiteSpaceBill = fb.replace(/\\s/g, \"\").toUpperCase();\n                if (!billList.find(bill => bill.LegislationNumber.toUpperCase() === noWhiteSpaceBill)) { //desired bill is not in the bill search response\n                    //if the non-found bill was only requested within a range (e.g. hb120 within hb1-hb1000), then don't include it as a missed bill, because obviously not every number in a range will be expected\n                    const billKey = noWhiteSpaceBill.replace(/^\\D+/g, '');\n                    const billPrefix = noWhiteSpaceBill.replace(/\\d+/, \"\");\n                    if (!ranges.find(range => range.prefix === billPrefix && range.rangeStart <= billKey && range.rangeEnd >= billKey)) {\n                        missedBills.push(noWhiteSpaceBill);\n                    }\n                }\n            })\n\n            if (duplicatedBills.length) {\n                this.props.actions.makeToast([{ message: (duplicatedBills.length === 1 ? (duplicatedBills[0] + \" is \") : \"Multiple added bills were \") + \"already in this watchlist.\", type: \"warning\" }]);\n            }\n            let saveWatchlist = false;\n            billList.forEach(bill => {\n                // Make sure the bill isn't already a part of the watchlist\n                if (!watchlist.WatchListLegislation.find(leg => !leg.DeletionDate && leg.LegislationID === bill.LegislationID)) {\n                    saveWatchlist = true;\n                    watchlist.WatchListLegislation.push({\n                        LegislationID: bill.LegislationID,\n                        LegislationNumber: bill.LegislationNumber,\n                        Sessions: [{ SessionID: bill.SessionID }],\n                        WatchListID: watchlist.WatchListID\n                    });\n                }\n            });\n            if (saveWatchlist) {\n                this.handleCollectionChange(watchlist, (err => {\n                    if (!err) {\n                        this.setState({\n                            billList: billList,\n                            fullLegislationList: billList,\n                            totalResults: billList.length,\n                            checkedBills: [],\n                            lastCheckedBill: -1\n                        })\n                    }\n                }));\n            } else if (ranges.length) {\n                throw 'No bills found'\n            }\n            if (missedBills.length > 0) {\n                throw `${missedBills.length === 1 ? \"This bill\" : missedBills.length > 7 ? missedBills.length.toString() + \" bills\" : \"These bills\"} could not be added${missedBills.length <= 7 ? ': ' + missedBills.join(\", \") : \"\"}`\n            }\n            callback(false);\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return err;\n            }\n            this.setState({\n                isFetching: false\n            });\n            this.setState({ quickAddErr: err });\n            callback(true);\n        })\n    }\n\n    toggleAllNotes() {\n        const opposite = !this.state.showAllNotes;\n        this.setState({\n            showAllNotes: opposite\n        });\n        for (let i = 0; i < this._billResultRefs.length; i++) {\n            if (this._billResultRefs[i] && this._billResultRefs[i].current) {\n                this._billResultRefs[i].current.toggleBillNotesFromParent(opposite)\n            }\n        }\n    }\n\n    unload() {\n        //Delete the watchlist when the page is unloaded if the user leaves when the report maker is still open\n        this.deleteCollection();\n    }\n\n    toggleSidebar() {\n        this.setState({\n            showSidebar: !this.state.showSidebar\n        })\n    }\n\n    toggleModal() {\n        this.setState({\n            showModal: !this.state.showModal\n        })\n    }\n\n    toggleHelpModal() {\n        this.setState({\n            showHelpModal: !this.state.showHelpModal\n        })\n    }\n\n    getReportTitleObject() {\n        return { Name: this.getReportTitle() };\n    }\n\n    getReportTitle() {\n        if (this.state.selectedCollection) { return ''; }\n\n        let title = '';\n        if (this.state.allLegislation) {\n            title = \"All legislation\";\n        } else if (this.state.mostFrequent) {\n            title = \"Most frequently accessed bills\";\n        } else if (this.state.isPending) {\n            title = \"Pending bills\";\n        } else if (this.state.selectedBillStatusCategory && this.state.billStatusCategoryList.find(opt => opt.value === this.state.selectedBillStatusCategory)) {\n            title = this.state.billStatusCategoryList.find(opt => opt.value === this.state.selectedBillStatusCategory).label;\n            if (this.state.currentStatus) {\n                title += \" (Current Status)\";\n            }\n        }\n        return title;\n    }\n\n    handleToggleCompositeView() {\n        let billList = []\n        this.state.billList.forEach(x => {\n            billList.push({\n                LegislationNumber: x.LegislationNumber,\n                SessionID: x.SessionID\n            })\n        });\n        this.setState({ compositeView: !this.state.compositeView }, () => {\n            const jsonData = JSON.stringify({\n                showCatchline: true,\n                showCurrentStatus: false,\n                showTitle: false,\n                showChiefPatron: true,\n                showAllPatrons: false,\n                showSummary: false,\n                showNotes: true,\n                userCreated: this.props.login.userProfile.email || '',\n                selectedNotes: \"current\",\n                selectedCollection: this.state.selectedCollection && this.state.selectedCollection.Name && this.state.selectedCollection.WatchListID ? this.state.selectedCollection.WatchListID : '',\n                reportTitle: \"\",\n                showHistory: {\n                    all: false,\n                    recent: true,\n                    mostRecentAmount: \"1\",\n                    showVotes: false,\n                    Committee: true,\n                    Subcommittee: false\n                },\n                showHouseAmendments: false,\n                showSenateAmendments: false,\n                showConferenceAmendments: false,\n                showGovernorsRecommendations: false,\n                showStatus: {},\n                showCommitteeEvent: {},\n                showLdNumber: false,\n                showClerkNames: false,\n                showDlsStaffNames: false,\n                personalMessage: \"\",\n                billList: billList\n            });\n            this.props.actions.saveBillReportInformation(window.btoa(jsonData)).then(() => {\n                const billReportInformation = this.props.report.billReportInformation;\n                if (billReportInformation && billReportInformation.ReportNumber) {\n                    window.open('/bill-search-report/composite/' + billReportInformation.ReportNumber, '_blank');\n                } else {\n                    this.props.actions.makeToast([{ message: \"Composite View Generation Failed\", type: \"failure\" }]);\n                }\n                this.setState({ compositeView: false })\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n                this.props.actions.makeToast([{ message: \"Composite View Generation Failed\", type: \"failure\" }]);\n                this.setState({\n                    compositeView: false\n                });\n            })\n        })\n    }\n\n    render() {\n        const { isFetching, sessionID, billList, showSidebar, height } = this.state;\n        const { errorMessage } = this.props.bills;\n\n        const userCanUseCollections = Boolean(this.props.login.userClaims.resources.find(resource => resource === BILL_COLLECTION_AUTHOR));\n\n        const nextPageLoadingHeight = '100px';\n\n        let billResultRefs = [];\n        billList.forEach((_b) => billResultRefs.push(React.createRef()));\n        this._billResultRefs = billResultRefs;\n\n        let toggleArrows = [];\n        for (let i = 1; i <= height; i++) {\n            let top = (i * 540).toString() + \"px\";\n            toggleArrows.push(<button key={i} type=\"button\" aria-expanded={showSidebar} onClick={this.toggleSidebar} className={showSidebar ? \"sidebar-button arrow-up white-chevron\" : \"sidebar-button arrow-down white-chevron\"} style={{ top: top }}></button>);\n        }\n\n        return (\n            <div className=\"bill-theme bill-search-container\">\n                {this.state.historicalSessionRedirect &&\n                    <div className=\"schedule-modal\">\n                        <div className=\"schedule-modal-content fit-content center-content\">\n                            <p>For historical data, please use <b>Legacy LIS</b>, available at <b><a href=\"https://legacylis.virginia.gov\" target=\"_blank\" rel=\"noreferrer\">https://legacylis.virginia.gov</a></b>.</p>\n                            <p>Click 'Go' to be taken to Legacy LIS, or 'Close' to remain here.</p>\n                            <div className=\"inline-list\">\n                                <button className=\"button primary float-right\" onClick={() => this.state.historicalSessionRedirect(true)}>Go</button>\n                                <button className=\"button secondary float-right\" onClick={() => this.state.historicalSessionRedirect(false)}>Close</button>\n                            </div>\n                            <br />\n                        </div>\n                    </div>\n                }\n                {this.state.showModal &&\n                    <div className=\"schedule-modal\">\n                        <div className=\"schedule-modal-content\">\n                            <p>You will need to click the search button or press the enter key in order to update your search results after removing a search parameter.</p>\n                            <button className=\"button primary float-right\" onClick={() => this.toggleModal()}>Close</button>\n                            <br />\n                        </div>\n                    </div>\n                }\n                {this.state.showHelpModal &&\n                    <div className=\"schedule-modal\">\n                        <div className=\"schedule-modal-content seach-help-modal\">\n                            <a className=\"float-right\" style={{ cursor: \"pointer\" }} onClick={() => this.toggleHelpModal()}>X</a>\n                            <SearchHelp />\n                            <button className=\"button primary float-right\" onClick={() => this.toggleHelpModal()}>Close</button>\n                            <br />\n                        </div>\n                    </div>\n                }\n                {this.state.showReportMaker &&\n                    <ReportMaker\n                        toggleReportMaker={this.toggleReportMaker}\n                        billList={this.state.mostFrequent ? this.state.billList : this.state.fullLegislationList}\n                        collections={this.state.collections}\n                        selectedCollection={this.state.selectedCollection || this.getReportTitleObject()}\n                        autoReport={this.state.autoReport}\n                        reportTitle={this.getReportTitle()}\n                    />\n                }\n                <br />\n                <div className={showSidebar ? \"inner-grid one-toggle-and-three\" : \"inner-grid toggle-and-three\"}>\n                    {showSidebar &&\n                        <div>\n                            <LegislationWatchlists\n                                collections={this.state.collections}\n                                isLoading={this.state.collectionIsLoading}\n                                error={this.props.collection.collectionError}\n                                selectedCollectionIndex={this.state.selectedCollectionIndex}\n                                selectCollection={this.selectCollection}\n                                createCollection={this.createCollection}\n                                collectionIsSaving={this.state.collectionIsSaving}\n                                location={this.props.history.location.pathname}\n                                isAuthor={this.props.login.userClaims.resources.find(resource => resource === BILL_COLLECTION_AUTHOR)}\n                            />\n                            <br />\n                            <AdvancedSearchBox\n                                ref={this.searchBox}\n                                selectedBillNumbers={this.state.selectedBillNumbers}\n                                selectedBillRangeBeginning={this.state.selectedBillRangeBeginning}\n                                selectedBillRangeEnd={this.state.selectedBillRangeEnd}\n                                selectedChapterNumber={this.state.selectedChapterNumber}\n                                selectedKeywords={this.state.selectedKeywords}\n                                selectedBillEvent={this.state.selectedBillEvent}\n                                billEventOptions={this.state.billEventOptions}\n                                sessionOptions={this.state.sessionOptions}\n                                selectedSession={this.state.selectedSession}\n                                billStatusCategoryList={this.state.billStatusCategoryList}\n                                selectedBillStatusCategory={this.state.selectedBillStatusCategory}\n                                billStatusStartDate={this.state.billStatusStartDate}\n                                billStatusEndDate={this.state.billStatusEndDate}\n                                selectedCommittee={this.state.selectedCommittee}\n                                committeeList={this.state.filteredCommitteeList}\n                                subcommitteeList={this.state.subcommitteeList}\n                                selectedSubcommittee={this.state.selectedSubcommittee}\n                                patronList={this.state.filteredPatronList}\n                                patronRoles={this.state.patronRoles}\n                                selectedPatron={this.state.selectedPatron}\n                                selectedPatronType={this.state.selectedPatronType}\n                                selectedChamber={this.state.selectedChamber}\n                                selectedBillType={this.state.selectedBillType}\n                                billEventEndDate={this.state.billEventEndDate}\n                                billEventStartDate={this.state.billEventStartDate}\n                                resetUrl={this.resetUrl}\n                                handleSubmit={this.handleSubmit}\n                                handleTextChange={this.handleTextChange}\n                                handleSelectChange={this.handleSelectChange}\n                                handleDateChange={this.handleDateChange}\n                                committeeChange={this.committeeChange}\n                                chamberChange={this.chamberChange}\n                                sessionChange={this.sessionChange}\n                                clearForm={this.clearForm}\n                                isFetching={this.state.isFetching}\n                                handlePatronChange={this.handlePatronChange}\n                                handlePatronTypeChange={this.handlePatronTypeChange}\n                                subjectList={this.state.subjectList}\n                                selectedSubject={this.state.selectedSubject}\n                                toggleGroup={this.toggleGroup}\n                                billFieldset={this.state.billFieldset}\n                                keywordFieldset={this.state.keywordFieldset}\n                                statusFieldset={this.state.statusFieldset}\n                                activityFieldset={this.state.activityFieldset}\n                                membersFieldset={this.state.membersFieldset}\n                                committeesFieldset={this.state.committeesFieldset}\n                                subjectFieldset={this.state.subjectFieldset}\n                                showCategories={this.state.showCategories}\n                                toggleShowCategories={this.toggleShowCategories}\n                                location={this.props.history.location.pathname}\n                                searchParam={this.props.history.location.search}\n                                billVersionList={this.state.billVersionList}\n                                selectedBillVersion={this.state.selectedBillVersion}\n                                billSummaryList={this.state.billSummaryList}\n                                selectedSummaryVersion={this.state.selectedSummaryVersion}\n                                selectedLocation={this.state.selectedLocation}\n                                keywordUseGlobalSessionSearch={this.state.keywordUseGlobalSessionSearch}\n                                handleRadioChange={this.handleRadioChange}\n                                handleCurrentStatusChange={this.handleCurrentStatusChange}\n                                currentStatus={this.state.currentStatus}\n                                handleExcludeFailedChange={this.handleExcludeFailedChange}\n                                excludeFailed={this.state.excludeFailed}\n                                toggleHelpModal={this.toggleHelpModal}\n                                failedToGetSessions={this.state.failedToGetSessions}\n                                showReportMaker={this.state.showReportMaker}\n                                showUpdateSearchButton={this.state.showUpdateSearchButton}\n                            />\n                        </div>\n                    }\n                    <div className={showSidebar ? \"sidebar-toggle-open\" : \"sidebar-toggle-closed\"} onClick={this.toggleSidebar}>\n                        {toggleArrows.map((a, i) => {\n                            return (a)\n                        })}\n                    </div>\n                    {this.state.failedToGetSessions ? <div className=\"center input-feedback\" style={{ fontSize: '1em' }}>Failed to retrieve sessions. Please refresh & try again.</div> : !this.state.selectedSession ? <div className=\"center-spinner spinner\">Loading...</div>\n                        :\n                        this.state.showCategories ?\n                            <BillCategories\n                                session={this.state.sessionOptions.find(session => session.SessionCode === this.props.nav.session)}\n                                patronList={this.state.patronList}\n                                committeeList={this.state.groupedCommitteeList}\n                                subjectList={this.state.subjectList}\n                                introDateList={this.state.introDateList}\n                                statusCategoriesList={this.state.billStatusCategoryList}\n                                isLoading={this.state.billStatusCategoryListIsLoading}\n                                history={this.props.history}\n                                location={this.props.history.location.pathname}\n                                selectedSession={this.state.selectedSession}\n                                excludeFailed={this.state.excludeFailed}\n                            />\n                            :\n                            <div id=\"results-div\">\n                                {userCanUseCollections &&\n                                    <React.Fragment>\n                                        <CollectionControls\n                                            searchMade={this.state.searchMade}\n                                            collections={this.state.collections}\n                                            selectedCollection={this.state.selectedCollection}\n                                            selectedCollectionIndex={this.state.selectedCollectionIndex}\n                                            handleCollectionChange={this.handleCollectionChange}\n                                            handleToggleCompositeView={this.handleToggleCompositeView}\n                                            selectCollection={this.selectCollection}\n                                            collectionIsSaving={this.state.collectionIsSaving}\n                                            deleteCollection={this.deleteCollection}\n                                            checkedBills={this.state.checkedBills}\n                                            addToWatchlists={this.addToWatchlists}\n                                            billListLength={this.state.billList.length}\n                                        />\n                                        {!this.state.searchMade &&\n                                            <WatchlistNotifications\n                                                selectedCollection={this.state.selectedCollection}\n                                                handleCollectionChange={this.handleCollectionChange}\n                                                memberList={this.state.patronList}\n                                                committeeList={this.state.groupedCommitteeList}\n                                                criteriaTypes={this.state.criteriaTypes}\n                                                collectionIsSaving={this.state.collectionIsSaving}\n                                            />\n                                        }\n                                    </React.Fragment>\n                                }\n                                {this.state.searchMade &&\n                                    <SearchSelections\n                                        currentStatus={this.state.currentStatus}\n                                        selectedSession={this.state.selectedSession}\n                                        selectedBillNumbers={this.state.selectedBillNumbers}\n                                        selectedBillRangeBeginning={this.state.selectedBillRangeBeginning}\n                                        selectedBillRangeEnd={this.state.selectedBillRangeEnd}\n                                        selectedChapterNumber={this.state.selectedChapterNumber}\n                                        selectedKeywords={this.state.searchedKeywords || this.state.selectedKeywords}\n                                        selectedBillEvent={this.state.billEventOptions.find(opt => opt.value === this.state.selectedBillEvent)}\n                                        selectedBillStatusCategory={this.state.billStatusCategoryList.find(opt => opt.value === this.state.selectedBillStatusCategory)}\n                                        billStatusStartDate={this.state.billStatusStartDate}\n                                        billStatusEndDate={this.state.billStatusEndDate}\n                                        selectedCommittee={this.state.committeeList.find(opt => opt.value === this.state.selectedCommittee)}\n                                        selectedSubcommittee={this.state.subcommitteeList.find(opt => opt.value === this.state.selectedSubcommittee)}\n                                        selectedPatron={this.state.patronList.find(opt => opt.value === this.state.selectedPatron)}\n                                        selectedPatronType={this.state.patronRoles.filter(role => this.state.selectedPatronType.includes(role.PatronTypeID))}\n                                        selectedChamber={this.state.selectedChamber}\n                                        billEventEndDate={this.state.billEventEndDate}\n                                        billEventStartDate={this.state.billEventStartDate}\n                                        selectedSubject={this.state.subjectList.find(opt => opt.value === this.state.selectedSubject)}\n                                        excludeFailed={this.state.excludeFailed}\n                                        handleSelectionClear={this.handleSelectionClear}\n                                        handleMultiSelectionClear={this.handleMultiSelectionClear}\n                                        updateSearch={this.state.showUpdateSearchButton ? this.searchBox.current.handleSubmit : null}\n                                    />}\n                                {!isFetching &&\n                                    <>\n                                        <div className=\"flex-row search-results-title-section\">\n                                            {this.state.searchMade ?\n                                                <>\n                                                    {this.state.allLegislation && <h2>All legislation</h2>}\n                                                    {this.state.mostFrequent && <h2>Most frequently accessed bills</h2>}\n                                                    {this.state.isPending && <h2>Pending bills</h2>}\n                                                    {!this.state.isPending && !this.state.mostFrequent && !this.state.allLegislation && <h2 style={{ marginTop: \"0px\", marginBottom: \"10px\" }}>{billList.length === 0 && \"No \"}Search Results</h2>}\n                                                </>\n                                                : <div></div>}\n                                            {!this.state.selectedCollection || this.state.searchMade ?\n                                                <div className=\"inline-list\">\n                                                    {billList.length > 0 &&\n                                                        <React.Fragment>\n                                                            <button onClick={() => this.toggleReportMaker()} id=\"create-report-button\" type=\"button\" className={`${this.state.selectedCollection ? 'set-right ' : ''}button small-button`} style={{ marginRight: '0px', marginTop: \"8px\" }}>Create Report</button>\n                                                        </React.Fragment>\n                                                    }\n                                                </div>\n                                                :\n                                                <div />\n                                            }\n                                        </div>\n                                        {this.state.selectedCollection &&\n                                            <div className=\"flex-row flex-vertical-center notes-and-controls\">\n                                                {this.state.searchMade ?\n                                                    <>\n                                                        <div>\n                                                            <button\n                                                                type=\"button\"\n                                                                disabled={this.state.checkedBills.every(b => b === false) || this.state.collectionIsSaving}\n                                                                className=\"button small-button\"\n                                                                onClick={() => this.addToWatchlists(JSON.parse(JSON.stringify([this.state.selectedCollection])))}>Add</button>\n                                                        </div>\n                                                    </>\n                                                    :\n                                                    <>\n                                                        <div className=\"inline-list\">\n                                                            <button aria-label=\"remove watchlist bills\" onClick={this.removeWatchlistBills} type=\"button\" disabled={this.state.checkedBills.every(b => b === false) || this.state.collectionIsSaving} className=\"button danger small-button\">Remove</button>\n                                                            <button aria-label=\"toggle all notes\" disabled={this.state.collectionIsSaving} className=\"button-link toggle-all-notes\" onClick={this.toggleAllNotes} type=\"button\">{this.state.showAllNotes ? \"Hide\" : \"Show\"} All Notes +/-</button>\n                                                        </div>\n                                                        <div className=\"inline-list\" style={{ marginRight: \"0px\", display: this.state.quickAddErr ? \"grid\" : null }}>\n                                                            <QuickAdd\n                                                                quickAddBills={this.quickAddBills}\n                                                                quickAddErr={this.state.quickAddErr}\n                                                                autoFocus={!this.state.skippedRecords}\n                                                                collectionIsSaving={this.state.collectionIsSaving}\n                                                            />\n                                                            {billList.length > 0 &&\n                                                                <div style={{ display: 'inline-flex', justifyContent: 'end', marginRight: '0px', marginTop: this.state.quickAddErr ? '5px' : null }}>\n                                                                    <button onClick={() => this.toggleReportMaker()} id=\"create-report-button\" type=\"button\" className={`${this.state.selectedCollection ? 'set-right ' : ''}button small-button`} style={{ marginRight: '0px' }}>Create Report</button>\n                                                                </div>\n                                                            }\n                                                        </div>\n                                                    </>\n                                                }\n                                            </div>\n                                        }\n                                    </>\n                                }\n                                <div className=\"public-list search-results\">\n                                    {isFetching && !this.state.skippedRecords ?\n                                        <div className=\"spinner\"></div>\n                                        :\n                                        <>\n                                            {errorMessage ?\n                                                <p className=\"message-error\">{errorMessage}</p>\n                                                :\n                                                null\n                                            }\n                                        </>\n                                    }\n                                    {(!isFetching || this.state.skippedRecords) && billList.length && !errorMessage ?\n                                        <ul className=\"slidedown-list\">\n                                            <div className='flex-row'>\n                                                {userCanUseCollections ?\n                                                    <label htmlFor=\"sr-select-all\"\n                                                        className=\"txt-greyed\">\n                                                        <input id=\"sr-select-all\" checked={this.state.selectAllBills} onChange={this.toggleAllBills} type=\"checkbox\" style={{ verticalAlign: 'sub', marginRight: '10px' }} />\n                                                        Select all</label>\n                                                    :\n                                                    <div></div>}\n                                                {!errorMessage && <span id=\"search-result-count\" className=\"txt-greyed\">{this.state.totalResults} {this.state.searchMade ? \"Result\" : \"Item\"}{this.state.totalResults !== 1 && \"s\"}</span>}\n                                            </div>\n                                            {!this.state.displayCrossSession && <hr className=\"faded-line\" />}\n                                            {billList.map((bill, i) =>\n                                                <React.Fragment>\n                                                    {this.state.displayCrossSession && i === 0 &&\n                                                        <div className=\"search-session-header\">\n                                                            <label>{this.state.sessionOptions.find(x => x.SessionID === bill.SessionID).SessionYear + \" \" + this.state.sessionOptions.find(x => x.SessionID === bill.SessionID).DisplayName}</label>\n                                                        </div>\n                                                    }\n\n                                                    {this.state.displayCrossSession && billList[i + 1] && billList[i].SessionID != billList[i + 1].SessionID || this.state.displayCrossSession && billList[i + 1] === undefined\n                                                        ?\n                                                        <React.Fragment>\n                                                            <BillInfoComponent\n                                                                key={i}\n                                                                ref={this._billResultRefs[i]}\n                                                                userCanUseCollections={userCanUseCollections}\n                                                                bill={bill}\n                                                                billIndex={i}\n                                                                sessionID={sessionID}\n                                                                toggleShowData={this.toggleShowData}\n                                                                expanded={this.state[bill.LegislationID]}\n                                                                sessionCode={this.state.sessionOptions.find(session => session.SessionID === bill.SessionID) && this.state.sessionOptions.find(session => session.SessionID === bill.SessionID).SessionCode}\n                                                                selectedCollection={this.state.selectedCollection}\n                                                                handleCollectionChange={this.handleCollectionChange}\n                                                                collectionIsSaving={this.state.collectionIsSaving}\n                                                                handleBillCheckbox={e => this.handleBillCheckbox(i, e)}\n                                                                checked={this.state.checkedBills[i]}\n                                                                selectedKeywords={this.state.searchedKeywords || this.state.selectedKeywords}\n                                                                selectedLocation={this.state.displaySelectedLocation}\n                                                                searchMade={this.state.searchMade}\n                                                                session={this.state.sessionOptions.find(x => x.SessionID === bill.SessionID)}\n                                                                displayCrossSession={this.state.displayCrossSession}\n                                                                newSession={true}\n                                                                displayChapterNumber={this.state.selectedChapterNumber || (this.state.selectedBillStatusCategory && this.state.billStatusCategoryList.find(it => it.Name.toLowerCase() === \"acts of assembly chapters\") && this.state.selectedBillStatusCategory === this.state.billStatusCategoryList.find(it => it.Name.toLowerCase() === \"acts of assembly chapters\").LegislationCategoryID)}\n                                                                compositeView={this.state.compositeView}\n                                                            />\n                                                            {billList[i + 1] &&\n                                                                <div className=\"search-session-header\">\n                                                                    <label>{this.state.sessionOptions.find(x => x.SessionID === billList[i + 1].SessionID).SessionYear + \" \" + this.state.sessionOptions.find(x => x.SessionID === billList[i + 1].SessionID).DisplayName}</label>\n                                                                </div>\n                                                            }\n                                                        </React.Fragment>\n                                                        :\n                                                        <BillInfoComponent\n                                                            key={i}\n                                                            ref={this._billResultRefs[i]}\n                                                            userCanUseCollections={userCanUseCollections}\n                                                            bill={bill}\n                                                            billIndex={i}\n                                                            sessionID={sessionID}\n                                                            sessionCode={this.state.sessionOptions.find(session => session.SessionID === bill.SessionID) && this.state.sessionOptions.find(session => session.SessionID === bill.SessionID).SessionCode}\n                                                            selectedCollection={this.state.selectedCollection}\n                                                            handleCollectionChange={this.handleCollectionChange}\n                                                            collectionIsSaving={this.state.collectionIsSaving}\n                                                            handleBillCheckbox={e => this.handleBillCheckbox(i, e)}\n                                                            checked={this.state.checkedBills[i]}\n                                                            selectedKeywords={this.state.searchedKeywords || this.state.selectedKeywords}\n                                                            toggleShowData={this.toggleShowData}\n                                                            expanded={this.state[bill.LegislationID]}\n                                                            selectedLocation={this.state.displaySelectedLocation}\n                                                            searchMade={this.state.searchMade}\n                                                            session={this.state.sessionOptions.find(x => x.SessionID === bill.SessionID)}\n                                                            displayCrossSession={this.state.displayCrossSession}\n                                                            displayChapterNumber={this.state.selectedChapterNumber || (this.state.selectedBillStatusCategory && this.state.billStatusCategoryList.find(it => it.Name.toLowerCase() === \"acts of assembly chapters\") && this.state.selectedBillStatusCategory === this.state.billStatusCategoryList.find(it => it.Name.toLowerCase() === \"acts of assembly chapters\").LegislationCategoryID)}\n                                                            compositeView={this.state.compositeView}\n                                                        />\n                                                    }\n                                                </React.Fragment>\n                                            )}\n                                        </ul>\n                                        : null\n                                    }\n                                </div>\n                            </div>\n                    }\n                </div>\n                <div\n                    ref={loadingRef => (this.loadingRef = loadingRef)}\n                    style={{ position: 'relative', bottom: !isFetching && this.state.hasNextPage ? ((window.innerHeight || document.documentElement.clientHeight) * .35) + 'px' : null }}\n                >\n                    {isFetching && this.state.skippedRecords ?\n                        <div className=\"spinner\" style={{ height: nextPageLoadingHeight, margin: 'auto' }}></div>\n                        :\n                        this.state.hasNextPage ?\n                            <div style={{ marginTop: nextPageLoadingHeight }} />\n                            : null\n                    }\n                </div>\n            </div>\n        )\n    }\n}\n\nconst PublicBillSearch = connect(\n    (state) => {\n        const { bills, session, members, committee, patrons, nav, collection, login, report } = state;\n        return {\n            bills,\n            session,\n            members,\n            committee,\n            patrons,\n            nav,\n            collection,\n            login,\n            report\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, authActionCreators, committeeActionCreators, billActionCreators, sessionActionCreators, memberActionCreators, patronActionCreators, navActionCreators, collectionActionCreators, reportActionCreators), dispatch)\n        }\n    }\n)(BillSearchComponent)\n\nexport default PublicBillSearch;","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport {reportActionCreators} from '../../../stores/lis-report-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\n\nclass ShareReport extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            emailAddresses: '',\n            isSharing: false\n        };\n        this.handleEmailAddressChange = this.handleEmailAddressChange.bind(this);\n        this.sendReport = this.sendReport.bind(this);\n    }\n\n    \n    handleEmailAddressChange(e) {\n        this.setState({\n            emailAddresses: e.target.value\n        });\n    }\n\n    sendReport() {\n        this.setState({\n            isSharing: true\n        });\n        const url = encodeURIComponent(window.location.href);\n        const emailAddresses = encodeURIComponent(this.state.emailAddresses);\n        this.props.actions.shareReport(`?link=${url}&addresses=${emailAddresses}`)\n        .then(() => {\n            this.props.actions.makeToast([{ message: \"Share Successful\", type: \"success\" }]);\n            this.setState({\n                isSharing: false,\n                emailAddresses: ''\n            })\n        }).catch(err => {\n            if(err === \"Aborted\") {\n                return\n            }\n            this.setState({\n                isSharing: false\n            })\n            this.props.actions.makeToast([{ message: \"Share Failed\", type: \"failure\" }]);\n        })\n    }\n\n    render() {\n        return(<div onClick={!this.state.isSharing ? this.props.toggleShareForm : null} className=\"overlay center-content\">\n            <div className=\"full\">\n            <div onClick={e => e.stopPropagation()} className=\"dlas-forms user-forms advanced-search overlay-content animated-fade-in-up\">\n                <div>\n                    <label htmlFor=\"email-addresses-to-send-to\" className=\"label\">Share link to report. (Seperate email addresses by a comma)</label>\n                    <div className=\"inline-list\">\n                        <input id=\"email-addresses-to-send-to\" aria-label=\"Email addresses to send to\" style={{width: \"90%\"}}onChange={this.handleEmailAddressChange} value={this.state.emailAddresses} placeholder=\"Email addresses to send to\"/>\n                    </div>\n                </div>\n                <br />\n                <hr className=\"faded-line\" />\n                <div className=\"align-right inline-list\">\n                    {this.state.isSharing &&\n                        <div className=\"small-spinner\"></div>\n                    }\n                    <button type=\"button\" disabled={this.state.isSharing} className=\"button secondary\" onClick={this.props.toggleShareForm}>Close</button>\n                    <button type=\"button\" disabled={this.state.isSharing || !this.state.emailAddresses} className=\"button\" onClick={this.sendReport}>Share</button>\n                </div>\n            </div>\n            </div>\n        </div>);\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { report, nav } = state;\n        return {\n            report,\n            nav\n            \n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, reportActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(ShareReport);","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport renderHTML from 'react-render-html';\nimport moment from 'moment-timezone';\nimport { saveAs } from 'file-saver';\nimport { generateCsv } from '../../../services/csv.service';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport stripTags from \"striptags\";\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\nimport { memberActionCreators } from '../../../stores/lis-members-store';\nimport { billActionCreators } from '../../../stores/lis-legislation-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { patronActionCreators } from '../../../stores/lis-patron-store';\nimport { voteActionCreators } from '../../../stores/lis-votes-store';\nimport { collectionActionCreators } from '../../../stores/lis-collection-store';\nimport { reportActionCreators } from \"../../../stores/lis-report-store\";\nimport { personnelActionCreators } from '../../../stores/lis-personnel-store';\nimport { Link } from 'react-router-dom';\n\nimport ShareReport from './share-report'\n\nconst BILL_COLLECTION_AUTHOR = \"LegislationCollections\";\nconst STAFF = \"STAFF\";\nconst CLERKS = \"CLERKS\";\n\nconst MAX_BILL_HISTORY_CHUNK_SIZE = 125;\n\nconst weights = {\n    \"Committee\": 1,\n    \"Subcommittee\": 2,\n    \"recent\": 3,\n    \"all\": 4\n}\nconst sortBillHistoryTypes = (typeA, typeB) => {\n    return weights[typeA] - weights[typeB];\n}\n\nclass ReportMaker extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            showCatchline: true,\n            showCurrentStatus: true,\n            showTitle: false,\n            showChiefPatron: false,\n            showAllPatrons: false,\n            showSummary: false,\n            showNotes: false,\n            selectedNotes: 'all',\n            showHistory: false,\n            showHouseAmendments: false,\n            showSenateAmendments: false,\n            showConferenceAmendments: false,\n            showGovernorsRecommendations: false,\n            showStatus: {},\n            showCommitteeEvent: {},\n            showLdNumber: false,\n            showClerkNames: false,\n            showDlsStaffNames: false,\n            billData: [],\n            billList: [],\n            collections: [],\n            committeeClerksAndStaff: [],\n            generatingBillNumbers: true,\n            generatingReport: true,\n            hbCount: 0,\n            hjCount: 0,\n            sbCount: 0,\n            sjCount: 0,\n            showTooltip: false,\n            compositeSortValue: \"LegislationNumberAsc\",\n            showNotes: true\n        };\n        this.getReportData = this.getReportData.bind(this);\n        this.makeHtml = this.makeHtml.bind(this);\n        this.makePrintout = this.makePrintout.bind(this);\n        this.makeSpreadsheet = this.makeSpreadsheet.bind(this);\n        this.toggleShareForm = this.toggleShareForm.bind(this);\n        this.toggleTooltip = this.toggleTooltip.bind(this);\n        this.getBillHistoryTypeLabel = this.getBillHistoryTypeLabel.bind(this);\n        this.toggleCompositeSort = this.toggleCompositeSort.bind(this);\n        this.toggleShowNotes = this.toggleShowNotes.bind(this);\n\n        this.reportData = React.createRef();\n        this.htmlRef = React.createRef();\n        this.printOutRef = React.createRef();\n    }\n\n    async getCommitteeClerksOrStaff(bill, sessionStartDate, role) {\n        if (role === STAFF) {\n            bill.loadingStaffNames = true;\n        } else {\n            bill.loadingClerkNames = true;\n        }\n        this.props.actions.getPersonnelList(\"staffroletypeid=\" + role === STAFF ? this.state.staffRoleTypeID : this.state.clerkRoleTypeID + \"&affiliationID=\" + bill.CommitteeID + \"&effectiveBeginDate=\" + sessionStartDate, true)\n            .then(() => {\n                let committeeClerksAndStaff = [...this.state.committeeClerksAndStaff];\n                let personnelList = role === STAFF ? this.props.personnel.personnelStaffList : this.props.personnel.personnelClerkList;\n                personnelList.forEach(p => {\n                    p.SessionID = bill.SessionID\n                })\n                committeeClerksAndStaff = committeeClerksAndStaff.concat(personnelList);\n                this.setState({ committeeClerksAndStaff })\n            })\n        if (role === STAFF) {\n            bill.loadingStaffNames = false;\n        } else {\n            bill.loadingClerkNames = false;\n        }\n    }\n\n    async getLdNumber(bill, versions) {\n        bill.loadingLdNumber = true;\n        if (!versions) {\n            const params = '?BillNumber=' + bill.LegislationNumber + '&sessionID=' + bill.SessionID;\n            await this.props.actions.getBillVersionByBillNumber(params).then(async () => {\n                versions = this.props.bills.billVersion || [];\n            })\n        }\n        const fullTextVersions = versions.filter(v => v.IsActive && [\"Engrossed\", \"Reengrossed\", \"Enrolled\", \"Reenrolled\", \"Chaptered\", \"Governor's Veto\", \"Introduced\", \"Substitute\"].includes(v.Version));\n        const latestFullTextVersion = fullTextVersions.length ? fullTextVersions.reduce(function (r, a) {\n            return r.DraftDate > a.DraftDate ? r : a;\n        }) : null;\n        bill.LdNumber = latestFullTextVersion ? latestFullTextVersion.LDNumber : null;\n        bill.loadingLdNumber = false;\n    }\n\n    async getAmendments(bill) {\n        bill.loadingAmendments = true;\n        const params = '?BillNumber=' + bill.LegislationNumber + '&sessionID=' + bill.SessionID;\n        await this.props.actions.getBillVersionByBillNumber(params).then(async () => {\n            if (this.state.showLdNumber) {\n                bill.LdNumber = this.getLdNumber(this.props.bills.billVersion || []);\n            }\n            bill.amendments = [];\n            const amendments = this.props.bills.billVersion.filter(version => {\n                if (version.Version.includes('Amendment') && ((this.state.showHouseAmendments && version.ChamberCode === 'H') || (this.state.showSenateAmendments && version.ChamberCode === 'S'))) {\n                    return true;\n                } else if (version.Version.includes('Conference') && this.state.showConferenceAmendments) {\n                    return true;\n                } else if (version.Version.includes('Recommendation') && this.state.showGovernorsRecommendations) {\n                    return true;\n                }\n                return false;\n            });\n            for (let i = 0; i < amendments.length; i++) {\n                await this.props.actions.getBillText('?isPublic=true&legislationTextID=' + amendments[i].LegislationTextID)\n                    .then(() => {\n                        if (this.props.bills.billText !== 0) {\n                            bill.amendments.push(this.props.bills.billText[0]);\n                        }\n                    })\n            }\n            bill.loadingAmendments = false;\n            return Promise.resolve();\n        }).catch(err => {\n            bill.loadingAmendments = false;\n            return Promise.reject(err);\n        });\n    }\n\n    async getBillHistory(bills) {\n        const { showHistory } = this.state;\n        let legislationIDs = \"\";\n        bills.forEach((bill, i) => {\n            bill.loadingHistory = true;\n            legislationIDs += `${i === 0 ? '?' : '&'}legislationIDs=${bill.LegislationID}`;\n        })\n        await this.props.actions.getBillHistoryByBillID(legislationIDs)\n            .then(async () => {\n                const allResults = this.props.bills.billHistory;\n                for (const bill of bills) {\n                    let results = allResults.filter(b => b.LegislationID === bill.LegislationID);\n\n                    let billHistory = {};\n                    if (showHistory.recent) {\n                        if (results.length > showHistory.mostRecentAmount) {\n                            billHistory.recent = results.slice(results.length - parseInt(showHistory.mostRecentAmount || 0));\n                        } else {\n                            billHistory.recent = results;\n                        }\n                    } else if (showHistory.all) {\n                        billHistory.all = results;\n                    }\n                    if (showHistory.Committee || showHistory.Subcommittee) {\n                        results.forEach(historyItem => {\n                            if (historyItem.CommitteeName && !historyItem.ParentCommitteeName && showHistory.Committee) {\n                                //Need to get the full list of committee events in composite view\n                                //so we can get the latest committee event for both chambers -JGB\n                                if (!this.props.match.path.includes(\"composite\")) {\n                                    billHistory.Committee = [historyItem];\n                                } else if (historyItem.Status === \"In Committee\") {\n                                    if (!billHistory.Committee) {\n                                        billHistory.Committee = [];\n                                    }\n                                    billHistory.Committee.push(historyItem);\n                                }\n                            } else if (historyItem.ParentCommitteeName && showHistory.Subcommittee) {\n                                billHistory.Subcommittee = [historyItem];\n                            }\n                        });\n                    }\n                    let committeeEvents = {};\n                    results.forEach(historyItem => {\n                        if (!committeeEvents.firstSenateCommitteeEvent && historyItem.ChamberCode === \"S\" && historyItem.Status === \"In Committee\") {\n                            committeeEvents.firstSenateCommitteeEvent = historyItem;\n                        }\n                        if (!committeeEvents.firstHouseCommitteeEvent && historyItem.ChamberCode === \"H\" && historyItem.Status === \"In Committee\") {\n                            committeeEvents.firstHouseCommitteeEvent = historyItem;\n                        }\n                        if (historyItem.ChamberCode === \"S\" && historyItem.Status === \"In Subcommittee\") {\n                            committeeEvents.lastSenateSubcommitteeEvent = historyItem;\n                        }\n                        if (historyItem.ChamberCode === \"H\" && historyItem.Status === \"In Subcommittee\") {\n                            committeeEvents.lastHouseSubcommitteeEvent = historyItem;\n                        }\n                    });\n                    bill.committeeEvents = committeeEvents;\n                    bill.billHistory = billHistory;\n                    bill.loadingHistory = false;\n                    if (showHistory.showVotes) {\n                        //Can't use a foreach function right here because async will not work since foreach takes a function.\n                        for (let i = 0; i < results.length; i++) {\n                            if (results[i].VoteID) {\n                                this.getVoteDetails(results, i);\n                            }\n                        }\n                    }\n                };\n                return Promise.resolve()\n            }).catch(err => { bills.map(bill => bill.loadingHistory = false); Promise.reject(err) });\n    }\n\n    async getVoteDetails(billHistory, i) {\n        billHistory[i].loadingVotes = true;\n        await this.props.actions.getVoteDetails('?voteID=' + billHistory[i].VoteID)\n            .then(() => {\n                const voteData = this.props.votes.voteDetailsResponse[0];\n                let voteDetails = {};\n                voteDetails.ChamberCode = voteData.ChamberCode;\n                voteDetails.VoteType = voteData.VoteType;\n                voteDetails.memberYeas = voteData.VoteMember.filter(nObj => nObj.ResponseCode === 'Y');\n                voteDetails.memberNays = voteData.VoteMember.filter(nObj => nObj.ResponseCode === 'N');\n                voteDetails.memberAbstentions = voteData.VoteMember.filter(nObj => nObj.ResponseCode === 'A');\n                voteDetails.memberNoVote = voteData.VoteMember.filter(nObj => nObj.ResponseCode === 'X');\n                voteDetails.voteStatements = voteData.VoteMember.filter(member => member.VoteStatement);\n                // Abstentions appear as rule 36 on senate floor tally sheets\n                if (voteData.ChamberCode === \"S\" && voteData.VoteType === \"Floor\") {\n                    voteDetails.memberRule36 = voteData.VoteMember.filter(nObj => nObj.ResponseCode === 'A');\n                } else {\n                    voteDetails.memberRule36 = voteData.VoteMember.filter(nObj => nObj.ResponseCode === 'R');\n                }\n                billHistory[i].voteDetails = voteDetails;\n                billHistory[i].loadingVotes = false;\n                return Promise.resolve()\n            }).catch(err => {\n                billHistory[i].loadingVotes = false;\n                return Promise.reject(err);\n            });\n    }\n\n    async getPatrons(bill) {\n        bill.loadingPatrons = true;\n        await this.props.actions.getPatronList(bill.LegislationID)\n            .then(() => {\n                bill.Patrons = this.props.patrons.patronList\n                bill.loadingPatrons = false;\n                return Promise.resolve\n            }).catch(err => { bill.loadingPatrons = false; Promise.reject(err) });\n    }\n\n    async getBillStatusHistory(bill) {\n        bill.loadingStatusHistory = true;\n        let body = { \"LegislationIDs\": [{ \"LegislationID\": bill.LegislationID }] }\n        await this.props.actions.getBillStatusHistory(body)\n            .then(() => {\n                bill.billStatuses = this.props.bills.legislationStatusHistory[0]\n                bill.loadingStatusHistory = false;\n                return Promise.resolve\n            }).catch(err => { bill.loadingStatusHistory = false; Promise.reject(err) });\n    }\n\n    async getWatchlists(params) {\n        await this.props.actions.getCollections(params)\n            .then(() => {\n                this.setState({\n                    collections: this.props.collection.collections\n                }, () => {\n                    return Promise.resolve()\n                })\n            }).catch(err => Promise.reject(err));\n    }\n\n    getReportData() {\n        const { showTitle, showChiefPatron, showAllPatrons, showNotes, userCreated, showHistory, showHouseAmendments, showSenateAmendments, showConferenceAmendments, showGovernorsRecommendations, showStatus, showCommitteeEvent, showLdNumber, showClerkNames, showDlsStaffNames, selectedCollection, billList } = this.state;\n        const params = {\n            LegislationNumbers: [{ LegislationNumber: billList.map(bill => bill.LegislationNumber).join() }],\n            SessionID: billList[0].SessionID\n        };\n        this.setState({\n            sbCount: billList.filter(bill => bill.LegislationNumber.includes('SB')).length,\n            sjCount: billList.filter(bill => bill.LegislationNumber.includes('SJ')).length,\n            hbCount: billList.filter(bill => bill.LegislationNumber.includes('HB')).length,\n            hjCount: billList.filter(bill => bill.LegislationNumber.includes('HJ')).length\n        });\n        this.props.actions.getBillList(params).then(() => {\n            this.setState({\n                generatingBillNumbers: false\n            })\n            let committeePromises = [];\n            let patronPromises = [];\n            let historyPromises = [];\n            let textPromises = [];\n            let statusHistoryPromises = [];\n            let billData = this.props.bills.billList;\n            //Filter to only one result per bill per session since DB sometimes returns duplicates\n            billData = billData.filter((item, pos) => billData.findIndex(i => i.LegislationNumber === item.LegislationNumber && i.SessionID === item.SessionID) === pos);\n            //The backend will return the requested bill numbers in alphanumeric order, regardless of the bill number order in the request\n            //With that in mind, if the report is created from within bill search, the list of bill numbers stored in the report & sent in the request above will be sorted alphanumerically, so the backend sort is the same and desired\n            //If coming from a calendar, however, the list of bill numbers will initially be sorted in calendar order, which is desired, but the api will return the bills alphanumerically\n            //That said, the initial bill number order (stored in the report object) is always the proper order, so we need to sort the response back to that\n            billData.sort((a, b) => billList.findIndex(l => l.LegislationNumber === a.LegislationNumber && l.SessionID === a.SessionID) - billList.findIndex(l => l.LegislationNumber === b.LegislationNumber && l.SessionID === b.SessionID))\n            let showStatusBool = false;\n            for (const key in showStatus) {\n                if (showStatus[key] === true && key !== \"showEmergency\") {\n                    showStatusBool = true;\n                }\n            }\n            let showCommitteeEventBool = false;\n            for (const key in showCommitteeEvent) {\n                if (showCommitteeEvent[key] === true) {\n                    showCommitteeEventBool = true;\n                }\n            }\n            this.setState({\n                billData,\n                gettingBillHistory: showHistory || showCommitteeEventBool ? true : false,\n                gettingBillStatusHistory: showStatusBool ? true : false,\n                gettingClerkNames: showClerkNames ? true : false,\n                gettingStaffNames: showDlsStaffNames ? true : false,\n                gettingPatrons: showAllPatrons ? true : false,\n                gettingVotes: showHistory && showHistory.showVotes ? true : false,\n                gettingLdNumbers: showLdNumber ? true : false,\n                gettingAmendments: showHouseAmendments || showSenateAmendments || showConferenceAmendments || showGovernorsRecommendations ? true : false\n            }, () => {\n                let watchlistPromise = null;\n                if (showNotes && this.props.login.userProfile.email === userCreated) {\n                    watchlistPromise = this.getWatchlists(\"?SessionID=\" + billList[0].SessionID);\n                } else {\n                    watchlistPromise = new Promise(resolve => resolve());\n                }\n                watchlistPromise.then(() => {\n                    if (showClerkNames || showDlsStaffNames) {\n                        this.props.actions.getRoleTypes()\n                            .then(() => {\n                                const clerkRoleType = this.props.personnel.roleTypes.find(x => x.Name.toLowerCase() === 'committee clerk')\n                                const clerkRoleTypeID = clerkRoleType ? clerkRoleType.StaffRoleTypeID : 0;\n                                const staffRoleType = this.props.personnel.roleTypes.find(x => x.Name.toLowerCase() === 'committee staff')\n                                const staffRoleTypeID = staffRoleType ? staffRoleType.StaffRoleTypeID : 0;\n                                this.setState({ clerkRoleTypeID, staffRoleTypeID }, () => {\n                                    this.props.actions.getSessionList().then(() => {\n                                        let committeesAndSessionsToSearch = [];\n                                        const sessionList = this.props.session.sessionList;\n                                        billData.forEach(b => {\n                                            if (b.CommitteeID && b.SessionID && !committeesAndSessionsToSearch.find(c => c.CommitteeID === b.CommitteeID && c.SessionID === b.SessionID)) {\n                                                committeesAndSessionsToSearch.push({ CommitteeID: b.CommitteeID, SessionID: b.SessionID });\n                                                if (showClerkNames) {\n                                                    committeePromises.push(this.getCommitteeClerksOrStaff(b, sessionList.find(sl => sl.SessionID === b.SessionID).SessionEvents.find(se => se.EventTypeID === 1).ActualDate, CLERKS));\n                                                }\n                                                if (showDlsStaffNames) {\n                                                    committeePromises.push(this.getCommitteeClerksOrStaff(b, sessionList.find(sl => sl.SessionID === b.SessionID).SessionEvents.find(se => se.EventTypeID === 1).ActualDate, STAFF));\n                                                }\n                                            }\n                                        })\n                                    })\n                                })\n                            })\n                    }\n                    let billHistoryChunks = [];\n                    billData.forEach(bill => {\n                        bill['Chief Patron'] = bill.Patrons;\n                        if (showAllPatrons) {\n                            patronPromises.push(this.getPatrons(bill));\n                        } else {\n                            patronPromises.push(() => Promise.resolve());\n                        }\n                        bill.Notes = [];\n                        if (showStatus.showEmergency) {\n                            bill.Emergency = bill.EffectiveType === 'Emergency' ? \"Y\" : \"N\"\n                        }\n                        if (showStatusBool) {\n                            statusHistoryPromises.push(this.getBillStatusHistory(bill));\n                        } else {\n                            statusHistoryPromises.push(() => Promise.resolve());\n                        }\n                        if (showNotes) {\n                            if (this.state.selectedNotes === 'all') {\n                                this.state.collections.forEach(coll => {\n                                    let note = coll.WatchListLegislation.find(leg => leg.LegislationID === bill.LegislationID && leg.Note);\n                                    if (note) {\n                                        bill.Notes.push({ ...note, ListName: coll.Name });\n                                    }\n                                });\n                            }\n                            if (this.state.selectedNotes === 'current') {\n                                this.state.collections.forEach(coll => {\n                                    if (coll.WatchListID === selectedCollection) {\n                                        let note = coll.WatchListLegislation.find(leg => leg.LegislationID === bill.LegislationID && leg.Note);\n                                        if (note) {\n                                            bill.Notes.push({ ...note, ListName: coll.Name });\n                                        }\n                                    }\n                                });\n                            }\n                        }\n                        if (showHistory || showCommitteeEventBool) {\n                            if (!billHistoryChunks[0] || billHistoryChunks[billHistoryChunks.length - 1].length >= MAX_BILL_HISTORY_CHUNK_SIZE) {\n                                billHistoryChunks.push([bill]);\n                            } else if (billHistoryChunks[billHistoryChunks.length - 1].length < MAX_BILL_HISTORY_CHUNK_SIZE) {\n                                billHistoryChunks[billHistoryChunks.length - 1].push(bill);\n                            }\n                        }\n                        if (showHouseAmendments || showSenateAmendments || showConferenceAmendments || showGovernorsRecommendations) {\n                            textPromises.push(this.getAmendments(bill));\n                        } else if (showLdNumber) {\n                            textPromises.push(this.getLdNumber(bill))\n                        } else {\n                            textPromises.push(() => Promise.resolve());\n                        }\n                        this.setState({ billData });\n                    });\n                    if (billHistoryChunks.length) {\n                        billHistoryChunks.forEach(chunk => historyPromises.push(this.getBillHistory(chunk)))\n                    } else {\n                        historyPromises.push(() => Promise.resolve());\n                    }\n                    Promise.all(committeePromises).then(() => this.setState({ gettingClerkNames: false, gettingStaffNames: false }));\n                    Promise.all(patronPromises).then(() => this.setState({ gettingPatrons: false }));\n                    Promise.all(historyPromises).then(() => this.setState({ gettingBillHistory: false, gettingVotes: false }));\n                    Promise.all(textPromises).then(() => this.setState({ gettingAmendments: false, gettingLdNumbers: false }));\n                    Promise.all(statusHistoryPromises).then(() => this.setState({ gettingBillStatusHistory: false }));\n\n                    Promise.all(committeePromises.concat(patronPromises).concat(historyPromises).concat(textPromises).concat(statusHistoryPromises)).then(() => {\n                        this.setState({ generatingReport: false })\n                    }).catch((e) => {\n                        console.log(e);\n                        this.setState({ generatingReport: false })\n                    })\n                });\n            });\n        }).catch(err => {\n            this.setState({\n                reportError: err.toString(),\n                generatingReport: false,\n                generatingBillNumbers: false\n            });\n        });\n    }\n\n    makePrintout() {\n        let printWindow = this.printOutRef.current;\n\n        const pageStyles = document.querySelectorAll(\"style, link[rel='stylesheet']\");\n        pageStyles.forEach(el => {\n            printWindow.contentDocument.head.appendChild(el.cloneNode(true));\n        });\n        const reportDataNode = ReactDOM.findDOMNode(this.reportData.current);\n        const contentData = reportDataNode.outerHTML;\n        printWindow.contentDocument.body.innerHTML = contentData;\n        printWindow.focus();\n        // timeout is because some browsers do not set the content of the document in time. Since there is no way to check when it is actually finished this 10 millisecond timeout should do the trick.\n        setTimeout(() => printWindow.contentWindow.print(), 10);\n    }\n\n    makeHtml() {\n        const htmlRefNode = ReactDOM.findDOMNode(this.htmlRef.current);\n        let x = htmlRefNode.querySelectorAll('a');\n        x.forEach(el => {\n            el.setAttribute('href', el.href);\n        })\n        let breaks = htmlRefNode.querySelectorAll('hr');\n        [...breaks].forEach(b => {\n            b.parentNode.removeChild(b);\n        });\n        const fileName = `Search Results ${moment().format(\"MM_DD_YYYY HH mm\")}.html`\n        saveAs(new Blob([htmlRefNode.innerHTML], { type: \"text/html\" }), fileName);\n    }\n\n    makeSpreadsheet() {\n        const { showCatchline, showCurrentStatus, showTitle, showChiefPatron, showAllPatrons, showSummary, showNotes, showHistory, showHouseAmendments, showSenateAmendments, showConferenceAmendments, showGovernorsRecommendations, showStatus, showCommitteeEvent, billData } = this.state;\n        let headers = [\"Billno\"];\n        let historyRows = [];\n        let historyHeaders = [\"Billno\", \"Date\", \"Description\"];\n        if ((showHistory.all || (showHistory.recent && showHistory.mostRecentAmount > 1)) && showHistory.showVotes) {\n            historyHeaders.push(\"YEAS\", \"NAYS\", \"NOT VOTING\", \"ABSTENTIONS\", \"RULE 36\");\n        }\n        billData.forEach(bill => {\n            //Billno needs to be in hyperlink format; to get the appropriate href attr, create a fake element and attach to the DOM and use the resulting href\n            let el = document.createElement(\"a\");\n            el.style.display = 'none';\n            el.href = `/bill-details/${bill[\"SessionCode\"]}/${bill[\"LegislationNumber\"]}`; //relative path; the following logic will turn it into the real/appropriate href (e.g. https://test.lis... or https://qa.lis...)\n            el.className = bill[\"LegislationNumber\"];\n            document.body.appendChild(el);\n            const href = document.getElementsByClassName(bill[\"LegislationNumber\"])[0];\n            document.body.removeChild(el);\n            const hyperlinkedBill = `=HYPERLINK(\"\"${href}` + `\"\",\"\"` + bill[\"LegislationNumber\"] + `\"\")`;\n            bill[\"Billno\"] = hyperlinkedBill;\n            if (showCatchline) {\n                headers.push(\"Catch line\");\n                bill[\"Catchline\"] = bill[\"Description\"];\n            }\n            if (showCurrentStatus)\n                headers.push(\"LegislationStatus\");\n            if (showTitle)\n                headers.push(\"LegislationTitle\");\n            if (showSummary) {\n                headers.push(\"LegislationSummary\");\n            }\n            if (showChiefPatron) {\n                let patrons = bill.Patrons ? bill.Patrons.filter(p => p.Name === 'Chief Patron').map(patron => patron.PatronDisplayName) : [];\n                patrons = patrons.join(', ');\n                const header = \"Chief Patron\";\n                headers.push(header);\n                bill[header.replaceAll(\" \", \"\")] = patrons;\n            }\n            if (showAllPatrons) {\n                let patrons = bill.Patrons ? bill.Patrons.map(patron => {\n                    let formattedName = patron.PatronDisplayName\n                    if (patron.Name === 'Chief Patron') {\n                        formattedName += ' ' + patron.DisplayName;\n                    }\n                    return formattedName;\n                }) : [];\n                patrons = patrons.join(', ');\n                const header = \"All Patrons\";\n                headers.push(header);\n                bill[header.replaceAll(\" \", \"\")] = patrons;\n            }\n            if (showStatus.showEmergency) {\n                headers.push(\"Emergency\");\n            }\n            if (showHistory) {\n                if (showHistory.Committee) {\n                    const header = this.getBillHistoryTypeLabel(\"Committee\");\n                    headers.push(header);\n                }\n                if (showHistory.Subcommittee) {\n                    const header = this.getBillHistoryTypeLabel(\"Subcommittee\");\n                    headers.push(header);\n                }\n                if (showHistory.recent && showHistory.mostRecentAmount < 2) {\n                    const header = this.getBillHistoryTypeLabel(\"recent\");\n                    headers.push(header);\n                }\n                Object.entries(bill.billHistory).sort(([typeA, itemsA], [typeB, itemsB]) => sortBillHistoryTypes(typeA, typeB)).map(([billHistoryType, billHistoryItems]) => {\n                    if (billHistoryType === 'all' || (billHistoryType === 'recent' && showHistory.mostRecentAmount > 1)) {\n                        billHistoryItems.map(historyItem => {\n                            let newRow = { ...historyItem, Billno: hyperlinkedBill, Date: moment(historyItem.EventDate).format('MM/DD/YYYY') }\n                            if (showHistory.showVotes) {\n                                if (historyItem.voteDetails) {\n                                    newRow.YEAS = historyItem.voteDetails.memberYeas.map(item => item.PatronDisplayName).join();\n                                    newRow.NAYS = historyItem.voteDetails.memberNays.map(item => item.PatronDisplayName).join();\n                                    newRow[\"NOTVOTING\"] = historyItem.voteDetails.memberNoVote.map(item => item.PatronDisplayName).join();\n                                    newRow.ABSTENTIONS = historyItem.voteDetails.memberAbstentions.map(item => item.PatronDisplayName).join();\n                                    newRow[\"RULE36\"] = historyItem.voteDetails.memberRule36.map(item => item.PatronDisplayName).join();\n                                }\n                            }\n                            historyRows.push(newRow)\n                        });\n                    } else {\n                        billHistoryItems.map(historyItem => {\n                            if (showHistory.showVotes) {\n                                if (historyItem.voteDetails) {\n                                    headers.push(\"YEAS\", \"NAYS\", \"NOT VOTING\", \"ABSTENTIONS\", \"RULE 36\");\n                                    bill.YEAS = historyItem.voteDetails.memberYeas.map(item => item.PatronDisplayName).join();\n                                    bill.NAYS = historyItem.voteDetails.memberNays.map(item => item.PatronDisplayName).join();\n                                    bill[\"NOTVOTING\"] = historyItem.voteDetails.memberNoVote.map(item => item.PatronDisplayName).join();\n                                    bill.ABSTENTIONS = historyItem.voteDetails.memberAbstentions.map(item => item.PatronDisplayName).join();\n                                    bill[\"RULE36\"] = historyItem.voteDetails.memberRule36.map(item => item.PatronDisplayName).join();\n                                }\n                            }\n                            const header = this.getBillHistoryTypeLabel(billHistoryType);\n                            bill[header.replaceAll(\" \", \"\")] = historyItem.Description;\n                        });\n                    }\n                });\n            }\n            if (bill.billStatuses) {\n                if (showStatus.showPassedHouse) {\n                    headers.push(\"Passed House\");\n                    bill[\"PassedHouse\"] = bill.billStatuses.PassedHouse;\n                }\n                if (showStatus.showPassedSenate) {\n                    headers.push(\"Passed Senate\");\n                    bill[\"PassedSenate\"] = bill.billStatuses.PassedSenate;\n                }\n                if (showStatus.showPassed) {\n                    headers.push(\"Passed\");\n                    bill[\"Passed\"] = bill.billStatuses.Passed;\n                }\n                if (showStatus.showFailed) {\n                    headers.push(\"Failed\");\n                    bill[\"Failed\"] = bill.billStatuses.Failed;\n                }\n                if (showStatus.showContinued) {\n                    headers.push(\"Continued\");\n                    bill[\"Continued\"] = bill.billStatuses.Continued;\n                }\n                if (showStatus.showApproved) {\n                    headers.push(\"Approved\");\n                    bill[\"Approved\"] = bill.billStatuses.Approved;\n                }\n                if (showStatus.showVetoed) {\n                    headers.push(\"Vetoed\");\n                    bill[\"Vetoed\"] = bill.billStatuses.Vetoed;\n                }\n            }\n\n            if (bill.committeeEvents) {\n                if (showCommitteeEvent.showFirstHouseCommittee) {\n                    headers.push(\"1st House com\")\n                    bill[\"1stHousecom\"] = bill.committeeEvents.firstHouseCommitteeEvent ? `${moment(bill.committeeEvents.firstHouseCommitteeEvent.EventDate).format(\"MM/DD/YY\")} ${bill.committeeEvents.firstHouseCommitteeEvent.ChamberCode} ${bill.committeeEvents.firstHouseCommitteeEvent.Description}` : \"\";\n                }\n                if (showCommitteeEvent.showFirstSenateCommittee) {\n                    headers.push(\"1st Senate com\")\n                    bill[\"1stSenatecom\"] = bill.committeeEvents.firstSenateCommitteeEvent ? `${moment(bill.committeeEvents.firstSenateCommitteeEvent.EventDate).format(\"MM/DD/YY\")} ${bill.committeeEvents.firstSenateCommitteeEvent.ChamberCode} ${bill.committeeEvents.firstSenateCommitteeEvent.Description}` : \"\";\n                }\n                if (showCommitteeEvent.showLastHouseSubcommittee) {\n                    headers.push(\"Last House Subcommittee Assigned\")\n                    bill[\"LastHouseSubcommitteeAssigned\"] = bill.committeeEvents.lastHouseSubcommitteeEvent ? bill.committeeEvents.lastHouseSubcommitteeEvent.Description : \"\";\n                }\n                if (showCommitteeEvent.showLastSenateSubcommittee) {\n                    headers.push(\"Last Senate Subcommittee Assigned\")\n                    bill[\"LastSenateSubcommitteeAssigned\"] = bill.committeeEvents.lastSenateSubcommitteeEvent ? bill.committeeEvents.lastSenateSubcommitteeEvent.Description : \"\";\n                }\n            }\n            if (showHouseAmendments || showSenateAmendments || showConferenceAmendments || showGovernorsRecommendations) {\n                bill.amendments.forEach(amendment => {\n                    const columnHeader = '\"' + amendment.Description + '\"';\n                    headers.push(columnHeader);\n                    bill[columnHeader.replaceAll(\" \", \"\")] = amendment.DraftText;\n                });\n            }\n            if (showNotes) {\n                bill.Notes.forEach((note, noteIndex) => {\n                    bill[`Note${noteIndex + 1}`] = note.Note;\n                    headers.push(`Note ${noteIndex + 1} `)\n                })\n            }\n\n            if (showSummary) {\n                bill[\"LegislationSummary\"] = stripTags(bill[\"LegislationSummary\"]);\n            }\n\n            if (showTitle) {\n                bill[\"LegislationTitle\"] = stripTags(bill[\"LegislationTitle\"]);\n            }\n\n        });\n        headers = headers.filter((val, i, self) => self.indexOf(val) === i);\n        let fileName = `Search Results ${moment().format(\"MM_DD_YYYY HH mm\")}.csv`\n        let historyFileName = `Bill History ${moment().format(\"MM_DD_YYYY HH mm\")}.csv`;\n        if (!showHistory || headers.length > 1) { //This is here so if the user just wants bill history a csv with just the leg numbers will not created.\n            saveAs(new Blob([generateCsv(headers.filter(x => !x.toLowerCase().includes(\"amendment\")), billData)], { type: \"data:text/csv;charset=utf-8,\" }), fileName);\n        }\n        //History will not fit well in a spreadsheet with the other data so another file is saved here.\n        if (showHistory.all || (showHistory.recent && showHistory.mostRecentAmount > 1)) {\n            saveAs(new Blob([generateCsv(historyHeaders, historyRows)], { type: \"data:text/csv;charset=utf-8,\" }), historyFileName);\n        }\n    }\n\n    toggleShareForm() {\n        this.setState(state => ({\n            showShareForm: !state.showShareForm\n        }));\n    }\n\n    toggleTooltip() {\n        this.setState({\n            showTooltip: !this.state.showTooltip\n        })\n    }\n\n    toggleCompositeSort(value) {\n        this.setState({\n            compositeSortValue: this.state.compositeSortValue === \"LegislationNumberAsc\" && value === \"LegislationNumberAsc\"\n                ? \"LegislationNumberDesc\"\n                : value === \"LegislationNumberAsc\"\n                    ? \"LegislationNumberAsc\"\n                    : this.state.compositeSortValue === \"EventDateAsc\"\n                        ? \"EventDateDesc\"\n                        : \"EventDateAsc\"\n        })\n    }\n\n    toggleShowNotes() {\n        this.setState({\n            showNotes: !this.state.showNotes\n        })\n    }\n\n    componentDidMount() {\n        const reportId = this.props.match.params.id;\n        if (reportId) {\n            this.props.actions.getBillReportInformation('?ReportNumber=' + reportId).then(() => {\n                const billReportInformation = this.props.report.billReportInformation;\n                if (billReportInformation && billReportInformation.BillInformation) {\n                    try {\n                        const json = JSON.parse(window.atob(billReportInformation.BillInformation));\n                        this.setState({\n                            ...json\n                        }, () => {\n                            if (this.state.billList.length > 0) {\n                                this.getReportData();\n                            }\n                            if (this.state.selectedCollection) {\n                                this.props.actions.getCollection(\"?WatchListID=\" + this.state.selectedCollection);\n                            }\n                        });\n                    } catch {\n                        console.error(\"Malformed url\");\n                        this.setState({ generatingReport: false });\n                    }\n                } else {\n                    console.log(\"Request succeeded, but no report information found.\");\n                    this.setState({ reportError: \"This report does not exist.\", generatingReport: false, generatingBillNumbers: false })\n                }\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err);\n                this.setState({ reportError: \"This report does not exist.\", generatingReport: false, generatingBillNumbers: false })\n            })\n        } else {\n            console.log(\"No Report ID found to use.\");\n        }\n    }\n\n    getBillHistoryTypeLabel = (type) => {\n        switch (type) {\n            case 'all':\n                return `All Events`;\n            case 'recent':\n                return this.state.showHistory.mostRecentAmount > 1 ? `${this.state.showHistory.mostRecentAmount} Last Events` : 'Last Event';\n            case 'Committee':\n                return `Last Committee Event`;\n            case 'Subcommittee':\n                return `Last Subcommittee Event`;\n        }\n        return;\n    }\n\n    render() {\n        const { billData, reportError, generatingBillNumbers, generatingReport, gettingCommittees, gettingPatrons, gettingAmendments, gettingBillHistory, gettingVotes, gettingLdNumbers, gettingClerkNames, gettingStaffNames, showCatchline, showCurrentStatus, showTitle, showChiefPatron, showAllPatrons, showSummary, showNotes, showHistory, showHouseAmendments, showSenateAmendments, showConferenceAmendments, showGovernorsRecommendations, showStatus, showCommitteeEvent, showLdNumber, showClerkNames, showDlsStaffNames, sbCount, sjCount, hbCount, hjCount, userCreated } = this.state;\n        const sortBillsNumerically = (a, b, direction) => {\n            if (direction === \"asc\") {\n                return a.LegislationNumber.substring(0, 2).localeCompare(b.LegislationNumber.substring(0, 2)) === 0\n                    ? a.LegislationKey - b.LegislationKey\n                    : a.LegislationNumber.substring(0, 2).localeCompare(b.LegislationNumber.substring(0, 2)) > 0\n                        ? 1\n                        : -1\n            } else {\n                return a.LegislationNumber.substring(0, 2).localeCompare(b.LegislationNumber.substring(0, 2)) === 0\n                    ? b.LegislationKey - a.LegislationKey\n                    : a.LegislationNumber.substring(0, 2).localeCompare(b.LegislationNumber.substring(0, 2)) > 0\n                        ? -1\n                        : 1\n            }\n        }\n\n        if (generatingBillNumbers) {\n            return (\n                <div className=\"small-text\">\n                    {reportError && <div>{reportError}</div>}\n                    <div>Getting Bill Data <span className=\"small-spinner\"></span></div>\n                </div>)\n        }\n        const shareable = this.props.login.userClaims.resources.find(resource => resource === BILL_COLLECTION_AUTHOR);\n        return (<div>\n            <div className=\"full\">\n                {this.state.showShareForm && !reportError &&\n                    <ShareReport\n                        toggleShareForm={this.toggleShareForm}\n                    />\n                }\n                <div className=\"advanced-search dlas-forms\">\n                    {!reportError &&\n                        <>\n                            <div className=\"flex-row\">\n                                <br />\n                                <div className=\"inline-list\" style={{ textAlign: 'right' }}>\n                                    {generatingReport &&\n                                        <div className=\"small-text center\">Getting Data <span className=\"small-spinner\"></span></div>\n                                    }\n                                    <React.Fragment>\n                                        {this.props.match.path.includes(\"composite\") && (this.props.login.userProfile.email === userCreated) &&\n                                            <button type=\"button\" className=\"button\" onClick={() => this.toggleShowNotes()}>{(this.state.showNotes ? \"Hide\" : \"Show\") + \" Notes\"}</button>\n                                        }\n                                        {shareable &&\n                                            <button disabled={generatingReport} onClick={this.toggleShareForm} type=\"button\" className=\"button\">Share</button>\n                                        }\n                                        <span aria-label=\"html\" title=\"html\" onClick={this.makeHtml} className={`icon paper${generatingReport ? ' disabled' : ''} `}></span>\n                                        <span aria-label=\"print\" title=\"print\" onClick={this.makePrintout} className={`icon print${generatingReport ? ' disabled' : ''} `}></span>\n                                        <span aria-label=\"spreadsheet\" title=\"spreadsheet\" onClick={this.makeSpreadsheet} className={`icon csv${generatingReport ? ' disabled' : ''} `}></span>\n                                        <a onClick={(e) => { e.stopPropagation(e); this.toggleTooltip() }} style={{ cursor: \"pointer\" }}>CSV Help</a>\n                                        {this.state.showTooltip &&\n                                            <div className={`info - box report - tooltip${shareable ? ' shareable' : ''} `}>\n                                                <p>If you have selected 'All Events' or 'X last events', then these events will be downloaded in a separate .csv file.</p>\n                                                <p>Amendment text is not included in .csv file downloads.</p>\n                                                <p>Some text selections in the .csv file may include HTML markup.</p>\n                                            </div>\n                                        }\n                                    </React.Fragment>\n                                </div>\n                            </div>\n                            <br />\n                        </>\n                    }\n                    <div ref={this.htmlRef}>\n                        {this.state.reportTitle || this.props.collection.collection != \"\" ?\n                            <div>\n                                <h2>{this.state.reportTitle || this.props.collection.collection[0].Name}</h2>\n                            </div>\n                            : null\n                        }\n                        <div className=\"small-text\">\n                            {reportError && <div>{reportError}</div>}\n                        </div>\n                        <div ref={this.reportData} className=\"report-container\">\n                            <span>{this.state.personalMessage}</span>\n                            {!this.props.match.path.includes(\"composite\")\n                                ? billData.map((bill, i) =>\n                                    <div key={i} style={{ pageBreakInside: 'avoid', display: 'block' }}>\n                                        <h3><Link className='report-link' to={`/bill-details/${bill.SessionCode}/${bill.LegislationNumber}`}>{bill.LegislationNumber.split(/(\\d+)/).join(\" \")}</Link > {showCatchline && ` - ${bill.Description}`\n                                        }</h3 >\n                                        {\n                                            showChiefPatron || showAllPatrons ?\n                                                (bill.loadingPatrons ?\n                                                    <div style={{ margin: '0.3em 0px' }}>Getting Patrons <span className=\"small-spinner\"></span></div>\n                                                    :\n                                                    <div>\n                                                        {showChiefPatron && bill['Chief Patron'] &&\n                                                            <p>Chief Patron{bill['Chief Patron'].length > 1 && \"s\"}: {bill['Chief Patron'].map((patron, patronIndex) => <React.Fragment key={patronIndex}>\n                                                                {patronIndex !== 0 && ', '}{patron.PatronDisplayName}\n                                                            </React.Fragment>)}</p>\n                                                        }\n                                                        {showAllPatrons &&\n                                                            <p>Patron{bill.Patrons.length > 1 && \"s\"}: {bill.Patrons.map((patron, patronIndex) => <React.Fragment key={patronIndex}>\n                                                                {patronIndex !== 0 && ', '}{patron.PatronDisplayName}\n                                                            </React.Fragment>)}</p>\n                                                        }\n                                                    </div>)\n                                                : null\n                                        }\n                                        {showCurrentStatus && <p>Status: {bill.LegislationStatus}</p>}\n                                        {showTitle && bill.LegislationTitle && renderHTML(bill.LegislationTitle)\n                                        }\n                                        {\n                                            showClerkNames && bill.CommitteeID && bill.SessionID &&\n                                                bill.loadingClerkNames || (!this.state.committeeClerksAndStaff.find(c => c.AffiliationID === bill.CommitteeID && c.SessionID === bill.SessionID && c.StaffRoleTypeID === this.state.clerkRoleTypeID) && gettingClerkNames) ?\n                                                <div style={{ margin: '0.3em 0px' }}>Getting clerk(s) of current committee <span className=\"small-spinner\"></span></div>\n                                                :\n                                                this.state.committeeClerksAndStaff.find(c => c.AffiliationID === bill.CommitteeID && c.SessionID === bill.SessionID && c.StaffRoleTypeID === this.state.clerkRoleTypeID) ?\n                                                    <div>\n                                                        <p>\n                                                            <span>Clerk{this.state.committeeClerksAndStaff.filter(c => c.AffiliationID === bill.CommitteeID && c.SessionID === bill.SessionID && c.StaffRoleTypeID === this.state.clerkRoleTypeID).length > 1 ? 's' : ''} of current committee:</span>&nbsp;\n                                                            {\n                                                                this.state.committeeClerksAndStaff.filter(c => c.AffiliationID === bill.CommitteeID && c.SessionID === bill.SessionID && c.StaffRoleTypeID === this.state.clerkRoleTypeID).map((m, i) =>\n                                                                    <span>{m.FullName}{i === this.state.committeeClerksAndStaff.filter(c => c.AffiliationID === bill.CommitteeID && c.SessionID === bill.SessionID && c.StaffRoleTypeID === this.state.clerkRoleTypeID).length - 1 ? '' : ', '}</span>\n                                                                )\n                                                            }\n                                                        </p>\n                                                    </div>\n                                                    : null\n                                        }\n                                        {\n                                            showDlsStaffNames && bill.CommitteeID && bill.SessionID &&\n                                                bill.loadingStaffNames || (!this.state.committeeClerksAndStaff.find(c => c.AffiliationID === bill.CommitteeID && c.SessionID === bill.SessionID && c.StaffRoleTypeID === this.state.staffRoleTypeID) && gettingStaffNames) ?\n                                                <div style={{ margin: '0.3em 0px' }}>Getting DLS staff of current committee <span className=\"small-spinner\"></span></div>\n                                                :\n                                                this.state.committeeClerksAndStaff.find(c => c.AffiliationID === bill.CommitteeID && c.SessionID === bill.SessionID && c.StaffRoleTypeID === this.state.staffRoleTypeID) ?\n                                                    <div>\n                                                        <p>\n                                                            <span>DLS staff of current committee:</span>&nbsp;\n                                                            {\n                                                                this.state.committeeClerksAndStaff.filter(c => c.AffiliationID === bill.CommitteeID && c.SessionID === bill.SessionID && c.StaffRoleTypeID === this.state.staffRoleTypeID).map((m, i) =>\n                                                                    <span>{m.FullName}{i === this.state.committeeClerksAndStaff.filter(c => c.AffiliationID === bill.CommitteeID && c.SessionID === bill.SessionID && c.StaffRoleTypeID === this.state.staffRoleTypeID).length - 1 ? '' : ', '}</span>\n                                                                )\n                                                            }\n                                                        </p>\n                                                    </div>\n                                                    : null\n                                        }\n                                        {\n                                            showNotes && bill.Notes && bill.Notes.length > 0 &&\n                                            <div>\n                                                <span>Notes</span>\n                                                {bill.Notes.map((note, noteIndex) =>\n                                                    <div key={noteIndex}>\n                                                        <span className=\"small-text\"><span className=\"bold\">{note.ListName}</span>: {note.Note}</span>\n                                                    </div>\n                                                )}\n                                                <br />\n                                            </div>\n                                        }\n                                        {\n                                            showLdNumber &&\n                                                bill.loadingLdNumber || (!bill.LdNumber && gettingLdNumbers) ?\n                                                <div style={{ margin: '0.3em 0px' }}>Getting LD Number of current version <span className=\"small-spinner\"></span></div>\n                                                :\n                                                bill.LdNumber ?\n                                                    <div>\n                                                        <p>LD Number of current version: {bill.LdNumber}</p>\n                                                    </div>\n                                                    : null\n                                        }\n                                        {\n                                            showSummary &&\n                                            <div>\n                                                <strong>{bill.SummaryVersion}:</strong>{renderHTML(bill.LegislationSummary)}\n                                            </div>\n                                        }\n                                        {\n                                            (showHouseAmendments || showSenateAmendments || showConferenceAmendments || showGovernorsRecommendations) && (\n                                                bill.loadingAmendments ?\n                                                    <div style={{ margin: '0.3em 0px' }}>Getting Amendment Text <span className=\"small-spinner\"></span></div>\n                                                    :\n                                                    bill.amendments && bill.amendments.length ?\n                                                        <div>\n                                                            {bill.amendments.map((amendment, amendmentIndex) =>\n                                                                <div key={amendmentIndex}>\n                                                                    <strong>{amendment.Description}</strong>\n                                                                    {renderHTML(amendment.DraftText)}\n                                                                </div>\n                                                            )}\n                                                        </div>\n                                                        : null\n                                            )\n                                        }\n                                        {\n                                            bill.billStatuses &&\n                                            <div className=\"inner-grid four small-text\">\n                                                {bill.loadingStatusHistory ?\n                                                    <div style={{ margin: '0.3em 0px' }}>Getting Amendment Text <span className=\"small-spinner\"></span></div>\n                                                    :\n                                                    <>\n                                                        {showStatus.showPassedHouse && <span>Passed House: {bill.billStatuses.PassedHouse}</span>}\n                                                        {showStatus.showPassedSenate && <span>Passed Senate: {bill.billStatuses.PassedSenate}</span>}\n                                                        {showStatus.showPassed && <span>Passed: {bill.billStatuses.Passed}</span>}\n                                                        {showStatus.showVetoed && <span>Vetoed: {bill.billStatuses.Vetoed}</span>}\n                                                        {showStatus.showApproved && <span>Approved: {bill.billStatuses.Approved}</span>}\n                                                        {showStatus.showFailed && <span>Failed: {bill.billStatuses.Failed}</span>}\n                                                        {showStatus.showContinued && <span>Continued: {bill.billStatuses.Continued}</span>}\n                                                        {showStatus.showEmergency && <span>Emergency: {bill.Emergency}</span>}\n                                                    </>\n                                                }\n                                            </div>\n                                        }\n                                        {\n                                            bill.committeeEvents &&\n                                            <div className=\"small-text\">\n                                                {showCommitteeEvent.showFirstHouseCommittee && bill.committeeEvents.firstHouseCommitteeEvent && <div>First House Committee Referred: {bill.committeeEvents.firstHouseCommitteeEvent.Description}</div>}\n                                                {showCommitteeEvent.showFirstSenateCommittee && bill.committeeEvents.firstSenateCommitteeEvent && <div>First Senate Committee Referred : {bill.committeeEvents.firstSenateCommitteeEvent.Description}</div>}\n                                                {showCommitteeEvent.showLastHouseSubcommittee && bill.committeeEvents.lastHouseSubcommitteeEvent && <div>Last House Subcommittee Assigned: {bill.committeeEvents.lastHouseSubcommitteeEvent.Description}</div>}\n                                                {showCommitteeEvent.showLastSenateSubcommittee && bill.committeeEvents.lastSenateSubcommitteeEvent && <div>Last Senate Subcommittee Assigned: {bill.committeeEvents.lastSenateSubcommitteeEvent.Description}</div>}\n                                            </div>\n                                        }\n                                        {\n                                            showHistory && (\n                                                bill.loadingHistory ?\n                                                    <div style={{ margin: '0.3em 0px' }}>{\"Getting Bill Events\" + (showHistory.showVotes ? \" and Vote Data\" : \"\")} <span className=\"small-spinner\"></span></div>\n                                                    :\n                                                    bill.billHistory &&\n                                                    //Move grid container div inti place of react fragment to create a new grid for each row instead of continuing to overfill the parent div\n                                                    <div>\n                                                        {Object.entries(bill.billHistory).map(([billHistoryType, billHistoryItems], billHistoryTypeIndex) =>\n                                                            <div key={billHistoryTypeIndex}>\n                                                                <p>{this.getBillHistoryTypeLabel(billHistoryType)}</p>\n                                                                <div style={{ display: \"grid\", gridTemplateColumns: \"90px 75px 1fr\" }} className=\"small-text\">\n                                                                    {billHistoryItems.map((billHistoryItem, billHistoryItemIndex) =>\n                                                                        <>\n                                                                            <div style={{ marginRight: \"12px\" }}>\n                                                                                {moment(billHistoryItem.EventDate).format('MM/DD/YYYY')}\n                                                                            </div>\n                                                                            <div style={{ marginRight: \"12px\" }}>\n                                                                                {billHistoryItem.ActorType}\n                                                                            </div>\n                                                                            <div style={{ marginRight: \"12px\" }}>\n                                                                                {billHistoryItem.Description}\n                                                                            </div>\n                                                                            {showHistory.showVotes && (\n                                                                                billHistoryItem.voteDetails ?\n                                                                                    <div style={{ gridColumn: '3 / 4' }}>\n                                                                                        <p>\n                                                                                            YEAS--\n                                                                                            {billHistoryItem.voteDetails.memberYeas.map((item, index) => (\n                                                                                                <span key={index}>{item.PatronDisplayName}{billHistoryItem.voteDetails.memberYeas.length === index + 1 ? '--' : ', '}</span>\n                                                                                            ))}\n                                                                                            {billHistoryItem.voteDetails.memberYeas.length}\n                                                                                        </p>\n                                                                                        <p>\n                                                                                            NAYS--\n                                                                                            {billHistoryItem.voteDetails.memberNays.map((item, index) => (\n                                                                                                <span key={index}>{item.PatronDisplayName}{billHistoryItem.voteDetails.memberNays.length === index + 1 ? '--' : ', '}</span>\n                                                                                            ))}\n                                                                                            {billHistoryItem.voteDetails.memberNays.length}\n                                                                                        </p>\n                                                                                        <p>\n                                                                                            {(billHistoryItem.voteDetails.VoteType === \"Floor\" && billHistoryItem.voteDetails.ChamberCode === \"S\") ? \"RULE 36--\" : \"ABSTENTIONS--\"}\n                                                                                            {billHistoryItem.voteDetails.memberAbstentions.map((item, index) => (\n                                                                                                <span key={index}>{item.PatronDisplayName}{billHistoryItem.voteDetails.memberAbstentions.length === index + 1 ? '--' : ', '}</span>\n                                                                                            ))}\n                                                                                            {billHistoryItem.voteDetails.memberAbstentions.length}\n                                                                                        </p>\n                                                                                        <p>\n                                                                                            NOT VOTING--\n                                                                                            {billHistoryItem.voteDetails.memberNoVote.map((item, index) => (\n                                                                                                <span key={index}>{item.PatronDisplayName}{billHistoryItem.voteDetails.memberNoVote.length === index + 1 ? '--' : ', '}</span>\n                                                                                            ))}\n                                                                                            {billHistoryItem.voteDetails.memberNoVote.length}\n                                                                                        </p>\n                                                                                        {(billHistoryItem.voteDetails.VoteType !== \"Floor\" && billHistoryItem.voteDetails.ChamberCode !== \"S\") &&\n                                                                                            <p>\n                                                                                                RULE 36--\n                                                                                                {billHistoryItem.voteDetails.memberRule36.map((item, index) => (\n                                                                                                    <span key={index}>{item.PatronDisplayName}{billHistoryItem.voteDetails.memberRule36.length === index + 1 ? '--' : ', '}</span>\n                                                                                                ))}\n                                                                                                {billHistoryItem.voteDetails.memberRule36.length}\n                                                                                            </p>\n                                                                                        }\n                                                                                    </div>\n                                                                                    :\n                                                                                    billHistoryItem.loadingVotes ?\n                                                                                        <div style={{ gridColumn: '3/4', margin: '0.3em 0px' }}>Getting Vote Data <span className=\"small-spinner\"></span></div>\n                                                                                        :\n                                                                                        null\n                                                                            )}\n                                                                        </>\n                                                                    )}\n                                                                </div>\n                                                            </div>\n                                                        )}\n                                                    </div>\n                                            )\n                                        }\n                                        <hr className=\"faded-line\" />\n                                    </div >\n                                )\n                                : <>\n                                    <div className='composite-view-header'>\n                                        <div className=\"composite-view-header-label\" onClick={() => this.toggleCompositeSort(\"LegislationNumberAsc\")}>Bill</div>\n                                        <div>Committee</div>\n                                        <div>Last Action</div>\n                                        <div className=\"composite-view-header-label\" onClick={() => this.toggleCompositeSort(\"EventDateAsc\")}>Date</div>\n                                    </div>\n                                    {billData.sort((a, b) => {\n                                        return this.state.compositeSortValue === \"LegislationNumberAsc\"\n                                            ? sortBillsNumerically(a, b, \"asc\")\n                                            : this.state.compositeSortValue === \"LegislationNumberDesc\"\n                                                ? sortBillsNumerically(a, b, \"desc\")\n                                                : this.state.compositeSortValue === \"EventDateAsc\"\n                                                    ? moment(b.billHistory.recent[0].EventDate).isAfter(a.billHistory.recent[0].EventDate) ? 1 : -1\n                                                    : moment(b.billHistory.recent[0].EventDate).isBefore(a.billHistory.recent[0].EventDate) ? 1 : -1\n                                    }).map((bill, i) =>\n                                        <>\n                                            <div className={'composite-view-wrapper ' + ((!this.state.showNotes || this.props.login.userProfile.email !== userCreated) && \"notes-hidden\")}>\n                                                <div className='composite-view-data'>\n                                                    <div><Link to={\"/bill-details/\" + bill.SessionCode + \"/\" + bill.LegislationNumber}>{bill.LegislationNumber}</Link>{\" - \" + (bill.Patrons.find(x => x.PatronTypeID === 1) ? (bill.Patrons.find(x => x.PatronTypeID === 1).PatronDisplayName + \" - \") : \"\") + bill.Description}</div>\n                                                    {bill.billHistory && bill.billHistory.Committee\n                                                        ? <div className='composite-view-committees'>\n                                                            <div>{bill.billHistory.Committee.find(x => x.ChamberCode === \"H\") ? \"(H) \" + (bill.billHistory.Committee.sort((a, b) => moment(a.EventDate).isBefore(b.EventDate) ? 1 : -1).find(x => x.ChamberCode === \"H\").ParentCommitteeName ?? bill.billHistory.Committee.sort((a, b) => moment(a.EventDate).isBefore(b.EventDate) ? 1 : -1).find(x => x.ChamberCode === \"H\").CommitteeName) : \"\"}</div>\n                                                            <div>{bill.billHistory.Committee.find(x => x.ChamberCode === \"S\") ? \"(S) \" + (bill.billHistory.Committee.sort((a, b) => moment(a.EventDate).isBefore(b.EventDate) ? 1 : -1).find(x => x.ChamberCode === \"S\").ParentCommitteeName ?? bill.billHistory.Committee.sort((a, b) => moment(a.EventDate).isBefore(b.EventDate) ? 1 : -1).find(x => x.ChamberCode === \"S\").CommitteeName) : \"\"}</div>\n                                                        </div>\n                                                        : <div className='composite-view-committees'>\n                                                            <div />\n                                                            <div />\n                                                        </div>\n                                                    }\n                                                    <div>\n                                                        {bill.billHistory\n                                                            ? (bill.billHistory.recent[0].ChamberCode ? \"(\" + bill.billHistory.recent[0].ChamberCode + \") \" : \"\") + bill.billHistory.recent[0].Description\n                                                            : \"\"}\n                                                    </div>\n                                                    <div>\n                                                        {bill.billHistory\n                                                            ? moment(bill.billHistory.recent[0].EventDate).format(\"MM/DD/YY\")\n                                                            : \"\"}\n                                                    </div>\n                                                </div>\n                                                {this.state.showNotes && userCreated === this.props.login.userProfile.email\n                                                    && <>\n                                                        {bill.Notes !== undefined && bill.Notes.length > 0\n                                                            ? <div className='composite-view-notes'>{\"Notes: \" + bill.Notes[0].Note}</div>\n                                                            : <div />\n                                                        }\n                                                    </>\n                                                }\n                                            </div>\n\n                                        </>\n                                    )}\n                                </>\n                            }\n\n\n                            {!reportError && <span><b>Counts:</b> {`HB: ${hbCount} HJ: ${hjCount} SB: ${sbCount} SJ: ${sjCount}`}</span>}\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <iframe ref={this.printOutRef} width=\"0\" height=\"0\" frameBorder=\"0\" src=\"about:blank\"></iframe>\n        </div >);\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { bills, session, members, committee, patrons, nav, login, votes, collection, report, personnel } = state;\n        return {\n            bills,\n            session,\n            members,\n            committee,\n            patrons,\n            nav,\n            login,\n            votes,\n            collection,\n            report,\n            personnel\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, committeeActionCreators, billActionCreators, sessionActionCreators, memberActionCreators, patronActionCreators, voteActionCreators, collectionActionCreators, reportActionCreators, personnelActionCreators), dispatch)\n        }\n    }\n)(ReportMaker);","import moment from 'moment-timezone';\n\nconst SearchTranslator = props => {\n    const sessionCode = parseInt(props.match.params.id);\n    const wordToTranslate = props.match.params.word;\n    const param = props.match.params.wordparam;\n    let url = '/bill-search';\n    if(isNaN(sessionCode) || !wordToTranslate) {\n        props.history.push(url);\n        return(null);\n    }\n\n    let billSearchParams = '';\n    switch(wordToTranslate.toUpperCase()) {\n        case(\"ALL\"):\n            billSearchParams = { selectedBillStatus: 1 }\n            break;\n        case(\"TOP\"):\n            billSearchParams = { mostFrequent: true }\n            break;\n        case(\"INT\"):\n            const date = moment(param);\n            if(param && date.isValid()) {\n                billSearchParams = {\n                    selectedBillStatus: 1,\n                    billStatusStartDate: date.startOf('day'),\n                    billStatusEndDate: date.endOf('day')\n                };  \n            }\n            break;\n        case(\"PSH\"):\n            billSearchParams = { selectedBillStatus: 4 }\n            break;\n        case(\"PSS\"):\n            billSearchParams = { selectedBillStatus: 5 }\n            break;\n        case(\"PAS\"):\n            billSearchParams = { selectedBillStatus: 6 }\n            break;\n        case(\"ENR\"):\n            billSearchParams = { selectedBillStatus: 14 }\n            break;\n        case(\"SGN\"):\n            billSearchParams = { selectedBillStatus: 21 }\n            break;\n        case(\"FAI\"):\n            billSearchParams = { selectedBillStatus: 9 }\n            break;\n        case(\"PND\"):\n            billSearchParams = { isPending: true }\n            break;\n        case(\"CAR\"):\n            billSearchParams = { selectedBillStatus: 10 }\n            break;\n        case(\"CIN\"):\n            billSearchParams = { selectedBillStatus: 16 }\n            break;\n        case(\"CRA\"):\n            billSearchParams = { selectedBillStatus: 31 }\n            break;\n        case(\"CRR\"):\n            billSearchParams = { selectedBillStatus: 32 }\n            break;\n        case(\"REC\"):\n            billSearchParams = { selectedBillStatus: 27 }\n            break;\n        case(\"GAS\"):\n            billSearchParams = { selectedBillStatus: 33 }\n            break;\n        case(\"APP\"):\n            billSearchParams = { selectedBillStatus: 8 }\n            break;\n        case(\"VET\"):\n            billSearchParams = { selectedBillStatus: 26 }\n            break;\n        case(\"CHP\"):\n            billSearchParams = { selectedBillStatus: 25 }\n            break;\n    }\n\n    if(billSearchParams) {\n        billSearchParams.selectedSession = sessionCode;\n        const b64Params = window.btoa(JSON.stringify(billSearchParams));\n        url += '?q=' + b64Params;\n    }\n    props.history.push(url);\n\n    return(null);\n}\n\nexport default SearchTranslator;","import moment from 'moment-timezone';\nimport React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\nimport { memberActionCreators } from '../../../stores/lis-members-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { patronActionCreators } from '../../../stores/lis-patron-store';\n\nclass ShorthandUrlTranslator extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            params: [],\n            error: false\n        };\n\n        this.findPatronType = this.findPatronType.bind(this);\n    }\n\n    findPatronType(value) {\n        switch (value) {\n            case \"C\":\n                return this.props.patrons.patronRoles.find(x => x.Name === \"Chief Patron\").PatronTypeID\n            case \"F\":\n                return this.props.patrons.patronRoles.find(x => x.Name === \"Chief Co-Patron\").PatronTypeID\n            case \"S\":\n                return this.props.patrons.patronRoles.find(x => x.Name === \"Co-Patron\").PatronTypeID\n            case \"I\":\n                return this.props.patrons.patronRoles.find(x => x.Name === \"Incorporated Chief Co-Patron\").PatronTypeID\n            default:\n                return '';\n        }\n    }\n\n    componentDidMount() {\n        this.setState({\n            params: this.props.location.search.slice(1).split(\"&\")\n        }, () => {\n            if(!this.state.params || this.state.params.length === 0) {\n                this.setState({\n                    error: true\n                }, () => {\n                    return;\n                })                \n            }\n\n            this.props.actions.getSessionList()\n                .then(() => {\n                    //Get the default session if the user didn't pass in a session param\n                    let sessionParam = \"SessionID=\" + (this.state.params.findIndex(x => x.toLowerCase().includes(\"ses\")) >= 0\n                        ? this.props.session.sessionList.find(x => x.SessionCode === this.state.params[this.state.params.findIndex(x => x.toLowerCase().includes(\"ses\"))].split(\"=\")[1]).SessionID\n                        : this.props.session.sessionList.find(x => x.IsDefault).SessionID);\n\n                    this.props.actions.getCommitteeList(sessionParam + \"&includeSubCommittees=true\")\n                        .then(this.props.actions.getPatronRoles(sessionParam)\n                            .then(this.props.actions.getMemberList(sessionParam)\n                                .then(() => {                                    \n                                    let obj = {};\n                                    try {\n                                        for (let i = 0; i < this.state.params.length; i++) {\n                                            switch (this.state.params[i].split(\"=\")[0].toLowerCase()) {\n                                                case \"com\":\n                                                    obj.selectedCommittee = this.props.committee.committeeList.find(x => x.CommitteeNumber === this.state.params[i].split(\"=\")[1]).CommitteeID\n                                                    break;\n                                                case \"subcom\":\n                                                    obj.selectedSubcommittee = this.props.committee.committeeList.find(x => x.CommitteeNumber === this.state.params[i].split(\"=\")[1]).CommitteeID\n                                                    break;\n                                                case \"mem\":\n                                                    obj.selectedPatron = this.props.members.memberList.find(x => x.MemberNumber === this.state.params[i].split(\"=\")[1]).MemberID\n                                                    break;\n                                                case \"mempat\":\n                                                    if (!obj.selectedPatronType)\n                                                        obj.selectedPatronType = [];\n                                                    obj.selectedPatronType.push(this.findPatronType(this.state.params[i].split(\"=\")[1]))\n                                                    break;\n                                                case \"ses\":\n                                                    obj.selectedSession = this.props.session.sessionList.find(x => x.SessionCode === this.state.params[i].split(\"=\")[1]).SessionID\n                                                    break;\n                                                default:\n                                                    //Invalid param, do nothing\n                                                    break;\n                                            }\n                                        }\n\n                                        //If the user provided patron types with no patron throw an error\n                                        if (obj.selectedPatronType && !obj.selectedPatron) {\n                                            this.setState({\n                                                error: true\n                                            }, () => {\n                                                return;\n                                            })\n                                        }\n\n                                        //If the user provided a member without patron types then set the default patron types based on chamber\n                                        if (obj.selectedPatron && !obj.selectedPatronType && this.props.members.memberList.find(x => x.MemberID === obj.selectedPatron).ChamberCode === \"H\") {\n                                            obj.selectedPatronType = [1, 2, 4];\n                                        } else if (obj.selectedPatron && !obj.selectedPatronType) {\n                                            obj.selectedPatronType = [1, 2, 4, 5];\n                                        }\n\n                                        //If the user provided a subcommittee without a parent committee then set the parent committee for them\n                                        if (obj.selectedSubcommittee && !obj.selectedCommittee) {\n                                            obj.selectedCommittee = this.props.committee.committeeList.find(x => x.CommitteeID === (this.props.committee.committeeList.find(x => x.CommitteeID === obj.selectedSubcommittee).ParentCommitteeID)).CommitteeID\n                                        }\n\n                                        if (Object.keys(obj).length > 0) {\n                                            const b64Params = window.btoa(JSON.stringify(obj));\n                                            const url = '/bill-search/?q=' + b64Params;\n                                            this.props.history.push(url);\n                                        } else {\n                                            this.setState({\n                                                error: true\n                                            }, () => {\n                                                return;\n                                            })\n                                        }\n                                    } catch (e) {\n                                        console.log(e)\n                                        this.setState({\n                                            error: true\n                                        })\n                                    }\n                                })));\n\n                })\n        })\n    }\n\n    render() {\n        return (\n            <div>\n                {!this.state.error\n                    ? <div className=\"center-spinner spinner\">Loading...</div>\n                    : <p className='message-error'>There was an error converting your URL parameters into a bill search. Please check your parameters and try again.\n                        <br />\n                        <br />\n                        The following parameters can be used to write a search query:\n                        <br />\n                        <br />\n                        To search for a:\n                        <br />\n                        Member: mem=Member Number\n                        <br />\n                        Patron Type: mempat=Letter (C/F/S/I)\n                        <br />\n                        Committee: com=Committee Number\n                        <br />\n                        Subcommittee: subcom=Committee Number\n                        <br />\n                        Session: ses=Session Code\n                        <br />\n                        <br />\n                        The URLs are constructed as /q/?param=value&param2=value2&param3=value3\n                        <br />\n                        <br />\n                        For example:  lis.virginia.gov/q?ses=20221&mem=H0289&mempat=S&mempat=F will get legislation for Dawn Adams as a Co-Patron or Chief Co-Patron in the 2022 Regular Session.\n                        <br />\n                        <br />\n                        You may use multiple patron types. If you use multiple sessions, members, committees, or subcommittees the search will use the last one in the list. If you supply a patron type you must supply a patron.\n                    </p>\n                }\n            </div>\n        )\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { nav, committee, members, patrons, session } = state;\n        return {\n            nav,\n            committee,\n            members,\n            patrons,\n            session\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, committeeActionCreators, memberActionCreators, navActionCreators, patronActionCreators, sessionActionCreators), dispatch)\n        }\n    }\n)(ShorthandUrlTranslator);","import { partnerRequest, publicRequest } from '../services/request.service'\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst agencyListSuccess = 'AGENCY_LIST_SUCCESS';\nconst agencyListFailure = 'AGENCY_LIST_FAILURE';\n\nconst initialState = {\n    agencyList: [],\n    agencyListError: '',\n};\n\nexport const orgActionCreators = {\n\n    receiveAgencyList: (content) => ({\n        type: agencyListSuccess,\n        agencyList: content\n    }),\n\n    agencyListError: (message) => ({\n        type: agencyListFailure,\n        agencyListError: message\n    }),\n\n    getAgencyList: (params) => {\n        return dispatch => {\n            return publicRequest((API_URL || process.env.REACT_APP_STATS_API_URL) + '/Organization/api/GetAgencyReferencesAsync', 'GET', '', '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(orgActionCreators.agencyListError(result[1]));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(orgActionCreators.receiveAgencyList(result[1].Agencies));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(orgActionCreators.receiveAgencyList([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n}\n\nexport const reducer = (state, action) => {\n\n    state = state || initialState;\n    switch (action.type) {\n        case agencyListSuccess:\n            return Object.assign({}, state, {\n                agencyList: action.agencyList,\n                agencyListError: ''\n            })\n        case agencyListFailure:\n            return Object.assign({}, state, {\n                agencyListError: action.agencyListError\n            })\n        default:\n            return state\n    }\n};","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport Select from 'react-select';\nimport moment from 'moment-timezone';\n\nclass ImpactStatementForm extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            fiscal: true,\n            selectedAgency: \"\",\n            uploadFile: \"\"\n        }\n\n        this.getImpactStatementDescription = this.getImpactStatementDescription.bind(this);\n        this.handleAgencyChange = this.handleAgencyChange.bind(this);\n        this.handleFileChange = this.handleFileChange.bind(this);\n        this.submit = this.submit.bind(this);\n    }\n\n    handleRadioChange() {\n        this.setState({\n            fiscal: !this.state.fiscal\n        })\n    }\n\n    handleAgencyChange(value) {\n        this.setState({\n            selectedAgency: value\n        })\n    }\n\n    handleFileChange(e) {\n        this.setState({\n            uploadFile: e.target.files[0]\n        })\n    }\n\n    getImpactStatementDescription() {\n        if (!this.state.selectedAgency) { return \"\" }\n        let description;\n        if (!this.state.fiscal) {\n            description = \"Racial and ethnic impact statement\";\n        } else if (this.state.selectedAgency.Abbreviation !== \"JLARC\") {\n            description = \"Impact statement\";\n        } else {\n            description = \"Fiscal impact review\";\n        }\n\n        description += \" from \" + this.state.selectedAgency.Abbreviation + \" (\" + this.props.match.params.billnumber + \")\";\n        return description;\n    }\n\n    submit() {\n        this.props.submit(this.getImpactStatementDescription(), this.state.selectedAgency, this.state.uploadFile);\n    }\n\n    render() {\n        let description = this.getImpactStatementDescription();\n        if (description) {\n            description = description.substr(0, description.indexOf(\"(\"))\n        }\n        return (\n            <div className=\"dlas-forms\">\n                <p>{\"Impact Statement for \" + moment(this.props.statementDate).format(\"MM/DD/YYYY\") + \" - \" + this.props.statementDescription}</p>\n                <div className=\"grid-wrapper one-two-small-small\">\n                    <div style={{ whiteSpace: 'nowrap' }}>\n                        <div style={{ display: \"inline-flex\", alignItems: 'center', marginRight: '0.5em' }}>\n                            <label htmlFor=\"selected-type-button\" className={`label radio-label`} style={{ whiteSpace: \"no-wrap\", width: 'auto' }}>Fiscal</label>\n                            <input id=\"selected-type-button\" checked={this.state.fiscal === true} onChange={() => this.handleRadioChange()} type=\"radio\" />\n                        </div>\n                        <div style={{ display: \"inline-flex\", alignItems: 'center' }}>\n                            <label htmlFor=\"all-sessions-button\" className={`label radio-label`} style={{ whiteSpace: \"no-wrap\", width: 'auto' }}>Racial and Ethnic</label>\n                            <input id=\"all-sessions-button\" checked={this.state.fiscal === false} onChange={() => this.handleRadioChange()} type=\"radio\" />\n                        </div>\n                    </div>\n                    <Select\n                        options={this.props.agencyOptions}\n                        onChange={this.handleAgencyChange}\n                        value={this.state.selectedAgency}\n                        isSearchable\n                    />\n                    <button type=\"button\" className=\"button small-button file-button\">\n                        <input type=\"file\" accept=\".pdf\" onChange={this.handleFileChange} />\n                        {this.state.uploadFile ? this.state.uploadFile.name : \"Attach Impact Statement\"}\n                    </button>\n                </div>\n                <br />\n                <div>\n                    <p style={{ position: 'absolute' }}>{description ? \"Description: \" + description : \"\"}</p>\n                    <div className=\"align-right\">\n                        <button type=\"button\" className=\"button secondary\" style={{ marginRight: \"15px\" }} onClick={() => this.props.toggleStatementForm()}>Cancel</button>\n                        <button type=\"button\" className=\"button default\" disabled={this.state.uploadFile === \"\" || this.state.selectedAgency === \"\" || this.props.isSubmitting} onClick={() => this.submit()}>Upload</button>\n                    </div>\n                </div>\n            </div>\n        )\n    }\n}\n\nexport default withRouter(ImpactStatementForm);\n","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { collectionActionCreators } from '../../../stores/lis-collection-store';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\n\nclass CollectionNotes extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            notes: [],\n            expanded: false\n        };\n\n        this.toggleExpandNotes = this.toggleExpandNotes.bind(this);\n    }\n\n    componentDidMount() {\n        this.props.actions.getCollections(\"?SessionID=\" + this.props.sessionId)\n            .then(() => {\n                const legId = this.props.billData.LegislationID;\n                let notes = [];\n                this.props.collection.collections.forEach(collection => {\n                    const legislationInCollection = collection.WatchListLegislation.find(leg => leg.LegislationID === legId);\n                    if (legislationInCollection && legislationInCollection.Note) {\n                        notes.push({\n                            ...legislationInCollection,\n                            Name: collection.Name,\n                            Description: collection.Description\n                        });\n                    }\n                });\n                this.setState({\n                    notes: notes\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return\n                }\n            });\n    }\n\n    toggleExpandNotes() {\n        this.setState({\n            expanded: !this.state.expanded\n        })\n    }\n\n    render() {\n        if (this.state.notes.length === 0) {\n            return (<div></div>);\n        }\n        return (<div>\n            <h4>Your Notes</h4>\n            {this.state.notes.map((note, noteIndex) =>\n                <div key={noteIndex} className='note-wrapper'>\n                    <span className=\"small-text\"><span className=\"bold\">{note.Name}</span>: {note.Note.length < 345 || this.state.expanded ? note.Note : note.Note.substring(0, 345) + \"...\"}</span>\n                </div>\n            )}\n            {this.state.notes.find(x => x.Note.length > 400) && <button className='button small-button note-button' type=\"button\" onClick={() => this.toggleExpandNotes()}>{(this.state.expanded ? \"Collapse\" : \"Expand\") + \" Notes\"}</button>}\n        </div>)\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { collection, login } = state;\n        return {\n            collection,\n            login\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, authActionCreators, collectionActionCreators), dispatch)\n        }\n    }\n)(CollectionNotes)","import React from 'react';\nimport moment from 'moment-timezone';\nimport renderHTML from 'react-render-html';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport ReactToPrint from \"react-to-print\";\nimport CreatableSelect from 'react-select/creatable';\nimport { billActionCreators } from '../../../stores/lis-legislation-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { patronActionCreators } from '../../../stores/lis-patron-store';\nimport { voteActionCreators } from '../../../stores/lis-votes-store';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { committeeActionCreators } from '../../../stores/lis-committee-store';\nimport { orgActionCreators } from '../../../stores/lis-org-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport '../../../stylesheets/lis-public-view/public-view.css';\nimport LoaderComponent from '../../../lis-shared/lis-layout/components/lis-loader-component';\nimport BillHistoryForm from './lis-history-form';\nimport ImpactStatementForm from './lis-impact-statements';\nimport CollectionNotes from './collection-notes';\nimport queryString from 'query-string';\nimport { minutesActionCreators } from '../../../stores/lis-minutes-store';\nimport { memberActionCreators } from '../../../stores/lis-members-store';\nimport VersionList from '../../../lis-shared/lis-bills/lis-bill-version-list';\nimport { Editor } from '@tinymce/tinymce-react';\nimport { collectionActionCreators } from '../../../stores/lis-collection-store';\n\nconst BILL_EVENT_VIEWER = \"LegislationEvent\";\nconst BILL_EVENT_AUTHOR = \"LegislationEventHistory\";\nconst BILL_COLLECTION_AUTHOR = \"LegislationCollections\";\nconst BILL_AUTHOR = \"Legislation\";\nconst VERSION_AUTHOR = \"LegislationText\";\nconst PATRON_AUTHOR = \"LegislationPatron\";\n\nconst SUMMARY = \"summary\";\nconst DESCRIPTION = \"description\";\n\nconst isStatic = window.location.pathname.includes('static');\n\nconst selectStyle = {\n    control: styles => ({\n        ...styles,\n        minHeight: '0px',\n        padding: '0.12em 0.6em !important',\n    }),\n    valueContainer: styles => ({\n        ...styles,\n        padding: 0,\n    }),\n    input: styles => ({\n        ...styles,\n        fontSize: '0.8em',\n        lineHeight: 'normal',\n    }),\n    singleValue: styles => ({\n        ...styles,\n        fontSize: '0.8em'\n    }),\n    placeholder: styles => ({\n        ...styles,\n        fontSize: '0.8em'\n    }),\n    option: styles => ({\n        ...styles,\n        fontSize: '0.8em'\n    }),\n    dropdownIndicator: styles => ({\n        ...styles,\n        padding: '1px'\n    }),\n}\n\nfunction PatronName(props) {\n    return (\n        <Link to={`/session-details/${props.session.SessionCode}/member-information/${props.MemberNumber}/member-details`}>{props.MemberDisplayName}{props.ByRequest && props.DisplayName ? ' ' + props.DisplayName.replace(')', ', By Request)') : props.DisplayName ? ' ' + props.DisplayName : props.ByRequest ? ' (By Request)' : null}</Link>\n    );\n}\n\nfunction PatronList(props) {\n    var patronsLength = props.patrons.length;\n    const listPatrons = props.patrons.map((patrons, i) => {\n        if (props.list) {\n            return <li><PatronName session={props.session} key={i} {...patrons} /></li>\n        } else if (patronsLength === i + 1) {\n            return <PatronName session={props.session} key={i} {...patrons} />\n        } else {\n            return <span key={i}><PatronName session={props.session} {...patrons} />, </span>\n        }\n    });\n    return props.list ? <ul className=\"list-two no-list-style\">{listPatrons}</ul> : <span>{listPatrons}</span>;\n}\n\nclass BillDetailsComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            billData: '',\n            historyList: [],\n            summariesList: [],\n            housePatronsList: [],\n            senatePatronsList: [],\n            versionsList: [],\n            chiefPatronsList: [],\n            sessionData: '',\n            toolTip: false,\n            editingHistory: false,\n            billEvents: [],\n            organizedEvents: [],\n            actionTypes: [],\n            memberList: [],\n            committeeList: [],\n            editing: {},\n            description: \"\",\n            saving: {},\n            displayStatementForm: false,\n            statementSubmitting: false,\n            statementLegislationTextID: '',\n            statementDate: '',\n            statementDescription: '',\n            agencyOptions: [],\n            statementDocumentcode: '',\n            reconsiderationEvents: [],\n            hideAllEvents: true,\n            patronList: [],\n            collections: [],\n            collectionIsLoading: false,\n            showPopup: false,\n            watchlists: [],\n            selectedWatchlists: [],\n            showWatchlistForm: false\n        };\n        this.setupPage = this.setupPage.bind(this);\n        this.getBillDetails = this.getBillDetails.bind(this);\n        this.getPatrons = this.getPatrons.bind(this);\n        this.getBillVersion = this.getBillVersion.bind(this);\n        this.toggleShowLinks = this.toggleShowLinks.bind(this);\n        this.toggleEditContent = this.toggleEditContent.bind(this);\n        this.handleEventChange = this.handleEventChange.bind(this);\n        this.saveEvents = this.saveEvents.bind(this);\n        this.changeToNewBillHistoryForm = this.changeToNewBillHistoryForm.bind(this);\n        this.saveDescription = this.saveDescription.bind(this);\n        this.saveSummary = this.saveSummary.bind(this);\n        this.toggleEdit = this.toggleEdit.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n        this.toggleStatementForm = this.toggleStatementForm.bind(this);\n        this.submitImpactStatement = this.submitImpactStatement.bind(this);\n        this.closeStatementForm = this.closeStatementForm.bind(this);\n        this.getReconsiderationEvents = this.getReconsiderationEvents.bind(this);\n        this.togglehideAllEvents = this.togglehideAllEvents.bind(this);\n        this.checkForDuplicates = this.checkForDuplicates.bind(this);\n        this.togglePatronModal = this.togglePatronModal.bind(this);\n        this.handleWatchlistChange = this.handleWatchlistChange.bind(this);\n        this.handleAddToWatchlists = this.handleAddToWatchlists.bind(this);\n        this.addToWatchlists = this.addToWatchlists.bind(this);\n        this.getCollections = this.getCollections.bind(this);\n        this.toggleWatchlistForm = this.toggleWatchlistForm.bind(this);\n        this.handleToggleDescriptionEdit = this.handleToggleDescriptionEdit.bind(this);\n        this.handleDescriptionChange = this.handleDescriptionChange.bind(this);\n        this.saveVersionDescription = this.saveVersionDescription.bind(this);\n    }\n\n    componentDidMount() {\n        window.scrollTo(0, 0);\n\n        const sessionCode = this.props.match ? this.props.match.params.sessionCode : this.props.selectedBillSession;\n        let legislationNumber = this.props.match ? this.props.match.params.billnumber : this.props.selectedBill;\n\n        //if legislation number is zero-padded (such as from a calendar), remove the zero-padding\n        const legislationNumberDigitsWithZeroPadding = legislationNumber.match(/\\d+/); //e.g. 0259\n        if (legislationNumberDigitsWithZeroPadding) {\n            const legislationNumberDigitsWithOutZeroPadding = parseInt(legislationNumberDigitsWithZeroPadding[0]); //turns 0259 into 259\n            legislationNumber = legislationNumber.replace(/\\d+/, legislationNumberDigitsWithOutZeroPadding); //turns HB0259 into HB259\n        }\n\n        this.setupPage(sessionCode, legislationNumber);\n    }\n\n    componentDidUpdate(prevProps) {\n        const sessionCode = this.props.match ? this.props.match.params.sessionCode : this.props.selectedBillSession;\n        const legislationNumber = this.props.match ? this.props.match.params.billnumber : this.props.selectedBill;\n        const previousSessionCode = prevProps.match ? prevProps.match.params.sessionCode : prevProps.selectedBillSession;\n        const previousLegislationNumber = prevProps.match ? prevProps.match.params.billnumber : prevProps.selectedBill;\n        if (previousSessionCode !== sessionCode || previousLegislationNumber !== legislationNumber) {\n            this.setState({\n                historyIsLoaded: false,\n                summaryIsLoaded: false,\n                versionsIsLoaded: false,\n                patronIsLoaded: false,\n                billDataIsLoaded: false\n            }, () => {\n                this.setupPage(sessionCode, legislationNumber);\n            })\n        } else if (JSON.stringify(prevProps.login.userClaims.resources) !== JSON.stringify(this.props.login.userClaims.resources)) {\n            this.setState({\n                historyIsLoaded: false\n            }, () => {\n                if (!this.props.login.userClaims.resources.find(resource => resource === BILL_AUTHOR)) {\n                    this.setState({ editing: {} })\n                }\n                this.setupPage(sessionCode, legislationNumber);\n            })\n        }\n\n        if (!this.state.switchedToBill && prevProps.location.search !== this.props.location.search) {\n            const parsed = queryString.parse(this.props.location.search);\n            if (parsed.openBillHistory) {\n                this.setState({\n                    switchedToBill: true\n                });\n            }\n        }\n\n    }\n\n    setupPage(sessionCode, legislationNumber) {\n        this.props.actions.getSessionByCode(sessionCode).then(() => {\n            if (this.props.session.selectedSession) {\n                this.setState({\n                    sessionData: this.props.session.selectedSession,\n                    conveneDate: this.props.session.selectedSession.SessionStart,\n                    legislationNumber: legislationNumber\n                }, () => {\n                    this.getBillDetails(legislationNumber, sessionCode);\n                    this.getBillSummary(legislationNumber, sessionCode);\n                    this.getBillVersion(legislationNumber, sessionCode);\n\n                    if (this.props.login.isAuthenticated) {\n                        this.getCollections(\"?SessionID=\" + this.state.sessionData.SessionID);\n                    }\n                });\n                this.props.actions.getCommitteeList('sessionID=' + this.props.session.selectedSession.SessionID + \"&includeSubCommittees=true\").then(() => {\n                    let committeeList = this.props.committee.committeeList;\n                    committeeList.forEach(committee => {\n                        committee.label = committee.Name;\n                        committee.value = committee.CommitteeID;\n                        committee.abbrev = committee.Abbreviation;\n                    });\n                    this.setState({\n                        committeeList: committeeList\n                    });\n                });\n            }\n        }).catch(err => {\n            if (err === \"Aborted\") {\n                return;\n            }\n            this.setState({\n                billDataIsLoaded: true,\n                patronIsLoaded: true,\n                historyIsLoaded: true,\n                billData: ''\n            });\n        });\n        //This is if a user is signed in with the correct roles they can edit the events\n        const chamberCode = legislationNumber[0];\n        this.props.actions.getBillEvents('?LegislationChamberCode=' + chamberCode)\n            .then(() => {\n                let billEvents = [...this.props.bills.billEvents];\n                billEvents.forEach(evt => {\n                    evt.label = evt.LegislationDescription;\n                    evt.value = `${evt.LegislationEventTypeID}-${evt.IsPassed}`\n                });\n                this.setState({\n                    billEvents: billEvents\n                });\n            });\n        this.props.actions.getMemberList('sessionCode=' + sessionCode).then(() => {\n            let memberList = [...this.props.members.memberList];\n            memberList.forEach(member => {\n                member.label = member.PatronDisplayName;\n                member.value = member.MemberID;\n            });\n            this.setState({\n                memberList: memberList\n            });\n        });\n        this.props.actions.getActionTypes()\n            .then(() => {\n                let actionTypes = [...this.props.minutes.actionTypes];\n                actionTypes.forEach(type => {\n                    type.label = type.ActionReferenceType;\n                    type.value = type.ActionReferenceTypeID;\n                })\n                this.setState({\n                    actionTypes: actionTypes\n                });\n            });\n        this.props.actions.getAgencyList().then(() => {\n            let agencies = [...this.props.organizations.agencyList]\n            agencies.forEach((agency, i) => {\n                agency.label = agency.AgencyName + \" (\" + agency.Abbreviation + \")\";\n                agency.value = agency.AgencyNumber\n            })\n            this.setState({\n                agencyOptions: agencies\n            })\n        })\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    // RETRIEVE PATRONS FOR A BILL\n    getPatrons(billID, chamberCode) {\n        this.props.actions.getPatronList(billID).then(() => {\n            let senatePatronsList = this.props.patrons.senatePatronsList;\n            let housePatronsList = this.props.patrons.housePatronsList;\n            let chiefPatronsList = this.props.patrons.chiefPatronsList;\n            let patronList = this.props.patrons.patronList;\n            let originalPatronList = this.props.patrons.patronList;\n            if (chamberCode === 'H' && chiefPatronsList && chiefPatronsList.length > 1) {\n                for (let i = 1; i < chiefPatronsList.length; i++) {\n                    if (chiefPatronsList[i].ChamberCode === 'S') {\n                        senatePatronsList.unshift(chiefPatronsList[i]);\n                    } else {\n                        housePatronsList.unshift(chiefPatronsList[i]);\n                    }\n                    chiefPatronsList.splice(i, 1);\n                    i--;\n                }\n            }\n\n            housePatronsList.sort((a, b) => { return a.Sequence > b.Sequence ? 1 : b.Sequence > a.Sequence ? -1 : a.PatronDisplayName > b.PatronDisplayName ? 1 : -1 });\n            senatePatronsList.sort((a, b) => { return a.Sequence > b.Sequence ? 1 : b.Sequence > a.Sequence ? -1 : a.PatronDisplayName > b.PatronDisplayName ? 1 : -1 });\n\n            this.setState({\n                senatePatronsList,\n                housePatronsList,\n                chiefPatronsList,\n                patronList,\n                originalPatronList,\n                patronIsLoaded: true\n            }, () => {\n                if (this.props.location.state && this.props.location.state.expandPatrons && chiefPatronsList.length + housePatronsList.length + senatePatronsList.length > 1) {\n                    this.toggleShowData('slidePatron');\n                }\n            })\n        }\n        )\n    }\n\n    // RETRIEVE BILL SUMMARIES\n    getBillSummary(billNumber, sessionCode) {\n        const params = '?sessionCode=' + sessionCode + '&legislationNumber=' + billNumber;\n        this.props.actions.getBillSummary(params).then(() => {\n            this.setState({\n                summariesList: this.props.bills.billSummary.sort((a, b) => { return b.SummaryVersionID - a.SummaryVersionID }),\n                summaryIsLoaded: true\n            });\n        });\n    }\n\n    // RETRIEVE BILL VERSIONS\n    getBillVersion(billNumber, sessionCode) {\n        const partner = this.props.login.userClaims.resources.find(resource => resource === VERSION_AUTHOR)\n        var params = '?isPublic=' + !partner + '&legislationNumber=' + billNumber + '&sessionCode=' + sessionCode;\n        this.props.actions.getBillText(params, partner).then(() =>\n            this.setState({\n                versionsList: [...this.props.bills.billText].filter(v => !v.SessionCode || v.SessionCode === sessionCode),\n                versionsIsLoaded: true\n            }, () => {\n                if (this.props.login.userClaims.scopes.findIndex(x => x === \"House\") > -1 || this.props.login.userClaims.scopes.findIndex(x => x === \"Senate\") > -1 || this.props.login.userClaims.roles.findIndex(x => x === \"DLSStaff\") > -1) {\n                    this.setState({\n                        slideVersions: true\n                    })\n                }\n            })\n        );\n    }\n\n    // RETRIEVE THE BILL HISTORY (BILL EVENTS)\n    getBillHistory(legislationID, sessionCode) {\n        let partner = false;\n        let partnerEditor = false;\n        //Only use the partner endpoint if the user looking at the bill text is authorized to edit it or is supposed to see non-public events\n        if (this.props.login.userClaims.claims.find(claim => claim.RoleName === BILL_EVENT_AUTHOR)) {\n            partner = true;\n            partnerEditor = true;\n        } else if (this.props.login.userClaims.resources.find(resource => resource === BILL_EVENT_VIEWER)) {\n            partner = true;\n        }\n\n        let params = '?legislationID=' + legislationID + \"&sessionCode=\" + sessionCode;\n        this.props.actions.getBillHistoryByBillID(params, partner)\n            .then(() => {\n                this.setState({\n                    historyList: this.props.bills.billHistory,\n                    historyIsLoaded: true\n                }, () => {\n                    if (partnerEditor) {\n                        const parsed = queryString.parse(this.props.location.search);\n                        if (parsed.openBillHistory) {\n                            this.setState({\n                                switchedToBill: true,\n                                editingHistory: true\n                            });\n                        }\n                    } else {\n                        this.setState({\n                            editingHistory: false\n                        })\n                    }\n                })\n            });\n    }\n\n    getReconsiderationEvents(params) {\n        params = '?ReconsiderationAction=' + params + '&LegislationID=' + this.state.billData.LegislationID;\n\n        this.props.actions.getLegislationEventsByLegislationId(params)\n            .then(() => {\n                this.setState({\n                    reconsiderationEvents: this.props.bills.legislationEventsById\n                });\n            })\n    }\n\n    // RETRIEVE THE BILL DETAILS\n    getBillDetails(billId, sessionCode) {\n        const params = {\n            SessionCode: sessionCode,\n            LegislationNumbers: [{ LegislationNumber: billId }],\n        };\n\n        this.props.actions.getBillList(params).then(() => {\n            if (this.props.bills.billList[0]) {\n                this.setState({\n                    billData: this.props.bills.billList[0],\n                    billDataIsLoaded: true,\n                }, () => {\n                    this.getPatrons(this.state.billData.LegislationID, this.state.billData.ChamberCode);\n                    this.getBillHistory(this.state.billData.LegislationID, this.state.billData.SessionCode);\n                });\n            } else {\n                //The bill cannot be found. Everything has stopped loading so set them to true. A message will be displayed to the user that the bill was not found\n                this.setState({\n                    billDataIsLoaded: true,\n                    patronIsLoaded: true,\n                    historyIsLoaded: true,\n                    billData: ''\n                });\n            }\n        });\n    }\n\n    // TOGGLE SHOW 'ALL' SLIDEDOWNS\n    toggleShowData(slide) {\n        this.setState(prevState => ({\n            [slide]: !prevState[slide]\n        }));\n    }\n\n    // TOGGLE THE INFO TOOLTIP\n    toggleShowTooltip() {\n        this.setState(state => ({\n            toolTip: !state.toolTip\n        }));\n    }\n\n    // TOGGLE THE 'ALL HISTORY' ARROW\n    toggleShowLinks(vote, sessionCode) {\n        let historyList = [...this.state.historyList];\n        const historyIndex = historyList.findIndex(item => item.LegislationEventID == vote.LegislationEventID);\n\n        historyList[historyIndex].opened = !historyList[historyIndex].opened;\n        if (vote.VoteLinks) {\n            this.setState({\n                historyList: historyList\n            });\n        } else {\n            historyList[historyIndex].isLoading = true;\n            this.setState({ historyList: historyList });\n            let params = '?legislationEventID=' + vote.LegislationEventID;\n            this.props.actions.getVoteLink(params).then(() => {\n                let links = [...this.props.votes.voteLinkResponse];\n                let linkPromises = [];\n                links.forEach(link => {\n                    if (link.CommitteeID) {\n                        const cmtePromise = this.props.actions.getCommitteeById(\"?id=\" + link.CommitteeID + \"&sessionCode=\" + vote.SessionCode)\n                            .then(() => {\n                                link.CommitteeNumber = this.props.committee.committeeByIdData.CommitteeNumber;\n                            }).catch((err) => {\n                                console.error(err);\n                                // Don't care if it fails. That committee won't be visible\n                                return Promise.resolve();\n                            })\n                        linkPromises.push(cmtePromise);\n                    }\n                    // If there are any vote links of type 'Legislation' then the legislation ID needs to be turned into a legislation number to form the link\n                    if (link.ReferenceType === \"Legislation\") {\n                        const promise = this.props.actions.getBill(link.ReferenceID)\n                            .then(() => {\n                                link.LegislationNumber = this.props.bills.bill.LegislationNumber;\n                                link.SessionCode = link.SessionCode || vote.SessionCode;\n                                return Promise.resolve();\n                            }).catch(err => {\n                                console.error(err);\n                                // Don't care if it fails. That legislation won't be visible\n                                return Promise.resolve();\n                            });\n                        linkPromises.push(promise);\n                    }\n                });\n                Promise.all(linkPromises)\n                    .then(() => {\n                        historyList[historyIndex].isLoading = false;\n                        historyList[historyIndex].VoteLinks = this.props.votes.voteLinkResponse;\n                        this.setState({\n                            historyList: historyList\n                        });\n                    });\n            });\n        }\n    }\n\n    toggleEditContent() {\n        this.setState(state => ({\n            editingHistory: !state.editingHistory\n        }), () => {\n            //some browsers do not support the :has() css selector, which is how we remove (i.e. set display: none) the footer-wrapper when editing events.\n            //in these instances, we rely on the below js to accomplish the same.\n            const footer = document.getElementsByClassName(\"footer-wrapper\");\n            if (footer && footer[0]) {\n                const unsupportedBrowser = (this.state.editingHistory && window.getComputedStyle(footer[0]).display === 'block') || (!this.state.editingHistory && footer[0].style.display === 'none');\n                if (unsupportedBrowser) {\n                    if (this.state.editingHistory) {\n                        footer[0].style.display = 'none';\n                    } else {\n                        footer[0].style.display = '';\n                    }\n                }\n            }\n        });\n    }\n\n    toggleStatementForm(statementDate, statementDescription, documentCode) {\n        if (!this.state.displayStatementForm) {\n            this.setState({\n                displayStatementForm: true,\n                statementDate: statementDate,\n                statementDescription: statementDescription,\n                statementDocumentcode: documentCode\n            });\n        } else {\n            this.setState({\n                displayStatementForm: false,\n                statementDate: \"\",\n                statementDescription: \"\",\n                statementDocumentcode: \"\"\n            });\n        }\n    }\n\n    closeStatementForm() {\n        this.setState({\n            displayStatementForm: false\n        }, () => {\n            //Refresh the page to show the new impact statement in the version list\n            const sessionCode = this.props.match ? this.props.match.params.sessionCode : this.props.selectedBillSession;\n            const legislationNumber = this.props.match ? this.props.match.params.billnumber : this.props.selectedBill;\n            this.setupPage(sessionCode, legislationNumber);\n        })\n    }\n\n    handleEventChange(organizedEvents, callback) {\n        this.setState({\n            organizedEvents: organizedEvents\n        }, () => {\n            if (callback) {\n                callback();\n            }\n        });\n    }\n\n    saveEvents(eventsToSave, callback) {\n        if (eventsToSave.length > 0) {\n            this.props.actions.saveBillEvent({ LegislationEvents: eventsToSave })\n                .then(() => {\n                    this.props.actions.makeToast([{ message: \"Events Saved\", type: \"success\" }]);\n                    this.props.actions.getBillHistoryByBillID('?legislationID=' + this.state.billData.LegislationID + \"&sessionCode=\" + this.state.billData.SessionCode, true)\n                        .then(() => {\n                            this.setState({\n                                historyList: this.props.bills.billHistory,\n                            }, () => callback(true))\n                        });\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    let msg;\n                    if (err) {\n                        try {\n                            const errJson = JSON.parse(err);\n                            if (errJson && errJson.Name) {\n                                msg = errJson.Name\n                            }\n                        } catch (e) { /*do nothing*/ }\n                    }\n                    this.props.actions.makeToast([{ message: msg && msg.toLowerCase().includes(\"unable to delete referral\") ? msg : \"Events Save Failed\", type: \"failure\" }]);\n                    this.props.actions.getBillHistoryByBillID('?legislationID=' + this.state.billData.LegislationID + \"&sessionCode=\" + this.state.billData.SessionCode, true)\n                        .then(() => {\n                            this.setState({\n                                historyList: this.props.bills.billHistory,\n                            }, () => callback(false))\n                        });\n                })\n        } else {\n            // If there  are no events to save then just show the save succesful banner after a second to give the illusion something happened.\n            setTimeout(() => {\n                this.props.actions.makeToast([{ message: \"Events Saved\", type: \"success\" }]);\n                callback(false)\n            }, 1000)\n        }\n    }\n\n    changeToNewBillHistoryForm(billNum) {\n        this.props.history.push(`/bill-details/${this.state.sessionData.SessionCode}/${billNum}/?openBillHistory=true`)\n    }\n\n    saveDescription() {\n        let saving = { ...this.state.saving };\n        saving[DESCRIPTION] = true;\n        this.setState({\n            saving\n        }, () => {\n            //Partner get bill request to get the mod date\n            this.props.actions.getBill(this.state.billData.LegislationID, true)\n                .then(() => {\n                    let modifiedBillData = { ...this.props.bills.bill };\n                    modifiedBillData.Description = this.state.description;\n\n                    this.props.actions.saveBill({ LegislationList: [modifiedBillData] })\n                        .then(() => {\n                            this.props.actions.makeToast([{ message: \"Description Saved\", type: \"success\" }]);\n                            let newBillData = { ...this.state.billData }\n                            newBillData.Description = this.state.description;\n                            let editing = { ...this.state.editing };\n                            editing[DESCRIPTION] = false;\n                            saving[DESCRIPTION] = false;\n                            this.setState({\n                                editing,\n                                saving,\n                                billData: newBillData\n                            });\n                        }).catch(err => {\n                            if (err === 'Aborted') {\n                                return;\n                            }\n                            this.props.actions.makeToast([{ message: \"Description Save Failed\", type: \"failure\" }]);\n                            let editing = { ...this.state.editing };\n                            editing[DESCRIPTION] = false;\n                            saving[DESCRIPTION] = false;\n                            this.setState({\n                                editing: editing,\n                                saving: saving\n                            });\n                        });\n                })\n        })\n    }\n\n    saveSummary(index, deletion) {\n        let saving = { ...this.state.saving };\n        if (!saving[SUMMARY]) {\n            saving[SUMMARY] = {};\n        }\n        saving[SUMMARY][index] = true;\n        this.setState({\n            saving\n        }, () => {\n            let summariesList = [...this.state.summariesList];\n            //Partner get summary request to get the mod date\n            this.props.actions.getBillSummary('/' + summariesList[index].LegislationSummaryID, true)\n                .then(() => {\n                    let modifiedSummaryData = [...this.props.bills.billSummary];\n                    if (deletion) {\n                        //Turn IsActive and IsPublic is false, and that will prevent the DB from turning one or the other true in the future\n                        modifiedSummaryData[0].IsActive = false;\n                        modifiedSummaryData[0].IsPublic = false;\n                    } else {\n                        modifiedSummaryData[0].Summary = this.state.summary[index];\n                    }\n                    this.props.actions.saveBillSummary({ SummaryList: modifiedSummaryData })\n                        .then(() => {\n                            this.props.actions.makeToast([{ message: \"Summary \" + (deletion ? \"Removed\" : \"Saved\"), type: \"success\" }]);\n                            let editing = { ...this.state.editing };\n                            let summary = { ...this.state.summary };\n                            if (deletion) {\n                                //remove from the UI and reset the editing/saving/summary values to avoid indexing problems\n                                this.toggleDeleteSummaryModal();\n                                summariesList.splice(index, 1);\n                                saving = {};\n                                editing = {};\n                                summary = {};\n                            } else {\n                                summariesList[index] = this.props.bills.billSummarySave[0];\n                                saving[SUMMARY][index] = false;\n                                if (editing[SUMMARY] && editing[SUMMARY][index]) {\n                                    editing[SUMMARY][index] = false;\n                                }\n                            }\n                            this.setState({\n                                summariesList,\n                                summary,\n                                editing,\n                                saving\n                            });\n                        }).catch(err => {\n                            if (err === 'Aborted') {\n                                return;\n                            }\n                            console.error(err)\n                            this.props.actions.makeToast([{ message: \"Summary Save Failed\", type: \"failure\" }]);\n                            let editing = { ...this.state.editing };\n                            let saving = { ...this.state.saving };\n                            let summary = { ...this.state.summary };\n                            editing = {};\n                            saving = {};\n                            summary = {};\n                            this.setState({\n                                summary,\n                                editing: editing,\n                                saving: saving\n                            });\n                        });\n                })\n        })\n    }\n\n    toggleEdit(key, value, index) {\n        let editing = { ...this.state.editing };\n        if (key === SUMMARY) {\n            if (!editing[key]) {\n                editing[key] = {};\n            }\n            editing[key][index] = !editing[key][index];\n            let keyState = { ...this.state[key] };\n            keyState[index] = value;\n            this.setState({\n                editing,\n                [key]: keyState\n            })\n        } else {\n            editing[key] = !editing[key];\n            this.setState({\n                editing,\n                [key]: value\n            })\n        }\n    }\n\n    handleChange(key, e, index) {\n        if (key === SUMMARY) {\n            let keyState = { ...this.state[key] };\n            keyState[index] = e;\n            this.setState({\n                [key]: keyState\n            })\n        } else {\n            this.setState({\n                [key]: e.target.value\n            })\n        }\n    }\n\n    handleWatchlistChange(val) {\n        this.setState({\n            selectedWatchlists: val\n        });\n    }\n\n    handleAddToWatchlists() {\n        let watchlists = JSON.parse(JSON.stringify(this.state.selectedWatchlists));\n        this.addToWatchlists(watchlists, (saveResultCollections) => {\n            let showPopup = { ...this.state.showPopup };\n\n            // they are adding bills to one or more watchlist(s) - we need to update the selectedWatchlists state values because their mod dates have now changed\n            for (let i = 0; i < watchlists.length; i++) {\n                const associatedWatchlist = saveResultCollections.find(c => c.WatchListID === watchlists[i].WatchListID);\n                if (associatedWatchlist && associatedWatchlist.ModificationDate !== watchlists[i].ModificationDate) {\n                    watchlists[i] = associatedWatchlist\n                };\n            }\n\n            this.setState({ selectedWatchlists: [] ? watchlists : [], selectedMergeWatchlists: [], showPopup })\n        });\n    }\n\n    addToWatchlists(watchlists) {\n        let duplicatedBills = [];\n        watchlists.forEach(watchlist => {\n            //Replace each instance of bill with the bill details in state here\n            if (watchlist.__isNew__) {\n                watchlist.Name = watchlist.label;\n                watchlist.Description = `Created on ${moment().format('MM/DD/YYYY')}`;\n                watchlist.WatchListLegislation = [];\n                delete watchlist.label;\n                delete watchlist.__isNew__;\n                delete watchlist.value;\n            }\n            // Make sure the bill isn't already a part of the watchlist\n            if (!watchlist.WatchListLegislation.find(leg => leg.LegislationID === this.state.billData.LegislationID) || watchlist.WatchListLegislation.find(leg => leg.LegislationID === this.state.billData.LegislationID).DeletionDate) {\n                watchlist.WatchListLegislation.push({\n                    LegislationID: this.state.billData.LegislationID,\n                    LegislationNumber: this.state.billData.LegislationNumber,\n                    Sessions: [{ SessionID: this.state.billData.SessionID }],\n                    WatchListID: watchlist.WatchListID,\n                    Note: null\n                });\n            } else {\n                duplicatedBills.push({ \"Watchlist\": watchlist.Name, \"LegislationNumber\": this.state.billData.LegislationNumber });\n            }\n        })\n\n        this.setState({\n            collectionIsSaving: true\n        }, () => {\n            this.props.actions.saveCollections({ WatchLists: watchlists })\n                .then(() => {\n                    this.setState({\n                        collectionIsSaving: false,\n                        showWatchlistForm: false,\n                        selectedWatchlists: []\n                    });\n\n                    this.getCollections(\"?SessionID=\" + this.state.billData.SessionID)\n\n                    if (duplicatedBills.length) {\n                        this.props.actions.makeToast([{ message: duplicatedBills[0].LegislationNumber + \" is already in \" + (watchlists.length === 1 ? \"this watchlist. \" : \"one or more of these watchlists. \"), type: \"warning\", long: true }]);\n                    } else {\n                        this.props.actions.makeToast([{ message: this.state.billData.LegislationNumber + \" was added to your watchlist\" + (watchlists.length > 1 ? \"s\" : (\" \" + watchlists[0].Name)), type: \"success\" }]);\n                    }\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    console.log(err)\n                    this.setState({\n                        collectionIsSaving: false\n                    });\n                    let message;\n                    if (err && JSON.parse(err)) {\n                        const errorMsg = JSON.parse(err).Name;\n                        message = errorMsg && errorMsg.includes('Public users are') ? errorMsg : 'Save Failed'\n                    } else {\n                        message = \"Save Failed\";\n                    }\n                    this.props.actions.makeToast([{ message: message, type: \"failure\", long: message.includes('Public users are') }]);\n                })\n        });\n    }\n\n    getCollections(params) {\n        this.setState({\n            collectionIsLoading: true\n        });\n        this.props.actions.getCollections(params)\n            .then(() => {\n                const parsed = queryString.parse(this.props.location.search);\n                const collectionIndex = this.props.collection.collections.findIndex(coll => coll.WatchListID === parseInt(parsed.collection))\n                this.setState({\n                    collectionIsLoading: false,\n                }, () => {\n                    if (collectionIndex !== -1) {\n                        this.selectCollection(collectionIndex)\n                    }\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return\n                }\n                this.setState({\n                    collectionIsLoading: false\n                });\n            });\n    }\n\n    toggleWatchlistForm() {\n        this.setState({\n            showWatchlistForm: !this.state.showWatchlistForm\n        })\n    }\n\n    async submitImpactStatement(description, agency, file) {\n        let params = \"?legislationNumber=\" + this.props.match.params.billnumber\n            + \"&sessionCode=\" + this.props.match.params.sessionCode\n            + \"&referenceNumber=\" + this.state.statementDocumentcode + \"F\" + agency.AgencyNumber\n            + \"&description=\" + description\n\n        this.setState({\n            statementSubmitting: true\n        }, () => {\n            this.props.actions.uploadImpactStatement(params, file)\n                .then(() => {\n                    this.setState({\n                        statementSubmitting: false\n                    }, () => {\n                        this.closeStatementForm();\n                    })\n                    this.props.actions.makeToast([{ message: \"Impact Statement Upload Successful\", type: \"success\" }]);\n                })\n                .catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.setState({\n                        statementSubmitting: false\n                    });\n                    this.props.actions.makeToast([{ message: \"Impact Statement Upload Failed\", type: \"failure\" }]);\n                })\n        })\n    }\n\n    togglehideAllEvents() {\n        this.setState({\n            hideAllEvents: !this.state.hideAllEvents\n        })\n    }\n\n    checkForDuplicates(summary) {\n        let results = summary.match(/[H|S][B|J|R][\\s|&nbsp;]+[0-9]+/g);\n        if (results) {\n            //.trim() and .replace(\" \", \"\") both didn't work, even after being run through .toString(). I'm just glad this works. - JGB\n            results.forEach((match) => {\n                let breaklessMatch = match.replace('&nbsp;', ' ')\n                let billNum = breaklessMatch.slice(0, 2) + breaklessMatch.slice(3);\n                let link = `<a href=\"/bill-details/` + this.state.billData.SessionCode + `/` + billNum + `\">` + breaklessMatch + `</a>`;\n                summary = summary.replace(match, link);\n            });\n            return summary\n        } else {\n            return summary\n        }\n    }\n\n    toggleDeleteSummaryModal(summary, summaryIndex) {\n        this.setState({\n            showDeleteModal: !this.state.showDeleteModal,\n            summaryToDelete: { ...summary, index: summaryIndex }\n        })\n    }\n\n    togglePatronModal() {\n        this.props.history.push({\n            pathname: `/bill-details/${this.state.billData.SessionCode}/${this.state.billData.LegislationNumber}/text/${this.state.versionsList.find(v => v.LegislationVersion === \"Introduced\")?.DocumentCode}`,\n            state: { patronUpdate: true }\n        })\n    }\n\n    handleToggleDescriptionEdit(index) {\n        let versionsList = this.state['slideVersions'] ? [...this.state.versionsList] : [...this.state.versionsList.filter(version => version.IsActive === true || (version.TextDisposition === \"Offered\" && version.CommitteeID !== undefined))];\n        if (versionsList.length > 0) {\n            if (versionsList[index].editing === undefined) {\n                versionsList[index].editing = true;\n                versionsList[index].tempDescription = versionsList[index].Description;\n            } else {\n                versionsList[index].editing = !versionsList[index].editing;\n            }\n            this.setState({\n                versionsList\n            })\n        }\n    }\n\n    handleDescriptionChange(value, index) {\n        let versionsList = this.state['slideVersions'] ? [...this.state.versionsList] : [...versionsList.filter(version => version.IsActive === true || (version.TextDisposition === \"Offered\" && version.CommitteeID !== undefined))];\n        versionsList[index].tempDescription = value;\n        this.setState({\n            versionsList\n        })\n    }\n\n    saveVersionDescription(index) {\n        let bill = this.state['slideVersions'] ? { ... this.state.versionsList[index] } : { ...versionsList.filter(version => version.IsActive === true || (version.TextDisposition === \"Offered\" && version.CommitteeID !== undefined))[index] };\n        bill.Description = bill.tempDescription;\n        this.props.actions.saveBillText({ TextsList: [bill] })\n            .then(() => {\n                this.getBillVersion(this.props.match.params.billnumber, this.props.match.params.sessionCode);\n            });\n    }\n\n    render() {\n        const { sessionData, summariesList, historyList, billData, senatePatronsList, housePatronsList, chiefPatronsList, versionsList, editing, description, saving, patronList } = this.state;\n        // Show the active and offered versions when drawer is collapsed. If there are no active or offered versions then just display the last item\n        let activeVersions = versionsList.filter(version => version.IsActive === true || (version.TextDisposition === \"Offered\" && version.CommitteeID !== undefined) || (version.TextDisposition === \"Recommended\"));\n        if (activeVersions.length === 0) {\n            activeVersions = [versionsList[versionsList.length - 1]];\n        }\n        let billSummary = '';\n        if (summariesList.length > 0) {\n            billSummary = summariesList[0];\n        }\n        const sessionHeader = sessionData && !isStatic ? sessionData.SessionYear + ' ' + sessionData.DisplayName : '';\n        const billHeader = billData && !isStatic ? <React.Fragment>\n            <span style={{ marginRight: '1em' }}>{billData.LegislationNumber}</ span>\n            <span></span>\n            <span>{renderHTML(billData.Description || '')}</span>\n            {this.props.login.userClaims.resources.find(resource => resource === BILL_AUTHOR) && <a className=\"icon edit\" style={{ marginLeft: \"5px\" }} onClick={() => this.toggleEdit(DESCRIPTION, this.state.billData.Description)}></a>}\n        </React.Fragment> : '';\n\n        const billHeaderEditor = <div className=\"bill-description-editor\">\n            <span>{billData.LegislationNumber}</ span>\n            <input value={description} onChange={(e) => this.handleChange(DESCRIPTION, e)} disabled={saving[DESCRIPTION]} />\n            {saving[DESCRIPTION]\n                ? <div className=\"small-spinner\"></div>\n                : <React.Fragment><a className=\"icon save\" onClick={() => this.saveDescription()}></a>\n                    <a className=\"icon delete\" onClick={() => this.toggleEdit(DESCRIPTION)}></a></React.Fragment>\n            }\n        </div>;\n\n        const formatSummaryVersion = (billSummary) => (\n            billSummary.SummaryVersion.toLowerCase().split(\"\").map((x, i) => { return billSummary.SummaryVersion[i - 1] === \" \" || i === 0 ? x.toUpperCase() : x })\n        )\n\n        const billSummaryEditor = index => <div className=\"bill-summary-editor\">\n            <Editor\n                disabled={saving[SUMMARY] && saving[SUMMARY][index]}\n                value={this.state.summary[index]}\n                init={{\n                    browser_spellcheck: true,\n                    height: 350,\n                    plugins: 'link paste save lists preview searchreplace pagebreak code table',\n                    toolbar: 'undo redo | bold italic strikethrough | alignleft aligncenter alignright',\n                    skin: false,\n                    valid_children: '+body[style]',\n                    content_css: false,\n                    content_style: 'table { border-collapse: collapse; border: 1px solid #FFFFFF }' + 'td { padding: 12px 0px }',\n                    formats: {\n                        sumtext: {\n                            block: 'p', attributes: { class: 'sumtext' }\n                        }\n                    },\n                    style_formats: [\n                        { title: \"Sumtext\", format: \"sumtext\" },\n                    ],\n                }}\n                onEditorChange={content => this.handleChange(SUMMARY, content, index)}\n            />\n            {saving[SUMMARY] && saving[SUMMARY][index]\n                ? <div className=\"small-spinner\"></div>\n                : <React.Fragment><a className=\"icon save\" onClick={() => this.saveSummary(index)}></a>\n                    <a className=\"icon delete\" onClick={() => this.toggleEdit(SUMMARY, null, index)}></a></React.Fragment>\n            }\n        </div>;\n\n        if (!this.state.billDataIsLoaded) {\n            return (\n                <div><LoaderComponent className=\"center-spinner\" data={false} /></div>\n            )\n        } else if (!billData) {\n            //Bill Data has been loaded but if it is empty then there have been zero results returned from the server\n            return (<p>Bill data could not be found</p>)\n        }\n        return (\n            <div id=\"bill-details\" className=\"bill-theme public-details inner-grid\" ref={el => (this.componentRef = el)}>\n                {this.state.showDeleteModal &&\n                    <div className='schedule-modal'>\n                        <div className='schedule-modal-content'>\n                            <div className='grid-wrapper'>\n                                <div className='inner-grid eight-one-and-one'>\n                                    <span>Are you sure you want to delete this summary ({formatSummaryVersion(this.state.summaryToDelete)})?</span>\n                                    {saving[SUMMARY] && saving[SUMMARY][this.state.summaryToDelete.index]\n                                        ? <div className=\"small-spinner\"></div>\n                                        : <button className='button primary' onClick={() => this.saveSummary(this.state.summaryToDelete.index, true)}>Yes</button>\n                                    }\n                                    <button className='button secondary' onClick={() => this.toggleDeleteSummaryModal()}>No</button>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                }\n                {!isStatic &&\n                    <div>\n                        <h2 style={{ marginBottom: \"10px\" }}>{sessionHeader}</h2>\n                    </div>\n                }\n                {!isStatic &&\n                    <div className=\"details-header bill-details-header\">\n                        <h3>{!editing[DESCRIPTION] ? billHeader : billHeaderEditor}</h3>\n                        {!this.state.displayStatementForm &&\n                            <div style={{ padding: \"10px 10px 0px 10px\" }} className={`flex-row ${!this.state.editingHistory && this.props.login.userClaims.claims.find(claim => claim.RoleName === BILL_EVENT_AUTHOR) ? 'space-around' : 'flex-end'}`}>\n                                {!this.state.editingHistory && this.props.login.userClaims.claims.find(claim => claim.RoleName === BILL_EVENT_AUTHOR) &&\n                                    <button type=\"button\" className=\"button-link remove-from-print\" style={{ fontSize: '0.8em' }} onClick={this.toggleEditContent}>Edit History</button>\n                                }\n                                <ReactToPrint\n                                    trigger={() => <a type=\"button\" className=\"button print remove-from-print\"> Print</a>}\n                                    content={() => {\n                                        let printedContent = this.componentRef.cloneNode(true);\n                                        //remove icons from printed document\n                                        const removedContent = printedContent.getElementsByClassName('remove-from-print');\n                                        for (const el of removedContent) {\n                                            el.innerHTML = ''\n                                        }\n                                        return printedContent\n                                    }}\n                                    pageStyle={\"break-inside: avoid\"}\n                                />\n                            </div>\n                        }\n                    </div>\n                }\n                <div>\n                    <div style={this.state.editingHistory || this.state.displayStatementForm ? { display: 'none' } : { display: 'block' }}>\n                        {this.props.login.isAuthenticated && <div className=\"dlas-forms collection-controls\" style={{ marginBottom: \"5px\" }}>\n                            <a style={{ fontSize: \"14px\", cursor: \"pointer\" }} onClick={() => this.toggleWatchlistForm()}>{this.state.showWatchlistForm ? \"Hide watchlist form\" : \"Add bill to watchlist\"}</a>\n                            {this.state.showWatchlistForm &&\n                                <div className=\"inner-grid two\">\n                                    <div>\n                                        <label htmlFor=\"sr-watchlist-name-control\">Watchlist Name</label>\n                                        <CreatableSelect\n                                            id=\"sr-watchlist-name-control\"\n                                            styles={selectStyle}\n                                            options={this.props.collection.collections}\n                                            getOptionLabel={opt => opt.label || `${opt.Name} ${opt.Description && `- ${opt.Description}`}`}\n                                            getOptionValue={opt => opt.value || opt.WatchListID}\n                                            value={this.state.selectedWatchlists}\n                                            onChange={this.handleWatchlistChange}\n                                            createOptionPosition=\"first\"\n                                            formatCreateLabel={input => <span>Create new: {input}</span>}\n                                            isMulti\n                                        />\n                                    </div>\n                                    <div className=\"inline-list\">\n                                        <br />\n                                        {this.props.collectionIsSaving ?\n                                            <div><span className=\"small-spinner\"></span></div>\n                                            :\n                                            <React.Fragment>\n                                                <button disabled={(this.state.selectedWatchlists && this.state.selectedWatchlists.length < 1 ? true : false) || !this.state.selectedWatchlists} style={{ marginLeft: \"0px\" }} className=\"button\" type=\"button\" onClick={() => this.handleAddToWatchlists(false)}>Add</button>\n                                            </React.Fragment>\n                                        }\n                                    </div>\n                                </div>}\n                        </div>}\n                        {!isStatic &&\n                            <div style={{ marginTop: \"-3px\" }} className=\"list-desc\">\n                                <p>Status: {billData.LegislationStatus}</p>\n                            </div>\n                        }\n                        {this.props.login.userClaims.resources.find(resource => resource === BILL_COLLECTION_AUTHOR) && billData && !isStatic &&\n                            <CollectionNotes\n                                billData={billData}\n                                sessionId={this.props.session.selectedSession.SessionID}\n                            />\n                        }\n                        <div style={{ marginBottom: \"0px\" }} className={this.state['slidePatron'] ? 'parent-li slidedown-open' : 'parent-li slidedown-closed'}>\n                            <div className=\"toggle-row\">\n                                <div className=\"description\" style={{ display: 'flex', gap: '5px', alignItems: 'center' }}>\n                                    <h4>{chiefPatronsList.length + housePatronsList.length + senatePatronsList.length > 1 ? \"Patrons\" : \"Patron\"}</h4>\n                                    {versionsList.find(v => v.LegislationVersion === \"Introduced\") && this.props.login.userClaims.claims.find(claim => claim.RoleName === \"Admin\" || (claim.Resource === PATRON_AUTHOR && claim.Scope === (this.state.billData.ChamberCode === \"H\" ? \"House\" : \"Senate\"))) &&\n                                        <button className=\"button small-button\" onClick={this.togglePatronModal}>Update Patrons</button>\n                                    }\n                                </div>\n                                {chiefPatronsList.length + housePatronsList.length + senatePatronsList.length > 1 &&\n                                    <div className=\"button-container\">\n                                        <label id=\"sr-patrons-drawer-label\" className=\"arrow-down-label\" onClick={this.toggleShowData.bind(this, 'slidePatron')}>All Patrons</label>\n                                        <button aria-labelledby=\"sr-patrons-drawer-label\" aria-expanded={!!this.state['slidePatron']} className=\"arrow-down\" onClick={this.toggleShowData.bind(this, 'slidePatron')}>More info</button>\n                                    </div>\n                                }\n                            </div>\n                        </div>\n                        {!this.state.patronIsLoaded ? <LoaderComponent data={false} /> :\n                            <div style={{ marginBottom: \"10px\" }}>\n                                <div className=\"list-desc\">\n                                    <p style={this.state['slidePatron'] ? { marginBottom: \"0px\" } : { marginBottom: \"20px\" }}>Introduced by: <PatronList session={sessionData} patrons={chiefPatronsList} /></p>\n                                </div>\n                                {this.state['slidePatron'] &&\n                                    <div className=\"patrons-list list-desc\">\n                                        {this.state.billData.ChamberCode === \"H\"\n                                            ?\n                                            <React.Fragment>\n                                                {housePatronsList.length > 0 && <div><span>House: </span><PatronList session={sessionData} patrons={housePatronsList} list /></div>}\n                                                {senatePatronsList.length > 0 && <div><span>Senate: </span><PatronList session={sessionData} patrons={senatePatronsList} list /></div>}\n                                            </React.Fragment>\n                                            :\n                                            <React.Fragment>\n                                                {senatePatronsList.length > 0 && <div><span>Senate: </span><PatronList session={sessionData} patrons={senatePatronsList} list /></div>}\n                                                {housePatronsList.length > 0 && <div><span>House: </span><PatronList session={sessionData} patrons={housePatronsList} list /></div>}\n                                            </React.Fragment>\n                                        }\n                                    </div>\n                                }\n                            </div>\n                        }\n                        {summariesList.length > 1 &&\n                            <div className={this.state['slideSummaries'] ? 'parent-li slidedown-open' : 'parent-li slidedown-closed'}>\n                                <div className=\"toggle-row\">\n                                    <br />\n                                    <div className=\"button-container\">\n                                        <label id=\"sr-summaries-drawer-label\" className=\"arrow-down-label\" onClick={this.toggleShowData.bind(this, 'slideSummaries')}>All Summaries</label>\n                                        <button aria-labelledby=\"sr-summaries-drawer-label\" aria-expanded={!!this.state['slideSummaries']} className=\"arrow-down\" onClick={this.toggleShowData.bind(this, 'slideSummaries')}>More info</button>\n                                    </div>\n                                </div>\n                            </div>\n                        }\n                        {!this.state.summaryIsLoaded ? <LoaderComponent data={false} /> :\n                            <div className=\"bill-details-summary\">\n                                <div className=\"list-desc\">\n                                    <div style={{ display: 'flex', alignItems: 'center' }}>\n                                        <h4 style={{ paddingLeft: '0px' }}>{formatSummaryVersion(billSummary)}</h4>\n                                        {(!editing[SUMMARY] || !editing[SUMMARY][0]) && this.props.login.userClaims.resources.find(resource => resource === BILL_AUTHOR) &&\n                                            <React.Fragment>\n                                                <a className=\"icon edit\" style={{ margin: \"0px 7px\" }} onClick={() => this.toggleEdit(SUMMARY, billSummary.Summary ? this.checkForDuplicates(billSummary.Summary) : '', 0)}></a>\n                                                <a className=\"icon delete\" onClick={() => this.toggleDeleteSummaryModal(billSummary, 0)}></a>\n                                            </React.Fragment>\n                                        }\n                                    </div>\n                                    <div className='summary-wrapper'>\n                                        {!editing[SUMMARY] || !editing[SUMMARY][0]\n                                            ? renderHTML(this.checkForDuplicates(billSummary.Summary) || '')\n                                            : billSummaryEditor(0)\n                                        }\n                                    </div>\n                                </div>\n                                {this.state['slideSummaries'] &&\n                                    <div className=\"list-desc\" style={{ marginTop: \"10px\" }}>\n                                        <span>\n                                            {\n                                                summariesList.map((summaries, i) => {\n                                                    if (i > 0) {\n                                                        return (\n                                                            <div>\n                                                                <div key={i} style={{ display: 'flex' }}> <p><strong>{summaries.SummaryVersion}</strong></p>\n                                                                    {(!editing[SUMMARY] || !editing[SUMMARY][i]) && this.props.login.userClaims.resources.find(resource => resource === BILL_AUTHOR) &&\n                                                                        <React.Fragment>\n                                                                            <a className=\"icon edit\" style={{ margin: \"0px 7px\" }} onClick={() => this.toggleEdit(SUMMARY, summaries.Summary ? this.checkForDuplicates(summaries.Summary) : '', i)}></a>\n                                                                            <a className=\"icon delete\" onClick={() => this.toggleDeleteSummaryModal(summaries, i)}></a>\n                                                                        </React.Fragment>\n                                                                    }\n                                                                </div>\n                                                                {!editing[SUMMARY] || !editing[SUMMARY][i] ?\n                                                                    renderHTML(summaries.Summary ? this.checkForDuplicates(summaries.Summary) : '')\n                                                                    :\n                                                                    billSummaryEditor(i)\n                                                                }\n                                                            </div>\n                                                        )\n                                                    } else {\n                                                        return false;\n                                                    }\n\n                                                })\n                                            }\n                                        </span>\n                                    </div>\n                                }\n                            </div>\n                        }\n                        <div>\n                            <div style={{ marginBottom: \"0px\" }} className={this.state['slideVersions'] ? 'parent-li slidedown-open' : 'parent-li slidedown-closed'}>\n                                <div className=\"toggle-row\">\n                                    <div className=\"table-container description\">\n                                        <h4>Bill Versions</h4>\n                                        <button onClick={this.toggleShowTooltip.bind(this)} className=\"button info\">Info</button>\n                                        {this.state.toolTip &&\n                                            <div className=\"info-box\">\n                                                <ol>\n                                                    <li> Introduced - A bill that has been introduced and referred to a committee. </li>\n                                                    <li> Engrossed - A stage in the legislative process when a bill passes the second reading in the house of origin. If amended, the engrossed version of the legislation is printed incorporating all amendments that are agreed to. If not amended, the introduced version of the legislation becomes the engrossed bill, and if an amendment in the nature of a substitute is agreed to, the substitute becomes the engrossed bill.</li>\n                                                    <li> Enrolled - Legislation which has passed both the Senate and the House of Delegates. It has been signed by the President of the Senate and the Speaker of the House and it has been sent to the Governor, but not yet signed. If signed by the Governor, the bill becomes a law and a Chapter of the Acts of Assembly.</li>\n                                                    <li> Chaptered - A bill passed and signed into law by the Governor. The term also applies to constitutional amendments passed by the General Assembly and to bills passed notwithstanding the Governor’s objections or amendments.</li>\n                                                    <li> Substitute - The redrafting of legislation that incorporates proposed changes in a new version. </li>\n                                                </ol>\n                                            </div>\n                                        }\n                                    </div>\n                                    {versionsList.length > 1 && versionsList.find(version => !version.IsActive) &&\n                                        <div className=\"button-container\">\n                                            <label id=\"sr-versions-drawer-label\" className=\"arrow-down-label\" onClick={this.toggleShowData.bind(this, 'slideVersions')}>{this.state.slideVersions ? \"Hide All Versions\" : \"Show All Versions\"}</label>\n                                            <button aria-labelledby=\"sr-versions-drawer-label\" aria-expanded={!!this.state['slideVersions']} className=\"arrow-down\" onClick={this.toggleShowData.bind(this, 'slideVersions')}>More info</button>\n                                        </div>\n                                    }\n                                </div>\n                                {this.props.login.userClaims.resources.find(resource => resource === VERSION_AUTHOR) &&\n                                    <Link to={`/bill-details/${sessionData.SessionCode}/${billData.LegislationNumber}/text/new-amendment`} className=\"button small-button remove-from-print\">Create Amendment</Link>\n                                }\n                            </div>\n                            <table className=\"line-table\">\n                                {!this.state.versionsIsLoaded ? (<LoaderComponent data={false} />) : (\n                                    <React.Fragment>\n                                        {versionsList.length > 0 &&\n                                            <div>\n                                                {this.state['slideVersions'] ?\n                                                    <VersionList userClaims={this.props.login.userClaims} descriptionEditable={true} handleDescriptionChange={this.handleDescriptionChange} handleToggleDescriptionEdit={this.handleToggleDescriptionEdit} saveDescription={this.saveVersionDescription} version={versionsList} toggleStatementForm={this.toggleStatementForm} legislationClass={billData.LegislationClass} />\n                                                    :\n                                                    <VersionList userClaims={this.props.login.userClaims} descriptionEditable={true} handleDescriptionChange={this.handleDescriptionChange} handleToggleDescriptionEdit={this.handleToggleDescriptionEdit} saveDescription={this.saveVersionDescription} version={activeVersions} toggleStatementForm={this.toggleStatementForm} legislationClass={billData.LegislationClass} />\n                                                }\n                                            </div>\n                                        }\n                                    </React.Fragment>\n                                )}\n                            </table>\n                        </div>\n                    </div>\n                    <div>\n                        {!this.state.displayStatementForm &&\n                            <React.Fragment>\n                                <h4 style={{ display: 'inline-block', marginRight: '8px' }}>History</h4>\n                                {!this.state.editingHistory && this.props.login.userClaims.claims.find(claim => claim.RoleName === BILL_EVENT_AUTHOR) &&\n                                    <button type=\"button\" className=\"button-link\" style={{ fontSize: '0.8em' }} onClick={this.toggleEditContent}>(Edit)</button>\n                                }\n                            </React.Fragment>}\n                        {this.state.editingHistory && this.state.historyIsLoaded ?\n                            <BillHistoryForm\n                                switchedToBill={this.state.switchedToBill}\n                                legislationNumber={this.state.legislationNumber}\n                                historyList={historyList}\n                                organizedEvents={this.state.organizedEvents}\n                                handleEventChange={this.handleEventChange}\n                                billEvents={this.state.billEvents}\n                                billData={this.state.billData}\n                                toggleEditContent={this.toggleEditContent}\n                                saveEvents={this.saveEvents}\n                                hideAllEvents={this.state.hideAllEvents}\n                                togglehideAllEvents={this.togglehideAllEvents}\n                                changeToNewBillHistoryForm={this.changeToNewBillHistoryForm}\n                                actionTypes={this.state.actionTypes}\n                                memberList={this.state.memberList}\n                                committeeList={this.state.committeeList}\n                                versionsList={this.state.versionsList.map(text => ({\n                                    ...text,\n                                    label: text.DocumentCode + \" \" + text.Description,\n                                    value: text.LegislationTextID\n                                }))}\n                                reconsiderationEvents={this.state.reconsiderationEvents}\n                                getReconsiderationEvents={this.getReconsiderationEvents}\n                            />\n                            :\n                            <React.Fragment>\n                                {!this.state.historyIsLoaded ? <LoaderComponent data={false} /> :\n                                    !this.state.displayStatementForm &&\n                                    <React.Fragment>\n                                        <table className=\"line-table\">\n                                            <tbody>\n                                                {historyList.filter(item => !item.DeletionDate).map((item, index) => (\n                                                    <tr key={index} className={`parent-tr ${item.opened ? 'slidedown-open' : 'slidedown-closed'} bill-details-table-row${item.IsPublic ? '' : ' not-public'}`}>\n                                                        <td className=\"left\">{moment(item.EventDate).format('l')}</td>\n                                                        <td className=\"left\">{item.ActorType}</td>\n                                                        <td className=\"left\">\n                                                            {item.Description}\n                                                            {item.VoteLinks && item.opened &&\n                                                                <div className=\"link-row\">\n                                                                    {item.VoteLinks.map((link, index) =>\n                                                                        <div key={index}>\n                                                                            {link.VoteID && item.VoteTally !== \"(Voice Vote)\" ? link.IsPublic ? <Link to={`/vote-details/${this.state.billData.LegislationNumber}/${item.SessionCode}/${link.VoteNumber}`}>Vote</Link> : <span>Vote Detail Pending</span> : ''}\n                                                                            {link.CommitteeNumber ? <Link to={`/session-details/${item.SessionCode}/committee-information/${link.CommitteeNumber}/committee-details`}>{link.ParentCommitteeID ? 'Subcommittee' : 'Committee'}</Link> : ''}\n                                                                            {link.LegislationNumber && link.SessionCode ? <Link to={`/bill-details/${link.SessionCode}/${link.LegislationNumber}`}>Legislation</Link> : ''}\n                                                                        </div>\n                                                                    )}\n                                                                </div>\n                                                            }\n                                                        </td>\n                                                        <td className=\"button-container\">\n                                                            {item.ReferenceType && item.ReferenceType.toLowerCase() === \"committee\" ||\n                                                                item.ReferenceType && item.ReferenceType.toLowerCase() === \"subcommittee\" ||\n                                                                item.ReferenceType && item.ReferenceType.toLowerCase() === \"legislation\" ||\n                                                                item.VoteID && item.ReferenceType && item.ReferenceType.toLowerCase() === \"vote\" && item.VoteTally !== \"(Voice Vote)\"\n                                                                ? <React.Fragment>\n                                                                    {item.isLoading ?\n                                                                        <span className=\"small-spinner\"></span>\n                                                                        :\n                                                                        <button className=\"arrow-down\" onClick={() => this.toggleShowLinks(item)}>Show links</button>\n                                                                    }\n                                                                </React.Fragment>\n                                                                : null\n                                                            }\n                                                        </td>\n                                                    </tr>\n                                                ))}\n                                            </tbody>\n                                        </table>\n                                    </React.Fragment>\n                                }\n                            </React.Fragment>\n                        }\n                    </div>\n                    <div>\n                        {this.state.displayStatementForm &&\n                            <ImpactStatementForm\n                                submit={this.submitImpactStatement}\n                                isSubmitting={this.state.statementSubmitting}\n                                toggleStatementForm={this.toggleStatementForm}\n                                statementDate={this.state.statementDate}\n                                statementDescription={this.state.statementDescription}\n                                agencyOptions={this.state.agencyOptions}\n                            />\n                        }\n                    </div>\n                </div>\n            </div>\n        )\n    }\n}\n\nconst PublicBillDetails = connect(\n    (state) => {\n        const { bills, session, patrons, votes, login, nav, minutes, members, committee, organizations, collection } = state;\n        return {\n            bills,\n            session,\n            patrons,\n            votes,\n            login,\n            nav,\n            minutes,\n            members,\n            committee,\n            organizations,\n            collection\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, voteActionCreators, billActionCreators, sessionActionCreators, patronActionCreators, authActionCreators, navActionCreators, minutesActionCreators, memberActionCreators, committeeActionCreators, orgActionCreators, collectionActionCreators), dispatch)\n        }\n    }\n)(BillDetailsComponent)\n\nexport default PublicBillDetails;\n","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { billActionCreators } from '../../stores/lis-legislation-store';\nimport { sessionActionCreators } from '../../stores/lis-session-store';\nimport { voteActionCreators } from '../../stores/lis-votes-store';\nimport VoteDetails from '../../lis-shared/lis-votes/lis-vote-details';\n\nimport LoaderComponent from '../../lis-shared/lis-layout/components/lis-loader-component';\nimport { cancelRequest } from '../../services/request.service';\n\nclass VoteDetailsComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            voteData: []\n        };\n    }\n\n    componentDidMount() {\n        const legislationNumber = this.props.match.params.billnumber;\n        const voteNumber = this.props.match.params.votenumber;\n        const sessionCode = this.props.match.params.sessioncode;\n        const params = '?legislationNumber=' + legislationNumber + '&sessionCode=' + sessionCode + '&voteNumber=' + voteNumber;\n\n        // GET VOTE DETAILS DATA\n        this.props.actions.getVoteDetails(params).then(() => {\n            this.setState({ voteDataIsLoaded: true });\n            if (this.props.votes.voteDetailsError) {\n                throw this.props.votes.voteDetailsError;\n            }\n            if (this.props.votes.voteDetailsResponse.length === 0) {\n                throw \"Cannot get vote data\";\n            }\n            const pdfFile = this.props.votes.voteDetailsResponse[0].VoteFiles.find(file => file.FileURL.toUpperCase().includes(\".PDF\"));\n            this.setState({\n                voteData: this.props.votes.voteDetailsResponse[0],\n                voteFileUrl: pdfFile || ''\n            });\n            this.props.actions.getSessionById(this.props.votes.voteDetailsResponse[0].SessionID)\n                .then(() => this.setState({ isLoaded: true }));\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            console.log(err.toString());\n            this.setState({\n                isLoaded: true,\n                message: err.toString()\n            });\n        });\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { voteData } = this.state;\n        if (this.state.message) {\n            return (<p>{this.state.message}</p>);\n        }\n        if (!this.state.isLoaded) {\n            return (\n                <div><LoaderComponent className=\"center-spinner\" data={false} /></div>\n            )\n        }\n        return (\n            <div className=\"bill-theme public-details inner-grid\">\n                <div>\n                    <div>\n                        <VoteDetails\n                            sessionData={this.props.session.selectedSession}\n                            billData={voteData.VoteLegislation ? voteData.VoteLegislation.filter(vl => !vl.DeletionDate) : []}\n                            voteMembers={voteData.VoteMember || []}\n                            voteData={voteData}\n                            voteFileUrl={this.state.voteFileUrl}\n                            componentRef={this.componentRef}\n                            isPublic\n                        />\n                    </div>\n                </div>\n            </div>\n        )\n    }\n}\n\nconst PublicVoteDetails = connect(\n    (state) => {\n        const { bills, session, votes } = state;\n        return {\n            bills,\n            session,\n            votes\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, voteActionCreators, billActionCreators, sessionActionCreators), dispatch)\n        }\n    }\n)(VoteDetailsComponent)\n\nexport default PublicVoteDetails;\n","import React from \"react\";\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { navActionCreators } from \"../../stores/lis-nav-store\";\nimport { sessionActionCreators } from '../../stores/lis-session-store';\n\nconst csv_info = [\n    {\n        csv_name: \"Amendments\",\n    },\n    {\n        csv_name: \"Bills\",\n        csv_file: \"BILLS.CSV\"\n    },\n    {\n        csv_name: \"CiBillSubjects\",\n        csv_file: \"CIBillSubjects.csv\"\n    },\n    {\n        csv_name: \"CiParentChildSubjects\",\n        csv_file: \"CIParentChildSubjects.csv\"\n    },\n    {\n        csv_name: \"CommitteeMembers\",\n    },\n    {\n        csv_name: \"Committees\",\n    },\n    {\n        csv_name: \"Docket\",\n        csv_file: \"DOCKET.CSV\"\n    },\n    {\n        csv_name: \"FiscalImpactStatements\",\n    },\n    {\n        csv_name: \"History\",\n        csv_file: \"HISTORY.CSV\"\n    },\n    {\n        csv_name: \"Members\",\n    },\n    {\n        csv_name: \"Section\",\n        csv_file: \"SECTION.csv\"\n    },\n    {\n        csv_name: \"Sponsors\",\n    },\n    {\n        csv_name: \"SubCommitteeMembers\",\n    },\n    {\n        csv_name: \"SubCommittees\",\n        csv_file: \"SubCommittees.csv\"\n    },\n    {\n        csv_name: \"Subdocket\",\n        csv_file: \"SUBDOCKET.CSV\"\n    },\n    {\n        csv_name: \"Summaries\",\n    },\n    {\n        csv_name: \"Vote\",\n        csv_file: \"VOTE.CSV\"\n    },\n    {\n        csv_name: \"VoteStatements\",\n    }\n]\n\nclass PublicDataFiles extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            sessionCode: null,\n            loadingSessions: true,\n            sessionOptions: []\n        }\n    }\n\n    componentDidMount() {\n        this.props.actions.getSessionList()\n            .then(() => {\n                this.setState({\n                    sessionOptions: this.props.session.sessionList,\n                    loadingSessions: false\n                }, () => {\n                    if (this.state.sessionOptions && this.state.sessionOptions.length) {\n                        if (this.props.match.params.sessionCode && this.state.sessionOptions.find(s => s.SessionCode === this.props.match.params.sessionCode)) {\n                            const session = this.state.sessionOptions.find(s => s.SessionCode === this.props.match.params.sessionCode)\n                            this.props.actions.changeSession(session.SessionCode);\n                            this.setSession(this.props.match.params.sessionCode);\n                        } else if (this.props.nav.session) {\n                            this.setSession(this.props.nav.session)\n                        } else if (this.state.sessionOptions.find(s => s.IsDefault)) {\n                            this.setSession(this.state.sessionOptions.find(s => s.IsDefault).SessionCode);\n                        } else {\n                            //shouldn't happen, means no session was provided in the url and there is no default session set\n                            this.setSession(this.state.sessionOptions[this.state.sessionOptions.length - 1].SessionCode);\n                        }\n                    }\n                })\n            }).catch(err => {\n                this.setState({ loadingSessions: false })\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n            });\n    }\n\n    componentDidUpdate(prevProps) {\n        if (this.props.nav.session !== prevProps.nav.session) {\n            if (this.state.sessionOptions && this.state.sessionOptions.length && !isNaN(parseInt(this.props.nav.session))) {\n                const session = this.state.sessionOptions.find(s => s.SessionCode === this.props.nav.session);\n                if (session) {\n                    if (this.props.match.params.sessionCode) {\n                        //update url since it has a sessionCode in it\n                        this.props.history.push('/data-files/' + session.SessionCode);\n                    } else {\n                        this.setSession(session.SessionCode);\n                    }\n                }\n            }\n        }\n    }\n\n    setSession(sessionCode) {\n        this.setState({ sessionCode })\n    }\n\n    render() {\n        const { sessionCode, loadingSessions } = this.state;\n\n        return (\n            <div className='generic-details-page public-data-files-page'>\n                <div className=\"dlas-forms\">\n                    <div className=\"public-details\">\n                        <h2>CSV File Download</h2>\n                    </div>\n                    <div>\n                        <p>Users having the desire and ability to do their own bill tracking have csv files available for download using this page. These csv files are suitable for spreadsheet or database input. Location of these files is {window.env?.STORAGE_ACCOUNT_DOMAIN}/[session_code]/[csv_filename].csv.</p>\n                        <p>For questions or assistance with csv files, please contact our Help Desk at <a href=\"tel:8047869631\">(804) 786-9631</a>, or <a href=\"mailto:LIS@dlas.virginia.gov\">LIS@dlas.virginia.gov</a>.</p>\n                    </div>\n                    <div className=\"csv-desc\">\n                        <h3>BILLS.CSV</h3>\n                        <p>The <strong>bills.csv</strong> file contains one row per bill. This file is updated hourly during session and reflects a 'snapshot' status of all bills. This is a comma separated values file with the following columns:</p>\n                        <ol className=\"data-files-list list-three\">\n                            <li>Bill_id</li>\n                            <li>Bill_description</li>\n                            <li>Patron_id</li>\n                            <li>Patron_name</li>\n                            <li>Last_house_committee_id</li>\n                            <li>Last_house_action</li>\n                            <li>Last_house_action_date</li>\n                            <li>Last_senate_committee_id</li>\n                            <li>Last_senate_action</li>\n                            <li>Last_senate_action_date</li>\n                            <li>Last_conference_action</li>\n                            <li>Last_conference_action_date</li>\n                            <li>Last_governor_action</li>\n                            <li>Last_governor_action_date</li>\n                            <li>Emergency</li>\n                            <li>Passed_house</li>\n                            <li>Passed_senate</li>\n                            <li>Passed</li>\n                            <li>Failed</li>\n                            <li>Carried_over</li>\n                            <li>Approved</li>\n                            <li>Vetoed</li>\n                            <li>Full_text_doc1</li>\n                            <li>Full_text_date1</li>\n                            <li>Full_text_doc2</li>\n                            <li>Full_text_date2</li>\n                            <li>Full_text_doc3</li>\n                            <li>Full_text_date3</li>\n                            <li>Full_text_doc4</li>\n                            <li>Full_text_date4</li>\n                            <li>Full_text_doc5</li>\n                            <li>Full_text_date5</li>\n                            <li>Full_text_doc6</li>\n                            <li>Full_text_date6</li>\n                            <li>Last_house_actid</li>\n                            <li>Last_senate_actid</li>\n                            <li>Last_conference_act</li>\n                            <li>Last_governor_actid</li>\n                            <li>Chapter_id</li>\n                            <li>Introduction_date</li>\n                            <li>Last_actid</li>\n                        </ol>\n                    </div>\n                    <div className=\"csv-desc\">\n                        <h3>HISTORY.CSV</h3>\n                        <p>The <strong>history.csv</strong> file contains one row for each history \"action\" related to a given bill. It is updated once a day, overnight.\n                            This is a comma separated values file with the following columns:</p>\n                        <ol className=\"data-files-list\">\n                            <li>Bill_id</li>\n                            <li>History_date</li>\n                            <li>History_description</li>\n                        </ol>\n                    </div>\n                    {sessionCode ?\n                        <div className=\"csv-desc\">\n                            <h3>{sessionCode.substr(0, 4)} CSV FILES FOR DOWNLOAD</h3>\n                            <p>Below are links to all the files that are available for download. All these files, except the history.csv (as explained above) are updated once an hour during session.</p>\n                            <ul className=\"data-files-list list-two no-list-style\">\n                                {\n                                    csv_info.map((csv, idx) =>\n                                        <li key={idx}><a target=\"_blank\" rel=\"noreferrer\" href={`${window.env?.STORAGE_ACCOUNT_DOMAIN}/lisfiles/${sessionCode}/${csv.csv_file ? csv.csv_file : (csv.csv_name + '.csv')}`}>{csv.csv_name}.csv</a></li>\n                                    )\n                                }\n                            </ul>\n                        </div>\n                        :\n                        loadingSessions ?\n                            <div className=\"small-spinner\" />\n                            :\n                            <p>Error retrieving sessions.</p>\n                    }\n                </div>\n            </div>\n        )\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { nav, session } = state;\n        return {\n            nav,\n            session\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, navActionCreators, sessionActionCreators), dispatch)\n        }\n    }\n)(PublicDataFiles)","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { sessionActionCreators } from '../../stores/lis-session-store';\nimport { navActionCreators } from '../../stores/lis-nav-store';\nimport { communicationsActionCreators } from '../../stores/lis-communications-store';\nimport moment from 'moment-timezone';\n\nimport { cancelRequest } from '../../services/request.service';\nimport { Link } from 'react-router-dom';\n\nclass PublicCommunicationsList extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            session: '',\n            senateIsLoaded: false,\n            houseIsLoaded: false,\n            senateCommList: [],\n            houseCommList: [],\n            showHouseChamber: true,\n            showSenateChamber: true\n        };\n        this.toggleChamber = this.toggleChamber.bind(this);\n    }\n\n    toggleChamber(chamber) {\n        this.setState(state => ({\n            [chamber]: !state[chamber]\n        }));\n    }\n\n    //When component has mounted, make the call to get session by code\n    componentDidMount() {\n        const sessionCode = this.props.match.params.sessioncode\n        if (parseInt(sessionCode) > 0) {\n            //Update the session selector component, which will run componentDidUpdate and call setupPage on its own\n            if (this.props.nav.session !== sessionCode) {\n                this.props.actions.changeSession(sessionCode)\n            } else {\n                this.setupPage(sessionCode);\n            }\n        }\n    }\n\n    componentDidUpdate(prevProps) {\n        // Setup the page if the global selected session changes. Change the URL to reflect the session change\n        if (prevProps.nav.session !== this.props.nav.session) {\n            this.props.history.push(\"/session-details/\" + this.props.nav.session + \"/communications\");\n            this.setupPage(this.props.nav.session);\n        } else if (this.props.nav.session !== this.props.match.params.sessioncode) {\n            // If the url changes then update the global selected session with whatever the url is\n            const sessionCode = this.props.match.params.sessioncode;\n            if (!isNaN(sessionCode)) {\n                this.props.actions.changeSession(sessionCode);\n            }\n        }\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    setupPage(sessionCode) {\n        this.setState({\n            senateIsLoaded: false,\n            houseIsLoaded: false\n        });\n        const createCommList = commList => {\n            commList.forEach(comm => {\n                const jsonFile = comm.CommunicationFiles.find(file => file.FileURL.includes('JSON'))\n                if (jsonFile && jsonFile.IsGenerated) {\n                    comm.jsonFile = jsonFile\n                }\n            });\n            return commList;\n        }\n        //Get the session information\n        this.props.actions.getSessionByCode(sessionCode)\n            .then(() => {\n                this.setState({\n                    session: this.props.session.selectedSession,\n                });\n            });\n        //Get the list for the Senate\n        this.props.actions.getCommList('?sessionCode=' + sessionCode + '&chamberCode=S&communicationType=Floor')\n            .then(() => {\n                this.setState({\n                    senateCommList: createCommList([...this.props.communications.commList]),\n                    senateIsLoaded: true\n                });\n            });\n        //Get the list for the House\n        this.props.actions.getCommList('?sessionCode=' + sessionCode + '&chamberCode=H&communicationType=Floor')\n            .then(() => {\n                this.setState({\n                    houseCommList: createCommList([...this.props.communications.commList]),\n                    houseIsLoaded: true\n                });\n            });\n    }\n\n    render() {\n        const { senateCommList, houseCommList, senateIsLoaded, houseIsLoaded, session } = this.state;\n        const sessionHeader = session ? session.SessionYear + \" \" + session.DisplayName : '';\n        return (\n            <div className=\"public-chamber-data\">\n                <div>\n                    <h2>{sessionHeader}</h2>\n                </div>\n                <div className=\"public-list inner-grid two\">\n                    <div>\n                        <h3 role=\"button\" onClick={() => this.toggleChamber(\"showHouseChamber\")} aria-expanded={this.state.showHouseChamber} className={`chamber-name ${this.state.showHouseChamber ? \"opened\" : \"\"}`}>House Communications</h3>\n                        {houseIsLoaded ?\n                            <table className=\"line-table\">\n                                {this.state.showHouseChamber &&\n                                    <tbody className=\"toggle-table\">\n                                        <div className=\"list-desc\">\n                                            {houseCommList.map(comm =>\n                                                <tr key={comm.CommunicationID} className=\"inner-grid two alternating-color-list\">\n                                                    <td>\n                                                        <Link to={`/session-details/${this.state.session.SessionCode}/communications/${comm.ReferenceNumber}`}>\n                                                            <span className=\"button paper\">Communication</span>\n                                                            {moment(comm.CommunicationDate).format(\"MMMM D, YYYY\")} {comm.CommunicationNumber > 1 && `(${comm.CommunicationNumber})`}\n                                                        </Link>\n                                                    </td>\n                                                </tr>\n                                            )}\n                                        </div>\n                                    </tbody>\n                                }\n                            </table>\n                            :\n                            <div className=\"center-spinner spinner\"></div>\n                        }\n                    </div>\n\n                    <div>\n                        <h3 role=\"button\" onClick={() => this.toggleChamber(\"showSenateChamber\")} aria-expanded={this.state.showSenateChamber} className={`chamber-name ${this.state.showSenateChamber ? \"opened\" : \"\"}`}>Senate Communications</h3>\n                        {senateIsLoaded ?\n                            <table className=\"line-table\">\n                                {this.state.showSenateChamber &&\n                                    <tbody className=\"toggle-table\">\n                                        <div className=\"list-desc\">\n                                            {senateCommList.map(comm =>\n                                                <tr key={comm.CommunicationID} className=\"inner-grid two alternating-color-list\">\n                                                    <td>\n                                                        <Link to={`/session-details/${this.state.session.SessionCode}/communications/${comm.ReferenceNumber}`}>\n                                                            <span className=\"button paper\">Communication</span>\n                                                            {moment(comm.CommunicationDate).format(\"MMMM D, YYYY\")} {comm.CommunicationNumber > 1 && `(${comm.CommunicationNumber})`}\n                                                        </Link>\n                                                    </td>\n                                                </tr>\n                                            )}\n                                        </div>\n                                    </tbody>\n                                }\n                            </table>\n                            :\n                            <div className=\"center-spinner spinner\"></div>\n                        }\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { session, nav, communications } = state;\n        return {\n            session,\n            nav,\n            communications\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, sessionActionCreators, navActionCreators, communicationsActionCreators), dispatch)\n        }\n    }\n)(PublicCommunicationsList)\n","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { Link } from 'react-router-dom'\nimport { sessionActionCreators } from '../../stores/lis-session-store';\nimport { navActionCreators } from '../../stores/lis-nav-store';\nimport { calendarActionCreators } from '../../stores/lis-calendar-store';\nimport moment from 'moment-timezone';\nimport { cancelRequest } from '../../services/request.service';\n\n\nclass PublicCalendarList extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            session: '',\n            senateIsLoaded: false,\n            houseIsLoaded: false,\n            senateCalendarList: [],\n            houseCalendarList: [],\n            showHouseChamber: true,\n            showSenateChamber: true\n        };\n\n        this.toggleChamber = this.toggleChamber.bind(this);\n    }\n\n    toggleChamber(chamber) {\n        this.setState(state => ({\n            [chamber]: !state[chamber]\n        }));\n    }\n\n    //When component has mounted, make the call to get session by code\n    componentDidMount() {\n        //Update the session selector component, which will run componentDidUpdate and call setupPage on its own\n        const sessionCode = this.props.match.params.sessioncode\n        if (this.props.nav.session !== sessionCode) {\n            this.props.actions.changeSession(sessionCode)\n        } else {\n            this.setupPage(sessionCode);\n        }\n    }\n\n    componentDidUpdate(prevProps) {\n        // Setup the page if the global selected session changes. Change the URL to reflect the session change\n        if (prevProps.nav.session !== this.props.nav.session) {\n            this.props.history.push(\"/session-details/\" + this.props.nav.session + \"/calendar\");\n            this.setupPage(this.props.nav.session);\n        } else if (this.props.nav.session !== this.props.match.params.sessioncode) {\n            // If the url changes then update the global selected session with whatever the url is\n            const sessionCode = this.props.match.params.sessioncode;\n            if (!isNaN(sessionCode)) {\n                this.props.actions.changeSession(sessionCode);\n            }\n        }\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    setupPage(sessionCode) {\n        this.setState({\n            senateIsLoaded: false,\n            houseIsLoaded: false\n        });\n        //Get the session information\n        this.props.actions.getSessionByCode(sessionCode)\n            .then(() => {\n                if (this.props.session.selectedSession) {\n                    this.setState({\n                        session: this.props.session.selectedSession\n                    });\n                }\n            });\n        //Get the list for the Senate\n        this.props.actions.getCalendarList('?sessionCode=' + sessionCode + '&chamberCode=S')\n            .then(() => {\n                this.setState({\n                    senateCalendarList: this.props.calendar.calendarList,\n                    senateIsLoaded: true\n                });\n            });\n        //Get the list for the House\n        this.props.actions.getCalendarList('?sessionCode=' + sessionCode + '&chamberCode=H')\n            .then(() => {\n                this.setState({\n                    houseCalendarList: this.props.calendar.calendarList,\n                    houseIsLoaded: true\n                });\n            });\n    }\n\n    render() {\n        const { senateCalendarList, houseCalendarList, senateIsLoaded, houseIsLoaded, session } = this.state;\n        const sessionHeader = session ? session.SessionYear + \" \" + session.DisplayName : '';\n        return (\n            <div className=\"public-chamber-data\">\n                <div>\n                    <h2>{sessionHeader}</h2>\n                </div>\n                <div className=\"public-list inner-grid two\">\n                    <div>\n                        <h3 role=\"button\" onClick={() => this.toggleChamber(\"showHouseChamber\")} aria-expanded={this.state.showHouseChamber} className={`chamber-name ${this.state.showHouseChamber ? \"opened\" : \"\"}`}>House Calendar</h3>\n                        {houseIsLoaded ?\n                            <table className=\"line-table\">\n                                {this.state.showHouseChamber &&\n                                    <tbody className=\"toggle-table\">\n                                        <div className=\"list-desc\">\n                                            {houseCalendarList.map(calendar =>\n                                                <tr key={calendar.CalendarID} className=\"inner-grid two alternating-color-list\">\n                                                    <td>\n                                                        <Link to={`/session-details/${session.SessionCode}/calendar/${calendar.ReferenceNumber}`}>\n                                                            {moment(calendar.CalendarDate).format(\"MMMM D, YYYY\") + \" \" + (calendar.CalendarNumber > 1 ? \"(sup. \" + (calendar.CalendarNumber - 1) + \")\" : \"\")}\n                                                        </Link>\n                                                    </td>\n                                                </tr>\n                                            )}\n                                        </div>\n                                    </tbody>\n                                }\n                            </table>\n                            :\n                            <div aria-label=\"Loading\" className=\"center-spinner spinner\"></div>\n                        }\n                    </div>\n                    <div>\n                        <h3 role=\"button\" onClick={() => this.toggleChamber(\"showSenateChamber\")} aria-expanded={this.state.showSenateChamber} className={`chamber-name ${this.state.showSenateChamber ? \"opened\" : \"\"}`}>Senate Calendar</h3>\n                        {senateIsLoaded ?\n                            <table className=\"line-table\">\n                                {this.state.showSenateChamber &&\n                                    <tbody className=\"toggle-table\">\n                                        <div className=\"list-desc\">\n                                            {senateCalendarList.map(calendar =>\n                                                <tr key={calendar.CalendarID} className=\"inner-grid two alternating-color-list\">\n                                                    <td>\n                                                        <Link to={`/session-details/${session.SessionCode}/calendar/${calendar.ReferenceNumber}`}>\n                                                            {moment(calendar.CalendarDate).format(\"MMMM D, YYYY\") + \" \" + (calendar.CalendarNumber > 1 ? \"(sup. \" + (calendar.CalendarNumber - 1) + \")\" : \"\")}\n                                                        </Link>\n                                                    </td>\n                                                </tr>\n                                            )}\n                                        </div>\n                                    </tbody>\n                                }\n                            </table>\n                            :\n                            <div aria-label=\"Loading\" className=\"center-spinner spinner\"></div>\n                        }\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { session, nav, calendar } = state;\n        return {\n            session,\n            nav,\n            calendar\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, sessionActionCreators, navActionCreators, calendarActionCreators), dispatch)\n        }\n    }\n)(PublicCalendarList)\n","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport CalendarDetailsComponent from '../../lis-shared/lis-calendar/lis-calendar-details';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { sessionActionCreators } from '../../stores/lis-session-store';\nimport { navActionCreators } from '../../stores/lis-nav-store';\nimport { calendarActionCreators } from '../../stores/lis-calendar-store';\nimport { authActionCreators } from '../../stores/lis-auth-store';\nimport { cancelRequest } from '../../services/request.service';\nimport renderHTML from 'react-render-html';\nimport { HubConnectionBuilder } from \"@microsoft/signalr\";\n\nimport moment from 'moment-timezone';\n\nimport { collectionActionCreators } from '../../stores/lis-collection-store';\nimport { billActionCreators } from '../../stores/lis-legislation-store';\nimport { communicationsActionCreators } from '../../stores/lis-communications-store';\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst lisDocDomain = window.env?.STORAGE_ACCOUNT_DOMAIN;\n\nclass PublicCalendarDetails extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            isLoaded: false,\n            showAll: false,\n            calendar: '',\n            creatingCollection: null,\n            createdCollections: [],\n            currentItemHubConnection: '',\n            commonCurrentItemOptions: [\n                { label: \"Clear current item\", value: 0 },\n                { label: \"At Ease\", value: 1 },\n                { label: \"In Recess\", value: 2 },\n                { label: \"Adjourned\", value: 3 },\n                { label: \"Morning Hour\", value: 4 },\n                { label: \"Closing Statements\", value: 5 },\n                { label: \"Point of Personal Privilege\", value: 6 },\n                { label: \"Taking up Budget Bill\", value: 7 },\n                { label: \"Electing Judges\", value: 8 },\n                { label: \"Governor Addressing Joint Session\", value: 9 },\n                { label: \"Taking up Memorial Resolutions\", value: 10 },\n                { label: \"Taking up Commending Resolutions\", value: 11 },\n                { label: \"Other Business\", value: 12 }\n            ],\n            failedToJoinBills: [],\n            showPdfWindow: false\n        };\n\n        this.receiveCurrentItem = this.receiveCurrentItem.bind(this);\n        this.setCurrentItem = this.setCurrentItem.bind(this);\n        this.toggleAgenda = this.toggleAgenda.bind(this);\n        this.createWatchlist = this.createWatchlist.bind(this);\n        this.editHistory = this.editHistory.bind(this);\n        this.removeZeros = this.removeZeros.bind(this);\n        this.generateClerksCopy = this.generateClerksCopy.bind(this);\n    }\n\n    componentDidMount() {\n        window.scrollTo(0, 0);\n        this.props.actions.getCalendarCategoriesReferences();\n        const getCalendar = this.props.actions.getCalendarById(`?ReferenceNumber=${this.props.match.params.calendarid}&SessionCode=${this.props.match.params.sessioncode}`)\n            .then(() => {\n                this.props.actions.getSessionById(this.props.calendar.calendarGet.SessionID);\n                // If the calendar has zero categories then it is probably legacy data.\n                // The exception is that Pro Forma calendars have zero bills on them.                \n                // OR If the CalendarCategory at index 0 is the default calendar category template with no CalendarCategoryID from the DB\n                if (this.props.calendar.calendarGet.CalendarCategories.length === 0 && !this.props.calendar.calendarGet.IsProforma || this.props.calendar.calendarGet.CalendarCategories[0] && this.props.calendar.calendarGet.CalendarCategories[0].CalendarCategoryID === undefined) {\n                    const htmlFile = this.props.calendar.calendarGet.CalendarFiles.find(file => file.FileURL.toUpperCase().includes('.HTM'));\n                    if (htmlFile) {\n                        return this.props.actions.getFile(htmlFile.FileURL)\n                            .then(() => {\n                                let html = this.props.nav.file;\n                                if (html) {\n                                    html = html.replaceAll('href=\"#', 'href=\"' + window.location.pathname + \"#\")\n                                }\n                                this.setState({\n                                    calendarFile: html,\n                                    isLoaded: true\n                                });\n                                return Promise.resolve();\n                            }).catch(err => {\n                                if (err !== 'Aborted') {\n                                    throw err.toString();\n                                }\n                                return Promise.reject(err);\n                            });\n                    } else {\n                        return Promise.resolve();\n                    }\n                } else {\n                    return Promise.resolve()\n                }\n            }).catch(err => {\n                return Promise.reject(err);\n            });\n        Promise.all([\n            getCalendar\n        ])\n            .then(() => {\n                const calendarGet = this.props.calendar.calendarGet\n                this.setState({\n                    isLoaded: true,\n                    calendar: calendarGet\n                })\n                // Connect to websocket for calendar current item\n                let currentItemConnection = new HubConnectionBuilder()\n                    .withUrl((API_URL || process.env.REACT_APP_CALENDAR_API_URL) + '/Calendar/currentitem')\n                    .build();\n                //Will change to a more reasonable timeout later\n                currentItemConnection.serverTimeoutInMilliseconds = 5000000000;\n                this.setState({\n                    currentItemHubConnection: currentItemConnection\n                }, () => {\n                    this.state.currentItemHubConnection\n                        .start({ withCredentials: false })\n                        .then(() => {\n                            this.state.currentItemHubConnection.invoke('GetCalendarCurrentItem', calendarGet.CalendarID)\n                                .then((message) => {\n                                    const currentItem = message.stronglyTypedObject;\n                                    if (currentItem) {\n                                        this.setState({\n                                            currentCategoryItem: currentItem[0].calendarCategoryID,\n                                            currentAgendaItem: currentItem[0].agendaID,\n                                            currentProceduralMotion: currentItem[0].proceduralMotion\n                                        })\n\n                                    }\n                                })\n                        })\n                        .catch(err => {\n                            console.log('Error while establishing connection :( ' + err)\n                        });\n                    this.state.currentItemHubConnection.on(\"Receive\", message => this.receiveCurrentItem(message));\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n                this.setState({\n                    isLoaded: true,\n                    message: err.toString()\n                });\n            });\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    receiveCurrentItem(message) {\n        try {\n            const currentItem = JSON.parse(message.message);\n            this.setState({\n                currentCategoryItem: currentItem[0].CalendarCategoryID,\n                currentAgendaItem: currentItem[0].AgendaID,\n                currentProceduralMotion: currentItem[0].ProceduralMotion\n            })\n        } catch {\n            console.error(`Message malformed: ${message}`);\n        }\n    }\n\n    setCurrentItem(e, categoryId, agendaId, proceduralMotion) {\n        if (e) {\n            e.stopPropagation();\n        }\n        if (proceduralMotion === 'Clear current item') {\n            // This is so the user has ability to set clear out the current item and display nothing.\n            proceduralMotion = '';\n        }\n        const params = {\n            CalendarID: this.state.calendar.CalendarID,\n            CalendarCategoryID: categoryId || null,\n            AgendaID: agendaId || null,\n            ProceduralMotion: proceduralMotion || ''\n        }\n        this.setState({\n            isSavingCalendarCurrentItem: true\n        });\n        this.props.actions.saveCalendarCurrentItem(params)\n            .then(() => {\n                this.setState({\n                    isSavingCalendarCurrentItem: false\n                });\n            })\n            .catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.error(err);\n                this.props.actions.makeToast([{ message: \"Failed To Set Current Item\", type: \"failure\" }]);\n            });\n    }\n\n    toggleAgenda(catIndex, agendaIndex) {\n        let calendar = { ...this.state.calendar };\n        let agenda = calendar.CalendarCategories[catIndex].Agendas[agendaIndex];\n        agenda.show = !agenda.show;\n        if (agenda.IsActive && agenda.LegislationNumber && !agenda.Versions) {\n            agenda.Versions = []\n            this.props.actions.getBillVersionByBillNumber('?BillNumber=' + calendar.CalendarCategories[catIndex].Agendas[agendaIndex].LegislationNumber + '&SessionID=' + calendar.SessionID)\n                .then(() => {\n                    // Get the calendar data again just in case the user toggled the agenda items\n                    calendar = { ...this.state.calendar };\n                    let versions = this.props.bills.billVersion.filter(ver => moment(ver.DraftDate).startOf('day').isSameOrBefore(calendar.CalendarDate))\n                    // Most recent versions first\n                    versions = versions.sort((a, b) => moment(a.DraftDate).isSameOrBefore(b.DraftDate))\n                    calendar.CalendarCategories[catIndex].Agendas[agendaIndex].Versions = versions\n                    this.setState({\n                        calendar: calendar\n                    });\n                }).catch(err => {\n                    if (err === \"Aborted\") {\n                        return\n                    }\n                    calendar = { ...this.state.calendar };\n                    calendar.CalendarCategories[catIndex].Agendas[agendaIndex].Versions = \"fail\";\n                    this.setState({\n                        calendar: calendar\n                    });\n                })\n        }\n        this.setState({\n            calendar: calendar\n        });\n    }\n\n    createWatchlist(e, catIndex, callback) {\n        e.stopPropagation();\n        const category = this.state.calendar.CalendarCategories[catIndex];\n        let collection = {\n            Name: `Calendar on ${moment(this.state.calendar.CalendarDate).format('MM/DD/YY')}`,\n            Description: category.Description,\n            WatchListLegislation: []\n        };\n        category.Agendas.forEach(agenda => {\n            if (agenda.LegislationID && agenda.IsActive) {\n                collection.WatchListLegislation.push({ LegislationID: agenda.LegislationID });\n            }\n        });\n        if (collection.WatchListLegislation.length > 0) {\n            this.setState({\n                creatingCollection: catIndex\n            });\n            this.props.actions.saveCollections({ WatchLists: [collection] }, true)\n                .then(() => {\n                    let createdCollections = [...this.state.createdCollections];\n                    createdCollections[catIndex] = [...this.props.collection.collectionSave][0]\n                    this.setState({\n                        creatingCollection: null,\n                        createdCollections: createdCollections\n                    });\n                    if (callback) {\n                        callback(this.props.collection.collectionSave);\n                    }\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.setState({\n                        creatingCollection: null\n                    });\n                    this.props.actions.makeToast([{ message: \"Failed To Create Watchlist\", type: \"failure\" }]);\n                });\n        }\n    }\n\n    editHistory(e, catIndex, displayDescription) {\n        //User wants to be able to click a button on the calendar and immediately be able to edit the bills in a category.\n        //Loop the category agendas, build a string of legislationIDs, put it in the query object, and ship it to bill management\n        const category = this.state.calendar.CalendarCategories[catIndex];\n\n        let legislationIds = [];\n        for (let i = 0; i < category.Agendas.length; i++) {\n            if (category.Agendas[i].IsActive && !category.Agendas[i].IsHidden)\n                legislationIds.push({ LegislationID: category.Agendas[i].LegislationID })\n        }\n\n        const queryString = JSON.stringify({ legislationIDs: legislationIds, selectedSession: this.state.calendar.SessionID, calendarDate: this.state.calendar.CalendarDate, calendarCategoryTypeID: category.CalendarCategoryTypeID, calendarCategoryDescription: displayDescription })\n        const link = \"/bill-management?q=\" + window.btoa(queryString)\n        this.props.history.push(link);\n    }\n\n    removeZeros(doc) {\n        let dom = document.createElement('div');\n        dom.innerHTML = doc;\n\n        let all = document.getElementsByTagName(\"*\");\n\n        for (let i = 0; i < all.length; i++) {\n            let trimmedUrl = \"\"\n            //If it's an href with a bill or resolution number in it then slice off the end, remove the zeros, and append it back to the href\n            if (all[i].href && all[i].href != \"\" && all[i].href.match(/[H|S][B|J|R][0-9]{4}/)) {\n                trimmedUrl = all[i].href.slice(all[i].href.length - 7, all[i].href.length - 1)\n                trimmedUrl = trimmedUrl.slice(0, 2) + parseInt(trimmedUrl.slice(2))\n                all[i].href = all[i].href.slice(0, all[i].href.length - 7) + trimmedUrl + \"/\";\n            }\n        }\n\n        return doc;\n    }\n\n    generateClerksCopy(category) {\n        let LegislationFiles = [];\n\n        category.Agendas.filter(x => x.IsActive).forEach((x, i) => {\n            LegislationFiles.push({\n                LegislationID: x.LegislationID,\n                LegislationNumber: x.LegislationNumber,\n                SessionID: this.state.calendar.SessionID,\n                AmendmentCount: 1,\n                FirstChamberCount: 1,\n                SecondChamberCount: 1\n            })\n        })\n\n        this.props.actions.joinCommFile({ LegislationFiles })\n            .then(() => {\n                const res = this.props.communications.joinCommFile;\n                if (res.Pdf.FileContents) {\n                    fetch(`data:application/pdf;base64,${res.Pdf.FileContents}`)\n                        .then(res => res.blob())\n                        .then(blob => {\n                            const urlObj = URL.createObjectURL(blob);\n                            this.setState({\n                                pdfSrc: urlObj\n                            });\n                        });\n                } else {\n                    this.setState({\n                        pdfSrc: ''\n                    })\n                }\n                let failedBills = [];\n                res.JoinLegislation.forEach(leg => {\n                    if (!leg.Generated) {\n                        const bill = LegislationFiles.find(bill => bill.LegislationID === leg.LegislationID)\n                        if (bill && !failedBills.includes(bill)) {\n                            failedBills.push(bill)\n                        }\n                    }\n                });\n\n                if (failedBills.length === LegislationFiles.length) {\n                    // Every single bill in the list does not have a clerk copy\n                    this.props.actions.makeToast([{ message: LegislationFiles.length === 1 ? LegislationFiles[0].LegislationNumber + \" does not have a clerk copy\" : \"No selected bills have a clerk copy\", type: \"failure\", long: true }]);\n                    this.setState({\n                        gettingPdf: false\n                    });\n                } else {\n                    this.setState({\n                        failedToJoinBills: failedBills,\n                        showPdfWindow: true,\n                        gettingPdf: false\n                    });\n                }\n            }).catch(err => {\n                if (err === 'AbortError') {\n                    return;\n                }\n                this.setState({\n                    pdfSrc: '',\n                    gettingPdf: false\n                });\n                console.log(err.toString());\n                this.props.actions.makeToast([{ message: \"Failed To Get Data\", type: \"failure\" }]);\n            })\n    }\n\n    render() {\n        const { selectedSession } = this.props.session;\n        const { isLoaded, message, calendar } = this.state;\n        if (!isLoaded) {\n            return (<div className=\"center-spinner spinner\">Loading...</div>)\n        }\n        if (message) {\n            return (<div className=\"center\">{message}</div>)\n        }\n        if (this.state.calendarFile) {\n\n            //Find and display the PDF link if we're displaying a pre-generated calendar file\n            let calendarFileUrl = '';\n            const pdfFile = this.props.calendar.calendarGet.CalendarFiles.find(file => file.FileURL.toUpperCase().includes('PDF'));\n            if (pdfFile) {\n                const url = new URL(pdfFile.FileURL);\n                calendarFileUrl = lisDocDomain + (url.pathname[0] === '/' ? url.pathname : '/' + url.pathname);\n            }\n\n            return (\n                <div className='details-page-data-container'>\n                    {calendarFileUrl != \"\" &&\n                        <a target=\"_blank\" href={calendarFileUrl} className=\"float-right\">\n                            <span title=\"PDF\" aria-label=\"PDF\" className=\"icon pdf\"></span>\n                        </a>\n                    }\n                    {renderHTML(this.removeZeros(this.state.calendarFile))}\n                </div>\n            );\n        }\n\n        //This calendarTime logic is also set in lis-calendar-form, if changed here, change there as well\n        const calendarTime = moment.utc(calendar.CalendarDate).isSame(moment.utc(calendar.CalendarDate).hour(0), \"minute\")\n            || moment.utc(calendar.CalendarDate).isSame(moment.utc(calendar.CalendarDate).hour(12), \"minute\")\n            ? \"12 noon\"\n            : moment.utc(calendar.CalendarDate).format(\"h:mm a\");\n\n        return (<div className='generic-details-page calendar-details-page'>\n            <div style={{ display: this.state.showPdfWindow ? 'block' : 'none', overflow: 'hidden' }} onClick={() => this.setState({ showPdfWindow: false })} className=\"overlay center-content\">\n                <div className=\"full full-height\" style={{ maxWidth: '100vw', width: '95%' }}>\n                    <div onClick={e => e.stopPropagation()} className=\"dlas-forms user-forms overlay-content animated-fade-in-up full-height\">\n                        <div>\n                            <button className=\"button print\" onClick={() => this.pdfRef ? this.pdfRef.contentWindow.print() : null}> Print</button>\n                        </div>\n                        {this.state.failedToJoinBills.length > 0 &&\n                            <div className=\"small-text\">\n                                <span>These bills do not have clerk copies and are not included in the PDF: </span>\n                                <span>{this.state.failedToJoinBills.map((bill, i) => <React.Fragment key={i}>{i !== 0 && \", \"}{bill.billNum}</React.Fragment>)}</span>\n                            </div>\n                        }\n                        <div className=\"center full-height\">\n                            <iframe className=\"center\" style={{ width: '100%', height: '90%' }} ref={el => this.pdfRef = el} src={this.state.pdfSrc}></iframe>\n                            <button style={{ position: 'absolute', bottom: '10px', right: '10px' }} type=\"button\" onClick={() => this.setState({ showPdfWindow: false, pdfSrc: \"\" })} className=\"button secondary\">Close</button>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <CalendarDetailsComponent\n                calendar={calendar}\n                calendarTime={calendarTime}\n                session={selectedSession}\n                sessionList={this.props.session.sessionList}\n                comments={calendar.CalendarComments || []}\n                creatingCollection={this.state.creatingCollection}\n                userClaims={this.props.login.userClaims}\n                createdCollections={this.state.createdCollections}\n                editHistory={this.editHistory}\n                createWatchlist={this.createWatchlist}\n                toggleAgenda={this.toggleAgenda}\n                setCurrentItem={this.setCurrentItem}\n                currentCategoryItem={this.state.currentCategoryItem}\n                currentAgendaItem={this.state.currentAgendaItem}\n                currentProceduralMotion={this.state.currentProceduralMotion}\n                commonCurrentItemOptions={this.state.commonCurrentItemOptions}\n                isSavingCalendarCurrentItem={this.state.isSavingCalendarCurrentItem}\n                generateClerksCopy={this.generateClerksCopy}\n                calendarCategoryReferences={this.props.calendar.calendarCategoriesReferences}\n            />\n        </div>);\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { session, nav, calendar, bills, login, collection, communications } = state;\n        return {\n            session,\n            nav,\n            calendar,\n            bills,\n            login,\n            collection,\n            communications\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, sessionActionCreators, navActionCreators, calendarActionCreators, billActionCreators, authActionCreators, collectionActionCreators, communicationsActionCreators), dispatch)\n        }\n    }\n)(PublicCalendarDetails)\n","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { Link } from 'react-router-dom';\nimport { connect } from 'react-redux';\nimport { sessionActionCreators } from '../../stores/lis-session-store';\nimport { navActionCreators } from '../../stores/lis-nav-store';\nimport { minutesActionCreators } from '../../stores/lis-minutes-store';\nimport { cancelRequest } from '../../services/request.service';\nimport moment from 'moment-timezone';\n\n\nclass PublicMinutesList extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            session: '',\n            senateIsLoaded: false,\n            houseIsLoaded: false,\n            senateMinutesList: [],\n            houseMinutesList: [],\n            showHouseChamber: true,\n            showSenateChamber: true\n        };\n\n        this.toggleChamber = this.toggleChamber.bind(this);\n    }\n\n    toggleChamber(chamber) {\n        this.setState(state => ({\n            [chamber]: !state[chamber]\n        }));\n    }\n\n    //When component has mounted, make the call to get session by code\n    componentDidMount() {\n        const sessionCode = this.props.match.params.sessioncode\n        if (parseInt(sessionCode) > 0) {\n            //Update the session selector component, which will run componentDidUpdate and call setupPage on its own\n            if (this.props.nav.session !== sessionCode) {\n                this.props.actions.changeSession(sessionCode)\n            } else {\n                this.setupPage(sessionCode);\n            }\n        }\n    }\n\n    componentDidUpdate(prevProps) {\n        // Setup the page if the global selected session changes. Change the URL to reflect the session change\n        if (prevProps.nav.session !== this.props.nav.session) {\n            this.props.history.push(\"/session-details/\" + this.props.nav.session + \"/minutes-list/\" + this.props.match.params.chamber);\n            this.setupPage(this.props.nav.session);\n        } else if (this.props.nav.session !== this.props.match.params.sessioncode) {\n            // If the url changes then update the global selected session with whatever the url is\n            const sessionCode = this.props.match.params.sessioncode;\n            if (!isNaN(sessionCode)) {\n                this.props.actions.changeSession(sessionCode);\n            }\n        }\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    setupPage(sessionCode) {\n        this.setState({\n            senateIsLoaded: false,\n            houseIsLoaded: false\n        }, () => {\n            //Get the session information\n            this.props.actions.getSessionByCode(sessionCode)\n                .then(() => {\n                    this.setState({\n                        session: this.props.session.selectedSession,\n                    });\n                });\n            if (this.props.match.params.chamber === \"house\") {\n                //Get the list for the House\n                this.props.actions.getMinutesList('sessionCode=' + sessionCode + '&chamberCode=H')\n                    .then(() => {\n                        this.setState({\n                            houseMinutesList: [...this.props.minutes.minutesList].filter(m => !m.CommitteeID),\n                            houseIsLoaded: true\n                        });\n                    });\n            } else {\n                //Get the list for the Senate\n                this.props.actions.getMinutesList('sessionCode=' + sessionCode + '&chamberCode=S')\n                    .then(() => {\n                        this.setState({\n                            senateMinutesList: [...this.props.minutes.minutesList].filter(m => !m.CommitteeID),\n                            senateIsLoaded: true\n                        });\n                    });\n            }\n        });\n    }\n\n    render() {\n        const { senateMinutesList, houseMinutesList, senateIsLoaded, houseIsLoaded, session } = this.state;\n        const sessionHeader = (session ? session.SessionYear + \" \" + session.DisplayName : '') + (this.props.match.params.chamber === \"house\" ? \" House\" : \" Senate\") + \" Minutes\";\n        return (\n            <div className=\"public-chamber-data\">\n                <div>\n                    <h2>{sessionHeader}</h2>\n                </div>\n                <div className=\"public-list\">\n                    {this.props.match.params.chamber === \"house\" ?\n                        session && session.SessionYear < 2010 ?\n                            <div>\n                                {houseIsLoaded ?\n                                    <table className=\"line-table\">\n                                        <tbody className=\"toggle-table\">\n                                            {houseMinutesList.map(minutes =>\n                                                <tr key={minutes.MinutesBookID} className=\"inner-grid two alternating-color-list\">\n                                                    <td>\n                                                        {minutes.MinutesFiles && minutes.MinutesFiles.length > 0 ?\n                                                            <a target=\"_blank\" href={minutes.MinutesFiles[0].FileURL}>\n                                                                <span className=\"button paper\">Minutes</span>\n                                                                {moment(minutes.MinutesDate).format(\"MM/DD/YYYY\")} {minutes.MinutesNumber > 1 && `(${minutes.MinutesNumber})`}\n                                                            </a>\n                                                            :\n                                                            <div>\n                                                                <span className=\"button paper\">Minutes</span>\n                                                                {moment(minutes.MinutesDate).format(\"MM/DD/YYYY\")} {minutes.MinutesunicatilonNumber > 1 && `(${minutes.MinutesNumber})`}\n                                                            </div>\n                                                        }\n                                                    </td>\n                                                </tr>\n                                            )}\n                                        </tbody>\n                                    </table>\n                                    :\n                                    <div aria-label=\"Loading\" className=\"center-spinner spinner\"></div>\n                                }\n                            </div>\n                            :\n                            <a href={\"https://virginiageneralassembly.gov/house/minutes/list.php?ses=\" + (session && session.SessionCode.toString().substr(2, 3))}>House Minutes</a>\n                        :\n                        <div>\n                            {senateIsLoaded ?\n                                <table className=\"line-table\">\n                                    <tbody className=\"toggle-table\">\n                                        {senateMinutesList.map(minutes =>\n                                            <tr key={minutes.MinutesBookID} className=\"inner-grid two alternating-color-list\">\n                                                <td>\n                                                    <Link to={`../minutes/${minutes.MinutesBookID}`}>\n                                                        <span className=\"button paper\">Minutes</span>\n                                                        {moment(minutes.MinutesDate).format(\"MM/DD/YYYY\")} {minutes.MinutesNumber > 1 && `(${minutes.MinutesNumber})`}\n                                                    </Link>\n                                                </td>\n                                            </tr>\n                                        )}\n                                    </tbody>\n                                </table>\n                                :\n                                <div aria-label=\"Loading\" className=\"center-spinner spinner\"></div>\n                            }\n                        </div>\n                    }\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { session, nav, minutes } = state;\n        return {\n            session,\n            nav,\n            minutes\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, sessionActionCreators, navActionCreators, minutesActionCreators), dispatch)\n        }\n    }\n)(PublicMinutesList)\n","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport ReactToPrint from 'react-to-print';\nimport { connect } from 'react-redux';\nimport { sessionActionCreators } from '../../stores/lis-session-store';\nimport { minutesActionCreators } from '../../stores/lis-minutes-store';\nimport { personnelActionCreators } from '../../stores/lis-personnel-store';\nimport { navActionCreators } from '../../stores/lis-nav-store';\nimport { cancelRequest } from '../../services/request.service';\nimport moment from 'moment-timezone';\n\nimport MinutesDetails from '../../lis-shared/lis-minutes/lis-minutes-details';\nimport renderHTML from 'react-render-html';\n\nclass PublicMinutesDetails extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            isLoaded: false\n        };\n    }\n\n    //When component has mounted, make the call to get session by ID\n    componentDidMount() {\n        const sessionCode = parseInt(this.props.match.params.sessioncode);\n        const minutesId = parseInt(this.props.match.params.minutesid)\n        const error = (msg) => {\n            this.setState({\n                message: msg || \"Failed to get minutes\",\n                isLoaded: true\n            });\n        }\n\n        if (parseInt(sessionCode) > 0 && minutesId > 0) {\n            this.props.actions.getSessionByCode(sessionCode)\n                .then(() => {\n                    this.props.actions.getMinutesBook('?minutesbookID=' + minutesId)\n                        .then(() => {\n                            const minutesBook = this.props.minutes.minutesBook;\n                            if (minutesBook.MinutesCategories.length === 0 && minutesBook.MinutesFiles.find(file => file.FileURL.toUpperCase().includes('.HTM'))) {\n                                //If there are no categories  then it is assumed that this minutes book is legacy. Get the file if it exists\n                                const htmlFile = minutesBook.MinutesFiles.find(file => file.FileURL.toUpperCase().includes('.HTM'));\n                                if (htmlFile) {\n                                    this.props.actions.getFile(htmlFile.FileURL)\n                                        .then(() => {\n                                            this.setState({\n                                                minutesFile: this.props.nav.file,\n                                                isLoaded: true\n                                            });\n                                        }).catch(err => {\n                                            if (err !== 'Aborted') {\n                                                throw err.toString();\n                                            }\n                                        });\n                                }\n                            } else {\n                                this.props.actions.getRoleTypes()\n                                    .then(() => {\n                                        // not going to serve the file itself, so we need to get the appropriate names for the header\n                                        // wait until both async calls are done before setting isLoaded to true \n                                        const ltGovPromise = new Promise((res, rej) => {\n                                            const ltGovRoleType = this.props.personnel.roleTypes.find(x => x.Name.toLowerCase().includes(\"president\"));\n                                            const ltGovParams = \"isPublic=true&staffRoleTypeID=\" + ltGovRoleType.StaffRoleTypeID + \"&effectiveBeginDate=\" + minutesBook.MinutesDate;\n                                            this.props.actions.getPersonnelList(ltGovParams, true)\n                                                .then(() => {\n                                                    const ltGov = this.props.personnel.personnelOtherList[0];\n                                                    if (ltGov) {\n                                                        this.setState({\n                                                            ltGov\n                                                        })\n                                                    } else {\n                                                        throw 'Failed to get President of the Senate';\n                                                    }\n                                                    res();\n                                                }).catch(err => rej(err));\n                                        });\n                                        const clerkOfSenatePromise = new Promise((res, rej) => {\n                                            const clerkOfSenateRoleType = this.props.personnel.roleTypes.find(x => x.Name.toLowerCase().includes(\"clerk\") && x.Name.toLowerCase().includes(\"senate\"))\n                                            const clerkOfSenateParams = \"isPublic=true&staffRoleTypeID=\" + clerkOfSenateRoleType.StaffRoleTypeID + \"&effectiveBeginDate=\" + minutesBook.MinutesDate;\n                                            this.props.actions.getPersonnelList(clerkOfSenateParams, true)\n                                                .then(() => {\n                                                    const clerkofTheSenate = this.props.personnel.personnelOtherList[0];\n                                                    if (clerkofTheSenate) {\n                                                        this.setState({\n                                                            clerkofTheSenate\n                                                        })\n                                                    } else {\n                                                        throw 'Failed to get Clerk of the Senate';\n                                                    }\n                                                    res();\n                                                }).catch(err => rej(err));\n                                        })\n                                        Promise.all([ltGovPromise, clerkOfSenatePromise]).then(() => {\n                                            this.setState({ isLoaded: true })\n                                        }).catch(err => {\n                                            if (err === 'Aborted')\n                                                return;\n                                            console.log(err)\n                                            error('Failed to get header personnel information');\n                                        })\n                                    }).catch(err => {\n                                        if (err === 'Aborted')\n                                            return;\n                                        error('Failed to get header personnel information');\n                                    });\n                            }\n                        }).catch(err => {\n                            if (err === 'Aborted')\n                                return;\n                            error();\n                        });\n                });\n        } else {\n            error();\n        }\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { isLoaded, message, ltGov, clerkofTheSenate } = this.state;\n\n        const session = this.props.session.selectedSession;\n        const sessionHeader = session ? session.SessionYear + \" \" + session.DisplayName : '';\n\n        const minutesBook = this.props.minutes.minutesBook;\n        const categories = minutesBook.MinutesCategories;\n        let categoriesToShow = [];\n        if (categories) {\n            categoriesToShow = categories.filter(category => category.ReleaseToPreview);\n        }\n\n        if (message) {\n            return (<p>{message}</p>);\n        }\n        if (!isLoaded) {\n            return (<div className=\"center-spinner spinner\">Loading...</div>);\n        }\n        return (\n            <div className='generic-details-page minutes-details-page'>\n                <div className=\"flex-row\">\n                    <div>\n                        <h2>{sessionHeader}</h2>\n                    </div>\n                    <div>\n                        {minutesBook.MinutesFiles && minutesBook.MinutesFiles.length > 0 &&\n                            <a className=\"download-link\" href={minutesBook.MinutesFiles[0].FileURL} target=\"_blank\" style={{ marginRight: \"5px\" }}><i className=\"icon file\" /> View HTML</a>\n                        }\n                        <ReactToPrint\n                            trigger={() => <button type=\"button\" className=\"button print\"> Print</button>}\n                            content={() => this.componentRef}\n                            pageStyle={\"break-inside: avoid\"}\n                        />\n                    </div>\n                </div>\n                <div className=\"details-page-data-container\" ref={el => (this.componentRef = el)}>\n                    {this.state.minutesFile ?\n                        <div>{renderHTML(this.state.minutesFile)}</div>\n                        :\n                        <React.Fragment>\n                            <div className=\"entry-text\">\n                                <ul className=\"first-entry\">\n                                    <li>Minute Book</li>\n                                    <li>{sessionHeader}</li>\n                                    <li>Senate of Virginia</li>\n                                    <li>{ltGov.FullName.toUpperCase()}, PRESIDENT OF THE SENATE</li>\n                                    <li>{clerkofTheSenate.FullName.toUpperCase()}, CLERK</li>\n                                    <li>{moment(minutesBook.MinutesDate).format('dddd, MMMM DD, YYYY')}</li>\n                                </ul>\n                            </div>\n                            <MinutesDetails\n                                categories={categoriesToShow}\n                                publicPage={true}\n                            />\n                        </React.Fragment>\n                    }\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { session, minutes, personnel, nav } = state;\n        return {\n            session,\n            minutes,\n            personnel,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, sessionActionCreators, minutesActionCreators, personnelActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(PublicMinutesDetails)\n","import React from 'react';\nimport Select from 'react-select';\nimport { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';\n\nconst RESET = 'RESET';\n\nconst getItemStyle = (isDragging, draggableStyle, isHeader) => ({\n    userSelect: \"none\",\n    padding: '5px',\n    border: '1px solid #CCC',\n    margin: '0',\n    fontSize: isHeader ? '.95em' : '.9em',\n    background: isDragging ? \"#CCC\" : \"#FFF\",\n    ...draggableStyle\n});\n\nconst getListStyle = isDraggingOver => ({\n    background: isDraggingOver ? \"#f5f5f5\" : \"#f5f5f5\",\n    padding: '0'\n});\n\nconst selectStyles = {\n    option: (base, state) => ({\n        ...base,\n        fontSize: '0.8em',\n    }),\n    control: (base) => ({\n        ...base,\n        padding: '1px',\n        margin: 0,\n        minHeight: 0,\n        fontSize: '0.8em',\n    }),\n    dropdownIndicator: (base) => ({\n        ...base,\n        padding: '0px 8px'\n    }),\n    clearIndicator: (base) => ({\n        ...base,\n        padding: '0px 8px'\n    }),\n    singleValue: (base, state) => {\n        return { ...base, };\n    },\n    menu: (base) => ({\n        ...base,\n        boxShadow: 'none'\n    }),\n    menuList: (base) => ({\n        ...base,\n        background: 'white',\n        border: '1px solid gray',\n        borderRadius: '5px'\n    })\n};\n\nexport default class UpdatePatronageModal extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            showPatronTypeChangeWarning: {}\n        }\n\n        this.handlePatronTypeChange = this.handlePatronTypeChange.bind(this);\n        this.cancel = this.cancel.bind(this);\n    }\n\n    handlePatronTypeChange(row, val, confirm) {\n        const patronDisplayName = row.PatronDisplayName;\n        if (val && val.Name === \"Chief Co-Patron\" && this.props.patronList.filter(p => !p.RemoveDate && p.Name === \"Chief Co-Patron\").length === 4) {\n            this.setState({\n                showPatronTypeChangeWarning: {\n                    ...this.state.showPatronTypeChangeWarning,\n                    [patronDisplayName]: !confirm\n                }\n            })\n            if (!confirm) {\n                return;\n            }\n        } else if (val === RESET) {\n            this.setState({\n                showPatronTypeChangeWarning: {\n                    ...this.state.showPatronTypeChangeWarning,\n                    [patronDisplayName]: false\n                }\n            })\n            return;\n        }\n        this.props.handlePatronChange(row, 'PatronType', val)\n    }\n\n    cancel() {\n        this.props.history.goBack();\n    }\n\n    render() {\n        const { billText, patronList, memberList, patronTypes, newPatron } = this.props;\n        const { showPatronTypeChangeWarning } = this.state;\n        const showConfirmButton = newPatron?.length && !newPatron.find(p => !p.MemberID) && !newPatron.find(p => !memberList.find(m => m.MemberID === p.MemberID)) && !newPatron.find(p => !patronTypes.find(pt => pt.Name === p.Name)) && [...newPatron].filter(p => p.Name === \"Chief Co-Patron\").concat(patronList.filter(p => !p.RemoveDate && p.Name === \"Chief Co-Patron\")).length > 4;\n        return (\n            <div>\n                <div style={{ margin: '10px' }}>\n                    <div style={{ marginBottom: '10px' }}>\n                        <h2 style={{ marginBottom: '0px' }}>Update Patrons ({billText.LegislationNumber})</h2>\n                    </div>\n                    <div style={{ marginBottom: '10px' }}>\n                        <div style={{ display: 'grid', gap: '10px', gridTemplateColumns: 'max-content 350px 180px 100px', alignItems: 'center' }}>\n                            <span style={{ fontSize: '.85em' }}>New Patron(s): </span>\n                            <Select\n                                isMulti\n                                options={memberList ? memberList.filter(m => !patronList.map(p => p.MemberID).includes(m.MemberID)) : []}\n                                onChange={(val, behavior) => this.props.handleNewPatronChange('Patron', val, behavior)}\n                                getOptionValue={(opt) => opt.MemberID}\n                                getOptionLabel={(opt) => memberList.find(m => m.MemberID === opt.MemberID)?.label}\n                                value={[...newPatron].filter(p => p.MemberID)}\n                                styles={selectStyles}\n                            />\n                            <Select\n                                options={patronTypes ? patronTypes.filter(pt => pt.Name !== \"Incorporated Chief Co-Patron\" || !newPatron.filter(p => p.ChamberCode !== \"S\")?.length) : []}\n                                getOptionLabel={opt => opt.Name}\n                                getOptionValue={opt => opt.PatronTypeID}\n                                onChange={(val) => this.props.handleNewPatronChange('PatronType', val)}\n                                value={newPatron[0].Name ? patronTypes.find(pt => pt.Name === newPatron[0].Name) : null}\n                                styles={selectStyles}\n                            />\n                            {!showConfirmButton &&\n                                <button disabled={!newPatron?.length || !newPatron[0].Name || !newPatron[0].MemberID || newPatron.find(p => !memberList.find(m => m.MemberID === p.MemberID)) || newPatron.find(p => !patronTypes.find(pt => pt.Name === p.Name))} className=\"button primary\" onClick={this.props.addNewPatron}>Add</button>\n                            }\n                        </div>\n                        {showConfirmButton &&\n                            <div style={{ display: 'flex', gap: '8px' }}>\n                                <span className=\"input-feedback-warning\" style={{ fontSize: '13px', margin: 'auto 0px' }}>Caution: There can only be a maximum of 4 Chief Co-Patrons, which this legislation will now exceed. Continue anyway?</span>\n                                <button className=\"button primary\" onClick={this.props.addNewPatron}>Yes</button>\n                                <button className=\"button secondary\" onClick={() => this.props.handleNewPatronChange('PatronType', null)}>No</button>\n                            </div>\n                        }\n                    </div>\n                    <div style={getItemStyle(false, null, true)} className='inner-grid toggle-and-small-one-med-half-half-small'>\n                        <div />\n                        <div>#</div>\n                        <div>Display Name</div>\n                        <div style={{ margin: 'auto' }}>Patron Type</div>\n                        <div style={{ margin: 'auto' }}>By Request</div>\n                        <div style={{ margin: 'auto' }}>Is Introducing</div>\n                        <div style={{ margin: 'auto' }}>Actions</div>\n                    </div>\n                    <DragDropContext onDragEnd={result => this.props.onDragEnd(result)}>\n                        <Droppable droppableId={\"hp\"} index={0}>\n                            {(provided, snapshot) => (\n                                <div\n                                    {...provided.droppableProps}\n                                    ref={provided.innerRef}\n                                    style={getListStyle(snapshot.isDraggingOver)}\n                                >\n                                    {patronList.map((row, j) => (\n                                        <Draggable isDragDisabled={Boolean(row.RemoveDate)} key={row.MemberID + \"-\" + row.LegislationID} draggableId={row.MemberID.toString()} index={j}>\n                                            {(provided, snapshot) => (\n                                                <div\n                                                    ref={provided.innerRef}\n                                                    {...provided.draggableProps}\n                                                    {...provided.dragHandleProps}\n                                                    style={getItemStyle(\n                                                        snapshot.isDragging,\n                                                        provided.draggableProps.style\n                                                    )}\n                                                >\n                                                    <div style={{ alignItems: 'center', color: row.RemoveDate ? '#8b8b8b' : '' }} className='inner-grid toggle-and-small-one-med-half-half-small'>\n                                                        <div><button className=\"button draggable\">Drag and drop</button></div>\n                                                        <div>{!row.RemoveDate ? row.Sequence : \"\"}</div>\n                                                        <div>{row.PatronDisplayName + \" (\" + row.ChamberCode + \")\"}</div>\n                                                        <div>\n                                                            <Select\n                                                                options={patronTypes ? patronTypes.filter(pt => pt.Name !== \"Incorporated Chief Co-Patron\" || row.Name === \"Incorporated Chief Co-Patron\" || row.ChamberCode === \"S\") : []}\n                                                                getOptionLabel={opt => opt.Name}\n                                                                getOptionValue={opt => opt.PatronTypeID}\n                                                                onChange={(val) => this.handlePatronTypeChange(row, val)}\n                                                                value={patronTypes.find(p => p.Name === row.Name)}\n                                                                isDisabled={row.RemoveDate}\n                                                                styles={selectStyles}\n                                                            />\n                                                        </div>\n                                                        <div style={{ margin: 'auto' }} disabled={row.RemoveDate} onClick={(val) => this.props.handlePatronChange(row, 'ByRequest')} className=\"toggle-switch\">\n                                                            <input id=\"sr-status-change\" checked={row.ByRequest} type=\"checkbox\" />\n                                                            <span className=\"slider\"></span>\n                                                        </div>\n                                                        <div style={{ margin: 'auto' }} disabled={row.RemoveDate} onClick={() => this.props.handlePatronChange(row, 'IsIntroducing')} className=\"toggle-switch\">\n                                                            <input id=\"sr-status-change\" checked={row.IsIntroducing} type=\"checkbox\" />\n                                                            <span className=\"slider\"></span>\n                                                        </div>\n                                                        <div style={{ margin: 'auto', display: 'flex' }}><button onClick={() => this.props.togglePatron(row)} className={`icon ${row.RemoveDate ? 'add' : 'delete'}`} type=\"button\" /></div>\n                                                    </div>\n                                                    {showPatronTypeChangeWarning[row.PatronDisplayName] &&\n                                                        <div style={{ display: 'flex', gap: '8px' }}>\n                                                            <span className=\"input-feedback-warning\" style={{ fontSize: '13px', margin: 'auto 0px' }}>Caution: There can only be a maximum of 4 Chief Co-Patrons, which this legislation already has. Continue anyway?</span>\n                                                            <button className=\"button primary\" onClick={() => this.handlePatronTypeChange(row, patronTypes.find(p => p.Name === \"Chief Co-Patron\"), true)}>Yes</button>\n                                                            <button className=\"button secondary\" onClick={() => this.handlePatronTypeChange(row, RESET)}>No</button>\n                                                        </div>\n                                                    }\n                                                </div>\n                                            )}\n                                        </Draggable>\n                                    ))}\n                                    {provided.placeholder}\n                                </div>\n                            )}\n                        </Droppable>\n                    </DragDropContext>\n                </div>\n                <div className=\"inline-list align-right\" style={{ paddingBottom: '55px' }}>\n                    {!this.props.savingPatrons && <button className=\"button secondary\" onClick={this.cancel}>Cancel</button>}\n                    <button disabled={this.props.savingPatrons || showConfirmButton || Object.keys(showPatronTypeChangeWarning).find(key => showPatronTypeChangeWarning[key] === true)} className=\"button primary\" onClick={this.props.updatePatrons}>{this.props.savingPatrons ? <div className=\"small-spinner\" /> : 'Update'}</button>\n                </div>\n            </div>\n        )\n    }\n}","import { createElement } from \"react\";\n\nconst getJsx = (jsonObject) => {\n    // Do sanity checks. Make sure that the the param is actually an object\n    if (typeof jsonObject !== 'object' || jsonObject === null) {\n        console.error(\"object sent to be turned into jsx is not an object\")\n        return null;\n    }\n    return mapJson(jsonObject);\n\n}\n\n\nconst mapJson = (object) => {\n    if (typeof object === \"string\") {\n        return object;\n    }\n    let attributeObject = {};\n    if (object[\"Attributes\"]) {\n        for (var key in object[\"Attributes\"]) {\n            if (object[\"Attributes\"].hasOwnProperty(key)) {\n                switch (key) {\n                    case (\"Id\"):\n                        attributeObject.id = object[\"Attributes\"][key];\n                        break;\n                    case (\"Class\"):\n                        attributeObject.className = object[\"Attributes\"][key];\n                        break;\n                    case (\"Style\"):\n                        attributeObject.style = processStyle(object[\"Attributes\"][key]);\n                        break;\n                    case (\"Url\"):\n                        attributeObject.href = object[\"Attributes\"].Url;\n                        break;\n                    case (\"cellspacing\"):\n                        attributeObject['cellSpacing'] = object[\"Attributes\"][key];\n                        break;\n                    case (\"cellpadding\"):\n                        attributeObject['cellPadding'] = object[\"Attributes\"][key];\n                        break;\n                    case (\"border\"):\n                    case (\"align\"):\n                        attributeObject[key] = object[\"Attributes\"][key];\n                        break;\n                }\n            }\n        }\n    }\n\n    let newElements = [];\n    if (object[\"Content\"]) {\n        let nestedElements = [];\n        for (const c of object[\"Content\"]) {\n            nestedElements.push(mapJson(c));\n        }\n        newElements.push(createElement(object[\"TagName\"], { ...attributeObject }, nestedElements));\n    } else {\n        newElements.push(createElement(object[\"TagName\"], { ...attributeObject }));\n    }\n    return newElements\n}\n\n// turns the inline style string into an object that jsx can understand.\nconst processStyle = cssText => {\n    const rule = cssText.replace(/\\/\\*(.|\\s)*?\\*\\//g, \" \").replace(/\\s+/g, \" \");\n    let style = {}\n    const properties = rule.split(\";\").map(o => o.split(\":\").map(x => x && x.trim()));\n    for (const [property, value] of properties) {\n        const objectName = property.toLowerCase().replace(/\\W+\\w/g, match => match.slice(-1).toUpperCase());\n        if (value) {\n            const urlChecker = value.replace(/url\\s*\\(/g, \"\").replace(/\\)\\s*$/g, \"\");\n            try {\n                new URL(urlChecker);\n                // a url does not need to be in a jsx attribute. Throw them out for safety's sake.\n                continue;\n            } catch {\n                // This is not a url. Carry on\n            }\n        }\n        style[objectName] = value;\n    }\n    return style;\n}\n\n\nexport default getJsx;","import React from 'react';\nimport renderHTML from 'react-render-html';\nimport { Link, Prompt } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport ReactToPrint from \"react-to-print\";\nimport DatePicker from \"react-datepicker\";\nimport Select from 'react-select';\nimport { billActionCreators } from '../../stores/lis-legislation-store';\nimport { authActionCreators } from '../../stores/lis-auth-store';\nimport { patronActionCreators } from '../../stores/lis-patron-store';\nimport { sessionActionCreators } from '../../stores/lis-session-store';\nimport { navActionCreators } from '../../stores/lis-nav-store';\nimport { cancelRequest } from '../../services/request.service';\nimport UpdatePatronageModal from '../../lis-admin/lis-update-patronage-modal';\nimport ReviewSection from '../../lis-admin/lis-version-management/components/lis-review';\nimport Mark from 'mark.js';\nimport queryString from 'query-string';\nimport moment from 'moment-timezone';\nimport getJsx from '../../services/json-to-jsx';\nimport getHtml from '../../services/json-to-html';\nimport { memberActionCreators } from '../../stores/lis-members-store';\n\nconst VERSION_AUTHOR = \"LegislationText\";\nconst PATRON_AUTHOR = \"LegislationPatron\";\nconst NEXT = \"NEXT\";\nconst PREVIOUS = \"PREVIOUS\";\n\nconst inlineStyles = [\n    { class: \"enactstm\", value: 'font-family:times,TimesNewRoman,Times New Roman;font-weight:bold;text-align:justify;text-indent:15px;' },\n    { class: \"enactcls\", value: 'font-family:times,TimesNewRoman,Times New Roman;font-weight:bold;text-align:justify;' },\n    { class: \"section\", value: 'font-family:times,TimesNewRoman,Times New Roman;text-align:justify;margin-bottom:1px;text-indent:15px;' },\n    { class: \"ldtitle\", value: 'font-family:times,TimesNewRoman,Times New Roman;font-style:italic;text-align:justify;text-indent:-15px;margin-left:15px;' },\n    { class: \"center\", value: 'font-family:times,TimesNewRoman,Times New Roman;font-weight:bold;text-align:center;' }\n]\n\nfunction PatronDisplayInfo(patron) {\n    var s = patron.PatronDisplayName.trim();\n    if (patron.ByRequest) {\n        s += \" (By Request)\";\n    }\n    return s;\n}\n\nclass FullText extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            message: '',\n            isLoaded: false,\n            isEditing: false,\n            isSaving: false,\n            billText: '',\n            draftTextCopy: '',\n            chamberOptions: [\n                { label: \"Senate\", value: \"S\" },\n                { label: \"House\", value: \"H\" }\n            ],\n            sponsorOptions: [],\n            highlight: this.props.location.pathname.endsWith('/hilite'),\n            amendmentSelections: {},\n            memberOptions: [],\n            houseMemberOptions: [],\n            senateMemberOptions: [],\n            committeeOptions: [],\n            housePatronsList: [],\n            senatePatronsList: [],\n            patronList: [],\n            originalPatronList: [],\n            versionsList: [],\n            chiefPatronsList: [],\n            showPatronModal: false,\n            showTooltip: false,\n            isDirty: false,\n            initialPass: false,\n            patronTypes: [],\n            newPatron: [{}],\n            wasEmpty: false,\n            replaced: false,\n            markHelpIndex: null,\n            subcommitteeOptions: []\n        };\n\n        this.handleEditorChange = this.handleEditorChange.bind(this);\n        this.toggleEditContent = this.toggleEditContent.bind(this);\n        this.createNewAmendment = this.createNewAmendment.bind(this);\n        this.saveText = this.saveText.bind(this);\n        this.handleBillDispositionChange = this.handleBillDispositionChange.bind(this);\n        this.toggleHighlight = this.toggleHighlight.bind(this);\n        this.highlightText = this.highlightText.bind(this);\n        this.membersCallback = this.membersCallback.bind(this);\n        this.committeesCallback = this.committeesCallback.bind(this);\n        this.handleParamChange = this.handleParamChange.bind(this);\n        this.handleIsActiveChange = this.handleIsActiveChange.bind(this);\n        this.handleIsPublicChange = this.handleIsPublicChange.bind(this);\n        this.toggleTooltip = this.toggleTooltip.bind(this);\n        this.getData = this.getData.bind(this);\n        this.isLdIncluded = this.isLdIncluded.bind(this);\n        this.getJsonHeadersRequestString = this.getJsonHeadersRequestString.bind(this);\n        this.toggleReprint = this.toggleReprint.bind(this);\n        this.downloadWordFile = this.downloadWordFile.bind(this);\n        this.togglePatronModal = this.togglePatronModal.bind(this);\n        this.updatePatrons = this.updatePatrons.bind(this);\n        this.savePatrons = this.savePatrons.bind(this);\n        this.onDragEnd = this.onDragEnd.bind(this);\n        this.togglePatron = this.togglePatron.bind(this);\n        this.handlePatronChange = this.handlePatronChange.bind(this);\n        this.handleNewPatronChange = this.handleNewPatronChange.bind(this);\n        this.addNewPatron = this.addNewPatron.bind(this);\n        this.handleVersionDateChange = this.handleVersionDateChange.bind(this);\n        this.applyPassageDates = this.applyPassageDates.bind(this);\n        this.triggerDownload = this.triggerDownload.bind(this);\n        this.passageCheck = this.passageCheck.bind(this);\n        this.setWasEmpty = this.setWasEmpty.bind(this);\n        this.setReplaced = this.setReplaced.bind(this);\n        this.resetPatrons = this.resetPatrons.bind(this);\n        this.navToKeywordHit = this.navToKeywordHit.bind(this);\n\n        this.dispositionRef = React.createRef();\n        this.sponsorRef = React.createRef();\n        this.memberRef = React.createRef();\n        this.committeeRef = React.createRef();\n    }\n\n    setWasEmpty(val, callback) {\n        this.setState({ wasEmpty: val }, () => {\n            if (callback) {\n                callback();\n            }\n        })\n    }\n\n    setReplaced(val, callback) {\n        this.setState({ replaced: val }, () => {\n            if (callback) {\n                callback();\n            }\n        })\n    }\n\n    handleEditorChange(value) {\n        this.setState({\n            draftTextCopy: value,\n            initialPass: true,\n            isDirty: this.state.billText.LegislationVersionID === 8 ? true : this.state.initialPass ? true : false\n        });\n    }\n\n    toggleReprint() {\n        let billText = { ...this.state.billText };\n        billText.IsReprint = !billText.IsReprint;\n        this.setState({ billText })\n    }\n\n    toggleEditContent(cb) {\n        this.setState({ gettingEditData: !this.state.isEditing }, () => {\n            let draftTextCopy, jsonPromise;\n            let headerError = false;\n            const billText = this.state.billText;\n            if (!this.state.isEditing && ['Introduced', 'Engrossed', 'Enrolled', 'Chaptered', 'Reenrolled'].includes(billText.LegislationVersion)) {\n\n                const jsonHeadersRequestString = this.getJsonHeadersRequestString(billText.LegislationTextID, billText.SessionID, this.state.selectedSession.SessionCode);\n\n                jsonPromise = this.props.actions.getJsonHeaders(jsonHeadersRequestString)\n                    .then(() => {\n                        if (this.props.bills.jsonHeaders) {\n                            let headers = getHtml(this.props.bills.jsonHeaders);\n\n                            let newDraftText;\n                            if (billText.LegislationVersion !== \"Introduced\") {\n                                draftTextCopy = headers + billText.DraftText;\n\n                                //Remove ldtitle from document if the header is present in the header and the header also contains the ldtitle\n                                let doc = document.createElement('div');\n                                doc.insertAdjacentHTML(\"afterbegin\", draftTextCopy);\n                                let header = doc.getElementsByTagName('div');\n\n                                if (header[0] != undefined) {\n                                    //Store the header somewhere while we find and iterate over paragraphs in the rest of the doc\n                                    let headerContainer = header[0].innerHTML;\n                                    let headerParagraphs = header[0].getElementsByTagName('p');\n\n                                    for (let i = 0; i < headerParagraphs.length; i++) {\n                                        if (['ldtitle', 'ld', 'patronLine', 'patctr'].includes(headerParagraphs[i].classList[0])) {\n                                            //Temporarily remove header                              \n                                            header[0].innerHTML = \"\";\n\n                                            //We found the ldtitle or patronage in the header, so iterate over the paragraphs to find any duplicate ldtitles or patronages and eliminate them\n                                            let docParagraphs = doc.getElementsByTagName('p');\n\n                                            for (let j = 0; j < docParagraphs.length; j++) {\n                                                if (['section', 'enactstm'].includes(docParagraphs[j].classList[0])) {\n                                                    break; //reached the actal body of the text, don't remove any more\n                                                } else if (['ldtitle', 'ld', 'patronLine', 'patctr', 'center'].includes(docParagraphs[j].classList[0])) {\n                                                    doc.removeChild(docParagraphs[j])\n                                                    j--\n                                                }\n                                            }\n                                        }\n                                    }\n                                    //Reattach the header\n                                    header[0].innerHTML = headerContainer;\n\n                                    newDraftText = doc.innerHTML;\n                                }\n                            } else {\n                                //if it's introduced, let's remove the existing headers if there are any before attaching the new headers\n                                draftTextCopy = billText.DraftText;\n\n                                let doc = document.createElement('div');\n                                doc.insertAdjacentHTML(\"afterbegin\", draftTextCopy);\n                                let content = doc.getElementsByTagName('p');\n\n                                //the below array defines where the actual draft text (i.e. not header information) begins, so that we know the point up to which we can remove elements (i.e. the point up to which we can assume the elements are headers)\n                                //they need to be in this priority order since sometimes there can be more than one, and we need to know which one will be the actual beginning of the draft text\n                                //e.g. hb1 in 2022 has the ldtitle class within the header itself as well as the enactstm class starting off the actual draft text, in which case the enactstm needs to be the point at which we stop removing elements, not the ldtitle element\n                                const beginningOfTextParagraphClassesInPriorityOrder = ['enactstm', 'ldtitle', 'ld'];\n\n                                //find the index of the element that marks the beginning of the draft text, and the point up to which we should assume everything is header information and remove all elements\n                                let beginningOfTextParagraphIndex = -1;\n                                let loopIdx = 0;\n                                do {\n                                    beginningOfTextParagraphIndex = [...content].findIndex(p => p.classList && p.classList[0] === beginningOfTextParagraphClassesInPriorityOrder[loopIdx]);\n                                    loopIdx++;\n                                } while (loopIdx < beginningOfTextParagraphClassesInPriorityOrder.length && beginningOfTextParagraphIndex === -1);\n\n                                //if we didn't find any start per the logic above, the index will still be -1, and this loop will not run and hence no elements will be removed\n                                //if we did find a starting index for the actual draft text, loop through the lines up to that point and remove the elements (i.e. header pieces)\n                                //Added a carveout to prevent removal of sections including \"Whereas\" that sometimes appear above the enactment statement\n                                let indexTracker = 0;\n                                for (let i = 0; i < beginningOfTextParagraphIndex; i++) {\n                                    //remove existing header (index 0 below rather than the variable 'i' since we are removing indexes of variable 'content' as we loop) \n                                    if (!content[indexTracker].innerHTML.includes(\"Whereas\") && content[indexTracker].classList[0] === \"section\") {\n                                        doc.removeChild(content[indexTracker]);\n                                    } else {\n                                        indexTracker++;\n                                    }\n                                }\n\n                                //Sometimes we end up with stray ldtitles at the top of the text. Remove that.\n                                if (content[0].className === \"ldtitle\") {\n                                    doc.removeChild(content[0])\n                                }\n\n                                newDraftText = doc.innerHTML;\n                            }\n\n                            //update draftTextCopy and now attach the new headers for introduced versions\n                            if (newDraftText != undefined) {\n                                draftTextCopy = (billText.LegislationVersion === \"Introduced\" ? headers : \"\") + newDraftText\n                            }\n                        }\n                    }).catch(e => {\n                        console.log(e)\n                        draftTextCopy = `<p class=\"message-error\">${typeof e === 'object' && !Array.isArray ? JSON.parse(e).Name || \"Unknown Error\" : e}</p>`;\n                        headerError = true;\n                    })\n            } else {\n                draftTextCopy = billText.DraftText\n            }\n\n            Promise.all([jsonPromise])\n                .finally(() => {\n                    this.setState(state => ({\n                        headerError,\n                        gettingEditData: false,\n                        isEditing: !state.isEditing,\n                        draftTextCopy\n                    }), () => {\n                        if (cb) cb();\n                    });\n                })\n        })\n    }\n\n    getJsonHeadersRequestString(legislationTextId, sessionID, sessionCode) {\n        //note we pass in a continuedToSessionCode all the time, even if it's not a continued bill and the sessionID/continuedToSessionCode represent the same session - in this case, it still works as expected so it's fine to pass both in\n        let jsonHeadersRequestString = \"?legislationTextID=\" + legislationTextId + \"&sessionID=\" + sessionID + \"&continuedToSessionCode=\" + sessionCode + \"&onlyHeader=true\";\n\n        return jsonHeadersRequestString\n    }\n\n    createNewAmendment() {\n        this.setState(state => ({\n            billText: {\n                ...state.billText,\n                VersionDate: new Date(),\n            }\n        }), () => {\n            this.saveText()\n        });\n    }\n\n    saveText(cb) {\n        if (!this.validateData()) {\n            return;\n        }\n        this.setState({ isSaving: true });\n        let billText = { ...this.state.billText };\n        //Try to find the draft title in the text and set it\n        let searchForLDTitleContainer = document.createElement('div');\n        searchForLDTitleContainer.innerHTML = this.state.draftTextCopy;\n        //The first element in the content with this class is the draft title\n        let draftLDTitle = searchForLDTitleContainer.querySelector('.ldtitle');\n        if (draftLDTitle && draftLDTitle.innerHTML !== '') {\n            billText.DraftTitle = draftLDTitle.innerHTML;\n            billText.EditTitle = draftLDTitle.innerHTML;\n        }\n\n        //Remove any tags TinyMCE may have added when pasting from Word (Borrow ldtitle container doc)\n        //Also remove any stranded spans with class \"bracket\"\n        searchForLDTitleContainer.childNodes.forEach(node => {\n            if (node.nodeName !== \"#text\") {\n                node.removeAttribute('data-mce-fragment');\n                if (node.childNodes.length > 0) {\n                    node.childNodes.forEach(childNode => {\n                        if (childNode.nodeName !== \"#text\") {\n                            childNode.removeAttribute('data-mce-fragment');\n                        }\n                        if (childNode.classList && childNode.classList.contains(\"bracket\") && ![\"[\", \"]\"].includes(childNode.innerText.trim())) {\n                            childNode.classList.remove(\"bracket\")\n                        }\n                        if (childNode.childNodes.length > 0) {\n                            childNode.childNodes.forEach(grandchildNode => {\n                                if (grandchildNode.nodeName !== \"#text\") {\n                                    grandchildNode.removeAttribute('data-mce-fragment');\n                                }\n                                if (grandchildNode.classList && grandchildNode.classList.contains(\"bracket\") && ![\"[\", \"]\"].includes(grandchildNode.innerText.trim())) {\n                                    grandchildNode.classList.remove(\"bracket\")\n                                }\n                                if (grandchildNode.childNodes.length > 0) {\n                                    grandchildNode.childNodes.forEach(greatGrandchildNode => {\n                                        if (greatGrandchildNode.nodeName !== \"#text\") {\n                                            greatGrandchildNode.removeAttribute('data-mce-fragment');\n                                        }\n                                        if (greatGrandchildNode.classList && greatGrandchildNode.classList.contains(\"bracket\") && ![\"[\", \"]\"].includes(greatGrandchildNode.innerText.trim())) {\n                                            greatGrandchildNode.classList.remove(\"bracket\")\n                                        }\n                                    })\n                                }\n                            })\n                        }\n\n                    })\n                }\n            }\n        });\n\n        billText.DraftText = searchForLDTitleContainer.innerHTML;\n\n        //Clear DocumentCode on amendment create. Setting this is handled in the DB\n        if (window.location.pathname.includes('new-amendment')) {\n            billText.DocumentCode = null;\n        }\n\n        if ([\"Chaptered\", \"Gov Recommendation\", \"Veto Explanation\"].includes(billText.LegislationVersion)) {\n            delete billText.ChamberCode;\n        } else if ([\"Introduced\", \"Reengrossed\", \"Engrossed\", \"Reenrolled\", \"Enrolled\"].includes(billText.LegislationVersion)) {\n            billText.ChamberCode = this.props.match.params.billnumber[0].toUpperCase();\n        } else if (billText.Sponsor && billText.Sponsor.toLowerCase() === \"member\" && billText.Patrons && billText.Patrons[0]) {\n            billText.ChamberCode = this.state.memberOptions.find(x => x.value.MemberID === billText.Patrons[0].MemberID).value.ChamberCode\n        } else if (billText.Sponsor && billText.Sponsor.toLowerCase() === \"committee\" && billText.CommitteeID) {\n            billText.ChamberCode = this.state.committeeOptions.find(x => x.value.CommitteeID === billText.CommitteeID) ? this.state.committeeOptions.find(x => x.value.CommitteeID === billText.CommitteeID).value.ChamberCode : billText.ChamberCode = this.state.subcommitteeOptions.find(x => x.value.CommitteeID === billText.CommitteeID).value.ChamberCode;\n        }\n\n        let jsonPromise = Promise.resolve();\n        if (JSON.stringify(this.state.patronList) !== JSON.stringify(this.state.originalPatronList)) {\n            jsonPromise = this.props.actions.savePatrons({ patrons: this.state.patronList });\n        }\n\n        delete billText.DraftTextFromJson;\n\n        if (this.state.billData) {\n            billText.LegislationClassID = this.state.billData.LegislationClassID;\n            billText.LegislationClass = this.state.billData.LegislationClass;\n        }\n\n        jsonPromise.then(() => {\n            this.props.actions.saveBillText({ TextsList: [billText] })\n                .then(() => {\n                    if (window.location.pathname.includes('new-amendment')) {\n                        if (this.state.billText.ChamberCode === \"H\" && this.state.selectedSponsor.value == \"Member\") {\n                            this.props.actions.saveIhodAmendment('?jvisa=7C936b138d2b6c3766Eb1cD5F84C6lRhG3JwWgvUWW&'\n                                + 'session=' + this.props.session.selectedSession.SessionCode\n                                + '&bill_num=' + this.state.billText.LegislationNumber\n                                + '&mem_key=' + this.state.selectedMember.value.MemberNumber\n                                + '&file_name=' + this.state.billText.LegislationNumber + '-' + this.state.selectedMember.value.MemberNumber + '.htm'\n                                + '&ld_num=' + this.props.bills.billTextSave[0].DocumentCode)\n                        }\n\n                        if (this.props.bills.billTextSave[0]) {\n                            billText.LegislationTextID = this.props.bills.billTextSave[0].LegislationTextID;\n                            billText.LegislationVersionID = this.props.bills.billTextSave[0].LegislationVersionID;\n                        }\n                    }\n\n                    let documentCodeChanged = false;\n                    if (this.props.bills.billTextSave[0]) {\n                        //Use document code that was constructed and returned from database\n                        documentCodeChanged = billText.DocumentCode !== this.props.bills.billTextSave[0].DocumentCode;\n                        billText.DocumentCode = this.props.bills.billTextSave[0].DocumentCode;\n                    }\n\n                    //Create the new pdf version of the bill \n                    const legFileGenParams = \"?legislationID=\" + billText.LegislationID\n                        + \"&legislationTextID=\" + billText.LegislationTextID\n                        + \"&legislationVersionID=\" + billText.LegislationVersionID\n                        + \"&sessionID=\" + this.state.selectedSession.SessionID;\n                    this.props.actions.genBillFile(legFileGenParams)\n                        .then(() => {\n                            this.props.actions.makeToast([{ message: \"Save Successful\", type: \"success\" }]);\n                            this.setState({\n                                isEditing: false,\n                                isSaving: false,\n                                isDirty: false,\n                                initialPass: 0\n                            });\n                            if (window.location.pathname.includes('new-amendment') || (billText.TextDisposition !== \"Removed\" && documentCodeChanged)) {\n                                const sessionCode = this.props.match.params.sessionCode;\n                                this.props.history.push(`/bill-details/${sessionCode}/${billText.LegislationNumber}/text/${billText.DocumentCode}`)\n                            } else if (billText.TextDisposition === \"Removed\") {\n                                const sessionCode = this.props.match.params.sessionCode;\n                                this.props.history.push(`/bill-details/${sessionCode}/${billText.LegislationNumber}`);\n                                return;\n                            }\n                            if (cb)\n                                cb();\n                            else\n                                this.getData();\n                        })\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    console.error(err)\n                    this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n                    this.setState({\n                        isSaving: false\n                    });\n                });\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            console.error(err)\n            this.props.actions.makeToast([{ message: \"Failed to update patrons\", type: \"failure\" }]);\n            this.setState({\n                isSaving: false\n            });\n        })\n    }\n\n    validateData() {\n        let valid = true;\n        const billText = this.state.billText;\n        let focused = false;\n\n        if (!billText.TextDisposition && !billText.TextDispositionID && billText.LegislationVersion !== \"Introduced\") {\n            this.setState({ textDispositionError: \"Please select a text disposition.\" });\n            console.error(\"No text disposition provided.\");\n            this.dispositionRef?.current?.focus();\n            focused = true;\n            valid = false;\n        }\n        if ([\"Amendment\", \"Substitute\"].includes(billText.LegislationVersion) && !billText.Sponsor) {\n            this.setState({ sponsorError: \"Please select a sponsor.\" });\n            console.error(\"No sponsor provided.\");\n            if (!focused) { this.sponsorRef?.current?.focus(); focused = true; }\n            valid = false;\n        }\n        if (billText.Sponsor && billText.Sponsor.toLowerCase() === \"member\" && !billText.Patrons) {\n            this.setState({ memberError: \"Please select a member.\" });\n            console.error(\"No member provided.\");\n            if (!focused) { this.memberRef?.current?.focus(); focused = true; }\n            valid = false;\n        }\n        if (billText.Sponsor && billText.Sponsor.toLowerCase() === \"committee\" && !billText.CommitteeID) {\n            this.setState({ committeeError: \"Please select a committee.\" });\n            console.error(\"No committee provided.\");\n            if (!focused) { this.committeeRef?.current?.focus(); focused = true; }\n            valid = false;\n        }\n        if (!this.state.draftTextCopy) {\n            this.setState({ draftTextError: \"Please provide draft text.\" });\n            console.error(\"No draft text provided.\");\n            valid = false;\n        }\n\n        if (valid) {\n            this.setState({\n                textDispositionError: \"\",\n                sponsorError: \"\",\n                memberError: \"\",\n                committeeError: \"\",\n                draftTextError: \"\"\n            })\n        }\n\n        return valid;\n    }\n\n    handleBillDispositionChange(val) {\n        this.setState(state => ({\n            billText: {\n                ...state.billText,\n                TextDisposition: val ? val.Name : null,\n                TextDispositionID: val ? val.TextDispositionID : null\n            }\n        }));\n    }\n\n    toggleHighlight() {\n        this.setState({\n            highlight: !this.state.highlight\n        })\n    }\n\n    highlightText(keywordsFromQueryString) {\n        var markInstance = new Mark(document.querySelector(\".mark-context\"));\n        if (this.props.location.state && this.props.location.state.selectedKeywords) {\n            this.props.location.state.selectedKeywords.forEach(keyword => {\n                const asteriskSearch = keyword.endsWith(\"*\");\n                const options = {\n                    separateWordSearch: false, //If phrase searching, only mark instances of the entire phrase together; i.e. 'availability of funds' do not mark every individual instance of 'availability' 'of' and 'funds'\n                    accuracy: {\n                        ///\"partially\": When searching for \"lor\" only \"lor\" inside \"lorem\" will be marked\n                        ///\"complementary\": When searching for \"lor\" the whole word \"lorem\" will be marked\n                        ///\"exactly\": When searching for \"lor\" only those exact words with a word boundary will be marked. In this example nothing inside \"lorem\".\n                        value: asteriskSearch ? \"complementary\" : \"exactly\", //When searching for \"of\" only those exact words with a word boundary will be marked. In this example nothing inside \"offered\".\n                        limiters: [\",\", \".\", \"?\", \"!\", \"-\", \";\", \"\\\"\", \"'\", \"`\", \"%\", \"$\", \"@\", \"*\", \"(\", \")\", \"[\", \"]\", \"/\"] //highlight also the above 'exact' words that are also followed by punctuation marks; without this 'availability of funds.' (ending with period) will not be marked when searching 'availability of funds' (no period)\n                    }\n                };\n                const mark = asteriskSearch ? keyword.substring(0, keyword.length - 1) : keyword;\n                markInstance.mark(mark, options);\n                if (document.getElementsByTagName(\"mark\").length) {\n                    this.setState({ showMarkHelp: true, showNextMarkHelp: \"Scroll to First\" });\n                }\n            });\n        }\n        if (keywordsFromQueryString) {\n            const selectedKeywords = keywordsFromQueryString.split(\" \");\n            selectedKeywords.forEach(keyword => markInstance.mark(keyword))\n            // Remove keywords from url\n            this.props.history.push(this.props.location.pathname);\n        }\n    };\n\n    navToKeywordHit(dir) {\n        const currentIdx = this.state.markHelpIndex ?? -1;\n        const elements = [...document.getElementsByTagName(\"mark\")];\n        const numElements = elements.length;\n        let scrollElement;\n        if (numElements > 0) {\n            if (dir === NEXT && currentIdx + 1 <= numElements) {\n                scrollElement = elements[currentIdx + 1];\n            } else if (dir === PREVIOUS && currentIdx >= 1) {\n                scrollElement = elements[currentIdx - 1];\n            }\n\n            if (scrollElement) {\n                scrollElement.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n                const newIndex = dir === NEXT ? currentIdx + 1 : currentIdx - 1;\n                this.setState({ markHelpIndex: newIndex, showNextMarkHelp: newIndex !== numElements - 1 ? \"Next\" : false });\n            }\n        }\n    }\n\n    membersCallback(memberList) {\n        let members = [];\n        let houseMembers = [];\n        let senateMembers = [];\n\n        memberList.map((member) => {\n            members.push({ text: member.MemberDisplayName, value: member })\n\n            if (member.ChamberCode === \"H\") {\n                houseMembers.push({ text: member.MemberDisplayName, value: member })\n            } else {\n                senateMembers.push({ text: member.MemberDisplayName, value: member })\n            }\n        })\n\n        this.setState({\n            memberOptions: members,\n            houseMemberOptions: houseMembers,\n            senateMemberOptions: senateMembers,\n            selectedMember: this.state.billText.Patrons && this.state.billText.Patrons.length > 0 ? members.find(x => x.value.MemberID === this.state.billText.Patrons[0].MemberID) : undefined\n        })\n    }\n\n    committeesCallback(committeeList) {\n        let committeeOptions = [];\n        let subcommitteeOptions = [];\n\n        committeeList.map((committee, i) => {\n            if (committee.ParentCommitteeID) {\n                subcommitteeOptions.push({ text: committee.Name + \" (\" + committee.ChamberCode + \")\", value: committee })\n            } else {\n                committeeOptions.push({ text: committee.Name + \" (\" + committee.ChamberCode + \")\", value: committee })\n            }\n        })\n\n        this.setState({\n            committeeOptions: committeeOptions,\n            subcommitteeOptions: subcommitteeOptions,\n            selectedCommittee: this.state.billText.CommitteeID ? committeeOptions.find(x => x.value.CommitteeID === this.state.billText.CommitteeID) : undefined\n        })\n    }\n\n    handleParamChange(value, state, init) {\n        //Always reset description if a description param is changed\n        let billText = { ...this.state.billText };\n        billText.Description = null;\n\n        //If the sponsor is changed reset the selected member and committee in case those have been set previously\n        if (state === \"selectedSponsor\") {\n            billText.Sponsor = value.value;\n            delete billText.SponsorTypeID;\n            delete billText.Patrons;\n            delete billText.CommitteeID;\n            delete billText.CommitteeName;\n\n            this.setState(state => ({\n                selectedMember: undefined,\n                selectedCommittee: undefined\n            }));\n        }\n\n        if (state === \"selectedMember\") {\n            billText.Patrons = [value.value];\n        }\n\n        if (state === \"selectedCommittee\") {\n            billText.CommitteeName = value.value.Name\n            billText.CommitteeID = value.value.CommitteeID\n        }\n\n        this.setState({\n            [state]: value,\n            billText: billText,\n            isDirty: init ? false : true\n        })\n    }\n\n    handleIsActiveChange() {\n        let billText = { ...this.state.billText };\n        billText.IsActive = !billText.IsActive;\n        this.setState({ billText });\n    }\n\n    handleIsPublicChange() {\n        let billText = { ...this.state.billText };\n        billText.IsPublic = !billText.IsPublic;\n        this.setState({ billText });\n    }\n\n    toggleTooltip() {\n        this.setState({\n            showTooltip: !this.state.showTooltip\n        })\n    }\n\n    isLdIncluded(draftText, LDNumber) {\n        //Discovers if the LD number is present in the file's DraftTextJSON or the text's DraftText, and sets a state value to hide displaying a duplicate LD Number if true\n        if (typeof draftText === \"string\") {\n            const ldRegex = new RegExp(`<p class=['\"]?(ld|ldtitle)['\"]?>${LDNumber}<\\/p>`);\n            if (ldRegex.test(draftText)) {\n                this.setState({\n                    hideLDNumber: true\n                })\n            }\n        } else {\n            for (let i = 0; i < draftText.Content.length; i++) {\n                if (draftText.Content[i].Content && draftText.Content[i].Content.includes(LDNumber))\n                    this.setState({\n                        hideLDNumber: true\n                    })\n            }\n        }\n    }\n\n    getData() {\n        this.setState({\n            isLoaded: false\n        });\n        const documentNumber = this.props.match.params.documentcode;\n        const billNumber = this.props.match.params.billnumber;\n        const sessionCode = parseInt(this.props.match.params.sessionCode, 10);\n        if (sessionCode > 0 && documentNumber && billNumber) {\n            let partner = false;\n            //Only use the partner endpoint if the user looking at the bill text is authorized to edit it\n            if (this.props.login.userClaims.resources.find(resource => resource === VERSION_AUTHOR)) {\n                partner = true;\n                this.props.actions.getLegislationDispositions()\n                    .catch(err => {\n                        if (err === 'Aborted') {\n                            return\n                        }\n                    });\n            }\n            this.setState({\n                sponsorOptions: this.props.login.userClaims.roles.find(x => x === \"Admin\") && !window.location.pathname.includes('new-amendment') ? [{ value: \"Committee\", label: \"Committee\" }, { value: \"Member\", label: \"Member\" }, { value: \"Conference\", label: \"Conference\" }, { value: \"Governor\", label: \"Governor\" }] : [{ value: \"Committee\", label: \"Committee\" }, { value: \"Member\", label: \"Member\" }]\n            })\n            //Get the session information for the header using the session in the url\n            this.props.actions.getSessionByCode(sessionCode).then(() => {\n                this.setState({ selectedSession: this.props.session.selectedSession })\n                const params = {\n                    SessionCode: sessionCode,\n                    LegislationNumbers: [{ LegislationNumber: billNumber }],\n                };\n                if (window.location.pathname.includes('new-amendment')) {\n                    // This is a new amendment\n                    // Get the bill information for creation of a new amendment\n                    this.props.actions.getBillList(params).then(() => {\n                        if (this.props.bills.billList[0]) {\n                            this.setState({\n                                isLoaded: true,\n                                isEditing: true,\n                                billText: {\n                                    LegislationVersionID: 8,\n                                    LegislationVersion: \"Amendment\",\n                                    LegislationID: this.props.bills.billList[0].LegislationID,\n                                    LegislationNumber: this.props.bills.billList[0].LegislationNumber,\n                                    ChamberCode: this.props.bills.billList[0].ChamberCode,\n                                    Description: \"Amendment\",\n                                    DLSPrepared: false,\n                                    SessionCode: this.props.session.selectedSession.SessionCode,\n                                    SessionYear: this.props.session.selectedSession.SessionYear,\n                                    IsActive: true,\n                                    IsPublic: false,\n                                    TextDisposition: this.props.bills.legislationDispositions[this.props.bills.legislationDispositions.findIndex(dispo => dispo.Name === \"Offered\")].Name,\n                                    TextDispositionID: this.props.bills.legislationDispositions[this.props.bills.legislationDispositions.findIndex(dispo => dispo.Name === \"Offered\")].TextDispositionID\n                                },\n                            });\n\n                            //default to member as sponsor\n                            this.handleParamChange(this.state.sponsorOptions.find(x => x.value === \"Member\"), \"selectedSponsor\", true);\n                        } else {\n                            throw \"Bill data not found\"\n                        }\n                    }).catch(err => {\n                        if (err === \"Aborted\") {\n                            return;\n                        }\n                        this.setState({\n                            message: err.toString(),\n                            isLoaded: true\n                        })\n                    });\n                } else {\n                    this.props.actions.getBillText(`?isPublic=${!partner}&sessionCode=${sessionCode}&documentNumber=${documentNumber}`, partner)\n                        .then(() => {\n                            //Make sure the text is actually there\n                            if (this.props.bills.billText.length !== 1 || !this.props.bills.billText[0].DraftText) {\n                                throw (\"Legislation text not found\")\n                            }\n                            let billText = this.props.bills.billText[0];\n                            //Get the session information for the header dates in tinymce using the text's session\n                            this.props.actions.getSessionById(billText.SessionID, false).then(() => {\n                                this.setState({ versionSession: this.props.session.selectedSession })\n                                const params = {\n                                    SessionCode: sessionCode,\n                                    LegislationNumbers: [{ LegislationNumber: billNumber }],\n                                };\n\n                                if (billText && [\"Introduced\", \"Enrolled\", \"Chaptered\", \"Substitute\"].includes(billText.LegislationVersion)) {\n                                    if (this.props.login.userClaims.resources.includes(\"LegislationText\")) {\n                                        this.props.actions.getBillManagementList(\"?LegislationID=\" + billText.LegislationID + \"&LegislationVersionID=\" + billText.LegislationVersionID + \"&SessionID=\" + billText.SessionID + \"&IsComplete=true\").then(() => {\n                                            if (this.props.bills.billManagementList[0]) {\n                                                this.setState({ billData: this.props.bills.billManagementList[0] }, () => {\n                                                    this.getPatronTypes(this.state.billData.ChamberCode);\n                                                    this.getMemberList(this.state.billData.SessionID);\n                                                    this.getPatrons(this.state.billData.LegislationID, this.state.billData.ChamberCode);\n                                                })\n                                            } else {\n                                                throw \"Bill data not found\"\n                                            }\n                                        }).catch(err => {\n                                            if (err === \"Aborted\") {\n                                                return;\n                                            }\n                                            this.setState({\n                                                message: err.toString(),\n                                                isLoaded: true\n                                            })\n                                        });\n                                    } else {\n                                        this.props.actions.getBillList(params).then(() => {\n                                            if (this.props.bills.billList[0]) {\n                                                this.setState({ billData: this.props.bills.billList[0] }, () => {\n                                                    this.getPatronTypes(this.state.billData.ChamberCode);\n                                                    this.getMemberList(this.state.billData.SessionID);\n                                                    this.getPatrons(this.state.billData.LegislationID, this.state.billData.ChamberCode);\n                                                })\n                                            } else {\n                                                throw \"Bill data not found\"\n                                            }\n                                        }).catch(err => {\n                                            if (err === \"Aborted\") {\n                                                return;\n                                            }\n                                            this.setState({\n                                                message: err.toString(),\n                                                isLoaded: true\n                                            })\n                                        });\n                                    }\n                                }\n                                billText.originalTextDisposition = billText.TextDisposition;\n                                // Try to get the json file. This contains some extra info like prefiled date\n                                let jsonPromise;\n                                if (billText.JSONFile && billText.JSONFile.length > 0) {\n                                    jsonPromise = this.props.actions.getFile(billText.JSONFile[0].FileURL)\n                                        .then(() => {\n                                            const file = JSON.parse(this.props.nav.file);\n                                            billText.OfferedDate = file.OfferedDate;\n                                            billText.PrefileDate = file.PrefileDate;\n                                            billText.ReferredCommittee = file.ReferredCommittee;\n                                            billText.Chamber = file.Chamber.toUpperCase();\n                                            billText.LegislationType = file.LegislationType.toUpperCase();\n                                            if (file.DraftTextJSON) {\n                                                billText.DraftTextFromJson = getJsx(file.DraftTextJSON);\n                                                this.isLdIncluded(file.DraftTextJSON, billText.LDNumber);\n                                            } else {\n                                                this.isLdIncluded(billText.DraftText, billText.LDNumber)\n                                            }\n                                            billText.jsonFileFound = true;\n                                        })\n                                } else {\n                                    this.isLdIncluded(billText.DraftText, billText.LDNumber)\n                                }\n                                Promise.all([jsonPromise])\n                                    .finally(() => {\n                                        this.setState({\n                                            isLoaded: true,\n                                            billText: billText,\n                                            selectedSponsor: billText.Sponsor ? this.state.sponsorOptions.find(x => x.value === billText.Sponsor) : \"\"\n                                        }, () => {\n                                            const parsed = queryString.parse(this.props.location.search)\n                                            if (this.props.location.state || parsed.keywords) {\n                                                this.highlightText(parsed.keywords);\n                                            }\n                                            if (billText.LegislationVersion === \"Introduced\" && this.props.location.state && this.props.location.state.patronUpdate && this.props.login.userClaims.claims.find(claim => claim.RoleName === \"Admin\" || (claim.Resource === PATRON_AUTHOR && claim.Scope === (billNumber[0]?.toUpperCase() === \"H\" ? \"House\" : \"Senate\")))) {\n                                                this.toggleEditContent(this.togglePatronModal)\n                                            }\n\n                                        })\n                                    })\n                            }).catch(err => {\n                                if (err === \"Aborted\") {\n                                    return;\n                                }\n                                this.setState({\n                                    message: err.toString(),\n                                    isLoaded: true\n                                })\n                            });\n                        }).catch(err => {\n                            if (err === 'Aborted') {\n                                return;\n                            }\n                            this.setState({\n                                message: err.toString(),\n                                isLoaded: true\n                            })\n                        });\n                }\n            }).catch(err => {\n                if (err === \"Aborted\") {\n                    return;\n                }\n                this.setState({\n                    message: err.toString(),\n                    isLoaded: true\n                })\n            });\n        } else {\n            this.setState({\n                message: \"Failed to get session or version\"\n            });\n        }\n    }\n\n    applyPassageDates(housePassage, senatePassage) {\n        let passageDates = \"\";\n        //Add the passage dates if they exist in the data but aren't in the DraftText yet - add both chambers for joint resolutions, or just the originating chamber for normal resolutions\n        if (this.state.billText.ChamberCode === \"H\") {\n            passageDates = this.state.billData.HousePassageDate && this.state.billData.HousePassageDate != \"\" && !housePassage ? passageDates + \"<p class='house-passage' style='text-align: center; margin: 0'>Agreed to by the House of Delegates, \" + moment(this.state.billData.HousePassageDate).format(\"LL\") + \"</p>\" : passageDates;\n            if (this.state.billData.LegislationTypeCode === \"J\") {\n                passageDates = this.state.billData.SenatePassageDate && this.state.billData.SenatePassageDate != \"\" && !senatePassage ? passageDates + \"<p class='senate-passage' style='text-align: center; margin: 0'>Agreed to by the Senate, \" + moment(this.state.billData.SenatePassageDate).format(\"LL\") + \"</p><p></p>\" : passageDates;\n            } else {\n                passageDates = passageDates + \"<p></p>\";\n            }\n        } else {\n            passageDates = this.state.billData.SenatePassageDate && this.state.billData.SenatePassageDate != \"\" && !senatePassage ? passageDates + \"<p class='senate-passage' style='text-align: center; margin: 0'>Agreed to by the Senate, \" + moment(this.state.billData.SenatePassageDate).format(\"LL\") + \"</p>\" : passageDates;\n            if (this.state.billData.LegislationTypeCode === \"J\") {\n                passageDates = this.state.billData.HousePassageDate && this.state.billData.HousePassageDate != \"\" && !housePassage ? passageDates + \"<p class='house-passage' style='text-align: center; margin: 0'>Agreed to by the House of Delegates, \" + moment(this.state.billData.HousePassageDate).format(\"LL\") + \"</p><p></p>\" : passageDates;\n            } else {\n                passageDates = passageDates + \"<p></p>\";\n            }\n        }\n\n        return passageDates;\n    }\n\n    triggerDownload(filename, htmlDoc) {\n        let downloadLink = document.createElement('a');\n        downloadLink.setAttribute('href', 'data:application/octet-stream;charset=utf-8,' + encodeURIComponent(`<html>` + htmlDoc.innerHTML + `</html>`));\n        downloadLink.setAttribute('download', filename);\n\n        downloadLink.style.display = 'none';\n        document.body.appendChild(downloadLink);\n        downloadLink.click();\n\n        document.body.removeChild(downloadLink);\n    }\n\n    passageCheck(docParagraphs) {\n        let housePassage = false;\n        let senatePassage = false;\n\n        for (let i = 0; i < docParagraphs.length; i++) {\n            if (docParagraphs[i].innerText.includes(\"Agreed to by the House\")) {\n                housePassage = true;\n            }\n\n            if (docParagraphs[i].innerText.includes(\"Agreed to by the Senate\")) {\n                senatePassage = true;\n            }\n        }\n\n        return { housePassage: housePassage, senatePassage: senatePassage };\n    }\n\n    downloadWordFile() {\n        const filename = this.state.billText.DocumentCode + \".doc\";\n        let htmlDoc = document.createElement('div');\n        let passageDates = '';\n\n        //Substitute declarations        \n        let doc = document.createElement('div');\n        doc.insertAdjacentHTML(\"afterbegin\", this.state.billText.DraftText);\n        let docParagraphs = doc.getElementsByTagName('p');\n        let prevClass = \"\";\n\n        if (this.state.billText.LegislationVersion !== \"Substitute\") {\n            let params = '?legislationTextID=' + this.state.billText.LegislationTextID +\n                '&sessionID=' + this.state.billText.SessionID +\n                '&LegislationVersionID=' + this.state.billText.LegislationVersionID +\n                '&onlyHeader=' + false +\n                \"&isPresentationCopy=\" + true;\n            if ([\"Introduced\"].includes(this.state.billText.LegislationVersion)) {\n                params += '&overrideLegislationVersion=Enrolled';\n            }\n            this.props.actions.getHtmlFilePreview(params)\n                .then(() => {\n                    const html = `<html>\n                    <head><meta charset=\"UTF-8\"></head>\n                    <body>${this.props.bills.htmlFilePreview}</body>\n                </html>`;\n\n                    htmlDoc.insertAdjacentHTML(\"afterbegin\", html);\n                    let passage = this.passageCheck(htmlDoc.getElementsByTagName(\"p\"))\n                    passageDates = this.applyPassageDates(passage.housePassage, passage.senatePassage);\n\n                    let ldtitle = htmlDoc.querySelector(\".ldtitle\");\n                    if (ldtitle) {\n                        ldtitle.insertAdjacentHTML(\"afterend\", passageDates);\n                    }\n\n                    this.triggerDownload(filename, htmlDoc);\n                })\n        } else if (this.state.billData.LegislationTypeCode === \"B\") {\n            let passage = this.passageCheck(docParagraphs);\n            passageDates = this.applyPassageDates(passage.housePassage, passage.senatePassage);\n\n            for (let j = 0; j < docParagraphs.length; j++) {\n                if (j == 2) {\n                    let insertText = this.props.session.sessionList.find(x => x.SessionID === this.state.billData.SessionID).SessionType === \"Regular\"\n                        ? this.props.session.sessionList.find(x => x.SessionID === this.state.billData.SessionID).SessionYear\n                        + \" \"\n                        + this.props.session.sessionList.find(x => x.SessionID === this.state.billData.SessionID).SessionType\n                        + \" Session\"\n                        : this.props.session.sessionList.find(x => x.SessionID === this.state.billData.SessionID).SessionYear + \" \" + this.props.session.sessionList.find(x => x.SessionID === this.state.billData.SessionID).DisplayName\n                    htmlDoc.insertAdjacentHTML(\"beforeend\", \"<p style='\" + inlineStyles.find(x => x.class == \"center\").value + \"'>\" + insertText + \"</p>\");\n                    htmlDoc.insertAdjacentHTML(\"beforeend\", \"<p style='\" + inlineStyles.find(x => x.class == \"center\").value + \"'>Virginia Acts of Assembly - Chapter</p>\");\n                }\n                if (!['pro', 'patronLine', 'patctr', 'ld', 'textctr', \"center\"].includes(docParagraphs[j].className)) {\n                    //If we're after the session, billno, etc. and the next paragraph is the enacting statement then add ldtitle and passage dates then proceed\n                    if (prevClass === \"center\" && docParagraphs[j].className === \"enactstm\") {\n                        htmlDoc.insertAdjacentHTML(\"beforeend\", \"<p style='\" + inlineStyles.find(x => x.class == \"ldtitle\").value + \"'>\" + this.state.billText.DraftTitle + \"</p>\");\n                        htmlDoc.insertAdjacentHTML(\"beforeend\", passageDates);\n                    }\n\n                    //Insert every remaining paragraph unless it's a center following a pro because that indicates a line wrap of the pro containing the introduced date\n                    if (!(docParagraphs[j].className === \"center\" && docParagraphs[j - 1] && docParagraphs[j - 1].className === \"pro\") && !docParagraphs[j].innerText.includes(\"SUBSTITUTE\")) {\n                        docParagraphs[j].style = inlineStyles.find(x => x.class === docParagraphs[j].className) ? inlineStyles.find(x => x.class === docParagraphs[j].className).value : \"\";\n                        htmlDoc.insertAdjacentHTML(\"beforeend\", docParagraphs[j].outerHTML);\n                    }\n\n                    prevClass = docParagraphs[j].className;\n                }\n            }\n\n            let ldtitle = htmlDoc.querySelector(\".ldtitle\");\n            if (ldtitle) {\n                ldtitle.insertAdjacentHTML(\"afterend\", passageDates);\n            }\n            this.triggerDownload(filename, htmlDoc);\n        } else {\n            let passage = this.passageCheck(docParagraphs)\n            passageDates = this.applyPassageDates(passage.housePassage, passage.senatePassage);\n\n            for (let j = 0; j < docParagraphs.length; j++) {\n                if (!['pro', 'patronLine', 'patctr', 'textbl', 'ld', 'textctr'].includes(docParagraphs[j].className)) {\n                    //If we're after the session, billno, etc. and the next paragraph is the enacting statement then add ldtitle and passage dates then proceed\n                    if (prevClass === \"center\" && docParagraphs[j].className === \"enactstm\") {\n                        htmlDoc.insertAdjacentHTML(\"beforeend\", \"<p style='\" + inlineStyles.find(x => x.class == \"ldtitle\").value + \"'>\" + this.state.billText.DraftTitle + \"</p>\");\n                        htmlDoc.insertAdjacentHTML(\"beforeend\", passageDates);\n                    }\n\n                    //Insert every remaining paragraph unless it's a center following a pro because that indicates a line wrap of the pro containing the introduced date\n                    if (!(docParagraphs[j].className === \"center\" && docParagraphs[j - 1] && docParagraphs[j - 1].className === \"pro\") && !docParagraphs[j].innerText.includes(\"SUBSTITUTE\")) {\n                        docParagraphs[j].style = inlineStyles.find(x => x.class === docParagraphs[j].className) ? inlineStyles.find(x => x.class === docParagraphs[j].className).value : \"\";\n                        htmlDoc.insertAdjacentHTML(\"beforeend\", docParagraphs[j].outerHTML);\n                    }\n\n                    prevClass = docParagraphs[j].className;\n                }\n            }\n\n            let ldtitle = htmlDoc.querySelector(\".ldtitle\");\n            if (ldtitle) {\n                ldtitle.insertAdjacentHTML(\"afterend\", passageDates);\n            }\n            this.triggerDownload(filename, htmlDoc);\n        }\n    }\n\n    // RETRIEVE PATRON TYPES\n    getPatronTypes(chamberCode) {\n        this.props.actions.getPatronRoles()\n            .then(() => {\n                let patronTypes = [...this.props.patrons.patronRoles];\n                patronTypes = patronTypes.filter(pt => ['Chief Patron', 'Chief Co-Patron', 'Co-Patron'].includes(pt.Name) || (chamberCode === 'S' && pt.Name === 'Incorporated Chief Co-Patron'))\n                patronTypes.sort((a, b) => a.PatronTypeID - b.PatronTypeID);\n                this.setState({\n                    patronTypes\n                }, () => {\n                    if (this.state.patronTypes.find(pt => pt.Name === \"Co-Patron\") && (!this.state.newPatron?.length || !this.state.newPatron[this.state.newPatron.length - 1].Name)) {\n                        this.handleNewPatronChange('PatronType', this.state.patronTypes.find(pt => pt.Name === \"Co-Patron\"));\n                    }\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err)\n            });\n    }\n\n    // RETRIEVE PATRONS FOR A BILL\n    getPatrons(billID, chamberCode) {\n        this.props.actions.getPatronList(billID).then(() => {\n            let senatePatronsList = this.props.patrons.senatePatronsList;\n            let housePatronsList = this.props.patrons.housePatronsList;\n            let chiefPatronsList = this.props.patrons.chiefPatronsList;\n            let patronList = this.props.patrons.patronList;\n            let originalPatronList = this.props.patrons.patronList;\n            if (chamberCode === 'H' && chiefPatronsList && chiefPatronsList.length > 1) {\n                for (let i = 1; i < chiefPatronsList.length; i++) {\n                    if (chiefPatronsList[i].ChamberCode === 'S') {\n                        senatePatronsList.unshift(chiefPatronsList[i]);\n                    } else {\n                        housePatronsList.unshift(chiefPatronsList[i]);\n                    }\n                    chiefPatronsList.splice(i, 1);\n                    i--;\n                }\n            }\n\n            patronList.sort((a, b) =>\n                Number(Boolean(a.RemoveDate)) - Number(Boolean(b.RemoveDate))\n                || (a.PatronTypeID === 1 && b.PatronTypeID === 2\n                    ? -1\n                    : a.PatronTypeID === 1 && b.PatronTypeID === 3\n                        ? -1\n                        : a.PatronTypeID === 1 && b.PatronTypeID === 4\n                            ? -1\n                            : a.PatronTypeID === 2 && b.PatronTypeID === 1\n                                ? 1\n                                : a.PatronTypeID === 2 && b.PatronTypeID === 3\n                                    ? 1\n                                    : a.PatronTypeID === 2 && b.PatronTypeID === 4\n                                        ? -1\n                                        : a.PatronTypeID === 3 && b.PatronTypeID === 1\n                                            ? 1\n                                            : a.PatronTypeID === 3 && b.PatronTypeID === 2\n                                                ? -1\n                                                : a.PatronTypeID === 3 && b.PatronTypeID === 4\n                                                    ? -1\n                                                    : a.PatronTypeID === 4 && b.PatronTypeID !== 4\n                                                        ? 1\n                                                        : 0\n                ) //https://i.imgur.com/rwYykLz.png\n                || a.PatronDisplayName.localeCompare(b.PatronDisplayName)\n                || a.Sequence - b.Sequence\n            )\n\n            housePatronsList.sort((a, b) => Number(Boolean(a.RemoveDate)) - Number(Boolean(b.RemoveDate)) || a.PatronTypeID - b.PatronTypeID || a.Sequence - b.Sequence || a.PatronDisplayName.localeCompare(b.PatronDisplayName));\n            senatePatronsList.sort((a, b) => Number(Boolean(a.RemoveDate)) - Number(Boolean(b.RemoveDate)) || a.PatronTypeID - b.PatronTypeID || a.Sequence - b.Sequence || a.PatronDisplayName.localeCompare(b.PatronDisplayName));\n\n            this.setState({\n                senatePatronsList,\n                housePatronsList,\n                chiefPatronsList,\n                patronList,\n                originalPatronList,\n                patronIsLoaded: true\n            })\n        })\n    }\n\n    // RETRIEVE MEMBER LIST FOR THE BILL'S SESSION\n    getMemberList(sessionID) {\n        let params = 'isPublic=false&sessionID=' + sessionID;\n        this.props.actions.getMemberList(params)\n            .then(() => {\n                let memberList = [...this.props.members.memberList];\n                memberList.forEach(patron => {\n                    patron.label = patron.PatronDisplayName + ' ' + '(' + patron.ChamberCode + ')';\n                    patron.value = patron.MemberID;\n                });\n                memberList.sort((a, b) => a.ChamberCode !== b.ChamberCode && a.ChamberCode === this.state.billData.ChamberCode ? -1 : 0)\n                this.setState({\n                    memberList\n                });\n            });\n    }\n\n    togglePatronModal() {\n        this.setState({\n            showPatronModal: !this.state.showPatronModal\n        }, () => {\n            if (this.state.showPatronModal) {\n                //set the patrons prior to edit (different than originalPatronList in the event that they update multiple times) in order to reset in case they cancel\n                this.setState({ patronListBeforeEdit: this.state.patronList })\n            }\n        })\n    }\n\n    updatePatrons() {\n        this.setState({ savingPatrons: true }, () => {\n            //Make call to save the patrons -- even if this is the same list as original, because they may have changed it and now are reverting\n            this.savePatrons(() => {\n                this.saveText(() => {\n                    this.setState({ savingPatrons: false }, () => {\n                        this.props.history.push({\n                            pathname: `/bill-details/${this.state.billText.SessionCode}/${this.state.billText.LegislationNumber}`,\n                            state: { expandPatrons: true }\n                        })\n                    })\n                });\n            });\n        })\n    }\n\n    savePatrons(cb) {\n        let draftTextCopy = this.state.draftTextCopy;\n        let doc = document.createElement('div');\n        doc.insertAdjacentHTML(\"afterbegin\", draftTextCopy);\n        let currentPatronLineElement = doc.querySelector('.patctr, .patalt, .patronLine, .billpatron');\n        if (currentPatronLineElement) {\n            const currChamber = this.state.billData.ChamberCode;\n            let patronInfo = \"\";\n            let patronsSameChamber = true;\n            let multiplePatrons = false;\n            const patrons = [...this.state.patronList].filter(p => !p.RemoveDate);\n            patrons.forEach((p) => {\n                if (patronsSameChamber && p.ChamberCode != currChamber) {\n                    patronsSameChamber = false;\n                }\n            });\n            let patronList = null;\n            let i = 0;\n            if (patronsSameChamber) {\n                i = 0;\n                patronList = patrons.sort((a, b) => a.PatronTypeID - b.PatronTypeID || a.Sequence - b.Sequence || a.PatronDisplayName.localeCompare(b.PatronDisplayName))\n                patronList.forEach(patron => {\n                    //check and see if this patron is on the other chamber\n                    if (patronsSameChamber && patron.ChamberCode != currChamber) {\n                        patronsSameChamber = false;\n                    }\n                    if (i != 0 && i == patronList.length - 1) {\n                        patronInfo += \" and \";\n                        multiplePatrons = true;\n                    }\n                    else if (i > 0) {\n                        patronInfo += \", \";\n                        multiplePatrons = true;\n                    }\n                    i++;\n                    patronInfo += PatronDisplayInfo(patron);\n                })\n            }\n            else {\n                //current chamber patron info\n                i = 0;\n                patronList = patrons.filter(p => p.ChamberCode === currChamber).sort((a, b) => a.PatronTypeID - b.PatronTypeID || a.Sequence - b.Sequence || a.PatronDisplayName.localeCompare(b.PatronDisplayName))\n                patronList.forEach(patron => {\n                    if (i != 0 && i == patronList.length - 1) {\n                        patronInfo += \" and \";\n                        multiplePatrons = true;\n                    }\n                    else if (i > 0) {\n                        patronInfo += \", \";\n                        multiplePatrons = true;\n                    }\n                    i++;\n                    patronInfo += PatronDisplayInfo(patron);\n                })\n                patronInfo += \"; \";\n                if (currChamber == \"S\") {\n                    patronInfo += \"Delegate\";\n                }\n                else {\n                    patronInfo += \"Senator\";\n                }\n                //other chamber patron info\n                i = 0;\n                patronList = patrons.filter(p => p.ChamberCode !== currChamber).sort((a, b) => a.PatronTypeID - b.PatronTypeID || a.Sequence - b.Sequence || a.PatronDisplayName.localeCompare(b.PatronDisplayName))\n                if (patronList.length > 1) {\n                    patronInfo += \"s: \"; //multiple from the other chamber; append \"s\"\n                } else {\n                    patronInfo += \": \"; //just one from the other chamber; don't append \"s\"\n                }\n                patronList.forEach(patron => {\n                    if (i !== 0 && i === patronList.length - 1) {\n                        patronInfo += \" and \";\n                        multiplePatrons = true;\n                    }\n                    else if (i > 0) {\n                        patronInfo += \", \";\n                        multiplePatrons = true;\n                    }\n                    i++;\n                    patronInfo += PatronDisplayInfo(patron);\n                })\n            }\n            const patronagePrefix = multiplePatrons ? \"Patrons- \" : \"Patron- \";\n            const newPatronLine = patronagePrefix + patronInfo;\n            currentPatronLineElement.textContent = newPatronLine;\n            this.setState({ draftTextCopy: doc.innerHTML }, () => {\n                if (cb) cb();\n            })\n        } else {\n            //There's no patron line in the introduced text, so we couldn't update it. But the patrons themselves will still be resequenced\n            this.props.actions.makeToast([{ message: \"Could not find patron line to update within draft text\", type: \"failure\", long: true }]);\n        }\n    }\n\n    onDragEnd(result) {\n        if (!result.destination) {\n            return;\n        }\n\n        let patronList = JSON.parse(JSON.stringify(this.state.patronList));\n        if (patronList[result.source.index].PatronTypeID !== patronList[result.destination.index].PatronTypeID) {\n            this.props.actions.makeToast([{ message: \"You may only reorder patrons of the same patron type\", type: \"warning\", long: true }]);\n            return;\n        }\n        if (patronList.findIndex(a => a.RemoveDate) > -1 && result.destination.index >= patronList.findIndex(a => a.RemoveDate)) {\n            alert(\"You cannot set active patrons after removed patrons.\");\n            return;\n        }\n        let [removed] = patronList.splice(result.source.index, 1);\n\n        patronList.splice(result.destination.index, 0, removed);\n\n        patronList.sort((a, b) =>\n            Number(Boolean(a.RemoveDate)) - Number(Boolean(b.RemoveDate))\n            || (a.PatronTypeID === 1 && b.PatronTypeID === 2\n                ? -1\n                : a.PatronTypeID === 1 && b.PatronTypeID === 3\n                    ? -1\n                    : a.PatronTypeID === 1 && b.PatronTypeID === 4\n                        ? -1\n                        : a.PatronTypeID === 2 && b.PatronTypeID === 1\n                            ? 1\n                            : a.PatronTypeID === 2 && b.PatronTypeID === 3\n                                ? 1\n                                : a.PatronTypeID === 2 && b.PatronTypeID === 4\n                                    ? -1\n                                    : a.PatronTypeID === 3 && b.PatronTypeID === 1\n                                        ? 1\n                                        : a.PatronTypeID === 3 && b.PatronTypeID === 2\n                                            ? -1\n                                            : a.PatronTypeID === 3 && b.PatronTypeID === 4\n                                                ? -1\n                                                : a.PatronTypeID === 4 && b.PatronTypeID !== 4\n                                                    ? 1\n                                                    : 0\n            ) //https://i.imgur.com/rwYykLz.png\n            || a.PatronDisplayName.localeCompare(b.PatronDisplayName)\n            || a.Sequence - b.Sequence\n        )\n\n        patronList.forEach((x, index) => {\n            x.Sequence = index + 1\n        });\n\n        this.setState({\n            patronList\n        })\n    }\n\n    togglePatron(patron) {\n        let patronList = JSON.parse(JSON.stringify(this.state.patronList));\n        let associatedPatron = patronList.find(p => p.MemberID === patron.MemberID);\n        if (associatedPatron) {\n            if (associatedPatron.RemoveDate) {\n                const sequence = this.calculatePatronSequence(associatedPatron);\n                for (let i = 0; i < patronList.length; i++) {\n                    const p = patronList[i];\n                    if (p.PatronDisplayName === associatedPatron.PatronDisplayName) {\n                        patronList.splice(i, 1);\n                        i--;\n                        continue;\n                    }\n                    if (!p.RemoveDate && p.Sequence >= sequence) {\n                        p.Sequence = i + 2;\n                    } else if (!p.RemoveDate && p.Sequence < sequence) {\n                        p.Sequence = i + 1;\n                    } else {\n                        continue;\n                    }\n                };\n                associatedPatron.Sequence = sequence;\n                patronList.push(associatedPatron);\n                associatedPatron.RemoveDate = null;\n            } else {\n                associatedPatron.RemoveDate = moment().format(\"L\");\n                associatedPatron.ByRequest = false;\n                associatedPatron.IsIntroducing = false;\n                patronList.forEach(p => {\n                    if (!p.RemoveDate && p.Sequence > associatedPatron.Sequence) {\n                        p.Sequence--;\n                    }\n                });\n                associatedPatron.Sequence = null;\n            }\n        }\n        patronList.sort((a, b) => Number(Boolean(a.RemoveDate)) - Number(Boolean(b.RemoveDate)) || a.PatronTypeID - b.PatronTypeID || a.Sequence - b.Sequence || a.PatronDisplayName.localeCompare(b.PatronDisplayName))\n\n        if (!patronList.find(x => !x.RemoveDate && x.PatronTypeID === 1)) {\n            this.props.actions.makeToast([{ message: \"There must be a Chief Patron.\", type: \"failure\" }])\n            return;\n        }\n\n        this.setState({ patronList });\n    }\n\n    handlePatronChange(patron, state, val) {\n        let patronList = JSON.parse(JSON.stringify(this.state.patronList));\n        let associatedPatron = patronList.find(p => p.MemberID === patron.MemberID);\n        if (associatedPatron) {\n            if (state === 'PatronType') {\n                associatedPatron.PatronTypeID = val ? val.PatronTypeID : null;\n                associatedPatron.DisplayName = val ? val.DisplayName : null;\n                associatedPatron.Name = val ? val.Name : null;\n            } else if (state === 'IsIntroducing' || state === 'ByRequest') {\n                associatedPatron[state] = !associatedPatron[state];\n            } else {\n                associatedPatron[state] = val;\n            }\n        }\n\n        if (!patronList.find(x => !x.RemoveDate && x.PatronTypeID === 1)) {\n            this.props.actions.makeToast([{ message: \"There must be a Chief Patron.\", type: \"failure\" }])\n            return;\n        }\n\n        if (associatedPatron) {\n            const sequence = this.calculatePatronSequence(associatedPatron);\n            for (let i = 0; i < patronList.length; i++) {\n                const p = patronList[i];\n                if (p.PatronDisplayName === associatedPatron.PatronDisplayName) {\n                    patronList.splice(i, 1);\n                    i--;\n                    continue;\n                }\n                if (!p.RemoveDate && (p.Sequence > sequence || (sequence < associatedPatron.Sequence && p.Sequence === sequence))) {\n                    p.Sequence = i + 2;\n                } else if (!p.RemoveDate && (p.Sequence < sequence || (sequence > associatedPatron.Sequence && p.Sequence === sequence))) {\n                    p.Sequence = i + 1;\n                } else {\n                    continue;\n                }\n            };\n            associatedPatron.Sequence = sequence;\n            patronList.push(associatedPatron);\n        }\n\n        patronList.sort((a, b) => Number(Boolean(a.RemoveDate)) - Number(Boolean(b.RemoveDate)) || a.PatronTypeID - b.PatronTypeID || a.Sequence - b.Sequence || a.PatronDisplayName.localeCompare(b.PatronDisplayName))\n\n        this.setState({ patronList });\n    }\n\n    handleNewPatronChange(state, val, behavior) {\n        let newPatron = [...this.state.newPatron];\n        if (state === 'Patron') {\n            if (behavior && behavior.action) {\n                switch (behavior.action) {\n                    case 'select-option':\n                        let addedPatron = behavior.option;\n                        if (addedPatron.ChamberCode === 'H' && addedPatron.Name === \"Incorporated Chief Co-Patron\") {\n                            addedPatron.Name = null;\n                            addedPatron.DisplayName = null;\n                            addedPatron.PatronTypeID = null;\n                        }\n                        newPatron.push({\n                            ByRequest: false,\n                            IsIntroducing: false,\n                            PatronDisplayName: addedPatron.PatronDisplayName,\n                            MemberID: addedPatron.MemberID,\n                            ChamberCode: addedPatron.ChamberCode,\n                            LegislationID: this.state.billData.LegislationID,\n                            DisplayName: newPatron[0].DisplayName,\n                            Name: newPatron[0].Name,\n                            PatronTypeID: newPatron[0].PatronTypeID\n                        })\n                        newPatron = newPatron.filter(p => p.MemberID);\n                        break;\n                    case 'remove-value':\n                        const removedPatron = behavior.removedValue;\n                        const index = newPatron.findIndex(p => p.MemberID === removedPatron.MemberID);\n                        newPatron.splice(index, 1);\n                        if (!newPatron.length) {\n                            this.resetPatrons(removedPatron.Name);\n                            return;\n                        }\n                        break;\n                    case 'clear':\n                        this.resetPatrons(newPatron[0].Name);\n                        return;\n                }\n            }\n        } else if (state === 'PatronType') {\n            newPatron.forEach(p => {\n                p.PatronTypeID = val ? val.PatronTypeID : null;\n                p.DisplayName = val ? val.DisplayName : null;\n                p.Name = val ? val.Name : null;\n            })\n        }\n\n        this.setState({ newPatron });\n    }\n\n    resetPatrons(keepPatronType) {\n        this.setState({ newPatron: [{}] }, () => {\n            if (this.state.patronTypes.find(pt => pt.Name === \"Co-Patron\")) {\n                this.handleNewPatronChange('PatronType', this.state.patronTypes.find(pt => pt.Name === (keepPatronType || \"Co-Patron\")));\n            }\n        })\n    }\n\n    addNewPatron() {\n        let newPatron = [...this.state.newPatron];\n        let patronList = JSON.parse(JSON.stringify(this.state.patronList));\n\n        newPatron.forEach(patron => {\n            patron.PatronDate = moment().format(\"L\");\n\n            const sequence = this.calculatePatronSequence(patron);\n            for (let i = 0; i < patronList.length; i++) {\n                const p = patronList[i];\n                if (!p.RemoveDate && p.Sequence >= sequence) {\n                    p.Sequence = i + 2;\n                } else if (!p.RemoveDate && p.Sequence < sequence) {\n                    p.Sequence = i + 1;\n                } else {\n                    continue;\n                }\n            };\n            patron.Sequence = sequence;\n            patronList.push(patron);\n        });\n        patronList.sort((a, b) =>\n            Number(Boolean(a.RemoveDate)) - Number(Boolean(b.RemoveDate))\n            || (a.PatronTypeID === 1 && b.PatronTypeID === 2\n                ? -1\n                : a.PatronTypeID === 1 && b.PatronTypeID === 3\n                    ? -1\n                    : a.PatronTypeID === 1 && b.PatronTypeID === 4\n                        ? -1\n                        : a.PatronTypeID === 2 && b.PatronTypeID === 1\n                            ? 1\n                            : a.PatronTypeID === 2 && b.PatronTypeID === 3\n                                ? 1\n                                : a.PatronTypeID === 2 && b.PatronTypeID === 4\n                                    ? -1\n                                    : a.PatronTypeID === 3 && b.PatronTypeID === 1\n                                        ? 1\n                                        : a.PatronTypeID === 3 && b.PatronTypeID === 2\n                                            ? -1\n                                            : a.PatronTypeID === 3 && b.PatronTypeID === 4\n                                                ? -1\n                                                : a.PatronTypeID === 4 && b.PatronTypeID !== 4\n                                                    ? 1\n                                                    : 0\n            ) //https://i.imgur.com/rwYykLz.png\n            || a.PatronDisplayName.localeCompare(b.PatronDisplayName)\n            || a.Sequence - b.Sequence\n        )\n\n        for (let i = 0; i < patronList.length; i++) {\n            let patron = { ...patronList[i] };\n            patron.Sequence = i + 1;\n            patronList.splice(i, 1, patron);\n        }\n\n        this.setState({ patronList }, () => {\n            this.resetPatrons();\n        });\n    }\n\n    calculatePatronSequence(patron) {\n        let patronList = JSON.parse(JSON.stringify(this.state.patronList));\n        const currentSeq = patron.Sequence;\n\n        //look first by chamber, if none found, then go out of chamber\n        let existingPatronOfSameType = patronList.findLast(p => p.PatronDisplayName !== patron.PatronDisplayName && !p.RemoveDate && p.PatronTypeID === patron.PatronTypeID && p.ChamberCode === patron.ChamberCode);\n        if (!existingPatronOfSameType) {\n            existingPatronOfSameType = patronList.findLast(p => p.PatronDisplayName !== patron.PatronDisplayName && !p.RemoveDate && p.PatronTypeID === patron.PatronTypeID);\n        }\n        if (existingPatronOfSameType && existingPatronOfSameType.Sequence) {\n            return currentSeq && existingPatronOfSameType.Sequence > currentSeq ? existingPatronOfSameType.Sequence : existingPatronOfSameType.Sequence + 1;\n        } else {\n            const existingPatronOfHigherPriority = patronList.findLast(p => p.PatronDisplayName !== patron.PatronDisplayName && !p.RemoveDate && p.PatronTypeID < patron.PatronTypeID);\n            if (existingPatronOfHigherPriority && existingPatronOfHigherPriority.Sequence) {\n                return currentSeq && existingPatronOfHigherPriority.Sequence > currentSeq ? existingPatronOfHigherPriority.Sequence : existingPatronOfHigherPriority.Sequence + 1;\n            } else {\n                return 1;\n            }\n        }\n    }\n\n    handleVersionDateChange(value) {\n        let billText = { ...this.state.billText };\n        billText.VersionDate = moment(value).startOf('day');\n\n        let draftTextCopy = this.state.draftTextCopy;\n        draftTextCopy = draftTextCopy.replace(/<p class=\"center\">\\s*on.+<\\/p>/, '<p class=\"center\">on ' + value.format(\"LL\") + ')</p>');\n\n        this.setState({ billText, draftTextCopy })\n    }\n\n    componentDidMount() {\n        window.scrollTo(0, 0);\n        this.getData();\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { message, isLoaded, isEditing, draftTextCopy, billText, highlight, senatePatronsList, housePatronsList, chiefPatronsList, patronList, selectedSession, versionSession } = this.state;\n        const session = selectedSession;\n        const sessionHeader = session ? session.SessionYear + \" \" + session.DisplayName : '';\n        const getPatronText = patronArray => {\n            const senators = patronArray.filter(p => p.ChamberCode === \"S\");\n            const delegates = patronArray.filter(p => p.ChamberCode === \"H\");\n            let finishedText = \"\";\n            if (billText.ChamberCode === \"S\") {\n                finishedText = senators.map(m => m.PatronDisplayName).join();\n                if (delegates.length > 0) {\n                    finishedText += \"; \" + (delegates.length === 1 ? \"Delegate: \" : \"Delegates: \");\n                    finishedText += delegates.map(m => m.PatronDisplayName).join();\n                }\n            }\n            if (billText.ChamberCode === \"H\") {\n                finishedText = delegates.map(m => m.PatronDisplayName).join();\n                if (senators.length > 0) {\n                    finishedText += \"; \" + (senators.length === 1 ? \"Senator: \" : \"Senators: \");\n                    finishedText += senators.map(m => m.PatronDisplayName).join();\n\n                }\n            }\n            return finishedText;\n\n        }\n        if (message) {\n            return (<p>{message}</p>);\n        }\n        const fetchingPatronage = (this.props.location.state && this.props.location.state.patronUpdate && (!this.state.patronTypes || !this.state.memberList || !this.state.patronIsLoaded));\n        if (!isLoaded || fetchingPatronage) {\n            return (<div className=\"center-spinner spinner\">{fetchingPatronage ? 'Loading...' : 'Loading Results...'}</div>)\n        }\n        if (isEditing || this.state.gettingEditData) {\n            const disableSponsor = !this.props.login.userClaims.roles.find(x => x === \"Admin\") && !window.location.pathname.includes('new-amendment');\n\n            return (\n                this.state.gettingEditData ?\n                    <div className=\"center-spinner spinner\">{this.props.location.state && this.props.location.state.patronUpdate ? 'Loading...' : 'Loading Results...'}</div>\n                    :\n                    <div className=\"dlas-forms\">\n                        {this.state.showPatronModal &&\n                            <UpdatePatronageModal history={this.props.history} billText={this.state.billText} savingPatrons={this.state.savingPatrons} newPatron={this.state.newPatron} onDragEnd={this.onDragEnd} patronTypes={this.state.patronTypes} handlePatronChange={this.handlePatronChange} handleNewPatronChange={this.handleNewPatronChange} addNewPatron={this.addNewPatron} togglePatron={this.togglePatron} patronList={patronList} memberList={this.state.memberList} updatePatrons={this.updatePatrons} />\n                        }\n                        <div className={this.state.showPatronModal ? 'd-none' : ''}>\n                            <div>\n                                <h2>{sessionHeader} {this.state.billText.OnReconvene && \" - Reconvened\"}</h2>\n                                <h3><Link to={`/bill-details/${selectedSession.SessionCode}/${this.props.match.params.billnumber}`}>{this.props.match.params.billnumber}</Link></h3>\n                                {!window.location.pathname.includes('new-amendment') &&\n                                    <button type=\"button\" className=\"button-link\" onClick={() => this.toggleEditContent()}>Cancel</button>\n                                }\n                                <div className={`inner-grid ${billText.LegislationVersion === \"Substitute\" ? 'half-one-one-one-half' : 'four'}`}>\n                                    {billText.LegislationVersion === \"Substitute\" &&\n                                        <div>\n                                            <label className=\"label small-text\">Proposed On</label>\n                                            <DatePicker\n                                                name=\"proposed-on\"\n                                                id=\"version-date-datepicker\"\n                                                selected={billText.VersionDate ? moment(billText.VersionDate) : null}\n                                                onChange={this.handleVersionDateChange}\n                                            />\n                                        </div>\n                                    }\n                                    <div>\n                                        <label className=\"label small-text\">Text Disposition</label>\n                                        <Select\n                                            options={this.props.bills.legislationDispositions ? this.props.bills.legislationDispositions.filter(d => ![\"Amendment\", \"Substitute\"].includes(billText.LegislationVersion) || ![\"Offered\", \"Reported\"].includes(billText.originalTextDisposition) ? d.Name !== \"Removed\" : true) : []}\n                                            getOptionLabel={opt => opt.Name}\n                                            getOptionValue={opt => opt.TextDispositionID}\n                                            isClearable={true}\n                                            onChange={this.handleBillDispositionChange}\n                                            ref={this.dispositionRef}\n                                            value={this.props.bills.legislationDispositions.find(dispo => dispo.Name === billText.TextDisposition)}\n                                            isDisabled={!this.props.login.userClaims.roles.find(x => x === \"Admin\")}\n                                        />\n                                        {this.state.textDispositionError && !billText.TextDisposition && <span className=\"input-feedback\" style={{ fontSize: '12px' }}>{this.state.textDispositionError}</span>}\n                                    </div>\n                                    {[\"Amendment\", \"Substitute\"].includes(billText.LegislationVersion) &&\n                                        <>\n                                            <div>\n                                                <label className=\"label small-text\">Sponsor</label>\n                                                <Select\n                                                    isDisabled={disableSponsor}\n                                                    options={this.state.sponsorOptions}\n                                                    onChange={(e) => this.handleParamChange(e, \"selectedSponsor\")}\n                                                    getOptionLabel={(option) => option.label}\n                                                    value={this.state.selectedSponsor}\n                                                    ref={this.sponsorRef}\n                                                    placeholder={\"Select...\"}\n                                                />\n                                                {this.state.sponsorError && !billText.Sponsor && <span className=\"input-feedback\" style={{ fontSize: '12px' }}>{this.state.sponsorError}</span>}\n                                            </div>\n                                            {this.state.selectedSponsor &&\n                                                this.state.selectedSponsor.value &&\n                                                this.state.selectedSponsor.value === \"Member\" &&\n                                                <div>\n                                                    <label className=\"label small-text\">Member</label>\n                                                    <Select\n                                                        options={this.props.login.userClaims.roles.find(x => x === \"Admin\")\n                                                            ? this.state.memberOptions\n                                                            : this.props.login.userClaims.claims.find(x => x.RoleName === \"HouseLegislationTextAuthor\")\n                                                                ? this.state.houseMemberOptions\n                                                                : this.state.senateMemberOptions\n                                                        }\n                                                        isDisabled={disableSponsor}\n                                                        onChange={(e) => this.handleParamChange(e, \"selectedMember\")}\n                                                        getOptionLabel={(option) => option.text}\n                                                        value={this.state.selectedMember}\n                                                        ref={this.memberRef}\n                                                        placeholder={\"Select...\"}\n                                                    />\n                                                    {this.state.memberError && !billText.Patrons && <span className=\"input-feedback\" style={{ fontSize: '12px' }}>{this.state.memberError}</span>}\n                                                </div>}\n                                            {this.state.selectedSponsor &&\n                                                this.state.selectedSponsor.value === \"Committee\" &&\n                                                <div>\n                                                    <label className=\"label small-text\">Committee</label>\n                                                    <Select\n                                                        options={this.props.login.userClaims.roles.find(x => x === \"Admin\")\n                                                            ? this.state.committeeOptions\n                                                            : this.props.login.userClaims.claims.find(x => x.RoleName === \"HouseLegislationTextAuthor\")\n                                                                ? this.state.committeeOptions.filter(x => x.value.ChamberCode === \"H\")\n                                                                : this.state.committeeOptions.filter(x => x.value.ChamberCode === \"S\")\n                                                        }\n                                                        isDisabled={disableSponsor}\n                                                        onChange={(e) => this.handleParamChange(e, \"selectedCommittee\")}\n                                                        getOptionLabel={(option) => option.text}\n                                                        value={this.state.selectedCommittee}\n                                                        ref={this.committeeRef}\n                                                        placeholder={\"Select...\"}\n                                                    />\n                                                    {this.state.committeeError && !billText.CommitteeName && <span className=\"input-feedback\" style={{ fontSize: '12px' }}>{this.state.committeeError}</span>}\n                                                </div>}\n                                        </>\n                                    }\n                                    {(this.props.login.userClaims.roles.find(x => x === \"Admin\") || billText.LegislationVersion === \"Amendment\") && /*admin can change IsActive/IsPublic on any version, other users of this page (LegislationText resource) can only change this on amendments*/\n                                        <div className=\"inner-grid two\">\n                                            <div>\n                                                <label className=\"label small-text\">Is Viable</label>\n                                                <a onClick={(e) => { e.stopPropagation(e); this.toggleTooltip() }} className=\"button info\">Info</a>\n                                                {this.state.showTooltip &&\n                                                    <div className=\"info-box red-edit-tooltip\">\n                                                        <p>Caution, only change this for reconsiderations.</p>\n                                                    </div>\n                                                }\n                                                <div onClick={this.handleIsActiveChange} className=\"toggle-switch\" style={{ display: 'block' }}>\n                                                    <input id=\"sr-status-change\" checked={billText.IsActive} type=\"checkbox\" />\n                                                    <span className=\"slider\"></span>\n                                                </div>\n                                            </div>\n                                            <div>\n                                                <label className=\"label small-text\">Is Public</label>\n                                                <div onClick={this.handleIsPublicChange} className=\"toggle-switch\" style={{ display: 'block' }}>\n                                                    <input id=\"sr-status-change\" checked={billText.IsPublic} type=\"checkbox\" />\n                                                    <span className=\"slider\"></span>\n                                                </div>\n                                            </div>\n                                        </div>\n                                    }\n                                </div>\n                            </div>\n                            <br />\n                            <Prompt\n                                when={this.state.isDirty}\n                                message={`You have unsaved changes. Are you sure you would like to leave?`}\n                            />\n                            <ReviewSection\n                                editorContent={draftTextCopy}\n                                handleEditorChange={this.handleEditorChange}\n                                sessionId={session.SessionID}\n                                height={1000}\n                                membersCallback={this.membersCallback}\n                                committeesCallback={this.committeesCallback}\n                                allowAmendmentActions={![\"Amendment\", \"Gov Recommendation\"].includes(this.state.billText.LegislationVersion) && !window.location.pathname.includes('new-amendment') ? false : true}\n                                overrideRemoveCreateAmendmentButton={this.state.billText.LegislationVersion === \"Gov Recommendation\"}\n                                userChamber={this.props.login.userClaims.roles.find((x) => x === \"Admin\") ? \"Admin\" : this.props.login.userClaims.roles.find((x) => x === \"HouseLegislationAuthor\") ? \"H\" : \"S\"}\n                                billNumber={this.props.match.params.billnumber}\n                                selectedSponsor={this.state.selectedSponsor}\n                                selectedMember={this.state.selectedMember}\n                                selectedCommittee={this.state.selectedCommittee}\n                                setWasEmpty={this.setWasEmpty}\n                                wasEmpty={this.state.wasEmpty}\n                                setReplaced={this.setReplaced}\n                                replaced={this.state.replaced}\n                            />\n                            {this.state.draftTextError && !draftTextCopy && <span className=\"input-feedback\" style={{ fontSize: '15px' }}>{this.state.draftTextError}</span>}\n                            <div className=\"button-bar\">\n                                <div>\n                                    {!window.location.pathname.includes('new-amendment') &&\n                                        <button disabled={this.state.isSaving} type=\"button\" onClick={() => this.toggleEditContent()} className=\"button secondary\">Cancel</button>\n                                    }\n                                </div>\n                                <div className=\"align-right\">\n                                    {window.location.pathname.includes('new-amendment') ?\n                                        <button disabled={this.state.isSaving} type=\"button\" onClick={this.createNewAmendment} className=\"button\">{this.state.isSaving ? \"Creating...\" : \"Create\"}</button>\n                                        :\n                                        <div className=\"flex-row flex-vertical-center flex-end\">\n                                            {![\"Amendment\", \"Gov Recommendation\", \"Veto Explanation\", \"Conference Report\"].includes(billText.LegislationVersion) &&\n                                                <React.Fragment>\n                                                    <div className=\"toggle-switch\" onClick={this.toggleReprint}>\n                                                        <input id=\"official-reprint-button\" checked={this.state.billText.IsReprint} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                                        <span className=\"slider\"></span>\n                                                    </div>\n                                                    <label htmlFor=\"official-reprint-button\" className=\"checkbox-label no-background\" style={{ whiteSpace: \"no-wrap\", marginTop: '0px', fontSize: '14px' }}>Mark As Official Reprint</label>\n                                                </React.Fragment>\n                                            }\n                                            <button disabled={this.state.isSaving || this.state.headerError} type=\"button\" onClick={() => this.saveText()} className=\"button\">{this.state.isSaving ? \"Saving...\" : this.props.bills.billText && this.props.bills.billText.length && this.props.bills.billText[0].IsPublic && billText.IsPublic ? \"Republish\" : billText.IsPublic ? \"Publish\" : \"Save\"}</button>\n                                        </div>\n                                    }\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n            );\n        }\n        const MarkHelpBar = (\n            <div className=\"floating-button-bar inline-list mark-help\">\n                {this.state.markHelpIndex > 0 && <button className=\"button\" type=\"button\" onClick={() => this.navToKeywordHit(PREVIOUS)}>Previous Keyword Hit</button>}\n                {this.state.showNextMarkHelp && <button className=\"button\" type=\"button\" onClick={() => this.navToKeywordHit(NEXT)}>{this.state.showNextMarkHelp} Keyword Hit</button>}\n            </div>\n        )\n\n        return (\n            <div>\n                <div className=\"flex-row\">\n                    <div>\n                        <h2>{sessionHeader} {this.state.billText.OnReconvene && \" - Reconvened\"}</h2>\n                        <h3><Link to={`/bill-details/${selectedSession.SessionCode}/${billText.LegislationNumber}`}>{billText.LegislationNumber}</Link></h3>\n                        {billText.CommitteeID && <h3><Link to={`/session-details/${selectedSession.SessionCode}/committee-information/${billText.CommitteeNumber}/committee-details`}>{billText.CommitteeName}</Link></h3>}\n                        {this.props.login.userClaims.resources.find(resource => resource === VERSION_AUTHOR) &&\n                            <button type=\"button\" className=\"button-link red-edit\" onClick={() => this.toggleEditContent()}>Edit</button>\n                        }\n                        <br />\n                        {billText && billText.LegislationNumber && ![\"Conference Report\", \"Amendment\", \"Gov Recommendation\"].includes(billText.LegislationVersion) && (billText.LegislationNumber.includes(\"HB\") || billText.LegislationNumber.includes(\"SB\")) ?\n                            <div className=\"flex-row flex-vertical-center flex-start\">\n                                <div className=\"toggle-switch\" onClick={() => this.toggleHighlight()}>\n                                    <input id=\"highlight-checkbox\" checked={highlight} type=\"checkbox\" style={{ width: \"auto\" }} />\n                                    <span className=\"slider\"></span>\n                                </div>\n                                <label htmlFor=\"highlight-checkbox\" className=\"checkbox-label no-background\">Highlight Proposed Changes</label>\n                            </div>\n                            :\n                            null\n                        }\n                    </div>\n                    <div>\n                        {this.props.login.userClaims.resources.includes(\"LegislationText\")\n                            && (([\"Introduced\", \"Enrolled\"].includes(this.state.billText.LegislationVersion) && this.state.billData && [\"J\", \"R\"].includes(this.state.billData.LegislationTypeCode))\n                                || (this.state.billText.LegislationVersion === \"Chaptered\" && this.state.billData && this.state.billData.LegislationTypeCode === \"B\")\n                                || (this.state.billText.LegislationVersion === \"Substitute\" && this.state.billData)) &&\n                            <button type=\"button\" onClick={this.downloadWordFile} className=\"button-link with-icon\"><span className=\"icon word\"></span>Presentation Copy</button>\n                        }\n                        {billText && billText.PDFFile && billText.PDFFile[0].FileURL &&\n                            <a href={billText.PDFFile[0].FileURL} target=\"_blank\" rel=\"noreferrer\" className=\"button pdf\"> PDF</a>\n                        }\n                        <ReactToPrint\n                            trigger={() => <button type=\"button\" className=\"button print\"> Print</button>}\n                            content={() => this.componentRef}\n                            pageStyle={\"break-inside: avoid\"}\n                        />\n                    </div>\n                </div>\n                <br />\n                <div ref={el => (this.componentRef = el)}>\n                    {!this.state.hideLDNumber && [\"Introduced\", \"Engrossed\", \"Reengrossed\"].includes(billText.LegislationVersion) &&\n                        <div>\n                            {billText.LDNumber}\n                        </div>\n                    }\n                    {/* The draft text from json contains everything. Including the header. So just show that if it exists */}\n                    {billText.DraftTextFromJson ?\n                        <div className={highlight === true ? \"highlight mark-context\" : \"mark-context\"}>\n                            {this.state.showMarkHelp && MarkHelpBar}\n                            {billText.DraftTextFromJson}\n                        </div>\n                        :\n                        <>\n                            {billText.jsonFileFound &&\n                                <div className=\"center\">\n                                    <strong>{billText.Chamber} {billText.LegislationType} NO. {billText.LegislationNumber.replace(/\\D/g, '')}</strong>\n                                    <div>{billText.PrefileDate && <>Offered {moment(billText.OfferedDate).format(\"MMMM D, YYYY\")}</>}</div>\n                                    <div>{billText.OfferedDate && <>Prefiled {moment(billText.PrefileDate).format(\"MMMM D, YYYY\")}</>}</div>\n                                    <div>{billText.DraftTitle ? renderHTML(billText.DraftTitle) : ''}</div>\n                                    <hr />\n                                    <div>Patron&mdash;{getPatronText(billText.Patrons)}</div>\n                                    <hr />\n                                    <div>{billText.ReferredCommittee\n                                        && billText.ReferredCommittee === \"Judiciary\"\n                                        ? <>Referred to Committee on the {billText.ReferredCommittee}</>\n                                        : billText.ReferredCommittee === \"Courts of Justice\"\n                                            ? <>Referred to Committee for {billText.ReferredCommittee}</>\n                                            : <>Referred to Committee on {billText.ReferredCommittee}</>\n                                    }</div>\n                                    <hr />\n                                </div>\n                            }\n                            <div className={highlight === true ? \"highlight mark-context\" : \"mark-context\"}>\n                                {this.state.showMarkHelp && MarkHelpBar}\n                                {billText ? renderHTML(billText.DraftText || '') : ''}\n                            </div>\n                        </>\n                    }\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { bills, session, login, patrons, members, nav } = state;\n        return {\n            bills,\n            session,\n            login,\n            patrons,\n            members,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, billActionCreators, patronActionCreators, sessionActionCreators, authActionCreators, memberActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(FullText)\n","export const Button = ({\n    icons,\n    input,\n    children,\n    disabled,\n    className,\n    style,\n    onClick,\n    ...props\n}) => {\n    return (\n        <button {...props} onClick={onClick} disabled={disabled} style={icons?.length ? { gridTemplateColumns: 'min-content' + icons.map(_ => ' min-content').join(''), ...style } : style} className={`${icons?.length ? 'button-icon-text-container ' : ''}${className}`}>\n            {input}\n            {icons?.map((icon, idx) => <div {...icon.props} key={idx} className={`icon ${icon.name}`}>{icon.children}</div>)}\n            <div className=\"button-text\">{children}</div>\n        </button>\n    );\n};\n","import React from 'react';\nimport { Prompt } from 'react-router';\nimport Select from 'react-select';\nimport DatePicker from 'react-datepicker';\nimport moment from 'moment-timezone';\nimport { Button } from '../lis-custom-components/lis-custom-components';\nimport { scheduleActionCreators } from '../../stores/lis-schedule-store';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { navActionCreators } from '../../stores/lis-nav-store';\n\nconst hyperlinkInstructions = \"INSERT HYPERLINK TEXT\";\n\nconst customStyles = {\n    option: (base, state) => ({\n        ...base,\n        fontSize: '0.8em',\n    }),\n    control: (base) => ({\n        ...base,\n        padding: '1px',\n        margin: 0,\n        height: \"32px\",\n        minHeight: \"32px\",\n        fontSize: '0.8em',\n    }),\n    singleValue: (base, state) => {\n        return { ...base, };\n    },\n    dropdownIndicator: base => ({\n        ...base,\n        padding: '0px 8px'\n    })\n}\n\nconst chamberList = [\n    { label: \"House\", value: 0 },\n    { label: \"Senate\", value: 1 }\n]\n\nclass MeetingsForm extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            displaySequence: 0,\n            committee: { label: \"Select...\" },\n            scheduleID: \"\",\n            scheduleType: { label: \"Select...\" },\n            meetingDateTime: \"\",\n            timeDescription: \"\",\n            location: { label: \"Select...\" },\n            description: \"\",\n            ownerName: \"\",\n            chamber: { label: \"Select...\" },\n            isCancelled: false,\n            isPublic: true,\n            onCalendar: false,\n            scheduleTypeOptions: [],\n            remarks: \"\",\n            scheduleFiles: []\n        }\n\n        this.handleFileChange = this.handleFileChange.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n        this.highlightFileAnchorTag = this.highlightFileAnchorTag.bind(this);\n        this.saveSchedule = this.saveSchedule.bind(this);\n    }\n\n    componentDidMount() {\n        let scheduleTypeOptions = [...this.props.scheduleTypeList];\n        scheduleTypeOptions.splice(5, 1);\n        this.setState({\n            scheduleTypeOptions: scheduleTypeOptions\n        })\n    }\n\n    static getDerivedStateFromProps(nextProps, prevState) {\n        if (nextProps.meeting.ScheduleID !== prevState.scheduleID) {\n            return {\n                displaySequence: nextProps.meeting.DisplaySequence ? nextProps.meeting.DisplaySequence : nextProps.organizedSchedule.find(x => moment(x.Date).isSame(nextProps.meeting.meetingDateTime, \"day\")) ? (Math.max(...nextProps.organizedSchedule.find(x => moment(x.Date).isSame(nextProps.meeting.meetingDateTime, \"day\")).Times[0].Items.map(x => x.DisplaySequence)) + 1) : 1,\n                committee: nextProps.meeting.OwnerID ? nextProps.committeeList.find(x => x.CommitteeID === nextProps.meeting.OwnerID) : { label: \"Select...\" },\n                ownerName: nextProps.meeting.OwnerName ? nextProps.meeting.OwnerName : \"\",\n                scheduleID: nextProps.meeting.ScheduleID ? nextProps.meeting.ScheduleID : 0,\n                scheduleType: nextProps.meeting.ScheduleTypeID ? nextProps.scheduleTypeList.find(x => x.ScheduleTypeID === nextProps.meeting.ScheduleTypeID) : { label: \"Select...\" },\n                location: nextProps.meeting.VoteRoomID ? nextProps.locationList.find(x => x.VoteRoomID === nextProps.meeting.VoteRoomID) : { label: \"Select...\" },\n                meetingDateTime: nextProps.meeting.ScheduleDate ? moment(nextProps.meeting.ScheduleDate).format(\"MM-DD-YYYY HH:mm\") : moment().set({ hour: 12, minute: 0, second: 0, millisecond: 0 }).format(\"MM-DD-YYYY hh:mm\"),\n                timeDescription: nextProps.meeting.ScheduleTime ? nextProps.meeting.ScheduleTime : \"\",\n                description: nextProps.meeting.Description ? nextProps.meeting.Description : \"\",\n                textHeight: (Math.round((nextProps.meeting.Description ? nextProps.meeting.Description : \"\").length / 95) * 20 + 40).toString() + 'px',\n                chamber: nextProps.meeting.ScheduleTypeID === 2 ? chamberList.find(x => x.label === nextProps.meeting.OwnerName) : { label: \"Select...\" },\n                isCancelled: nextProps.meeting.IsCancelled ? nextProps.meeting.IsCancelled : false,\n                isPublic: nextProps.meeting.IsPublic === true ? true : false,\n                onCalendar: nextProps.meeting.OnCalendar !== undefined ? nextProps.meeting.OnCalendar : false,\n                remarks: nextProps.meeting.Comments ? nextProps.meeting.Comments : \"\",\n                scheduleFiles: nextProps.meeting.ScheduleFiles || []\n            }\n        } else { return null; }\n    }\n\n    handleChange(state, value, callback) {\n        if (state === 'timeDescription') {\n            value = moment(value, \"H:mm\").tz('America/New_York').format(\"h:mm A\");\n        } else if (state === 'meetingDateTime') {\n            value = moment(value).tz('America/New_York');\n        }\n        this.setState({\n            [state]: value\n        }, () => {\n            this.props.setFormIsDirty(true);\n            if (value && value.ParentCommitteeID && value.ChamberCode === \"S\") {\n                this.props.getSubcommitteeMembers(\"?CommitteeID=\" + this.state.committee.CommitteeID + \"&EffectiveDate=\" + this.state.meetingDateTime)\n                    .then(() => {\n                        this.setState({\n                            remarks: this.props.subcommitteeMembers\n                        })\n                    })\n            } else {\n                if (state === 'description') {\n                    let textHeight = (Math.round((this.state.description ?? '').length / 95) * 20 + 40).toString() + 'px';\n                    this.setState({ textHeight });\n                }\n                if (callback) callback();\n            }\n        })\n    }\n\n    highlightFileAnchorTag() {\n        const field = document.getElementById('description');\n        if (field) {\n            const start = this.state.description.lastIndexOf(hyperlinkInstructions);\n            if (start > -1) {\n                const end = start + hyperlinkInstructions.length;\n                if (field.createTextRange) {\n                    var selRange = field.createTextRange();\n                    selRange.collapse(true);\n                    selRange.moveStart('character', start);\n                    selRange.moveEnd('character', end);\n                    selRange.select();\n                } else if (field.setSelectionRange) {\n                    field.setSelectionRange(start, end);\n                } else if (field.selectionStart) {\n                    field.selectionStart = start;\n                    field.selectionEnd = end;\n                }\n                field.focus();\n            }\n        }\n    }\n\n    saveSchedule() {\n        let params = {\n            DisplaySequence: this.state.displaySequence,\n            OwnerID: this.state.scheduleType.value !== 6 ? this.state.committee ? this.state.committee.CommitteeID : null : this.props.meeting.OwnerID, //If the meeting is a docket pass back the original OwnerID\n            OwnerName: this.state.scheduleType.value === 1 ? this.state.committee ? this.state.committee.Name : null : this.state.scheduleType.value === 2 ? this.state.chamber ? this.state.chamber.label : null : this.state.scheduleType.value === 6 ? this.props.meeting ? this.props.meeting.OwnerName : null : this.state.ownerName, //Pass back the original OwnerName if it's a docket meeting\n            ScheduleID: this.state.scheduleID,\n            ScheduleTypeID: this.state.scheduleType.value,\n            VoteRoomID: this.state.location ? this.state.location.VoteRoomID : undefined,\n            RoomDescription: this.state.location ? this.state.location.Description : undefined,\n            ScheduleDate: moment(this.state.meetingDateTime).format(\"MM/DD/YYYY HH:mm\"),\n            ScheduleTime: this.state.timeDescription !== \"Invalid date\" ? this.state.timeDescription : \"\",\n            Description: this.state.description,\n            IsCancelled: this.state.isCancelled,\n            IsPublic: this.state.isPublic,\n            OnCalendar: this.state.onCalendar,\n            ModificationDate: this.props.meeting.ModificationDate ? this.props.meeting.ModificationDate : '',\n            Comments: this.state.remarks\n        }\n\n        if (this.state.scheduleID === 0) {\n            this.props.createMeeting(params)\n        } else {\n            params = {\n                Schedules: [\n                    params\n                ]\n            }\n            this.props.saveMeetings(params)\n        }\n    }\n\n    handleFileChange(e, originalFile, isDelete) {\n        this.props.handleFileChange(e, originalFile, isDelete, (scheduleFiles, update, originalFileIdx, fileURL) => {\n            if (!isDelete && !update && (!originalFileIdx || originalFileIdx === -1)) {\n                this.handleChange(\"description\", this.state.description + `<a href='${fileURL}' target='_blank' rel='noopener noreferrer'>${hyperlinkInstructions}</a>`, () => {\n                    this.highlightFileAnchorTag();\n                })\n            } else if (update && originalFileIdx > -1) {\n                scheduleFiles[originalFileIdx]['change-success'] = true;\n                this.setState({ scheduleFiles });\n            }\n        })\n    }\n\n    getScheduleDateTime() {\n        const scheduleDate = moment(this.state.meetingDateTime);\n        const scheduleTime = moment(this.state.timeDescription, \"h:mm A\").isValid() && moment(this.state.timeDescription, \"h:mm A\");\n        return scheduleDate.hour(scheduleTime ? scheduleTime.hour() : scheduleDate.hour()).minute(scheduleTime ? scheduleTime.minute() : scheduleDate.minute()).second(scheduleTime ? scheduleTime.second() : scheduleDate.second()).tz('America/New_York', true).local();\n    }\n\n    render() {\n        const { committeeDropDownOptions, locationList, scheduleTypeList, isSaving, toggleEditMeeting } = this.props;\n        //custom filter for the committee dropdown so that subcommittees will be displayed if you filter by the parent committee name\n        const filterOption = (option, inputValue) => {\n            inputValue = inputValue.toUpperCase();\n            // check if this option label includes the inputValue, or if this option is a subcommittee whose parent committee's label contains the inputValue\n            const match = option.label.toUpperCase().includes(inputValue) || (option.data.ParentCommitteeID && committeeDropDownOptions.find(cmte => cmte.CommitteeID === option.data.ParentCommitteeID && cmte.label.toUpperCase().includes(inputValue)));\n            return match;\n        };\n\n        const formatURL = (url) => {\n            url = url.replace(\"https://\", \"\");\n            if (url.length >= 40) {\n                return url.substring(0, 11) + \"...\" + url.substring(28);\n            }\n            return url;\n        }\n\n        return (\n            <div className=\"dlas-forms meetings-form\">\n                <div>\n                    <Prompt\n                        when={this.props.isDirty}\n                        message={`You have unsaved changes. Are you sure you would like to leave?`}\n                    />\n                </div>\n                <div className=\"inner-grid seven-and-one\">\n                    {this.state.scheduleID === 0 ? <h3>Create an Event</h3> : <h3>Edit Event</h3>}\n                    <div className=\"checkbox flex-row flex-vertical-center flex-start\" style={{ paddingTop: \"5%\" }}>\n                        {this.props.userClaims && this.props.userClaims.roles.find(x => x === \"SenateScheduleAuthor\") &&\n                            <React.Fragment>\n                                <div className=\"toggle-switch\" onClick={() => this.handleChange(\"onCalendar\", !this.state.onCalendar)}>\n                                    <input id=\"is-public-button\" checked={this.state.onCalendar} type=\"checkbox\" style={{ width: \"inherit\" }} />\n                                    <span className=\"slider\"></span>\n                                </div>\n                                <label htmlFor=\"is-public-button\" className=\"checkbox-label no-background\" style={{ whiteSpace: \"nowrap\" }}>On Calendar?</label>\n                            </React.Fragment>\n                        }\n                        <div className=\"toggle-switch\" onClick={() => this.handleChange(\"isPublic\", !this.state.isPublic)}>\n                            <input id=\"is-public-button\" checked={this.state.isPublic} type=\"checkbox\" style={{ width: \"inherit\" }} />\n                            <span className=\"slider\"></span>\n                        </div>\n                        <label htmlFor=\"is-public-button\" className=\"checkbox-label no-background\" style={{ whiteSpace: \"nowrap\" }}>Is Public?</label>\n                    </div>\n                </div>\n                <div className=\"grid-wrapper third\">\n                    <div>\n                        <label htmlFor=\"meeting-datetime\">Date</label>\n                        <DatePicker\n                            id=\"meeting-datetime\"\n                            className=\"width-100\"\n                            selected={this.getScheduleDateTime()}\n                            onChange={(value => { this.handleChange(\"meetingDateTime\", value) })}\n                            dateFormat=\"MM/DD/YYYY\"\n                        />\n                    </div>\n                    <div>\n                        <label htmlFor=\"time-description\">Time</label>\n                        <div>\n                            <input\n                                type='time'\n                                id=\"time-description\"\n                                autoComplete='off'\n                                value={!this.state.timeDescription ? '' : moment(this.state.timeDescription, \"h:mm A\").tz('America/New_York', true).local().format(\"HH:mm\")}\n                                style={{ minWidth: '125px', maxHeight: '32px', fontFamily: 'arial' }}\n                                onChange={(e) => { this.handleChange(\"timeDescription\", e ? e.target.value : \"\") }}\n                            />\n                        </div>\n                    </div>\n                    <div>\n                        <label htmlFor=\"meeting-location\">Location</label>\n                        <Select\n                            id=\"meeting-location\"\n                            options={locationList}\n                            value={this.state.location}\n                            onChange={(value) => { this.handleChange(\"location\", value) }}\n                            styles={customStyles}\n                            isClearable\n                        />\n                    </div>\n                </div>\n                <div className=\"grid-wrapper meetings-form-two-and-one\">\n                    <React.Fragment>\n                        {this.state.scheduleType && this.state.scheduleType.value === 1 || this.state.scheduleType && this.state.scheduleType.value === 6\n                            ?\n                            <div>\n                                <label htmlFor=\"committee-subcommittee\">Committee/Subcommittee</label>\n                                {this.state.scheduleType.value === 6\n                                    ?\n                                    <div style={{ display: \"block\" }}>\n                                        <label>{this.state.ownerName}</label>\n                                    </div>\n                                    :\n                                    <Select\n                                        id=\"committee-subcommittee\"\n                                        options={committeeDropDownOptions}\n                                        value={this.state.committee}\n                                        onChange={(value) => { this.handleChange(\"committee\", value) }}\n                                        filterOption={filterOption}\n                                        styles={customStyles}\n                                    />\n                                }\n                            </div>\n                            : this.state.scheduleType && this.state.scheduleType.value === 2\n                                ?\n                                <div>\n                                    <label htmlFor=\"meeting-chamber\">Chamber</label>\n                                    <Select\n                                        id=\"meeting-chamber\"\n                                        value={this.state.chamber}\n                                        options={this.props.userClaims.claims.find(x => x.RoleName === \"Admin\")\n                                            ? chamberList\n                                            : this.props.userClaims.claims.find(x => x.RoleName === \"HouseScheduleEditor\")\n                                                ? chamberList.filter(x => x.label === \"House\")\n                                                : chamberList.filter(x => x.label === \"Senate\")\n                                        }\n                                        onChange={(value) => { this.handleChange(\"chamber\", value) }}\n                                        styles={customStyles}\n                                    />\n                                </div>\n                                :\n                                <div>\n                                    <label htmlFor=\"meeting-owner\">Meeting Owner</label>\n                                    <input\n                                        id=\"meeting-owner\"\n                                        className=\"width-100\"\n                                        type=\"text\"\n                                        onChange={(e) => { this.handleChange(\"ownerName\", e.target.value) }}\n                                        value={this.state.ownerName}\n                                    />\n                                </div>\n                        }\n                    </React.Fragment>\n                    <div>\n                        <label htmlFor=\"schedule-Type\">Meeting Type</label>\n                        <Select\n                            id=\"schedule-type\"\n                            options={this.state.scheduleTypeOptions}\n                            value={this.state.scheduleType}\n                            onChange={(value) => { this.handleChange(\"scheduleType\", value) }}\n                            styles={customStyles}\n                            isDisabled={this.state.scheduleType.value === 6}\n                        />\n                    </div>\n                </div>\n                <div className=\"grid-wrapper\">\n                    <label htmlFor=\"description\">Description{this.state.scheduleID ? <Button type=\"button\" className=\"button file-button slide\" style={{ marginLeft: '5px' }} icons={[{ name: 'add' }]} input={<input type=\"file\" accept=\".pdf\" onChange={this.handleFileChange} />}>\n                        {\"  Add PDF\"}\n                    </Button> : null}\n                        {this.state.scheduleFiles?.map((f, i) =>\n                            <Button key={i} type=\"button\" className={`button file-button secondary${f['change-success'] ? ' change-success' : ''}`}\n                                style={{ marginLeft: '5px', cursor: 'default' }}\n                                icons={[\n                                    { name: 'delete', props: { style: { cursor: 'pointer' }, onClick: (e) => this.handleFileChange(e, f, true) } },\n                                    { name: 'replace', children: <input type=\"file\" accept=\".pdf\" style={{ position: 'relative', cursor: 'pointer' }} onChange={(e) => this.handleFileChange(e, f)} /> }\n                                ]}>\n                                <a href={f.FileURL} target='_blank' rel='noopener noreferrer'>{formatURL(f.FileURL)}</a>\n                            </Button>)}\n                    </label>\n                    <textarea\n                        id=\"description\"\n                        style={{ height: this.state.textHeight || '40px' }}\n                        value={this.state.description}\n                        onChange={(e) => { this.handleChange(\"description\", e.target.value) }}\n                        type=\"text\"\n                    />\n                </div>\n                {((this.state.committee && this.state.committee.ChamberCode === \"S\") || (this.state.chamber && this.state.chamber.value === 1) || this.state.scheduleType.ScheduleTypeID === 6) &&\n                    <div className=\"grid-wrapper\">\n                        <label htmlFor=\"remarks\">Remarks</label>\n                        <textarea\n                            id=\"remarks\"\n                            value={this.state.remarks}\n                            onChange={(e) => { this.handleChange(\"remarks\", e.target.value) }}\n                            type=\"text\"\n                        />\n                    </div>\n                }\n                <button className=\"button float-right row-spacer-margin\" type=\"button\" onClick={() => { this.saveSchedule() }} disabled={isSaving}>{!isSaving ? \"Save\" : \"Saving...\"}</button>\n                <button style={{ marginRight: \"10px\" }} className=\"button float-right row-spacer-margin secondary\" type=\"button\" onClick={() => toggleEditMeeting()}>Cancel</button>\n            </div>\n        )\n    }\n}\n\nexport default MeetingsForm;","import React from 'react';\nimport DatePicker from 'react-datepicker';\nimport moment from 'moment-timezone';\n\nclass MeetingsCalendarPreview extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            date: moment()\n        }\n\n        this.setDate = this.setDate.bind(this);\n        this.submit = this.submit.bind(this);\n    }\n\n    setDate(value) {\n        this.setState({\n            date: value || ''\n        })\n    }\n\n    submit() {\n        this.props.getPreview(this.state.date);\n    }\n\n    render() {\n\n        return (\n            <div className=\"dlas-forms\">\n                <h3>Meetings Calendar Preview</h3>\n                <p>You may use this form to generate a preview PDF of all meetings scheduled to appear on the calendar.</p>\n                <div className=\"grid-wrapper meetings-preview\">\n                    <div>\n                        <label>Start Date</label>\n                        <DatePicker\n                            selected={this.state.date ? moment(this.state.date) : null}\n                            onChange={(value) => this.setDate(value)}\n                            dateFormat=\"MM/DD/YYYY\"\n                        />\n                    </div>\n                    <button\n                        type=\"button\"\n                        className=\"button\"\n                        style={{ height: \"32px\", marginTop: \"22px\" }}\n                        disabled={this.state.date === \"\" || this.props.gettingPreview}\n                        onClick={() => this.submit()}\n                    >\n                        Submit\n                    </button>\n                    <div />\n                    <button\n                        type=\"button\"\n                        className=\"button float-right\"\n                        style={{ marginRight: \"10px\", height: \"32px\", marginTop: \"22px\" }}\n                        onClick={() => this.props.toggleMeetingsCalendarPreview()}\n                    >Return to Schedule Management</button>\n                </div>\n                {this.props.gettingPreview ?\n                    <div aria-label=\"Loading\" className=\"center-spinner spinner\"></div>\n                    :\n                    this.props.pdfSrc != \"\" &&\n                    <div>\n                        <div className=\"center full-height\">\n                            <iframe className=\"center\" style={{ width: '100%', height: '1080px', marginTop: \"20px\" }} ref={el => this.pdfRef = el} src={this.props.pdfSrc}></iframe>\n                        </div>\n                    </div>\n                }\n            </div>\n        )\n    }\n}\n\nexport default MeetingsCalendarPreview;","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { committeeActionCreators } from '../../stores/lis-committee-store';\nimport { navActionCreators } from '../../stores/lis-nav-store';\nimport { scheduleActionCreators } from '../../stores/lis-schedule-store';\nimport { sessionActionCreators } from '../../stores/lis-session-store';\nimport MeetingsForm from '../../lis-shared/lis-meetings/lis-meetings-form-component';\nimport MeetingsCalendarPreview from '../../lis-shared/lis-meetings/lis-meetings-calendar-preview';\n\nimport moment from 'moment-timezone';\nimport DatePicker from 'react-datepicker';\nimport Select from 'react-select';\nimport { cancelRequest } from '../../services/request.service';\nimport { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';\nimport renderHTML from 'react-render-html';\nimport { generateCsv } from '../../services/csv.service';\n\nconst tz = moment.tz.guess();\n\nconst getItemStyle = (isDragging, draggableStyle) => ({\n    userSelect: \"none\",\n    padding: '0',\n    background: isDragging ? \"white\" : \"white\",\n    borderBottom: '1px solid #b3b3b3',\n    ...draggableStyle\n});\n\nconst reorder = (list, startIndex, endIndex) => {\n    const result = Array.from(list);\n    const removed = result.splice(startIndex, 1);\n    result.splice(endIndex, 0, removed[0]);\n\n    return result;\n};\n\nconst SCHEDULE_EDITOR = \"Schedule\";\nconst SENATE_SCHEDULE = \"SenateScheduleAuthor\";\n\nconst TIME_REGEX = /[0-9]:[0-9]{2}\\s[AP]M/i;\n\nclass PublicSchedule extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            organizedSchedule: [],\n            currentDayIndex: 0,\n            locationOptions: [],\n            showAllDates: true,\n            isEditing: false,\n            meeting: {},\n            committeeList: [],\n            fullCommitteeList: [],\n            partner: false,\n            isSaving: false,\n            scheduleTypeList: [],\n            startDate: moment().tz('America/New_York'),\n            endDate: null,\n            keyword: '',\n            location: [],\n            calendarList: [],\n            calendarDisabled: true,\n            displayScheduleModal: false,\n            displayMeetingsCalendarPreview: false,\n            pdfSrc: \"\",\n            gettingPreview: false,\n            isDirty: false,\n            showConfirmation: false\n        }\n\n        this.toggleAllDates = this.toggleAllDates.bind(this);\n        this.toggleEditMeeting = this.toggleEditMeeting.bind(this);\n        this.changeDay = this.changeDay.bind(this);\n        this.getCommittees = this.getCommittees.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n        this.handleSearch = this.handleSearch.bind(this);\n        this.handleReset = this.handleReset.bind(this);\n        this.openMeeting = this.openMeeting.bind(this);\n        this.saveMeetings = this.saveMeetings.bind(this);\n        this.createMeeting = this.createMeeting.bind(this);\n        this.toggleCancelMeeting = this.toggleCancelMeeting.bind(this);\n        this.deleteMeeting = this.deleteMeeting.bind(this);\n        this.onDragEnd = this.onDragEnd.bind(this);\n        this.openScheduleModal = this.openScheduleModal.bind(this);\n        this.closeScheduleModal = this.closeScheduleModal.bind(this);\n        this.toggleMeetingsCalendarPreview = this.toggleMeetingsCalendarPreview.bind(this);\n        this.getPreview = this.getPreview.bind(this);\n        this.setFormIsDirty = this.setFormIsDirty.bind(this);\n        this.closeConfirmation = this.closeConfirmation.bind(this);\n        this.handleFileChange = this.handleFileChange.bind(this);\n    }\n\n    changeDay(amount) {\n        let currentDayIndex = this.state.currentDayIndex += amount;\n        this.setState({\n            currentDayIndex: currentDayIndex\n        });\n    }\n\n    toggleAllDates() {\n        this.setState(state => ({\n            showAllDates: !state.showAllDates\n        }));\n    }\n\n    toggleEditMeeting(confirmed) {\n        if (this.state.isDirty && !confirmed) {\n            this.setState({\n                showConfirmation: true\n            })\n        } else {\n            this.setState(state => ({\n                isEditing: !state.isEditing,\n                meeting: { ScheduleID: 0 },\n                isDirty: false,\n                showConfirmation: false\n            }))\n        }\n    }\n\n    getCommittees(sessionParam) {\n        this.props.actions.getCommitteeList(sessionParam + \"&includeSubCommittees=true\").then(() => {\n            let committeeList = [...this.props.committee.committeeList];\n            committeeList.forEach(committee => {\n                committee.label = committee.Name;\n                committee.value = committee.CommitteeID;\n            });\n\n            //create a hierarchical list of committees (groups of committees, each of which contains the parent committee and its subcommittees) for the committee dropdown\n            const committeeDropDownOptions = JSON.parse(JSON.stringify(committeeList)).filter(cmte => !cmte.ParentCommitteeID).map(cmte => {\n                //add the chamber designator to the group header if necessary\n                cmte.label = cmte.label += (this.props.login.userClaims.claims.find(x => x.RoleName === \"Admin\") || (this.props.login.userClaims.claims.find(x => x.RoleName === \"HouseScheduleEditor\") && this.props.login.userClaims.claims.find(x => x.RoleName === \"SenateScheduleEditor\")) ? (' ' + '(' + cmte.ChamberCode + ')') : \"\");\n                //since the header for each group of committees will already contain the chamber code if necessary, the individual options therein do not need it\n                const parentCmteOption = { ...cmte, label: cmte.label && (cmte.label.endsWith(' (H)') || cmte.label.endsWith(' (S)')) ? cmte.label.substr(0, cmte.label.length - 4) : cmte.label }\n                cmte.options = [parentCmteOption].concat([...committeeList].filter(sub => sub.ParentCommitteeID === cmte.CommitteeID));\n\n                return cmte;\n            })\n\n            this.setState({\n                fullCommitteeList: committeeList,\n                committeeList: committeeList.filter(committee => {\n                    if (this.props.login.userClaims.claims.find(x => x.RoleName === \"Admin\")) {\n                        return true;\n                    } else if (committee.ChamberCode === \"H\" && this.props.login.userClaims.claims.find(x => x.RoleName === \"HouseScheduleEditor\") ||\n                        committee.ChamberCode === \"S\" && this.props.login.userClaims.claims.find(x => x.RoleName === \"SenateScheduleEditor\")) {\n                        return true;\n                    }\n                    return false;\n                }),\n                committeeDropDownOptions: committeeDropDownOptions.filter(committee => {\n                    if (this.props.login.userClaims.claims.find(x => x.RoleName === \"Admin\")) {\n                        return true;\n                    } else if (committee.ChamberCode === \"H\" && this.props.login.userClaims.claims.find(x => x.RoleName === \"HouseScheduleEditor\") ||\n                        committee.ChamberCode === \"S\" && this.props.login.userClaims.claims.find(x => x.RoleName === \"SenateScheduleEditor\")) {\n                        return true;\n                    }\n                    return false;\n                }),\n            });\n        });\n    }\n\n    handleChange(value, state) {\n        this.setState({\n            [state]: value\n        })\n    }\n\n    handleSearch(preserveIndex) {\n        const startDate = moment(this.state.startDate).hour(0).minute(0).second(0).format('MM/DD/YYYY HH:mm:ss');\n        const endDate = this.state.endDate ? moment(this.state.endDate).hour(23).minute(59).second(59).format('MM/DD/YYYY HH:mm:ss') : null;\n        const voteRooms = this.state.location.length > 0 ? this.state.location : null;\n\n        let keyword = this.state.keyword;\n\n        this.setState({\n            isLoaded: false,\n            isEditing: false\n        }, () => {\n            let params = \"startDate=\" + startDate;\n            if (endDate) {\n                params += \"&endDate=\" + endDate;\n            }\n\n            this.props.actions.getScheduleList(params, this.state.partner)\n                .then(() => {\n                    if (this.props.schedule.scheduleListError) {\n                        throw this.props.schedule.scheduleListError;\n                    }\n                    let scheduleList = this.props.schedule.scheduleList\n                    // Filter out the results that are not part of the search\n                    if (keyword) {\n                        //Get rid of white space and make sure its all in lowercase so elements that are close to the search are included as well\n                        keyword = keyword.replace(/\\s/g, '');\n                        keyword = keyword.toLowerCase();\n                        scheduleList = scheduleList.filter(item => {\n                            const roomDescription = item.RoomDescription ? item.RoomDescription.replace(/\\s/g, '') : '';\n                            const description = item.Description ? item.Description.replace(/\\s/g, '') : '';\n                            const comments = item.Comments ? item.Comments.replace(/\\s/g, '') : '';\n                            const time = item.ScheduleTime ? item.ScheduleTime.replace(/\\s/g, '') : '';\n                            const ownerName = item.OwnerName ? item.OwnerName.replace(/\\s/g, '') : '';\n                            if (roomDescription.toLowerCase().includes(keyword) ||\n                                description.toLowerCase().includes(keyword) ||\n                                comments.toLowerCase().includes(keyword) ||\n                                time.toLowerCase().includes(keyword) ||\n                                ownerName.toLowerCase().includes(keyword)) {\n                                return item;\n                            }\n                        });\n                    }\n                    if (voteRooms) {\n                        scheduleList = scheduleList.filter(item => {\n                            if (voteRooms.find(room => room.VoteRoomID === item.VoteRoomID)) {\n                                return (item);\n                            }\n                        });\n                    }\n                    if (scheduleList.length === 0) {\n                        this.setState({\n                            isLoaded: true\n                        })\n                    }\n                    const organizedSchedule = this.organizeSchedule(scheduleList)\n                    this.setState({\n                        isLoaded: true,\n                        organizedSchedule: organizedSchedule,\n                        currentDayIndex: preserveIndex ? this.state.currentDayIndex : 0,\n                        scheduleError: null,\n                        calendarList: scheduleList\n                    });\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.setState({\n                        isLoaded: true,\n                        scheduleError: err\n                    });\n                });\n        });\n    }\n\n    handleReset() {\n        this.setState({\n            location: [],\n            keyword: '',\n            startDate: moment().tz('America/New_York'),\n            endDate: null\n        }, () => {\n            this.handleSearch();\n        })\n    }\n\n    organizeSchedule(scheduleList) {\n        // Turn the list of schedule items into a list of dates each containing a list of schedule items\n        // This formatting is done so the schedule can be listed in the table with a date as a container\n        scheduleList.sort((a, b) => {\n            const dateComp = new Date(a.ScheduleDate) - new Date(b.ScheduleDate);\n            if (dateComp !== 0) {\n                return dateComp;\n            }\n\n            const timeA = moment(a.TimeDescription, \"h:mm A\");\n            const timeB = moment(b.TimeDescription, \"h:mm A\");\n            if (timeA.isValid() && timeB.isValid()) {\n                if (timeA.isBefore(timeB)) return -1;\n                if (timeA.isAfter(timeB)) return 1;\n            }\n            return 0;\n        });\n        let organizedSchedule = [];\n        let scheduleArray = [];\n        let previousSchedule = scheduleList[0];\n        scheduleList.forEach(schedule => {\n            const scheduleDateTime = this.getScheduleDateTime(schedule);\n            const previousScheduleDateTime = this.getScheduleDateTime(previousSchedule);\n\n            if (!schedule.DisplaySequence) {\n                schedule.DisplaySequence = 999;\n            }\n\n            if (!previousScheduleDateTime.isSame(scheduleDateTime, 'day')) {\n                //Add the list of legislation to the category\n                //Organize the times so that the hour/minute times are in their seperate containers, this is done to help with formatting\n                let newDateContainer = {\n                    Times: this.organizeTimes(scheduleArray),\n                    Date: previousScheduleDateTime.format(\"L\"),\n                };\n                organizedSchedule.push(newDateContainer);\n                //Empty out the leg array so we can use it for another category\n                scheduleArray = [];\n                //Add the first item to the next category\n                scheduleArray.push(schedule);\n            } else {\n                scheduleArray.push(schedule);\n            }\n            //Set this variable so the next iteration will know what the schedule date of the previous iteration was\n            previousSchedule = schedule;\n        });\n        //If the schedule array still has elements then that means not every schedule item in the results has been added to a container\n        //So, check to see if the schedule array has elements and if so create another container\n        if (scheduleArray.length > 0) {\n            let newDateContainer = {\n                Times: this.organizeTimes(scheduleArray),\n                Date: this.getScheduleDateTime(scheduleArray[0]).format(\"L\")\n            };\n            organizedSchedule.push(newDateContainer);\n        }\n\n        return organizedSchedule;\n    }\n\n    organizeTimes(itemsList) {\n        itemsList.sort((a, b) => {\n            return a.DisplaySequence < b.DisplaySequence ? -1 : a.DisplaySequence > b.DisplaySequence ? 1 : 0\n        })\n\n        let organizedTimes = [];\n        let items = [];\n        let time = \"\";\n\n        for (let i = 0; i < itemsList.length; i++) {\n            //If a ScheduleTime has been specified then use that, otherwise get the time from the ScheduleDate but do not display it in the list\n            let currentTime = \"\";\n\n            //If we've entered a new time then push the current time and sorted items into organizedTimes and reset variables\n            if (currentTime !== time) {\n                if (items.length > 0) {\n                    items.sort((a, b) => a.DisplaySequence - b.DisplaySequence);\n                    organizedTimes.push({\n                        Items: items,\n                        Time: time\n                    });\n                }\n\n                time = currentTime;\n                items = [itemsList[i]];\n            } else {\n                items.push(itemsList[i]);\n            }\n        }\n\n        //Sort and push the last time and sorted items\n        items.sort((a, b) => a.DisplaySequence - b.DisplaySequence);\n        organizedTimes.push({\n            Items: items,\n            Time: time\n        })\n\n        return organizedTimes;\n    }\n\n    getScheduleDateTime(schedule) {\n        const scheduleDate = moment(schedule.ScheduleDate);\n        const scheduleTime = moment(schedule.ScheduleTime, \"h:mm A\").isValid() && moment(schedule.ScheduleTime, \"h:mm A\");\n        return scheduleDate.hour(scheduleTime ? scheduleTime.hour() : scheduleDate.hour()).minute(scheduleTime ? scheduleTime.minute() : scheduleDate.minute()).second(scheduleTime ? scheduleTime.second() : scheduleDate.second()).tz('America/New_York', true).local();\n    }\n\n    openMeeting(meeting) {\n        this.setState({\n            meeting: meeting,\n            isEditing: true,\n            isDirty: false\n        }, () => {\n            window.scrollTo({\n                top: 0,\n                behavior: 'smooth'\n            })\n        })\n    }\n\n    saveMeetings(meetings, callback) {\n        this.setState({\n            isSaving: true\n        }, () => {\n            this.props.actions.saveSchedule(meetings)\n                .then((result) => {\n                    this.props.actions.makeToast([{ message: \"Schedule Saved\", type: \"success\" }]);\n                    this.setState({\n                        isSaving: false,\n                        showPopup: false,\n                        isDirty: false\n                    }, () => {\n                        //Refresh the data\n                        this.handleSearch(true);\n                        if (callback)\n                            callback();\n                    })\n                })\n                .catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n                    this.setState({\n                        isSaving: false,\n                    });\n                });\n        })\n    }\n\n    createMeeting(meeting) {\n        this.setState({\n            isSaving: true\n        }, () => {\n            this.props.actions.createSchedule(meeting)\n                .then((response) => {\n                    this.props.actions.makeToast([{ message: \"Schedule Saved\", type: \"success\" }]);\n                    this.setState({\n                        isSaving: false,\n                        isEditing: false,\n                        isDirty: false\n                    }, () => {\n                        this.handleSearch();\n                    })\n                })\n                .catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n                    this.setState({\n                        isSaving: false,\n                    });\n                });\n        })\n    }\n\n    toggleCancelMeeting(meeting) {\n        meeting.IsCancelled = !meeting.IsCancelled\n        let params = {\n            Schedules: [\n                meeting\n            ]\n        };\n        this.saveMeetings(params);\n    }\n\n    deleteMeeting(meeting, onFail) {\n        let promises = [];\n        meeting.ScheduleFiles?.forEach(scheduleFile => {\n            promises.push(this.handleFileChange(null, scheduleFile, true, null, meeting));\n        });\n        Promise.all(promises).then(() => {\n            meeting.DeletionDate = moment();\n            let params = {\n                Schedules: [\n                    meeting\n                ]\n            };\n            this.saveMeetings(params);\n        }).catch(() => {\n            if (onFail) onFail();\n        })\n    }\n\n    async handleFileChange(e, originalFile, isDelete, callback, deleteMeeting) {\n        if (isDelete || e.target.files[0]) {\n            let meeting = deleteMeeting ?? { ...this.state.meeting };\n            let originalFileIdx = -1;\n            let params = '?scheduleID=' + meeting.ScheduleID;\n            if (isDelete) params += \"&IsDeleted=true\";\n            if (originalFile) params += \"&FileURL=\" + originalFile.FileURL + \"&FileID=\" + originalFile.FileID;\n            await this.props.actions.uploadMeetingPdf(params, isDelete ? null : e.target.files[0]).then(() => {\n                const res = this.props.schedule.uploadMeetingPdf;\n                let update = false;\n                if (originalFile) {\n                    originalFileIdx = meeting.ScheduleFiles.findIndex(f => f.FileURL === originalFile.FileURL);\n                    if (originalFileIdx > -1) {\n                        if (isDelete) {\n                            meeting.ScheduleFiles.splice(originalFileIdx, 1);\n                        } else {\n                            meeting.ScheduleFiles[originalFileIdx] = res;\n                            update = true;\n                        }\n                    } else if (!isDelete) {\n                        meeting.ScheduleFiles.push(res);\n                    }\n                } else if (!isDelete) {\n                    meeting.ScheduleFiles.push(res);\n                }\n                this.setState({\n                    meeting: deleteMeeting ? this.state.meeting : meeting\n                }, () => {\n                    if (callback) callback(meeting.ScheduleFiles, update, originalFileIdx, res.FileURL)\n                })\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err);\n                this.props.actions.makeToast([{ message: isDelete ? \"PDF Delete Failed\" : \"PDF Upload Failed\", type: \"failure\" }]);\n                return Promise.reject();\n            })\n        }\n    }\n\n    onDragEnd(date, result) {\n        if (!result.destination) {\n            return;\n        }\n\n        //Exit if there is no change\n        if (result.destination.index === result.source.index) {\n            return;\n        }\n\n        let scheduleDate = JSON.parse(JSON.stringify(this.state.organizedSchedule.find(x => x.Date === date)));\n        let flatMappedSchedules = scheduleDate.Times.flatMap(t => t.Items);\n        let [removed] = flatMappedSchedules.splice(result.source.index, 1);\n        flatMappedSchedules.splice(result.destination.index, 0, removed);\n\n        //Exit if meetings have been moved out of timely order\n        /* let outOfOrder;\n        flatMappedSchedules.filter(i => i.ScheduleTime && moment(i.ScheduleTime, \"h:mm A\").isValid()).map(i => i.ScheduleTime).every((time, idx, arr) => {\n            const returnValue = !idx || moment(arr[idx - 1], \"h:mm A\").isSameOrBefore(moment(time, \"h:mm A\"));\n            if (!returnValue) {\n                outOfOrder = arr[idx - 1] + ' cannot be sequenced before ' + time;\n            }\n            return returnValue;\n        })\n        if (outOfOrder) {\n            this.props.actions.makeToast([{ message: outOfOrder, type: \"failure\" }]);\n            return;\n        } */\n\n        // Reorder the DisplaySequence value too!\n        flatMappedSchedules.forEach((element, index) => {\n            element.DisplaySequence = index + 1\n        });\n\n        const organizedDate = this.organizeSchedule(flatMappedSchedules);\n        const scheduleDateItems = organizedDate[0].Times.flatMap(t => t.Items);\n\n        let params = {\n            Schedules: scheduleDateItems\n        }\n\n        this.setState({\n            isSavingDrag: date\n        }, () => {\n            this.saveMeetings(params, () => {\n                this.setState({ isSavingDrag: false })\n            });\n        })\n    }\n\n    fetchCsv(showDates) {\n        let rows = [];\n        let meetingDate, meetingTime, lastDate, lastTime;\n\n        showDates.forEach(date => {\n            date.Times.forEach(time => {\n                time.Items.forEach(item => {\n                    //Leave Date and/or Time blank if previous meeting takes place at the same date and/or time\n                    let dateDate = moment(date.Date).format(\"MM/DD/YYYY\");\n                    meetingDate = !lastDate || !moment(dateDate).isSame(lastDate, 'day') ? dateDate : \"\";\n                    meetingTime = time.Time !== lastTime ? time.Time : \"\";\n\n                    rows.push({ Date: meetingDate, Time: item.IsCancelled ? \"Cancelled\" : moment(meetingTime, \"h:mm A\").isValid() ? moment(meetingTime, \"h:mm A\").tz('America/New_York', true).local().format(\"h:mm A\") : meetingTime, Meeting: item.OwnerName, Location: item.RoomDescription, Description: item.Description });\n\n                    lastDate = this.getScheduleDateTime(item).format(\"MM/DD/YYYY\");\n                    lastTime = item.ScheduleTime;\n                })\n            });\n        })\n\n        let fileName = showDates.length > 1 ? showDates[0].Date + \"-\" + showDates[showDates.length - 1].Date + \"_Schedule.csv\" : showDates[0].Date + \"_Schedule.csv\"\n\n        saveAs(new Blob([generateCsv([\"Date\", \"Time\", \"Meeting\", \"Location\", \"Description\"], rows)], { type: \"data:text/csv;charset=utf-8,\" }), fileName);\n    }\n\n    openScheduleModal() {\n        this.setState({\n            displayScheduleModal: true\n        })\n    }\n\n    closeScheduleModal() {\n        this.setState({\n            displayScheduleModal: false\n        })\n    }\n\n    toggleMeetingsCalendarPreview() {\n        this.setState({\n            displayMeetingsCalendarPreview: !this.state.displayMeetingsCalendarPreview\n        })\n    }\n\n    getPreview(date) {\n        this.setState({ gettingPreview: true }, () => {\n            this.props.actions.getMeetingsCalendarPreview(\"?startDate=\" + moment(date).format(\"MM/DD/YYYY\"))\n                .then(() => {\n                    if (this.props.schedule.meetingsCalendarPreview !== \"\") {\n                        this.props.schedule.meetingsCalendarPreview.body.getReader().read().then(({ value }) => {\n                            const blob = new Blob([value], { type: \"application/pdf\" });\n                            const urlObj = URL.createObjectURL(blob);\n                            this.setState({\n                                pdfSrc: urlObj,\n                                gettingPreview: false\n                            });\n                        }).catch(() => {\n                            this.setState({ gettingPreview: false })\n                        })\n                    } else {\n                        this.setState({ gettingPreview: false })\n                    }\n                }).catch(() => {\n                    this.setState({ gettingPreview: false })\n                })\n        })\n    }\n\n    componentDidMount() {\n        this.setState({\n            partner: Boolean(this.props.login.userClaims.resources.find(resource => resource === SCHEDULE_EDITOR))\n        })\n\n        this.props.actions.getScheduleTypeList().then(() => {\n            this.setState({\n                scheduleTypeList: Array.from(this.props.schedule.scheduleTypeList, obj => {\n                    const rObj = {\n                        ...obj,\n                        value: obj.ScheduleTypeID,\n                        label: obj.ScheduleType\n                    };\n                    return rObj;\n                })\n            })\n        })\n\n        this.props.actions.getMeetingRoomReferences('').then(() => {\n            const meetingRoomsList = Array.from(this.props.schedule.meetingRoomReferences, obj => {\n                const rObj = {\n                    ...obj,\n                    value: obj.VoteRoomID,\n                    label: obj.Description + ' ' + (obj.RoomNumber || '')\n                };\n                return rObj;\n            });\n            this.setState({\n                locationOptions: meetingRoomsList\n            });\n        })\n\n        this.props.actions.getSessionList()\n            .then(() => {\n                let selectedSession = '';\n                this.props.session.sessionList.forEach(session => {\n                    if (session.SessionCode === this.props.nav.session) {\n                        selectedSession = session;\n                    }\n                });\n\n                if (!selectedSession) {\n                    selectedSession = this.props.session.sessionList.find(s => s.IsDefault);\n                }\n\n                this.setState({\n                    sessionOptions: this.props.session.sessionList,\n                    selectedSession: selectedSession.SessionID\n                });\n                const sessionParam = \"sessionID=\" + selectedSession.SessionID;\n\n                this.getCommittees(sessionParam);\n            });\n\n        this.handleSearch();\n    }\n\n    setFormIsDirty(value) {\n        this.setState({\n            isDirty: value\n        })\n    }\n\n    closeConfirmation() {\n        this.setState({\n            showConfirmation: false\n        })\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    componentDidUpdate(prevProps) {\n        if (JSON.stringify(prevProps.login.userClaims.resources) !== JSON.stringify(this.props.login.userClaims.resources)) {\n            //Disable/Remove management controls if user logs out or otherwise loses Schedule role\n            const isPartner = Boolean(this.props.login.userClaims.resources.find(resource => resource === SCHEDULE_EDITOR));\n            this.setState({ partner: isPartner }, () => {\n                this.handleSearch();\n            })\n        }\n    }\n\n    render() {\n        const { isLoaded, organizedSchedule, currentDayIndex, locationOptions, showAllDates, committeeList, scheduleTypeList, meeting, isEditing, partner, isSaving, isSavingDrag, startDate, endDate, keyword, location, displayScheduleModal, displayMeetingsCalendarPreview } = this.state\n        //If the option to show all is selected then this array will contain every date. If the option to show one then this array will only contain one item\n        const showDates = showAllDates ? organizedSchedule : [organizedSchedule[currentDayIndex]];\n        return (\n            <div id=\"schedule-page\">\n                {this.state.showConfirmation &&\n                    <div className=\"schedule-modal\">\n                        <div className=\"schedule-modal-content\">\n                            <p>You have unsaved changes. Are you sure you want to close the form?</p>\n                            <button className=\"button secondary float-right\" onClick={() => this.closeConfirmation()}>No</button>\n                            <button className=\"button primary float-right\" onClick={() => this.toggleEditMeeting(true)} style={{ marginRight: \"10px\" }}>Yes</button>\n                            <br />\n                        </div>\n                    </div>\n                }\n                {displayMeetingsCalendarPreview ?\n                    <MeetingsCalendarPreview\n                        toggleMeetingsCalendarPreview={this.toggleMeetingsCalendarPreview}\n                        pdfSrc={this.state.pdfSrc}\n                        getPreview={this.getPreview}\n                        gettingPreview={this.state.gettingPreview}\n                    />\n                    :\n                    <React.Fragment>\n                        <br />\n                        {displayScheduleModal &&\n                            <ScheduleModal\n                                closeScheduleModal={this.closeScheduleModal}\n                            />\n                        }\n                        <div id=\"schedule-table\">\n                            <div className=\"inner-grid one-and-three no-margin\">\n                                <EventFinder\n                                    organizedSchedule={organizedSchedule}\n                                    handleChange={this.handleChange}\n                                    handleSearch={this.handleSearch}\n                                    handleReset={this.handleReset}\n                                    locationOptions={locationOptions}\n                                    isLoaded={isLoaded}\n                                    startDate={startDate}\n                                    endDate={endDate}\n                                    keyword={keyword}\n                                    location={location}\n                                />\n                                {isLoaded ?\n                                    <div>\n                                        <div className=\"section-side-padding\">\n                                            <div className=\"header-half\">\n                                                <div style={{ display: \"grid\" }}>\n                                                    <h2 style={{ marginBlockStart: '0px', marginBlockEnd: '0px' }}>Schedule of Events</h2>\n                                                    {tz !== \"America/New_York\" && <div><small><em>Times are displayed in your local timezone ({moment().tz(tz).format(\"zz\")})</em></small></div>}\n                                                </div>\n                                                <div className=\"align-right meeting-actions\">\n                                                    {this.props.login.userClaims.resources.find(resource => resource === SCHEDULE_EDITOR) &&\n                                                        <button\n                                                            type=\"button\"\n                                                            className=\"button\"\n                                                            style={{ marginRight: \"10px\", width: \"188px\", padding: \"8px 5px\" }}\n                                                            onClick={this.toggleMeetingsCalendarPreview}\n                                                        >Meeting Calendar Preview</button>\n                                                    }\n                                                    {partner &&\n                                                        <button\n                                                            type=\"button\"\n                                                            className=\"button\"\n                                                            style={{ marginRight: \"10px\" }}\n                                                            onClick={this.toggleEditMeeting}\n                                                        >Add Meeting</button>\n                                                    }\n                                                    <button className=\"button-link\" onClick={this.toggleAllDates}>{showAllDates ? \"Show Day\" : \"Show All\"}</button>\n                                                    {showDates[0] != undefined &&\n                                                        <React.Fragment>\n                                                            <a target=\"_blank\" onClick={() => this.fetchCsv(showDates)} style={{ marginLeft: \"10px\" }}>\n                                                                <span title=\"Download events as a spreadsheet\" aria-label=\"Download events as a spreadsheet\" role=\"button\" className=\"icon csv\"></span>\n                                                            </a>\n                                                            <button title=\"Add selected events to your calendar\" role=\"button\" aria-label=\"Add selected events to your calendar\" className=\"icon calendar\" /* target=\"_blank\" */ style={{ marginLeft: \"10px\" }} onClick={() => this.openScheduleModal()} />\n                                                        </React.Fragment>\n                                                    }\n                                                </div>\n                                            </div>\n                                        </div>\n                                        {isEditing && partner &&\n                                            <MeetingsForm\n                                                meeting={meeting}\n                                                committeeList={committeeList}\n                                                committeeDropDownOptions={this.state.committeeDropDownOptions || []}\n                                                locationList={locationOptions}\n                                                scheduleTypeList={scheduleTypeList}\n                                                isSaving={isSaving}\n                                                saveMeetings={this.saveMeetings}\n                                                createMeeting={this.createMeeting}\n                                                toggleEditMeeting={this.toggleEditMeeting}\n                                                userClaims={this.props.login.userClaims}\n                                                getSubcommitteeMembers={this.props.actions.getSubcommitteeMembers}\n                                                subcommitteeMembers={this.props.schedule.subcommitteeMembers}\n                                                setFormIsDirty={this.setFormIsDirty}\n                                                isDirty={this.state.isDirty}\n                                                handleFileChange={this.handleFileChange}\n                                                organizedSchedule={this.state.organizedSchedule}\n                                            />}\n                                        {this.state.scheduleError ?\n                                            <div className=\"center\">\n                                                <p>{this.state.scheduleError}</p>\n                                            </div>\n                                            :\n                                            <div className=\"schedule-content-wrapper\">\n                                                {showDates[0] != undefined\n                                                    ? showDates.map((currentDay, keyIndex) =>\n                                                        <div key={keyIndex}>\n                                                            <div className=\"day-wrapper\">\n                                                                {!showAllDates &&\n                                                                    <React.Fragment>\n                                                                        <div style={{ float: 'left' }}>\n                                                                            {organizedSchedule[currentDayIndex - 1] &&\n                                                                                <button aria-label=\"Previous day\" title=\"Previous day\" type=\"button\" onClick={() => this.changeDay(-1)} className=\"icon button-left\"></button>\n                                                                            }\n                                                                        </div>\n                                                                        <div style={{ float: 'right' }}>\n                                                                            {organizedSchedule[currentDayIndex + 1] &&\n                                                                                <button aria-label=\"Next day\" title=\"Next day\" type=\"button\" onClick={() => this.changeDay(1)} className=\"icon button-right\"></button>\n                                                                            }\n                                                                        </div>\n                                                                    </React.Fragment>\n                                                                }\n                                                                <div className=\"center mobile-left\">\n                                                                    <h4>{moment(currentDay.Date).format('dddd, MMMM Do, YYYY')}</h4>\n                                                                </div>\n                                                            </div>\n                                                            <div className=\"section-side-padding\">\n                                                                <div className=\"side-form\">\n                                                                    {partner ?\n                                                                        <PartnerSchedule\n                                                                            currentDay={currentDay}\n                                                                            session={this.props.nav.session}\n                                                                            openMeeting={this.openMeeting}\n                                                                            deleteMeeting={this.deleteMeeting}\n                                                                            toggleCancelMeeting={this.toggleCancelMeeting}\n                                                                            onDragEnd={this.onDragEnd}\n                                                                            isSaving={isSaving}\n                                                                            isSavingDrag={isSavingDrag}\n                                                                            calendarList={this.state.calendarList}\n                                                                            fullCommitteeList={this.state.fullCommitteeList}\n                                                                        />\n                                                                        :\n                                                                        <Schedule\n                                                                            currentDay={currentDay}\n                                                                            session={this.props.nav.session}\n                                                                            calendarList={this.state.calendarList}\n                                                                            fullCommitteeList={this.state.fullCommitteeList}\n                                                                        />\n                                                                    }\n                                                                </div>\n                                                            </div>\n                                                        </div>\n                                                    )\n                                                    :\n                                                    <p style={{ textAlign: \"center\" }}>Nothing Scheduled</p>\n                                                }\n                                            </div>\n                                        }\n                                    </div>\n                                    :\n                                    <div className=\"center-spinner spinner\">Loading...</div>\n                                }\n                            </div>\n                        </div>\n                    </React.Fragment>\n                }\n            </div>\n\n        );\n    }\n}\n\nclass EventFinder extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            showSection: window.innerWidth <= 900 ? false : true //900px is when mobile layout is used (set in mobile.scss); collapse by default\n        };\n        this.toggleSection = this.toggleSection.bind(this);\n        this.searchOnEnterPress = this.searchOnEnterPress.bind(this);\n    }\n\n    searchOnEnterPress(event) {\n        if (event.key === 'Enter' && this.props.isLoaded) {\n            //Pressing enter while on a react-select will select an option. A search should not happen because of that.\n            if (!event.target.id.includes('react-select') && !event.target.className.includes('quick-search') && !event.target.id.includes('description')) {\n                this.props.handleSearch();\n            }\n        }\n    }\n\n    componentDidMount() {\n        document.querySelector('body').addEventListener('keydown', this.searchOnEnterPress);\n    }\n\n    componentWillUnmount() {\n        document.querySelector('body').removeEventListener('keydown', this.searchOnEnterPress);\n    }\n\n    toggleSection() {\n        this.setState(state => ({\n            showSection: !state.showSection\n        }));\n    }\n\n    render() {\n        const { locationOptions, handleChange, handleSearch, handleReset, startDate, endDate, keyword, location } = this.props;\n\n        const customStyles = {\n            option: (base, state) => ({\n                ...base,\n                fontSize: '0.8em',\n            }),\n            control: (base) => ({\n                ...base,\n                padding: '1px',\n                margin: 0,\n                minHeight: 0,\n                fontSize: '0.8em',\n            }),\n            singleValue: (base, state) => {\n                return { ...base, };\n            },\n            dropdownIndicator: base => ({\n                ...base,\n                padding: '0px 8px'\n            })\n        }\n\n        return (\n            <div className=\"section-side-padding\" style={{ paddingBottom: '0' }}>\n                <div className=\"dlas-forms side-form event-finder\">\n                    <div className=\"header flex-row flex-vertical-center\">\n                        <h3 className=\"center\" style={{ margin: 'auto' }}>Find an Event</h3>\n                        <button onClick={this.toggleSection} type=\"button\" className={this.state.showSection ? \"arrow-up white-chevron\" : \"arrow-down white-chevron\"}></button>\n                    </div>\n                    {this.state.showSection &&\n                        <div className=\"content\">\n                            <div>\n                                <div>\n                                    <label htmlFor=\"start-date-datepicker\">Start Date</label>\n                                    <DatePicker\n                                        selected={startDate}\n                                        onChange={(val) => handleChange(val, \"startDate\")}\n                                        id=\"start-date-datepicker\"\n                                    />\n                                </div>\n                                <div>\n                                    <label htmlFor=\"end-date-datepicker\">End Date</label>\n                                    <DatePicker\n                                        isClearable\n                                        selected={endDate}\n                                        onChange={(val) => handleChange(val, \"endDate\")}\n                                        id=\"end-date-datepicker\"\n                                        todayButton=\"Today\"\n                                    />\n                                </div>\n                            </div>\n                            <div>\n                                <div>\n                                    <label htmlFor=\"keyword-input\">Keyword</label>\n                                    <div>\n                                        <input\n                                            type=\"text\"\n                                            id=\"keyword-input\"\n                                            value={keyword}\n                                            onChange={(e) => handleChange(e.target.value, \"keyword\")}\n                                        />\n                                    </div>\n                                </div>\n                                <div>\n                                    <label htmlFor=\"location-dropdown\">Location</label>\n                                    <Select\n                                        id=\"location-dropdown\"\n                                        value={location}\n                                        options={locationOptions}\n                                        isMulti\n                                        onChange={(val) => handleChange(val || [], \"location\")}\n                                        styles={customStyles}\n                                    />\n                                </div>\n                            </div>\n                            <br />\n                            <div className=\"center flex-row\">\n                                <button onClick={handleReset} type=\"button\" className=\"button secondary\">Clear</button>\n                                <button onClick={handleSearch} type=\"button\" className=\"button\">Search</button>\n                            </div>\n                        </div>\n                    }\n                </div>\n            </div>);\n    }\n}\n\nclass PartnerSchedule extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            showPopup: false,\n            selectedMeeting: {}\n        }\n\n        this.togglePopup = this.togglePopup.bind(this)\n    }\n\n    togglePopup(selectedMeeting) {\n        this.setState({\n            showPopup: !this.state.showPopup,\n            selectedMeeting: selectedMeeting\n        });\n    }\n\n    render() {\n        const { session, currentDay, openMeeting, deleteMeeting, toggleCancelMeeting, onDragEnd, isSaving, isSavingDrag, calendarList, fullCommitteeList } = this.props;\n        return (\n            <React.Fragment>\n                {this.state.showPopup &&\n                    <div className='popup'>\n                        <div className='popup-inner'>\n                            <p>Are you sure you want to delete this meeting?</p>\n                            <div className=\"inline-list\">\n                                <button className=\"button danger\" disabled={isSaving} onClick={() => { deleteMeeting(this.state.selectedMeeting, () => { this.togglePopup({}) }) }}>Yes</button>\n                                <button className=\"button\" disabled={isSaving} onClick={() => { this.togglePopup({}) }}>No</button>\n                            </div>\n                        </div>\n                    </div>}\n                <DragDropContext onDragEnd={result => onDragEnd(currentDay.Date, result)}>\n                    <Droppable droppableId={currentDay.Date} index={currentDay.Date}>\n                        {(provided) => (\n                            <div\n                                {...provided.droppableProps}\n                                ref={provided.innerRef}\n                            >\n                                {isSavingDrag && isSavingDrag.toString() === currentDay.Date.toString() ? <div className=\"spinner\" /> :\n                                    currentDay.Times.map((time, timeIndex) =>\n                                        time.Items.map((item, itemIndex) =>\n                                            !item.DeletionDate &&\n                                            <Draggable key={!timeIndex ? itemIndex : currentDay.Times.filter((t, idx) => idx < timeIndex).flatMap(t => t.Items).length + itemIndex} draggableId={item.ScheduleID.toString() || (currentDay.Date + '|' + time + '|' + itemIndex)} index={!timeIndex ? itemIndex : currentDay.Times.filter((t, idx) => idx < timeIndex).flatMap(t => t.Items).length + itemIndex}>\n                                                {(provided, snapshot) =>\n                                                    <div\n                                                        ref={provided.innerRef}\n                                                        {...provided.draggableProps}\n                                                        {...provided.dragHandleProps}\n                                                        style={getItemStyle(\n                                                            snapshot.isDragging,\n                                                            provided.draggableProps.style\n                                                        )}\n                                                        className=\"inner-grid no-grid-column-gap two-col-sidebar-backwards schedule-event\"\n                                                    >\n                                                        <div className=\"time-wrapper\">\n                                                            <span className=\"txt-greyed\">{TIME_REGEX.test(item.ScheduleTime) && item.ScheduleTime}</span>\n                                                        </div>\n                                                        <div className=\"items-wrapper\">\n                                                            <div className=\"schedule-event-grid\">\n                                                                <div>\n                                                                    <button id={\"schedule-dnd-\" + item.ScheduleID} className=\"button draggable\">Drag and drop</button>\n                                                                </div>\n                                                                <div>\n                                                                    {item.IsCancelled && <div><b className=\"fail\">CANCELLED</b></div>}\n                                                                    {item.OwnerName && <div><span className=\"schedule-title\">{item.OwnerName}</span></div>}\n                                                                    <span>\n                                                                        {item.RoomDescription && <React.Fragment>{item.RoomDescription + ' ' + (item.RoomNumber || '')}</React.Fragment>}\n                                                                        {item.RoomDescription && item.OwnerID !== undefined && <span className='mobile-newline'>&nbsp;|&nbsp;</span>}\n                                                                        {(item.ScheduleType === \"Committee\" || item.ScheduleType === \"Docket\") && item.OwnerID !== undefined &&\n                                                                            <Link to={`/session-details/${session}/committee-information/${item.CommitteeNumber}/committee-details`} target=\"_blank\">{fullCommitteeList.find(x => x.CommitteeID === item.OwnerID) && fullCommitteeList.find(x => x.CommitteeID === item.OwnerID).ParentCommitteeID !== null ? \"Subcommittee Info\" : \"Committee Info\"}</Link>\n                                                                        }\n                                                                        {item.LinkURL !== undefined && item.LinkURL !== \"\" &&\n                                                                            <React.Fragment>\n                                                                                {(item.ScheduleType === \"Committee\" || item.ScheduleType === \"Docket\") && item.OwnerID !== undefined\n                                                                                    ? <React.Fragment> | <Link to={item.LinkURL.substr(item.LinkURL.indexOf(\".gov\") + 4, item.LinkURL.length + 1)} target=\"_blank\">Docket Info</Link></React.Fragment>\n                                                                                    : <Link to={item.LinkURL.substr(item.LinkURL.indexOf(\".gov\") + 4, item.LinkURL.length + 1)} target=\"_blank\">Docket Info</Link>\n                                                                                }\n                                                                            </React.Fragment>\n                                                                        }\n                                                                    </span>\n                                                                    {!TIME_REGEX.test(item.ScheduleTime) &&\n                                                                        <div style={{ overflowWrap: 'anywhere', whiteSpace: 'pre-wrap' }}>\n                                                                            <span>{item.ScheduleTime}</span>\n                                                                        </div>}\n                                                                    {item.Description &&\n                                                                        <div style={{ overflowWrap: 'anywhere', whiteSpace: 'pre-wrap' }}>\n                                                                            <span>{renderHTML(item.Description)}</span>\n                                                                        </div>}\n                                                                </div>\n                                                                <div className=\"schedule-management-controls\">\n                                                                    <a className=\"icon edit\" onClick={() => openMeeting(item)} />\n                                                                    <React.Fragment>{item.IsCancelled ? <a className=\"icon blue-checkmark\" onClick={() => toggleCancelMeeting(item)} /> : <a className=\"icon blocked\" onClick={() => toggleCancelMeeting(item)} />} </React.Fragment>\n                                                                    <a className=\"icon bin\" onClick={() => this.togglePopup(item)} />\n                                                                </div>\n                                                            </div>\n                                                        </div>\n                                                    </div>\n                                                }\n                                            </Draggable>\n                                        )\n                                    )}\n                                {provided.placeholder}\n                            </div>\n                        )}\n                    </Droppable>\n                </DragDropContext>\n            </React.Fragment>\n        );\n    }\n}\n\nclass Schedule extends React.Component {\n\n    render() {\n        const { session, currentDay, calendarList, fullCommitteeList } = this.props;\n        return (\n            <div className=\"meeting-day\">\n                {currentDay.Times.map((time, timeIndex) =>\n                    time.Items.find(x => x.IsPublic === true) && /* If there is any public meeting in the time display it, otherwise don't show the time. */\n                    <React.Fragment key={timeIndex}>\n                        {time.Items.map((item, itemIndex) =>\n                            item.IsPublic &&\n                            <div className=\"inner-grid no-grid-column-gap two-col-sidebar-backwards-alt-2 schedule-event\">\n                                <div className=\"public-time-wrapper\">\n                                    <span className=\"txt-greyed\">{item.ScheduleTime}</span>\n                                </div>\n                                <div>\n                                    <div className=\"inner-grid no-grid-column-gap schedule-checkbox-and-content\">\n                                        <div key={itemIndex} className=\"public-schedule-event\">\n                                            {item.IsCancelled && <div><b className=\"fail\">CANCELLED</b></div>}\n                                            <div>\n                                                {item.OwnerName && <div><span className=\"schedule-title\">{item.OwnerName}</span></div>}\n                                                <span>\n                                                    {item.RoomDescription && <React.Fragment>{item.RoomDescription + ' ' + (item.RoomNumber || '')}</React.Fragment>}\n                                                    {item.RoomDescription && item.OwnerID !== undefined && <span className='mobile-newline'>&nbsp;|&nbsp;</span>}\n                                                    {(item.ScheduleType === \"Committee\" || item.ScheduleType === \"Docket\") && item.OwnerID !== undefined &&\n                                                        <Link to={`/session-details/${session}/committee-information/${item.CommitteeNumber}/committee-details`} target=\"_blank\">{fullCommitteeList.find(x => x.CommitteeID === item.OwnerID) && fullCommitteeList.find(x => x.CommitteeID === item.OwnerID).ParentCommitteeID !== null ? \"Subcommittee Info\" : \"Committee Info\"}</Link>\n                                                    }\n                                                    {item.LinkURL !== undefined && item.LinkURL !== \"\" &&\n                                                        <React.Fragment>\n                                                            {(item.ScheduleType === \"Committee\" || item.ScheduleType === \"Docket\") && item.OwnerID !== undefined\n                                                                ? <React.Fragment> | <Link to={item.LinkURL.substr(item.LinkURL.indexOf(\".gov\") + 4, item.LinkURL.length + 1)} target=\"_blank\">Docket Info</Link></React.Fragment>\n                                                                : <Link to={item.LinkURL.substr(item.LinkURL.indexOf(\".gov\") + 4, item.LinkURL.length + 1)} target=\"_blank\">Docket Info</Link>\n                                                            }\n                                                        </React.Fragment>\n                                                    }\n                                                </span>\n                                            </div>\n                                            {item.Description && <div style={{ overflowWrap: 'anywhere', whiteSpace: 'pre-wrap' }}><span>{renderHTML(item.Description)}</span></div>}\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        )}\n                    </React.Fragment>\n                )\n                }\n            </div>\n\n\n        );\n    }\n}\n\nclass ScheduleModal extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            showInstructions: false\n        }\n\n        this.close = this.close.bind(this);\n        this.toggleInstructions = this.toggleInstructions.bind(this)\n    }\n\n    close() {\n        this.props.closeScheduleModal();\n    }\n\n    toggleInstructions() {\n        this.setState({\n            showInstructions: !this.state.showInstructions\n        })\n    }\n\n    render() {\n        const icsLink = window.env?.APP_ENV?.toLowerCase() === \"production\" ? \"lis.blob.core.windows.net/cdn/meetings.ics\" : \"liscdn.blob.core.windows.net/cdn/meetings.ics\";\n        return (\n            <div className=\"schedule-modal\">\n                <div id=\"calendar-instructions\" className=\"schedule-modal-content\">\n                    <p>Add a new calendar in your calendar program that automatically reflects additions and updates to the website calendar.</p>\n                    <span>Download: </span><br />\n                    <a href={\"webcal://\" + icsLink}>webcal://{icsLink}</a>\n                    <br />\n                    <a href={\"https://\" + icsLink}>https://{icsLink}</a>\n                    <br />\n                    <br />\n                    {this.state.showInstructions\n                        ? <button type=\"button\" className=\"button-link\" onClick={() => this.toggleInstructions()}>Hide</button>\n                        : <button type=\"button\" className=\"button-link\" onClick={() => this.toggleInstructions()}>Show Instructions</button>\n                    }\n                    {this.state.showInstructions &&\n                        <div className=\"calendar-instructions\">\n                            <p>In most cases, just selecting the webcal link will add a new calendar in your calendar application and subscribe to updates.</p>\n                            <p>To subscribe in Google Calendar or Mozilla Thunderbird - Lightning Calendar, copy the link and paste it into the appropriate address or location field in the calendar application.</p>\n\n                            <p>For specific instructions, see:</p>\n                            <ul>\n                                <li>For specific Outlook instructions, see Office Support: <a href=\"https://support.office.com/en-sg/article/View-and-subscribe-to-Internet-Calendars-7cd5d35a-4a90-4d70-a2f7-f6fadd7e2d9an\">View and subscribe to Internet calendars.</a></li>\n                                <li>Google Calendar Help: <a href=\"https://support.google.com/calendar/answer/37100?hl=en\">Subscribe to public calendars using the calendar address.</a></li>\n                                <li>Mozilla Support: <a href=\"https://support.mozilla.org/en-US/kb/adding-a-holiday-calendar\">Adding a holiday [or other] calendar.</a></li>\n                                <li>On an Android device, you may not be able to subscribe by clicking the webcal link. Subscribe in Google Calendar, and then sync your calendars using a calendar app on your device.</li>\n                            </ul>\n\n                            <p>To unsubscribe, in your calendar program, delete the calendar.</p>\n                            <p>If you use more than one calendar program (for example, Google Calendar and Outlook), you can control which program a browser opens when you subscribe via an iCalendar URL.</p>\n                            <p>In your browser, follow instructions for how to set which programs handle specific file types and protocols.</p>\n                            <p>For the .ics file and/or webcal protocol handler, set the calendar program you prefer.</p>\n\n                            <p>Tip: In Lightning, you may need to use the https:// link, as opposed to webcal://.</p>\n                            <p>Tip: You can set different .ics and webcal handlers in each browser you use.</p>\n                            <p>Tip: On the iPhone or iPad, to unsubscribe go to your device Settings. In Mail, Contacts, and Calendars, under Subscribed Calendars, delete the calendar account.</p>\n                        </div>\n                    }\n                    <div>\n                        <br />\n                        <button className=\"button secondary\" type=\"button\" onClick={() => this.close()}>Close</button>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { committee, nav, schedule, session, login } = state;\n        return {\n            committee,\n            nav,\n            schedule,\n            session,\n            login\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, navActionCreators, committeeActionCreators, sessionActionCreators, scheduleActionCreators), dispatch)\n        }\n    }\n)(PublicSchedule)","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { sessionActionCreators } from '../../stores/lis-session-store';\nimport { voteActionCreators } from '../../stores/lis-votes-store';\n\nimport Select from 'react-select';\nimport { memberActionCreators } from '../../stores/lis-members-store';\nimport moment from 'moment-timezone';\nimport { cancelRequest } from '../../services/request.service';\n\nclass PublicVoteSearch extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            memberOptions: [],\n            sessionOptions: [],\n            voteTypeOptions: [\n                { label: 'All', value: 'All' },\n            ],\n            selectedMembers: '',\n            selectedSession: '',\n            selectedVoteType: { label: 'All', value: 'All' },\n            searchSelectedMember: '',\n            searchSelectedSession: '',\n            searchSelectedVoteType: '',\n        };\n\n        this.getMembers = this.getMembers.bind(this);\n        this.handleDropdownChange = this.handleDropdownChange.bind(this);\n        this.handleSearch = this.handleSearch.bind(this);\n    }\n\n    componentDidMount() {\n        // Get the session list for the session dropdown\n        this.props.actions.getSessionList()\n            .then(() => {\n                if (this.props.session.sessionListError) {\n                    throw this.props.session.sessionListError.toString();\n                }\n                let selectedSession = '';\n                let sessionList = [...this.props.session.sessionList];\n                sessionList.forEach(session => {\n                    session.value = session.SessionID;\n                    session.label = session.SessionYear + ' ' + session.DisplayName;\n                    if (session.SessionCode === this.props.match.params.sessioncode) {\n                        selectedSession = session;\n                    }\n                });\n                this.setState({\n                    selectedSession: selectedSession,\n                    sessionOptions: sessionList.reverse(),\n                }, () => {\n                    if (selectedSession) {\n                        // Get the list of members for the member dropdown\n                        // Use the selected session's start date\n                        this.getMembers(selectedSession.SessionID);\n                    } else {\n                        this.setState({\n                            isLoaded: true\n                        })\n                    }\n                });\n\n\n            });\n\n        // Get the list of vote type options for the vote type dropdown\n        this.props.actions.getVoteTypes()\n            .then(() => {\n                let voteTypeOptions = this.state.voteTypeOptions;\n                this.props.votes.voteTypes.forEach(type => {\n                    type.label = type.Name;\n                    type.value = type.VoteTypeID;\n                    voteTypeOptions.push(type);\n                });\n                this.setState({\n                    voteTypeOptions: voteTypeOptions\n                });\n            });\n\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    getMembers(sessionId) {\n        this.props.actions.getMemberList('sessionID=' + sessionId)\n            .then(() => {\n                if (this.props.members.memberListError) {\n                    throw this.props.members.memberListError.toString();\n                }\n                let memberList = [...this.props.members.memberList];\n                let selectedMember = '';\n                memberList.forEach(member => {\n                    member.label = `(${member.ChamberCode}) ${member.ListDisplayName}`;\n                    member.value = member.MemberID;\n                    if (member.MemberNumber === this.props.match.params.membernumber) {\n                        selectedMember = member;\n                    }\n                });\n                this.setState({\n                    memberOptions: memberList,\n                    selectedMember: selectedMember,\n                    isLoaded: true\n                }, () => {\n                    // Do a search if there is a selected member and session\n                    if (selectedMember) {\n                        this.handleSearch();\n                    }\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err);\n                this.setState({\n                    message: err,\n                    isLoaded: true\n                });\n            });\n    }\n\n    handleDropdownChange(val, key) {\n        if (window.env && window.env.HISTORICAL_DATA_REDIRECT && key === 'selectedSession' && val && !val.IsDefault && val.LegacySessionID) {\n            this.setState({\n                historicalSessionRedirect: (redirect) => {\n                    if (redirect) {\n                        let a = document.createElement('a');\n                        a.target = '_blank';\n                        a.href = `https://legacylis.virginia.gov`;\n                        document.body.appendChild(a);\n                        a.click();\n                        document.body.removeChild(a);\n                    }\n                    this.setState({ historicalSessionRedirect: false })\n                }\n            })\n            return;\n        }\n        this.setState({\n            [key]: val\n        });\n        if (key === 'selectedSession') {\n            this.props.history.push(`/vote-search/${val.SessionCode}`);\n            this.getMembers(val.SessionID);\n            this.setState({\n                selectedMember: ''\n            })\n        }\n        if (key === 'selectedMember') {\n            this.props.history.push(`/vote-search/${this.state.selectedSession.SessionCode}/${val.MemberNumber}`);\n        }\n    }\n\n    handleSearch(e) {\n        if (this.state.selectedMember && this.state.selectedSession) {\n            let params = `?memberId=${this.state.selectedMember.MemberID}&sessionId=${this.state.selectedSession.SessionID}`\n            if (this.state.selectedVoteType && this.state.selectedVoteType.value !== 'All') {\n                params += `&voteTypeId=${this.state.selectedVoteType.VoteTypeID}`;\n            }\n            this.setState({\n                isSearching: true\n            });\n            this.props.actions.getMemberVotes(params)\n                .then(() => {\n                    if (this.props.members.memberVotesError) {\n                        throw this.props.members.memberVotesError.toString();\n                    }\n                    this.setState({\n                        isSearching: false,\n                        searchSelectedMember: this.state.selectedMember,\n                        searchSelectedSession: this.state.selectedSession,\n                        searchSelectedVoteType: this.state.selectedVoteType,\n                        memberVotes: this.props.members.memberVotes\n                    });\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    console.log(err);\n                    this.setState({\n                        message: err,\n                        isSearching: false\n                    })\n                });\n        }\n        if (e) {\n            e.preventDefault();\n        }\n    }\n\n    render() {\n        const customStyles = {\n            container: base => ({\n                ...base,\n                lineHeight: 'normal',\n            }),\n            option: (base, state) => ({\n                ...base,\n                fontSize: '0.8em',\n            }),\n            control: (base) => ({\n                ...base,\n                padding: '1px',\n                margin: 0,\n                minHeight: 0,\n                fontSize: '0.8em',\n            }),\n            singleValue: (base, state) => {\n                return { ...base, };\n            },\n            dropdownIndicator: base => ({\n                ...base,\n                padding: '0px 8px'\n            })\n        }\n        const { isSearching, memberOptions, sessionOptions, voteTypeOptions, selectedMember, selectedSession, selectedVoteType } = this.state;\n        if (this.state.message) {\n            return (<div className=\"center\">{this.state.message}</div>)\n        }\n        if (!this.state.isLoaded) {\n            return (<div className=\"center-spinner spinner\">Loading...</div>)\n        }\n        return (\n            <div>\n                {this.state.historicalSessionRedirect &&\n                    <div className=\"schedule-modal\">\n                        <div className=\"schedule-modal-content fit-content center-content\">\n                            <p>For historical data, please use <b>Legacy LIS</b>, available at <b><a href=\"https://legacylis.virginia.gov\" target=\"_blank\" rel=\"noreferrer\">https://legacylis.virginia.gov</a></b>.</p>\n                            <p>Click 'Go' to be taken to Legacy LIS, or 'Close' to remain here.</p>\n                            <div className=\"inline-list\">\n                                <button className=\"button primary float-right\" onClick={() => this.state.historicalSessionRedirect(true)}>Go</button>\n                                <button className=\"button secondary float-right\" onClick={() => this.state.historicalSessionRedirect(false)}>Close</button>\n                            </div>\n                            <br />\n                        </div>\n                    </div>\n                }\n                <div className=\"dlas-forms side-form\">\n                    <div className=\"header\">\n                        <h3 className=\"center\">Find a Member's Votes</h3>\n                    </div>\n                    <form>\n                        <div className=\"inner-grid four\" style={{ backgroundColor: '#f3f5f5', padding: '1em' }}>\n                            <div>\n                                <label htmlFor=\"session-dropdown\">Session</label>\n                                <Select\n                                    id=\"session-dropdown\"\n                                    styles={customStyles}\n                                    options={sessionOptions}\n                                    value={selectedSession}\n                                    onChange={val => this.handleDropdownChange(val, 'selectedSession')}\n                                />\n                            </div>\n                            <div>\n                                <label htmlFor=\"member-dropdown\">Member</label>\n                                <Select\n                                    id=\"member-dropdown\"\n                                    styles={customStyles}\n                                    options={memberOptions}\n                                    value={selectedMember}\n                                    onChange={val => this.handleDropdownChange(val, 'selectedMember')}\n                                />\n                            </div>\n                            <div>\n                                <label htmlFor=\"vote-type-dropdown\">Vote Type</label>\n                                <Select\n                                    id=\"vote-type-dropdown\"\n                                    styles={customStyles}\n                                    options={voteTypeOptions}\n                                    value={selectedVoteType}\n                                    onChange={val => this.handleDropdownChange(val, 'selectedVoteType')}\n                                />\n                            </div>\n                            <div>\n                                <br />\n                                <div>\n                                    <button\n                                        disabled={!selectedMember || !selectedSession || !selectedVoteType || isSearching}\n                                        onClick={this.handleSearch}\n                                        type=\"submit\"\n                                        className=\"button\">Search</button>\n                                </div>\n                            </div>\n                        </div>\n                    </form>\n                </div>\n                <br />\n                {isSearching ?\n                    <div className=\"center-spinner spinner\">Searching...</div>\n                    :\n                    <React.Fragment>\n                        {this.state.memberVotes &&\n                            <VoteSearchResults\n                                memberVotes={this.state.memberVotes}\n                                selectedMember={this.state.searchSelectedMember}\n                                selectedSession={this.state.searchSelectedSession}\n                                selectedVoteType={this.state.searchSelectedVoteType} />\n                        }\n                    </React.Fragment>\n                }\n            </div>);\n    }\n}\n\nclass VoteSearchResults extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            showVotes: [],\n            hideAll: true\n        }\n        this.showVotes = this.showVotes.bind(this);\n        this.toggleShow = this.toggleShow.bind(this);\n    }\n\n    showVotes(dateIndex) {\n        let showVotes = [...this.state.showVotes];\n        showVotes[dateIndex] = !showVotes[dateIndex];\n        this.setState({\n            showVotes: showVotes\n        });\n    }\n\n    toggleShow() {\n        // Votes are hidden by default. Toggle the value of hideAll and set all the values of showVotes to the current value of hideAll\n        // So if hideAll is true, then set all of showVotes to true and switch hideAll to false\n        const opposite = !this.state.hideAll\n        let showVotes = [...this.state.showVotes];\n        this.props.memberVotes.VoteResult.forEach((v, index) => {\n            showVotes[index] = this.state.hideAll;\n        });\n        this.setState({\n            hideAll: opposite,\n            showVotes: showVotes\n        })\n    }\n\n    organizeVotes(voteList) {\n        // The votes need to be organized by date\n        let organizedVotes = [];\n        if (voteList) {\n            voteList.sort((a, b) => {\n                return new Date(b.VoteDate) - new Date(a.VoteDate);\n            });\n            let voteArray = [];\n            let previousVote = voteList[0];\n            voteList.forEach(vote => {\n                if (moment(previousVote.VoteDate).format('L') !== moment(vote.VoteDate).format('L')) {\n                    let newDateContainer = {\n                        Votes: voteArray,\n                        Date: previousVote.VoteDate,\n                    };\n                    organizedVotes.push(newDateContainer);\n                    voteArray = [];\n                    voteArray.push(vote);\n                } else {\n                    voteArray.push(vote);\n                }\n                previousVote = vote;\n            });\n            if (voteArray.length > 0) {\n                let newDateContainer = {\n                    Votes: voteArray,\n                    Date: previousVote.VoteDate,\n                };\n                organizedVotes.push(newDateContainer);\n            }\n        }\n        return organizedVotes;\n    }\n\n    shouldComponentUpdate(nextProps, nextState) {\n        if (nextProps.memberVotes !== this.props.memberVotes) {\n            return true;\n        }\n        if (nextState !== this.state) {\n            return true;\n        }\n        return false;\n    }\n\n    render() {\n        const { memberVotes, selectedMember, selectedSession, selectedVoteType } = this.props;\n        let memberName = '';\n        if (selectedMember.ChamberCode === 'S') {\n            memberName = \"Senator \";\n        }\n        if (selectedMember.ChamberCode === 'H') {\n            memberName = \"Delegate \";\n        }\n        memberName += memberVotes.MemberDisplayName;\n        const organizedVotes = this.organizeVotes(memberVotes.VoteResult)\n\n        return (\n            <div id=\"vote-search\">\n                <div className=\"header-half\">\n                    <h2>{memberName}</h2>\n                    <p>{`${selectedSession.label}: ${selectedVoteType.label} Votes`}</p>\n                </div>\n                <div className=\"collapsible-table\">\n                    <div className=\"vote-search\">\n                        {organizedVotes.length === 0 ?\n                            <span className=\"center\">No Votes Found</span>\n                            :\n                            <React.Fragment>\n                                <div className=\"flex-row\">\n                                    <div></div>\n                                    {this.state.hideAll ?\n                                        <button onClick={this.toggleShow} type=\"button\" className=\"button-link\">Show All +/-</button>\n                                        :\n                                        <button onClick={this.toggleShow} type=\"button\" className=\"button-link\">Hide All +/-</button>\n                                    }\n                                </div>\n                                <hr />\n                                <div className=\"vote-search-date-item inner-grid two-col-sidebar-backwards\">\n                                    <div className=\"date-column-header\">\n                                        <span className=\"txt-greyed\">Date</span>\n                                    </div>\n                                    <div className=\"section-row inner-grid vote-search-grid-header\">\n                                        <span className=\"txt-greyed\">Bill #</span>\n                                        <span className=\"txt-greyed\">Bill Title</span>\n                                        <span className=\"txt-greyed\">Vote</span>\n                                        <span className=\"txt-greyed\">Type</span>\n                                        <span className=\"txt-greyed\">Action</span>\n                                        <span className=\"txt-greyed center\">Vote Statement</span>\n                                    </div>\n                                </div>\n                            </React.Fragment>\n                        }\n                        {organizedVotes.map((date, dateIndex) =>\n                            <React.Fragment key={dateIndex}>\n                                <hr />\n                                {this.state.showVotes[dateIndex] ?\n                                    <div className=\"vote-search-date-item flex-row\" style={{ backgroundColor: '#f3f5f5', cursor: 'pointer' }} onClick={() => this.showVotes(dateIndex)}>\n                                        <span style={{ fontWeight: 800 }} className=\"txt-greyed\">{moment(date.Date).format(\"MM/DD/YYYY\")}</span>\n                                        <button aria-expanded={true} className=\"arrow-up\">Hide bills</button>\n                                    </div>\n                                    :\n                                    <div className=\"vote-search-date-item flex-row\" style={{ cursor: 'pointer' }} onClick={() => this.showVotes(dateIndex)}>\n                                        <span style={{ fontWeight: 800 }} className=\"txt-greyed\">{moment(date.Date).format(\"MM/DD/YYYY\")}</span>\n                                        <button aria-expanded={false} className=\"arrow-down\">Show bills</button>\n                                    </div>\n                                }\n                                <div className=\"inner-grid two-col-sidebar-backwards\">\n                                    <div className=\"date-column-header\"></div>\n                                    {this.state.showVotes[dateIndex] ?\n                                        <div>\n                                            {date.Votes.map((vote, voteIndex) =>\n                                                <React.Fragment key={voteIndex}>\n                                                    <div className=\"inner-grid section-row vote-search-grid\">\n                                                        <span>{vote.LegislationNumber ? <Link to={`/bill-details/${selectedSession.SessionCode}/${vote.LegislationNumber}`}>{vote.LegislationNumber}</Link> : \"\"}</span>\n                                                        <span title={vote.LegislationNumber ? vote.LegislationDescription : \"\"}>{vote.LegislationNumber ? vote.LegislationDescription : vote.ClassificationName}</span>\n                                                        <span>{vote.ResponseCode}</span>\n                                                        <span>{vote.VoteType}</span>\n                                                        <Link to={`/vote-details/${vote.LegislationNumber ? vote.LegislationNumber : 0}/${selectedSession.SessionCode}/${vote.VoteNumber}`} title={vote.VoteDescription}>{vote.VoteDescription}</Link>\n                                                        <span>{vote.VoteStatement && <Link to={`/vote-details/${vote.LegislationNumber ? vote.LegislationNumber : 0}/${selectedSession.SessionCode}/${vote.VoteNumber}`}>Vote Statement</Link>}</span>\n                                                    </div>\n                                                    {voteIndex !== date.Votes.length - 1 && <hr />}\n                                                </React.Fragment>\n                                            )}\n                                        </div>\n                                        :\n                                        <div></div>\n                                    }\n                                </div>\n                            </React.Fragment>\n                        )}\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { members, session, votes } = state;\n        return {\n            members,\n            session,\n            votes\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, voteActionCreators, memberActionCreators, sessionActionCreators), dispatch)\n        }\n    }\n)(PublicVoteSearch)\n","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport Select from 'react-select';\nimport { memberActionCreators } from '../../stores/lis-members-store';\nimport { sessionActionCreators } from '../../stores/lis-session-store';\nimport { navActionCreators } from '../../stores/lis-nav-store';\n\nimport { cancelRequest } from '../../services/request.service';\n\nclass PublicMemberLegislation extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            isLoaded: false,\n            chamberOptions: [\n                { label: 'Delegates', value: 'H' },\n                { label: 'Senators', value: 'S' }\n            ],\n            hideBills: [],\n            collapseAll: false,\n            showPrefileOnly: false\n        };\n\n        this.setupDoc = this.setupDoc.bind(this);\n        this.handleChamberChange = this.handleChamberChange.bind(this);\n        this.toggleAll = this.toggleAll.bind(this);\n        this.toggleRow = this.toggleRow.bind(this);\n        this.toggleShowPrefile = this.toggleShowPrefile.bind(this);\n    }\n\n    setupDoc(sessionCode) {\n        this.setState({\n            isLoaded: false\n        });\n        this.props.actions.getSessionByCode(sessionCode).then(() => {\n            let chamberCode = this.props.match.params.chambercode;\n            const sessionData = this.props.session.selectedSession;\n            this.props.actions.getMemberLegislation('sessionID=' + sessionData.SessionID + '&chamberCode=' + chamberCode)\n                .then(() => {\n                    if (this.props.members.memberLegislationError) {\n                        throw this.props.members.memberLegislationError;\n                    }\n                    if (this.props.members.memberLegislation.length === 0) {\n                        throw 'No Legislation Found';\n                    }\n                    this.setState({\n                        isLoaded: true,\n                        hideBills: new Array(this.props.members.memberLegislation.length).fill(true),\n                        collapseAll: true\n                    });\n                })\n                .catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.setState({\n                        isLoaded: true,\n                        message: err.toString()\n                    });\n                    console.log(err.toString());\n                });\n        });\n    }\n\n    handleChamberChange(value) {\n        this.props.history.push('/session-details/' + this.props.nav.session + '/member-legislation/' + value.value);\n    }\n\n    toggleAll() {\n        const opposite = !this.state.collapseAll;\n        let hideBills = [...this.state.hideBills];\n        hideBills.fill(opposite);\n        this.setState({\n            collapseAll: opposite,\n            hideBills: hideBills\n        });\n    }\n\n    toggleRow(index) {\n        let hideBills = [...this.state.hideBills];\n        hideBills[index] = !hideBills[index];\n        this.setState({\n            hideBills: hideBills\n        });\n    }\n\n    toggleShowPrefile() {\n        this.setState(state => ({\n            showPrefileOnly: !state.showPrefileOnly\n        }));\n    }\n\n    componentDidUpdate(prevProps) {\n        // Setup the page if the global selected session changes. Change the URL to reflect the session change\n        if (prevProps.nav.session !== this.props.nav.session) {\n            this.props.history.push('/session-details/' + this.props.nav.session + '/member-legislation/' + this.props.match.params.chambercode);\n            this.setupDoc(this.props.nav.session);\n        } else if (this.props.nav.session !== this.props.match.params.sessioncode) {\n            // If the url changes then update the global selected session with whatever the url is\n            if (this.props.match.params.sessioncode) {\n                this.props.actions.changeSession(this.props.match.params.sessioncode);\n            }\n        } else if (this.props.match.params.chambercode !== prevProps.match.params.chambercode) {\n            this.setupDoc(this.props.nav.session);\n        }\n    }\n\n    componentDidMount() {\n        //Update the session selector component, which will run componentDidUpdate and call setupDoc on its own\n        const sessionCode = this.props.match.params.sessioncode\n        if (sessionCode) {\n            if (this.props.nav.session !== sessionCode) {\n                this.props.actions.changeSession(sessionCode)\n            } else {\n                this.setupDoc(sessionCode);\n            }\n        }\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { isLoaded, message, chamberOptions, hideBills, collapseAll } = this.state;\n        const chamberCode = this.props.match.params.chambercode;\n        if (message) {\n            return (<div className=\"center\">{message}</div>)\n        }\n        const filteredMembers = this.props.members.memberLegislation.filter(member => member.ChamberCode === chamberCode)\n        return (\n            <div>\n                <br />\n                <div className=\"toolbar minutes-toolbar dlas-forms flex-row\">\n                    <label htmlFor=\"chamber-dropdown\" className=\"screen-reader-only\">Chamber</label>\n                    <Select\n                        value={chamberOptions.find(chamber => chamber.value === this.props.match.params.chambercode)}\n                        options={chamberOptions}\n                        id=\"chamber-dropdown\"\n                        onChange={this.handleChamberChange}\n                        isDisabled={!isLoaded}\n                    />\n                    <div className=\"checkbox\">\n                        <input id=\"sr-only-prefile\" style={{ verticalAlign: 'bottom' }} onChange={this.toggleShowPrefile} type=\"checkbox\" checked={this.state.showPrefileOnly} />\n                        <label htmlFor=\"sr-only-prefile\">Only Show Prefile</label>\n                    </div>\n                </div>\n                <br />\n                {isLoaded ?\n                    <div className=\"collapsible-table\">\n                        <div className=\"flex-row\">\n                            <div></div>\n                            <button type=\"button\" onClick={this.toggleAll} className=\"button-link\">{collapseAll ? \"Show Bills\" : \"Hide Bills\"} +/-</button>\n                        </div>\n                        {filteredMembers.map((member, memberIndex) => {\n                            const totalBills = member.Legislation.filter(leg => leg.LegislationClass === \"Legislation\").length;\n                            const prefiledBills = member.Legislation.filter(leg => leg.IsPrefile && leg.LegislationClass === \"Legislation\").length;\n                            const nonPrefiledBills = member.Legislation.filter(leg => !leg.IsPrefile && leg.LegislationClass === \"Legislation\").length;\n                            const memberBills = this.state.showPrefileOnly ? member.Legislation.filter(leg => leg.IsPrefile) : member.Legislation;\n                            return (<div key={memberIndex}>\n                                <div className={(!hideBills[memberIndex] ? \"opened \" : '') + \"flex-row section-header\"}>\n                                    <div>\n                                        <span>\n                                            <Link to={`/session-details/${this.props.nav.session}/member-information/${member.MemberNumber}/member-details`}>\n                                                {member.MemberDisplayName}\n                                            </Link>\n                                        </span>\n                                    </div>\n                                    <div>\n                                        <div className=\"extra-info\">\n                                            <span>Prefiled: {prefiledBills}/Not Prefiled: {nonPrefiledBills}/Total: {totalBills}</span>\n                                            <button aria-expanded={!!hideBills[memberIndex]} onClick={() => this.toggleRow(memberIndex)} className={hideBills[memberIndex] ? \"arrow-down\" : \"arrow-up\"}>Show bills</button>\n                                        </div>\n                                    </div>\n                                </div>\n                                {!hideBills[memberIndex] ?\n                                    <div className=\"section-body\">\n                                        {memberBills.map((leg, legIndex) =>\n                                            <div key={legIndex} className=\"section-row inner-grid small-two-one\">\n                                                <Link to={`/bill-details/${leg.SessionCode}/${leg.LegislationNumber}`}>{leg.LegislationNumber}</Link>\n                                                <span>{leg.Description}</span>\n                                                <span style={{ textAlign: 'right' }} className=\"txt-greyed\">{leg.IsPrefile ? \"Prefiled\" : \"Not Prefiled\"}</span>\n                                            </div>\n                                        )}\n                                    </div>\n                                    :\n                                    <div className=\"section-body\">\n                                        <div className=\"section-row\"></div>\n                                    </div>\n                                }\n                            </div>)\n                        })}\n                    </div>\n                    :\n                    <div className=\"center-spinner spinner\">Loading...</div>\n                }\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { members, session, nav } = state;\n        return {\n            members,\n            session,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, memberActionCreators, sessionActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(PublicMemberLegislation)\n","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { Link } from 'react-router-dom';\nimport ReactToPrint from \"react-to-print\";\nimport { connect } from 'react-redux';\nimport { sessionActionCreators } from '../../stores/lis-session-store';\nimport { navActionCreators } from '../../stores/lis-nav-store';\nimport { communicationsActionCreators } from '../../stores/lis-communications-store';\nimport { cancelRequest } from '../../services/request.service';\n\nimport renderHTML from 'react-render-html';\nimport CommunicationsDetailsComponent from '../../lis-shared/lis-communications/lis-communications-details';\n\nclass PublicCommunicationDetails extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            isLoaded: false,\n            communication: '',\n            communicationFile: '',\n            clerkInfo: {}\n        };\n    }\n\n    componentDidMount() {\n        window.scrollTo(0, 0);\n        const params = `?referenceNumber=${this.props.match.params.commid}&sessionCode=${this.props.match.params.sessioncode}`;\n        this.props.actions.getComm(params)\n        .then(() => {\n            this.props.actions.getSessionById(this.props.communications.commGet.SessionID);\n            const commGet = this.props.communications.commGet;\n            if(commGet.CommunicationCategories.length === 0) {\n                //If the communication does not have any categories then it is assumed that this is a legacy file and the data needs to be retrieved from file storage.\n                const htmlFile = commGet.CommunicationFiles.find(file => file.FileURL.toUpperCase().includes('.HTM'));\n                if(htmlFile) {\n                    this.props.actions.getFile(htmlFile.FileURL)\n                    .then(() => {\n                        this.setState({\n                            communicationFile: this.props.nav.file,\n                            isLoaded: true\n                        });\n                    }).catch(err => {\n                        if(err !== 'Aborted') {\n                            throw err.toString();\n                        }\n                    });\n                }\n            }\n            // Attempt to retrieve the json file in blob storage to get the signatures\n            const jsonFile = commGet.CommunicationFiles.find(file => file.FileURL.toUpperCase().includes('.JSON'));\n            if(jsonFile) {\n                this.props.actions.getFile(jsonFile.FileURL)\n                .then(() => {\n                    const json = JSON.parse(this.props.nav.file);\n                    this.setState({\n                        clerkInfo: {\n                            ClerkName: json.ClerkName,\n                            ClerkTitle: json.ClerkTitle,\n                            FooterSentence: json.FooterSentence\n                        }\n                    });\n                })\n                \n            }\n            this.setState({\n                communication: commGet,\n                isLoaded: true\n            });\n        }).catch(err => {\n            if(err === 'Aborted') {\n                return;\n            }\n            this.setState({\n                message: 'communication not found: ' + err.toString(),\n                isLoaded: true\n            });\n        });\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        const { selectedSession } = this.props.session;\n        const { isLoaded, message, clerkInfo } = this.state;\n        let communication = {\n            ...this.state.communication,\n            ClerkName: clerkInfo.ClerkName,\n            ClerkTitle: clerkInfo.ClerkTitle,\n            FooterSentence: clerkInfo.FooterSentence\n        }\n        if (!isLoaded) {\n            return (<div className=\"center-spinner spinner\">Loading...</div>)\n        }\n        if (message) {\n            return (<div className=\"center\">{message}</div>)\n        }\n        return (\n            <div className='generic-details-page'>\n                <div>\n                    <ReactToPrint\n                        trigger={() => <button type=\"button\" className=\"button print float-right\"> Print</button>}\n                        content={() => this.componentRef}\n                        pageStyle={\"break-inside: avoid\"}                        \n                    />\n                </div>\n                <div ref={el => (this.componentRef = el)}>\n                    {this.state.communicationFile ?\n                        <div className='details-page-data-container'>{renderHTML(this.state.communicationFile)}</div>\n                        :\n                        <CommunicationsDetailsComponent\n                            session={selectedSession}\n                            communication={communication}\n                        />\n                    }\n                </div>\n            </div>);\n    }\n}\n\n\nexport default connect(\n    (state) => {\n        const { session, nav, communications } = state;\n        return {\n            session,\n            nav,\n            communications\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, sessionActionCreators, navActionCreators, communicationsActionCreators), dispatch)\n        }\n    }\n)(PublicCommunicationDetails)\n","import { partnerRequest, publicRequest } from '../services/request.service'\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst chamberStatsSuccess = 'CHAMBER_STATS_SUCCESS';\nconst chamberStatsFailure = 'CHAMBER_STATS_FAILURE';\n\nconst committeeStatsSuccess = 'COMMITTEE_STATS_SUCCESS';\nconst committeeStatsFailure = 'COMMITTEE_STATS_FAILURE';\n\nconst initialState = {\n    stat: [],\n    statsError: '',\n    committeeStats: [],\n    committeeStatsError: ''\n};\n\nexport const statActionCreators = {\n\n    receiveChamberStats: (content) => ({\n        type: chamberStatsSuccess,\n        chamberStats: content\n    }),\n\n    chamberStatsError: (message) => ({\n        type: chamberStatsFailure,\n        chamberStatsError: message\n    }),\n\n    getChamberStats: (params) => {\n        return dispatch => {\n            return publicRequest((API_URL || process.env.REACT_APP_STATS_API_URL) + '/Statistics/api/getchamberstatisticsasync', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(statActionCreators.chamberStatsError(result[1]));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(statActionCreators.receiveChamberStats(result[1].ChamberStatistics));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(statActionCreators.receiveChamberStats([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    receiveCommitteeStats: (content) => ({\n        type: committeeStatsSuccess,\n        committeeStats: content\n    }),\n\n    committeeStatsError: (message) => ({\n        type: committeeStatsFailure,\n        committeeStatsError: message\n    }),\n\n    getCommitteeStats: (params) => {\n        return dispatch => {\n            return publicRequest((API_URL || process.env.REACT_APP_STATS_API_URL) + '/Statistics/api/getcommitteestatisticsasync', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(statActionCreators.committeeStatsError(result[1]));\n                        return Promise.reject(result[1]);\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(statActionCreators.receiveCommitteeStats(result[1].CommitteeStatistics));\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(statActionCreators.receiveCommitteeStats([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    }\n};\n\n\nexport const reducer = (state, action) => {\n\n    state = state || initialState;\n    switch (action.type) {\n        case chamberStatsSuccess:\n            return Object.assign({}, state, {\n                chamberStats: action.chamberStats,\n                chamberStatsError: ''\n            })\n        case chamberStatsFailure:\n            return Object.assign({}, state, {\n                chamberStatsError: action.statsError\n            })\n        case committeeStatsSuccess:\n            return Object.assign({}, state, {\n                committeeStats: action.committeeStats,\n                committeeStatsError: ''\n            })\n        case committeeStatsFailure:\n            return Object.assign({}, state, {\n                committeeStatsError: action.statsError\n            })\n        default:\n            return state\n    }\n};","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { navActionCreators } from '../../stores/lis-nav-store';\nimport { statActionCreators } from '../../stores/lis-statistics-store';\nimport { sessionActionCreators } from '../../stores/lis-session-store';\n\n\nclass CommitteeStatDetails extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            isLoading: true,\n            stats: [],\n            sessionData: '',\n            totals: ''\n        };\n\n        this.setupPage = this.setupPage.bind(this);\n    }\n\n    setupPage(sessionCode) {\n        this.setState({\n            isLoading: true\n        });\n        this.props.actions.getSessionByCode(sessionCode).then(() => {\n            this.setState({\n                sessionData: this.props.session.selectedSession\n            }, () => {\n                this.props.actions.getCommitteeStats('?sessionId=' + this.state.sessionData.SessionID + '&chambercode=' + this.props.match.params.chambercode)\n                    .then(() => {\n                        let totals = {\n                            ContinuedFromTotal: 0,\n                            HReferredTotal: 0,\n                            SReferredTotal: 0,\n                            HInCommitteeTotal: 0,\n                            SInCommitteeTotal: 0,\n                            HInSubCommitteeTotal: 0,\n                            SInSubCommitteeTotal: 0,\n                            HReportedTotal: 0,\n                            SReportedTotal: 0,\n                            HIncorporatedTotal: 0,\n                            SIncorporatedTotal: 0,\n                            HFailedTotal: 0,\n                            SFailedTotal: 0,\n                            ContinuedToTotal: 0\n                        }\n                        this.props.stats.committeeStats.sort((a, b) => a.CommitteeName.localeCompare(b.CommitteeName))\n                        this.props.stats.committeeStats.forEach(stat => {\n                            totals.ContinuedFromTotal += stat.HContinuedFrom += stat.SContinuedFrom || 0;\n                            totals.HReferredTotal += stat.HReferred || 0;\n                            totals.SReferredTotal += stat.SReferred || 0;\n                            totals.HInCommitteeTotal += stat.HInCommittee || 0;\n                            totals.SInCommitteeTotal += stat.SInCommittee || 0;\n                            totals.HInSubCommitteeTotal += stat.HInSubCommittee || 0;\n                            totals.SInSubCommitteeTotal += stat.SInSubCommittee || 0;\n                            totals.HReportedTotal += stat.HReported || 0;\n                            totals.SReportedTotal += stat.SReported || 0;\n                            totals.HIncorporatedTotal += stat.HIncorporated || 0;\n                            totals.SIncorporatedTotal += stat.SIncorporated || 0;\n                            totals.HFailedTotal += stat.HFailed || 0;\n                            totals.SFailedTotal += stat.SFailed || 0;\n                            totals.ContinuedToTotal += stat.HContinued += stat.SContinued || 0;\n                        });\n                        this.setState({\n                            stats: this.props.stats.committeeStats,\n                            totals: totals,\n                            isLoading: false\n                        });\n                    }).catch(err => {\n                        if (err === 'Aborted') {\n                            return;\n                        }\n                        this.setState({\n                            isLoading: false,\n                            message: this.props.stats.committeeStatsError\n                        })\n                    });\n            });\n        });\n    }\n\n    componentDidMount() {\n        if (this.props.match.params.sessioncode) {\n            //Update the session selector component, which will run componentDidUpdate and call setupPage on its own\n            if (this.props.nav.session !== this.props.match.params.sessioncode) {\n                this.props.actions.changeSession(this.props.match.params.sessioncode)\n            } else {\n                this.setupPage(this.props.match.params.sessioncode);\n            }\n        }\n    }\n\n    componentDidUpdate(prevProps) {\n        if (this.props.match.params.chambercode !== prevProps.match.params.chambercode) {\n            this.setupPage(this.props.match.params.sessioncode);\n        }\n        // Setup the page if the global selected session changes. Change the URL to reflect the session change\n        if (prevProps.nav.session !== this.props.nav.session) {\n            this.props.history.push('/session-details/' + this.props.nav.session + '/statistics/committee/' + this.props.match.params.chambercode)\n            this.setupPage(this.props.nav.session);\n        } else if (this.props.nav.session !== this.props.match.params.sessioncode) {\n            // If the url changes then update the global selected session with whatever the url is\n            if (this.props.match.params.sessioncode) {\n                this.props.actions.changeSession(this.props.match.params.sessioncode);\n            }\n        }\n    }\n\n    render() {\n        if (this.state.isLoading) {\n            return (<div aria-label=\"Loading\" className=\"center-spinner spinner\"></div>)\n        }\n        if (this.state.message) {\n            return (<div className=\"center\">{this.state.message}</div>)\n        }\n        return (\n            <div>\n                <br />\n                <div className=\"full\">\n                    <table className=\"statistics-table\">\n                        <caption>\n                            <h1>\n                                {this.state.sessionData && <span className=\"statistics-header\">{this.state.sessionData.SessionYear} {this.state.sessionData.DisplayName}</span>}\n                                <span className=\"statistics-header\">{this.props.match.params.chambercode.toLowerCase() === \"s\" ? \" Senate\" : \" House\"} Committee Statistics</span>\n                            </h1>\n                            {this.props.match.params.chambercode.toLowerCase() === \"s\" &&\n                                <Link to={`/session-details/${this.props.match.params.sessioncode}/statistics/committee/h`}>House Committee Statistics</Link>\n                            }\n                            {this.props.match.params.chambercode.toLowerCase() === \"h\" &&\n                                <Link to={`/session-details/${this.props.match.params.sessioncode}/statistics/committee/s`}>Senate Committee Statistics</Link>\n                            }\n                            <span> | </span>\n                            <Link to={`/session-details/${this.props.match.params.sessioncode}/statistics/status`}>Session Statistics</Link>\n                        </caption>\n                        <tbody>\n                            <tr>\n                                <th colSpan=\"1\" rowSpan=\"2\"></th>\n                                {this.state.totals.ContinuedFromTotal > 0 && <th rowSpan=\"2\">Continued From {this.state.sessionData.SessionYear - 1}</th>}\n                                <th colSpan=\"2\">Referred</th>\n                                <th colSpan=\"2\">In Committee</th>\n                                <th colSpan=\"2\">In Subcommittee</th>\n                                <th colSpan=\"2\">Reported</th>\n                                <th colSpan=\"2\">Incorporated</th>\n                                <th colSpan=\"2\">Failed</th>\n                                {this.state.totals.ContinuedToTotal > 0 && <th rowSpan=\"2\">Continued To {this.state.sessionData.SessionYear + 1}</th>}\n                            </tr>\n                            <tr>\n                                <th>H</th>\n                                <th>S</th>\n                                <th>H</th>\n                                <th>S</th>\n                                <th>H</th>\n                                <th>S</th>\n                                <th>H</th>\n                                <th>S</th>\n                                <th>H</th>\n                                <th>S</th>\n                                <th>H</th>\n                                <th>S</th>\n                            </tr>\n                            {this.state.stats.map((stat, statIndex) =>\n                                <tr key={statIndex}>\n                                    <td className=\"homepage-links\"><Link to={`/session-details/${this.props.match.params.sessioncode}/committee-information/${stat.CommitteeNumber}/committee-details`}>{stat.CommitteeName}</Link></td>\n                                    {this.state.totals.ContinuedFromTotal > 0 && <td>{stat.HContinuedFrom + stat.SContinuedFrom}</td>}\n                                    <td>{stat.HReferred}</td>\n                                    <td>{stat.SReferred}</td>\n                                    <td>{stat.HInCommittee}</td>\n                                    <td>{stat.SInCommittee}</td>\n                                    <td>{stat.HInSubCommittee}</td>\n                                    <td>{stat.SInSubCommittee}</td>\n                                    <td>{stat.HReported}</td>\n                                    <td>{stat.SReported}</td>\n                                    <td>{stat.HIncorporated}</td>\n                                    <td>{stat.SIncorporated}</td>\n                                    <td>{stat.HFailed}</td>\n                                    <td>{stat.SFailed}</td>\n                                    {this.state.totals.ContinuedToTotal > 0 && <td>{stat.HContinued + stat.SContinued}</td>}\n                                </tr>\n                            )}\n                            <tr>\n                                <td>Total for all {this.props.match.params.chambercode.toLowerCase() === \"s\" && \"Senate\"}{this.props.match.params.chambercode.toLowerCase() === \"h\" && \"House\"} Committees</td>\n                                {this.state.totals.ContinuedFromTotal > 0 && <td>{this.state.totals.ContinuedFromTotal}</td>}\n                                <td>{this.state.totals.HReferredTotal}</td>\n                                <td>{this.state.totals.SReferredTotal}</td>\n                                <td>{this.state.totals.HInCommitteeTotal}</td>\n                                <td>{this.state.totals.SInCommitteeTotal}</td>\n                                <td>{this.state.totals.HInSubCommitteeTotal}</td>\n                                <td>{this.state.totals.SInSubCommitteeTotal}</td>\n                                <td>{this.state.totals.HReportedTotal}</td>\n                                <td>{this.state.totals.SReportedTotal}</td>\n                                <td>{this.state.totals.HIncorporatedTotal}</td>\n                                <td>{this.state.totals.SIncorporatedTotal}</td>\n                                <td>{this.state.totals.HFailedTotal}</td>\n                                <td>{this.state.totals.SFailedTotal}</td>\n                                {this.state.totals.ContinuedToTotal > 0 && <td>{this.state.totals.ContinuedToTotal}</td>}\n                            </tr>\n                        </tbody>\n                    </table>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { stats, nav, session } = state;\n        return {\n            stats,\n            nav,\n            session\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, statActionCreators, navActionCreators, sessionActionCreators), dispatch)\n        }\n    }\n)(CommitteeStatDetails)\n","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { navActionCreators } from '../../stores/lis-nav-store';\nimport { statActionCreators } from '../../stores/lis-statistics-store';\nimport { sessionActionCreators } from '../../stores/lis-session-store';\nimport { billActionCreators } from '../../stores/lis-legislation-store';\n\nclass SessionStatDetails extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            isLoading: true,\n            stats: [],\n            sessionData: '',\n            totals: '',\n            billStatusCategoryList: []\n        };\n\n        this.setupPage = this.setupPage.bind(this);\n    }\n\n    setupPage(sessionCode) {\n        this.setState({\n            isLoading: true\n        }, () => {\n            this.props.actions.getBillStatusCategoryReferences()\n                .then(() => {\n                    let billStatusReferences = [...this.props.bills.billStatusCategoryReferences]\n                    billStatusReferences.forEach(ref => {\n                        ref.label = ref.Name\n                        ref.value = ref.LegislationCategoryID\n                    });\n                    this.setState({\n                        billStatusCategoryList: billStatusReferences,\n                    }, () => {\n                        this.props.actions.getSessionByCode(sessionCode).then(() => {\n                            this.setState({\n                                sessionData: this.props.session.selectedSession\n                            }, () => {\n                                this.props.actions.getChamberStats('?sessionId=' + this.state.sessionData.SessionID)\n                                    .then(() => {\n                                        let totals = {\n                                            ContinuedFromTotal: 0,\n                                            IntroducedTotal: 0,\n                                            InCommitteeTotal: 0,\n                                            PassedHouseTotal: 0,\n                                            PassedSenateTotal: 0,\n                                            PassedTotal: 0,\n                                            IncorporatedTotal: 0,\n                                            FailedTotal: 0,\n                                            PendingTotal: 0,\n                                            ApprovedTotal: 0,\n                                            VetoTotal: 0,\n                                            ContinuedToTotal: 0\n                                        }\n                                        this.props.stats.chamberStats.forEach(stat => {\n                                            totals.ContinuedFromTotal += stat.ContinuedFromLastSession || 0,\n                                                totals.IntroducedTotal += stat.Introduced || 0,\n                                                totals.InCommitteeTotal += stat.InCommittee || 0,\n                                                totals.PassedHouseTotal += stat.PassedHouse || 0,\n                                                totals.PassedSenateTotal += stat.PassedSenate || 0,\n                                                totals.PassedTotal += stat.Passed || 0,\n                                                totals.IncorporatedTotal += stat.Incorporated || 0,\n                                                totals.FailedTotal += stat.Failed || 0,\n                                                totals.PendingTotal += stat.Pending || 0,\n                                                totals.ApprovedTotal += stat.Approved || 0,\n                                                totals.VetoTotal += stat.Veto || 0,\n                                                totals.ContinuedToTotal += stat.ContinuedToNextSession || 0\n                                        })\n                                        this.setState({\n                                            stats: this.props.stats.chamberStats,\n                                            isLoading: false,\n                                            totals: totals\n                                        });\n                                    }).catch(err => {\n                                        if (err === 'Aborted') {\n                                            return;\n                                        }\n                                        this.setState({\n                                            isLoading: false,\n                                            message: this.props.stats.chamberStatsError\n                                        })\n                                    });\n                            });\n\n                        });\n                    });\n                })\n        });\n    }\n\n    componentDidMount() {\n        if (this.props.match.params.sessioncode) {\n            //Update the session selector component\n            if (this.props.nav.session !== this.props.match.params.sessioncode) {\n                this.props.actions.changeSession(this.props.match.params.sessioncode)\n            }\n            this.setupPage(this.props.match.params.sessioncode);\n        }\n    }\n\n    componentDidUpdate(prevProps) {\n        // Setup the page if the global selected session changes. Change the URL to reflect the session change\n        if (prevProps.nav.session !== this.props.nav.session) {\n            this.props.history.push('/session-details/' + this.props.nav.session + '/statistics/status/')\n            this.setupPage(this.props.nav.session);\n        } else if (this.props.nav.session !== this.props.match.params.sessioncode) {\n            // If the url changes then update the global selected session with whatever the url is\n            if (this.props.match.params.sessioncode) {\n                this.props.actions.changeSession(this.props.match.params.sessioncode);\n            }\n        }\n    }\n\n    render() {\n        if (this.state.isLoading) {\n            return (<div aria-label=\"Loading\" className=\"center-spinner spinner\"></div>)\n        }\n\n        const makeLink = (statusCategoryName, currentStatus) => {\n            let statusCategoryId;\n            if (statusCategoryName) {\n                const statusCategory = this.state.billStatusCategoryList.find(category => category.Name.toLowerCase() === statusCategoryName.toLowerCase());\n                statusCategoryId = statusCategory ? statusCategory.LegislationCategoryID : 99;\n            }\n\n            const params = {\n                selectedSession: this.props.session ? this.props.session.SessionID : '',\n                selectedBillStatusCategory: statusCategoryId,\n                currentStatus: currentStatus || false,\n                allLegislation: !statusCategoryName ? true : false,\n                uniqueSearch: Math.random()\n            };\n\n            const json = JSON.stringify(params);\n            const query = window.btoa(json);\n\n            return '/bill-search?q=' + query;\n        };\n\n        const sessionHeader = this.state.sessionData ? this.state.sessionData.SessionYear + ' ' + this.state.sessionData.DisplayName + ' Statistics' : '';\n\n        return (\n            <div>\n                {!this.state.isLoading ?\n                    <React.Fragment>\n                        <br />\n                        <table className=\"statistics-table\">\n                            <caption>\n                                <h1>{sessionHeader}</h1>\n                                <Link to={`/session-details/${this.props.match.params.sessioncode}/statistics/committee/h`}>House Committee Statistics</Link>\n                                <span> | </span>\n                                <Link to={`/session-details/${this.props.match.params.sessioncode}/statistics/committee/s`}>Senate Committee Statistics</Link>\n                            </caption>\n                            <tbody>\n                                <tr className=\"homepage-links\">\n                                    <th>Type</th>\n                                    {this.state.totals.ContinuedFromTotal > 0 && <th><Link to={makeLink(\"Continued from last session\", false)}>Continued from Last Session</Link></th>}\n                                    <th><Link to={makeLink(\"Introduced\", false)}>Introduced</Link></th>\n                                    <th><Link to={makeLink(\"Passed House\", false)}>Passed House</Link></th>\n                                    <th><Link to={makeLink(\"Passed Senate\", false)}>Passed Senate</Link></th>\n                                    <th><Link to={makeLink(\"Passed\", false)}>Passed</Link></th>\n                                    <th><Link to={makeLink(\"Incorporated\", false)}>Incorporated</Link></th>\n                                    <th><Link to={makeLink(\"Failed\", false)}>Failed</Link></th>\n                                    <th><Link to={makeLink(\"Pending\", true)}>Pending</Link></th>\n                                    <th><Link to={makeLink(\"Approved or Enacted\", false)}>Approved</Link></th>\n                                    <th><Link to={makeLink(\"Vetoed\", false)}>Vetoed</Link></th>\n                                    {this.state.totals.ContinuedToTotal > 0 && <th><Link to={makeLink(\"Continued to next session\", true)}>Continued to Next Session</Link></th>}\n                                </tr>\n                                {this.state.stats.map(stat =>\n                                    <tr>\n                                        <td>{stat.ChamberCode}.{stat.LegislationTypeCode}{stat.LegislationTypeCode === \"J\" && \".R\"}</td>\n                                        {this.state.totals.ContinuedFromTotal > 0 && <td>{stat.ContinuedFromLastSession}</td>}\n                                        <td>{stat.Introduced}</td>\n                                        <td>{stat.PassedHouse}</td>\n                                        <td>{stat.PassedSenate}</td>\n                                        <td>{stat.Passed}</td>\n                                        <td>{stat.Incorporated}</td>\n                                        <td>{stat.Failed}</td>\n                                        <td>{stat.Pending}</td>\n                                        <td>{stat.Approved}</td>\n                                        <td>{stat.Veto}</td>\n                                        {this.state.totals.ContinuedToTotal > 0 && <td>{stat.ContinuedToNextSession}</td>}\n                                    </tr>\n                                )}\n                                <tr>\n                                    <td>Totals</td>\n                                    {this.state.totals.ContinuedFromTotal > 0 && <td>{this.state.totals.ContinuedFromTotal}</td>}\n                                    <td>{this.state.totals.IntroducedTotal}</td>\n                                    <td>{this.state.totals.PassedHouseTotal}</td>\n                                    <td>{this.state.totals.PassedSenateTotal}</td>\n                                    <td>{this.state.totals.PassedTotal}</td>\n                                    <td>{this.state.totals.IncorporatedTotal}</td>\n                                    <td>{this.state.totals.FailedTotal}</td>\n                                    <td>{this.state.totals.PendingTotal}</td>\n                                    <td>{this.state.totals.ApprovedTotal}</td>\n                                    <td>{this.state.totals.VetoTotal}</td>\n                                    {this.state.totals.ContinuedToTotal > 0 && <td>{this.state.totals.ContinuedToTotal}</td>}\n                                </tr>\n                            </tbody>\n                        </table>\n                    </React.Fragment>\n                    : <div aria-label=\"Loading\" className=\"center-spinner spinner\" />\n                }\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { stats, nav, session, bills } = state;\n        return {\n            stats,\n            nav,\n            session,\n            bills\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, statActionCreators, navActionCreators, sessionActionCreators, billActionCreators), dispatch)\n        }\n    }\n)(SessionStatDetails)\n","import React from \"react\";\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { navActionCreators } from \"../../stores/lis-nav-store\";\nimport { Link } from \"react-router-dom\";\n\nclass Unauthorized extends React.Component {\n    render() {\n        return (\n            <div className=\"center\">\n                <h2>You do not have permission to view this page.</h2>\n                <Link to=\"/home\">Home</Link>\n            </div>\n        )\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { nav } = state;\n        return {\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, navActionCreators), dispatch)\n        }\n    }\n)(Unauthorized)","import React from \"react\";\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { navActionCreators } from \"../../stores/lis-nav-store\";\nimport { Link } from \"react-router-dom\";\nimport renderHTML from 'react-render-html';\nimport { collectionActionCreators } from \"../../stores/lis-collection-store\";\nimport moment from \"moment-timezone\";\nimport { sessionActionCreators } from \"../../stores/lis-session-store\";\nimport { authActionCreators } from \"../../stores/lis-auth-store\";\n\nclass WatchlistsComponent extends React.Component {\n    constructor(props) {\n        super(props);\n\n        this.state = {\n            sessionOptions: [],\n            watchlists: [],\n            filteredWatchlists: [],\n            filteredWatchlistsValue: \"\",\n            nameSort: false,\n            descSort: false,\n            dateSort: false,\n            billNumberSort: false,\n            viewCrossReferenceList: false,\n            expandedWatchlists: [],\n            legislationList: [],\n            expandedBills: [],\n            filteredBills: [],\n            filteredBillsValue: \"\",\n            expandAllWatchlists: false,\n            expandAllBills: false,\n            loadingCollections: true,\n            showPopup: false\n        }\n\n        this.getWatchlists = this.getWatchlists.bind(this);\n        this.filterWatchlist = this.filterWatchlist.bind(this);\n        this.filterBills = this.filterBills.bind(this);\n        this.sortByName = this.sortByName.bind(this);\n        this.sortByDesc = this.sortByDesc.bind(this);\n        this.sortByDate = this.sortByDate.bind(this);\n        this.sortByBillNumber = this.sortByBillNumber.bind(this);\n        this.toggleBillList = this.toggleBillList.bind(this);\n        this.toggleCrossReferenceList = this.toggleCrossReferenceList.bind(this);\n        this.toggleWatchlistList = this.toggleWatchlistList.bind(this);\n        this.toggleWatchlist = this.toggleWatchlist.bind(this);\n        this.togglePopup = this.togglePopup.bind(this);\n        this.deleteWatchlists = this.deleteWatchlists.bind(this);\n        this.updateCrossReferenceList = this.updateCrossReferenceList.bind(this);\n    }\n\n    componentDidMount() {\n        if (!this.props.session.sessionList || !this.props.session.sessionList.length) {\n            this.props.actions.getSessionList()\n                .then(() => {\n                    this.setState({\n                        sessionOptions: this.props.session.sessionList\n                    }, () => {\n                        this.getWatchlists();\n                    })\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    console.log(err)\n                });\n        } else {\n            this.setState({\n                sessionOptions: this.props.session.sessionList\n            }, () => {\n                this.getWatchlists();\n            })\n        }\n    }\n\n    componentDidUpdate(prevProps) {\n        if (prevProps.nav.session != this.props.nav.session) {\n            this.setState({ loadingCollections: true }, () => {\n                this.getWatchlists();\n            })\n        }\n    }\n\n    getWatchlists() {\n        if (this.props.nav.session) {\n            const selectedSession = this.state.sessionOptions.find(s => s.SessionCode === this.props.nav.session);\n            if (selectedSession) {\n                this.props.actions.getCollections(\"?SessionID=\" + selectedSession.SessionID)\n                    .then(() => {\n                        this.setState({\n                            watchlists: this.props.collection.collections,\n                            filteredWatchlists: this.props.collection.collections,\n                            filteredWatchlistsValue: \"\"\n                        }, () => {\n                            this.updateCrossReferenceList();\n                        })\n                    })\n            }\n        }\n    }\n\n    updateCrossReferenceList() {\n        let legislationList = [];\n        for (let i = 0; i < this.state.watchlists.filter(w => !w.DeletionDate).length; i++) {\n            for (let j = 0; j < this.state.watchlists.filter(w => !w.DeletionDate)[i].WatchListLegislation.length; j++) {\n                let legislationIndex = legislationList.findIndex(x => x.LegislationNumber === this.state.watchlists.filter(w => !w.DeletionDate)[i].WatchListLegislation[j].LegislationNumber);\n                if (legislationIndex >= 0) {\n                    legislationList[legislationIndex].watchlists.push(this.state.watchlists.filter(w => !w.DeletionDate)[i]);\n                } else {\n                    let newLegislation = JSON.parse(JSON.stringify(this.state.watchlists.filter(w => !w.DeletionDate)[i].WatchListLegislation[j]));\n                    newLegislation.watchlists = [this.state.watchlists.filter(w => !w.DeletionDate)[i]];\n                    legislationList.push(newLegislation);\n                }\n            }\n        }\n\n        this.setState({\n            legislationList: legislationList,\n            loadingCollections: false\n        })\n    }\n\n    filterWatchlist(e) {\n        const val = e.target.value.toLowerCase();\n        this.setState({\n            // Map is used to preserve the original index\n            filteredWatchlists: this.state.watchlists.map(coll => {\n                if ((coll.Description && coll.Description.toLowerCase().includes(val)) || (coll.Name && coll.Name.toLowerCase().includes(val))) {\n                    return coll;\n                }\n            }),\n            filteredWatchlistsValue: val\n        })\n    }\n\n    filterBills(e) {\n        const val = e.target.value.toLowerCase();\n        this.setState({\n            // Map is used to preserve the original index\n            filteredBills: this.state.legislationList.map(b => {\n                if ((b.LegislationNumber && b.LegislationNumber.toLowerCase().includes(val)) || (b.Description && renderHTML(b.Description.toLowerCase()).includes(val))) {\n                    return b;\n                }\n            }),\n            filteredBillsValue: val\n        })\n    }\n\n    sortByName() {\n        this.setState({\n            filteredWatchlists: this.state.filteredWatchlists.sort((a, b) => !this.state.nameSort ? a.Name?.localeCompare(b.Name) : b.Name?.localeCompare(a.Name)),\n            nameSort: !this.state.nameSort,\n            descSort: false,\n            dateSort: false\n        })\n    }\n\n    sortByDesc() {\n        this.setState({\n            filteredWatchlists: this.state.filteredWatchlists.sort((a, b) => !this.state.descSort ? a.Description?.localeCompare(b.Description) : b.Description?.localeCompare(a.Description)),\n            descSort: !this.state.descSort,\n            nameSort: false,\n            dateSort: false\n        })\n    }\n\n    sortByDate() {\n        this.setState({\n            filteredWatchlists: this.state.filteredWatchlists.sort((a, b) => moment(a.ModificationDate).isBefore(b.ModificationDate) ? this.state.dateSort ? -1 : 1 : this.state.dateSort ? 1 : -1),\n            dateSort: !this.state.dateSort,\n            nameSort: false,\n            descSort: false\n        })\n    }\n\n    sortByBillNumber() {\n        this.setState({\n            filteredBills: this.state.filteredBills.sort((a, b) => a.LegislationNumber > b.LegislationNumber ? this.state.billNumberSort ? -1 : 1 : this.state.billNumberSort ? 1 : -1),\n            legislationList: this.state.legislationList.sort((a, b) => a.LegislationNumber > b.LegislationNumber ? this.state.billNumberSort ? -1 : 1 : this.state.billNumberSort ? 1 : -1),\n            billNumberSort: !this.state.billNumberSort\n        })\n    }\n\n    toggleBillList(watchListIDsParam, toggleAll) {\n        let watchListIDs;\n\n        if (!Array.isArray(watchListIDsParam)) {\n            watchListIDs = [watchListIDsParam];\n        } else {\n            watchListIDs = watchListIDsParam;\n        }\n\n        let expandedWatchlists = [...this.state.expandedWatchlists];\n\n        for (let i = 0; i < watchListIDs.length; i++) {\n            if (!expandedWatchlists.find(x => x.WatchListID === watchListIDs[i])) {\n                let watchlist = this.state.filteredWatchlists.find(x => x && x.WatchListID === watchListIDs[i]);\n                watchlist.expanded = true;\n                expandedWatchlists.push(watchlist);\n            } else {\n                expandedWatchlists.find(x => x.WatchListID === watchListIDs[i]).expanded = toggleAll !== undefined ? toggleAll : !expandedWatchlists.find(x => x.WatchListID === watchListIDs[i]).expanded;\n            }\n        }\n\n        this.setState({\n            expandedWatchlists: expandedWatchlists\n        })\n    }\n\n    toggleCrossReferenceList() {\n        this.setState({\n            viewCrossReferenceList: !this.state.viewCrossReferenceList\n        })\n    }\n\n    toggleWatchlist(watchlistIndex) {\n        let watchlists = this.state.filteredWatchlistsValue.length > 0 ? this.state.filteredWatchlists.filter(x => x != undefined) : this.state.watchlists;\n        watchlists[watchlistIndex].checked = !watchlists[watchlistIndex].checked;\n\n        this.setState({ [this.state.filteredWatchlistsValue.length ? 'filteredWatchlistsValue' : 'watchlists']: watchlists })\n    }\n\n    togglePopup() {\n        this.setState({\n            showPopup: !this.state.showPopup\n        });\n    }\n\n    deleteWatchlists() {\n        let watchlists = this.state.filteredWatchlistsValue.length > 0 ? this.state.filteredWatchlists.filter(x => x != undefined) : this.state.watchlists;\n        let watchlistsToDelete = watchlists.filter(w => w.checked);\n        if (watchlistsToDelete.length) {\n            this.setState({ deletingWatchlists: true }, () => {\n                watchlistsToDelete.forEach(wl => wl.DeletionDate = moment());\n                this.props.actions.saveCollections({ WatchLists: watchlistsToDelete })\n                    .then(() => {\n                        watchlists = watchlists.filter(wl => !wl.checked && !wl.DeletionDate);\n                        this.props.actions.makeToast([{ message: \"Delete Successful\", type: \"success\" }]);\n                        this.setState({\n                            [this.state.filteredWatchlistsValue.length ? 'filteredWatchlistsValue' : 'watchlists']: watchlists,\n                            deletingWatchlists: false,\n                        }, () => {\n                            this.togglePopup();\n                            this.updateCrossReferenceList();\n                        });\n                    }).catch(err => {\n                        if (err === 'Aborted') {\n                            return;\n                        }\n                        this.setState({\n                            deletingWatchlists: false\n                        });\n                        this.props.actions.makeToast([{ message: \"Delete Failed\", type: \"failure\" }]);\n                    });\n            })\n        }\n    }\n\n    toggleWatchlistList(legislationNumbersParam, toggleAll) {\n        let legislationNumbers;\n\n        if (!Array.isArray(legislationNumbersParam)) {\n            legislationNumbers = [legislationNumbersParam];\n        } else {\n            legislationNumbers = legislationNumbersParam;\n        }\n\n        let expandedBills = [...this.state.expandedBills];\n\n        for (let i = 0; i < legislationNumbers.length; i++) {\n            if (!expandedBills.find(x => x.LegislationNumber === legislationNumbers[i])) {\n                let bill = this.state.legislationList.find(x => x.LegislationNumber === legislationNumbers[i]);\n                bill.expanded = true;\n                expandedBills.push(bill);\n            } else {\n                expandedBills.find(x => x.LegislationNumber === legislationNumbers[i]).expanded = toggleAll !== undefined ? toggleAll : !expandedBills.find(x => x.LegislationNumber === legislationNumbers[i]).expanded;\n            }\n        }\n\n        this.setState({\n            expandedBills: expandedBills\n        })\n    }\n\n    toggleExpandAll(crossRefList) {\n        if (crossRefList) {\n            let legNumbers = [];\n            this.state.legislationList.forEach(x => {\n                if (x.watchlists.length > 0) {\n                    legNumbers.push(x.LegislationNumber)\n                }\n            })\n            this.setState({\n                expandAllBills: !this.state.expandAllBills\n            }, () => {\n                this.toggleWatchlistList(legNumbers, this.state.expandAllBills)\n            })\n        } else {\n            let watchlists = [];\n            this.state.filteredWatchlists.forEach(x => {\n                if (x && x.WatchListLegislation.length > 0) {\n                    watchlists.push(x.WatchListID);\n                }\n            })\n            this.setState({\n                expandAllWatchlists: !this.state.expandAllWatchlists\n            }, () => {\n                this.toggleBillList(watchlists, this.state.expandAllWatchlists)\n            })\n        }\n    }\n\n    render() {\n        let watchlists = this.state.filteredWatchlistsValue.length > 0 ? this.state.filteredWatchlists.filter(x => x != undefined) : this.state.watchlists;\n        let bills = this.state.filteredBillsValue.length > 0 ? this.state.filteredBills.filter(x => x != undefined) : this.state.legislationList;\n        let sessionCode = this.props.nav.session;\n\n        const { isProfilePage } = this.props;\n\n        return (\n            <div className=\"homepage-links\">\n                {this.state.showPopup &&\n                    <div className='popup'>\n                        <div className='popup-inner'>\n                            <p style={{ fontSize: '16px' }}>Are you sure you want to delete? Once a Watchlist is deleted it cannot be restored.</p>\n                            <div className=\"inline-list\">\n                                <button className=\"button danger\" disabled={this.state.deletingWatchlists} onClick={this.deleteWatchlists}>Yes</button>\n                                <button className=\"button secondary\" disabled={this.state.deletingWatchlists} onClick={this.togglePopup}>No</button>\n                            </div>\n                        </div>\n                    </div>\n                }\n                {!isProfilePage && <h2>{this.state.viewCrossReferenceList ? \"Your Lobbyist-in-a-Box Watchlists: Bill Cross Reference\" : \"Your Lobbyist-in-a-Box Watchlists\"}</h2>}\n                {this.state.loadingCollections ? <div className=\"spinner\" /> :\n                    <React.Fragment>\n                        <div className=\"dlas-forms\">\n                            {!this.state.viewCrossReferenceList\n                                ? <React.Fragment>\n                                    <label htmlFor=\"sr-watchlist-find\" className=\"screen-reader-only\">Find a watchlist by name</label>\n                                    <input\n                                        id=\"sr-watchlist-find\"\n                                        type=\"text\"\n                                        placeholder=\"Find a watchlist\"\n                                        value={this.state.filteredWatchlistsValue}\n                                        onChange={this.filterWatchlist}\n                                    />\n                                </React.Fragment>\n                                : <React.Fragment>\n                                    <label htmlFor=\"sr-bill-find\" className=\"screen-reader-only\">Find a bill by bill number or description</label>\n                                    <input\n                                        id=\"sr-bill-find\"\n                                        type=\"text\"\n                                        placeholder=\"Find a bill\"\n                                        value={this.state.filteredBillsValue}\n                                        onChange={this.filterBills}\n                                    />\n                                </React.Fragment>\n                            }\n                            {this.state.legislationList.length > 0 && <button className=\"button primary float-right\" type=\"button\" onClick={() => this.toggleCrossReferenceList()}>{this.state.viewCrossReferenceList ? \"View Watchlists\" : \"View Bill Cross Reference List\"}</button>}\n                        </div>\n                        <br />\n                        <div className=\"flex-row\">\n                            {!this.state.viewCrossReferenceList ? <button className=\"button primary float-right\" type=\"button\" disabled={!watchlists.find(w => w.checked) || this.state.deletingWatchlists} onClick={this.togglePopup}>{this.state.deletingWatchlists ? watchlists.filter(w => w.checked).length > 1 ? \"Deleting Watchlists\" : \"Deleting Watchlist\" : watchlists.filter(w => w.checked).length > 1 ? \"Delete Watchlists\" : \"Delete Watchlist\"}</button> : <span />}\n                            {<button className=\"button primary float-right\" type=\"button\" onClick={() => this.toggleExpandAll(this.state.viewCrossReferenceList ? true : false)}>{this.state.viewCrossReferenceList ? this.state.expandAllBills ? \"Collapse All\" : \"Expand All\" : this.state.expandAllWatchlists ? \"Collapse All\" : \"Expand All\"}</button>}\n                        </div>\n                        <br />\n                        <div className=\"quick-table\">\n                            {this.state.viewCrossReferenceList\n                                ?\n                                <div className=\"inner-grid small-one-util table-headers\">\n                                    <label onClick={() => this.sortByBillNumber()} style={{ cursor: \"pointer\" }}>Bill Number</label>\n                                    <label>Bill Description</label>\n                                    <label>Show Watchlists</label>\n                                </div>\n                                :\n                                <div className=\"inner-grid one-two-one table-headers\">\n                                    <label />\n                                    <label onClick={() => this.sortByName()} style={{ cursor: \"pointer\" }}>Watchlist Name</label>\n                                    <label onClick={() => this.sortByDesc()} style={{ cursor: \"pointer\" }}>Description</label>\n                                    <label onClick={() => this.sortByDate()} style={{ cursor: \"pointer\" }}>Last Modified</label>\n                                    <label>Show Bills</label>\n                                </div>\n                            }\n                            {!this.state.viewCrossReferenceList ?\n                                <div className=\"table-body\">\n                                    {watchlists.map((w, i) => {\n                                        return (\n                                            <div className=\"table-row\" key={i}>\n                                                {w && <div className=\"inner-grid one-two-one\">\n                                                    <input id=\"sr-select-all\" disabled={this.state.deletingWatchlists || (w.IsPaid && !Boolean(this.props.login.userClaims.claims.find(claim => claim.Scope === \"Paid\" && claim.Resource === \"LegislationCollections\" && claim.RoleName === \"PaidLegislationCollectionsAuthor\")) && !Boolean(this.props.login.userClaims.resources.find(resource => resource === \"PaidLegislationCollectionsAuthor\" || resource === \"All\")))} checked={w.checked} onChange={() => this.toggleWatchlist(i)} type=\"checkbox\" style={{ verticalAlign: 'sub' }} />\n                                                    {(w.IsPaid && !Boolean(this.props.login.userClaims.claims.find(claim => claim.Scope === \"Paid\" && claim.Resource === \"LegislationCollections\" && claim.RoleName === \"PaidLegislationCollectionsAuthor\")) && !Boolean(this.props.login.userClaims.resources.find(resource => resource === \"PaidLegislationCollectionsAuthor\" || resource === \"All\"))) ? <span className=\"txt-greyed\">{w.Name} (PAID)</span> : <Link to={`/bill-search?collection=${w.WatchListID}`}>{w.Name}</Link>}\n                                                    <label className={(w.IsPaid && !Boolean(this.props.login.userClaims.claims.find(claim => claim.Scope === \"Paid\" && claim.Resource === \"LegislationCollections\" && claim.RoleName === \"PaidLegislationCollectionsAuthor\")) && !Boolean(this.props.login.userClaims.resources.find(resource => resource === \"PaidLegislationCollectionsAuthor\" || resource === \"All\"))) ? \"txt-greyed\" : \"\"}>{w.Description}</label>\n                                                    <label className={(w.IsPaid && !Boolean(this.props.login.userClaims.claims.find(claim => claim.Scope === \"Paid\" && claim.Resource === \"LegislationCollections\" && claim.RoleName === \"PaidLegislationCollectionsAuthor\")) && !Boolean(this.props.login.userClaims.resources.find(resource => resource === \"PaidLegislationCollectionsAuthor\" || resource === \"All\"))) ? \"txt-greyed\" : \"\"}>{moment(w.ModificationDate).format(\"MM/DD/YYYY hh:mm A\")}</label>\n                                                    {(w.IsPaid && !Boolean(this.props.login.userClaims.claims.find(claim => claim.Scope === \"Paid\" && claim.Resource === \"LegislationCollections\" && claim.RoleName === \"PaidLegislationCollectionsAuthor\")) && !Boolean(this.props.login.userClaims.resources.find(resource => resource === \"PaidLegislationCollectionsAuthor\" || resource === \"All\"))) ? null : w.WatchListLegislation.length > 0 && <button style={{ marginLeft: \"20px\" }} type=\"button\" className={(this.state.expandedWatchlists.find(x => x.WatchListID === w.WatchListID) == undefined || !this.state.expandedWatchlists.find(x => x.WatchListID === w.WatchListID).expanded ? \"arrow-down\" : \"arrow-up\") + \" float-right\"} onClick={() => this.toggleBillList(w.WatchListID)}></button>}\n                                                </div>\n                                                }\n                                                {this.state.expandedWatchlists.find(x => x.WatchListID === w.WatchListID) != undefined && this.state.expandedWatchlists.find(x => x.WatchListID === w.WatchListID).expanded &&\n                                                    <ul>\n                                                        {w.WatchListLegislation.map((l, i) => {\n                                                            return (\n                                                                <li className=\"inner-grid two-col-sidebar-tiny-backwards\" style={{ marginBottom: '5px' }}>\n                                                                    <a target=\"_blank\" key={i} className=\"watchlist-ref-link\" style={{ textAlign: 'right' }} href={\"/bill-details/\" + sessionCode + \"/\" + l.LegislationNumber}>{l.LegislationNumber}</a>\n                                                                    <span>{l.Description}</span>\n                                                                </li>\n                                                            )\n                                                        })}\n                                                    </ul>\n                                                }\n                                            </div>\n                                        )\n                                    })}\n                                </div>\n                                :\n                                <div className=\"table-body\">\n                                    {bills.map((l, i) => {\n                                        return (\n                                            <div className=\"table-row\" key={i}>\n                                                <div className=\"inner-grid small-one-util\" key={i}>\n                                                    {<Link to={\"/bill-details/\" + sessionCode + \"/\" + l.LegislationNumber}>{l.LegislationNumber}</Link>}\n                                                    <label>{renderHTML(l.Description)}</label>\n                                                    {l.watchlists.length > 0 && <button style={{ marginLeft: \"40px\" }} type=\"button\" className={(this.state.expandedBills.find(x => x.LegislationNumber === l.LegislationNumber) != undefined && !this.state.expandedBills.find(x => x.LegislationNumber === l.LegislationNumber).expanded ? \"arrow-down\" : \"arrow-up\") + \" float-right\"} onClick={() => this.toggleWatchlistList(l.LegislationNumber)}></button>}\n                                                </div>\n                                                {this.state.expandedBills.find(x => x.LegislationNumber === l.LegislationNumber) != undefined && this.state.expandedBills.find(x => x.LegislationNumber === l.LegislationNumber).expanded &&\n                                                    <ul>\n                                                        {l.watchlists.map((w, i) => {\n                                                            return (\n                                                                <li>\n                                                                    <a target=\"_blank\" key={i} className=\"watchlist-ref-link\" href={\"/bill-search?collection=\" + w.WatchListID}>{w.Name}</a> - <span>{w.Description}</span>\n                                                                </li>\n                                                            )\n                                                        })}\n                                                    </ul>\n                                                }\n                                            </div>\n                                        )\n                                    })}\n                                </div>\n                            }\n                        </div>\n                        <br />\n                        {!isProfilePage && <Link to={\"/bill-search\"}>Return to Bill Search</Link>}\n                    </React.Fragment>}\n            </div >\n        )\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { login, nav, collection, session } = state;\n        return {\n            login,\n            nav,\n            collection,\n            session\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, authActionCreators, navActionCreators, collectionActionCreators, sessionActionCreators), dispatch)\n        }\n    }\n)(WatchlistsComponent)","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { authActionCreators } from '../../../stores/lis-auth-store';\nimport { developersActionCreators } from '../../../stores/lis-developers-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport WatchlistsComponent from '../../../lis-public/components/lis-watchlists';\n\nclass ProfileForm extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            apiKeys: [],\n            apiKeyIsLoading: true\n        };\n\n        this.getApiKeys = this.getApiKeys.bind(this);\n        this.handleCopy = this.handleCopy.bind(this);\n    }\n\n    componentDidMount() {\n        this.getApiKeys();\n    }\n\n    getApiKeys() {\n        this.setState({ apiKeyIsLoading: true })\n        this.props.actions.getPartnerKey()\n            .then(() => {\n                this.setState({\n                    apiKeys: this.props.developers.partnerKey,\n                    apiKeyIsLoading: false\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return\n                }\n                this.setState({\n                    apiKeyIsLoading: false\n                });\n            });\n    }\n\n    handleCopy(key, element) {\n        navigator.clipboard.writeText(key);\n        element.disabled = true;\n        const delay = ms => new Promise(res => setTimeout(res, ms));\n        element.textContent = 'Copied to clipboard!'\n        delay(3000).then(() => {\n            element.textContent = \"Copy\"\n            element.disabled = false;\n        });\n    }\n\n    render() {\n        const { userProfile } = this.props.login;\n        let email = userProfile.email || \"\";\n        if (email.includes(\"#\")) {\n            email = email.replace(/#([^#]*)$/, '@$1');\n            email = email.replace(\"@dlasva.onmicrosoft.com\", '');\n        }\n        const canCreateMultipleWatchlists = Boolean(this.props.login.userClaims.claims.find(claim => claim.Scope === \"Paid\" && claim.Resource === \"LegislationCollections\" && claim.RoleName === \"PaidLegislationCollectionsAuthor\")) ||  Boolean(this.props.login.userClaims.resources.find(resource => resource === \"PaidLegislationCollectionsAuthor\" || resource === \"All\"));\n\n        return (\n            <div className=\"dlas-forms\">\n                <div className=\"public-details\">\n                    <div>\n                        <h2>My Profile</h2>\n                    </div>\n                    <div>\n                        <h3>Name</h3>\n                        <p>{userProfile.name}</p>\n                        <br />\n                        <h3>Email</h3>\n                        <p>{email}</p>\n                        <br />\n                        <h3>{canCreateMultipleWatchlists ? \"Watchlists\" : \"Watchlist\"}</h3>\n                        {\n                            <WatchlistsComponent isProfilePage />\n                        }\n                        <br />\n                        <h3>{this.state.apiKeys.length > 1 ? 'API Keys' : 'API Key'}</h3>\n                        {this.state.apiKeyIsLoading ?\n                            <div className=\"spinner\"></div>\n                            :\n                            this.state.apiKeys.length > 0 ?\n                                this.state.apiKeys.map((key, idx) =>\n                                    <div key={idx}>\n                                        <span style={{ fontSize: '14px', marginRight: '5px' }}>{key.APIKey}</span>\n                                        <button className=\"button\" type=\"button\" style={{ padding: '3px 5px' }} onClick={(e) => this.handleCopy(key.APIKey, e.target)}>Copy</button>\n                                    </div>\n                                )\n                                :\n                                <p>Your email ({`${email}`}) is not currently associated with an API key. Learn more about API keys <a target=\"blank\" rel=\"noreferrer\" style={{ fontSize: '14px' }} href={'/developers'}>here</a>.</p>\n                        }\n                    </div>\n                    <br />\n                    <div>\n                        <h3>Account Settings</h3>\n                        <Link to={'/change-password'} style={{ fontSize: '14px', textDecoration: \"none\" }}>Change Password</Link>\n                    </div>\n                </div>\n            </div>\n        );\n\n    }\n};\n\nexport default connect(\n    (state) => {\n        const { login, developers, session, nav } = state;\n        return {\n            login,\n            developers,\n            session,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, authActionCreators, developersActionCreators, sessionActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(ProfileForm);\n\n\n\n\n\n","import React from \"react\";\n\nclass PrivacyComponent extends React.Component {\n    render() {\n        return (\n            <div>\n\n                <p className=\"bold\">Virginia Division of Legislative Automated Systems</p>\n\n                <p className=\"bold\">Internet Privacy Policy Statement and Disclaimer</p>\n                <p>(Last updated on September 3, 2024)</p>\n\n                <p className=\"bold\">Privacy Information</p>\n                <p>It is the policy of the Commonwealth of Virginia that personal information about citizens will be collected only to the extent necessary to provide the service or benefit desired; that only appropriate information will be collected; that the citizen shall understand the reason the information is collected and be able to examine their personal record which is maintained by the Virginia Division of Legislative Automated Systems (DLAS).</p>\n\n                <p>This document explains how DLAS gathers information on its web site (http://lis.virginia.gov), and with whom and under what conditions the agency shares this information. The following is intended to explain the agency's current Internet privacy practices but shall not be construed as a contractual promise. DLAS reserves the right to amend its Internet Privacy Policy Statement at any time without notice.</p>\n\n                <p className=\"bold\">Information Collection</p>\n                <p>Virginia law requires that state bodies not collect personal information about citizens unless it is required to provide services for the citizen. When personal information is collected, it must be protected from unauthorized access, use or disclosure, and DLAS is required to provide a prescribed procedure by which you may learn the purpose for which information has been recorded and how the agency will use and disseminate it.</p>\n\n                <p className=\"bold\">In General</p>\n                <p>DLAS does not capture personal information about any visitor to its site without their permission. When you browse the agency's site without logging on to any of the interactive online services, you do so anonymously. Personal information, such as your name, address, phone number, or e-mail address, is not collected as you browse. Information, such as your domain name, Internet Protocol number, browser type, and date and time of your visit, is collected, but not tied to your personal identity. DLAS uses this information to track the number of customers who visit the site and identify the most popular pages so that the agency can improve site content and accessibility.</p>\n\n                <p className=\"bold\">Online Transactions</p>\n                <p>Though personal information may be required either by law or in order for DLAS to provide a requested service, in doing so the agency is subject to the requirements for administering information systems as established in the Government Data Collection and Dissemination Practices Act, Chapter 38 of Title 2.2 of the Code of Virginia. A different agency or entity, whose practices are not under the control of DLAS, may regulate pages that appear after you click on a link. When you log on to one of the agency's current online services, such as “Lobbyist in a Box”, personal information that you submit is captured to enable you to conduct business with DLAS. In addition, the agency collects the following information about your visit: Internet Protocol address, browser type, the name of the domain from which you access the Internet, and the date and time of your visit. This additional information allows the agency to track the number of customers who visit our site and identify the most popular pages so that it can improve site content and accessibility. The personal information you provide is required to enable you to complete various transactions with the agency online and for DLAS to deliver the requested services. Once registered with DLAS, you are eligible to request additional services that may require you to provide additional personal information. DLAS only collects, retains and uses personal information when it believes it is essential, and allowed by law, to conduct business and provide products and services. Should you not desire to provide the requested personal information, DLAS will not be able to provide you with online services.</p>\n\n                <p>Personal information that you provide to the agency is safeguarded according to the laws of the Commonwealth of Virginia. Information that you provide on the online surveys is used to improve the online services that the agency offers and to determine your level of satisfaction with the DLAS site and services. This information is not stored with any other records DLAS may have of your transactions with the agency.</p>\n\n                <p className=\"bold\">Contacting Us</p>\n                <p>When visiting the site, DLAS encourages you to contact us if you have any questions, comments, or concerns, or would like a return call. DLAS will request your name, the subject of your question or comment, and your e-mail address or telephone number. This information is used solely to respond to your inquiry. If you would like the agency to mail you materials, DLAS will request your mailing address so that it may provide the appropriate materials. Personal information that you provide to the DLAS is safeguarded according to the laws of the Commonwealth of Virginia.</p>\n\n                <p className=\"bold\">Information Access</p>\n                <p>Any personal information that is collected and retained by DLAS is maintained in compliance with the Government Data Collection and Dissemination Practices Act, Chapter 38 of Title 2.2 of the Code of Virginia. The agency does not share, sell or trade e-mail addresses, information collected on surveys or any other information about its online customers to any entity except as provided for or required by Chapter 38 of Title 2.2 of the Code of Virginia, the Virginia Freedom of Information Act, or other law. Under FOIA, any records in DLAS’ possession at the time of a Freedom of Information Request might be subject to being inspected by or disclosed to members of the public. If necessary, DLAS may disclose user information if it has reason to believe that disclosing such information is necessary to identify, contact, or bring legal action against an individual who attempts, even unintentionally, to unauthorized access to DLAS information or to disrupt our web site.</p>\n\n                <p className=\"bold\">Use of \"Cookies\"</p>\n                <p>In certain applications, user information is stored as \"cookies,\" which are then sent back and stored on your hard drive. Cookies allow the agency to save the information that you input while progressing through an online transaction. If your browser is not configured to accept cookies, you will still be able to access the information on the web site, but you may not be able to complete many of the online transactions. No user information is gathered through cookies except for that needed to run the specific application.</p>\n\n                <p className=\"bold\">Security</p>\n                <p>DLAS maintains security standards and procedures regarding unauthorized access to customer information to prevent unauthorized removal or alteration of data. When you browse public areas of the DLAS web site, none of your personal information is captured or stored by the agency. DLAS protects its records in accordance with its obligations as defined by applicable Virginia statues, including, but not limited to, the Government Data Collection and Dissemination Practices Act, the Virginia Freedom of Information Act, and by any applicable U.S. federal laws.</p>\n\n                <p className=\"bold\">Information Accuracy and Your Rights</p>\n                <p>DLAS has established procedures to ensure that information is as accurate and current as is practical to enable us to conduct business with you. Although the agency strives to do things right the first time, it also responds to requests to correct inaccurate information in a timely manner. You have the right to review the record that DLAS maintains about you in order to verify its accuracy. You may do this by contacting the individual listed below. If you find errors in your personal record, or desire that the agency purge your data from its records, you must contact the individual listed below. DLAS employee access to personally identifiable information is restricted to only those employees who need access in order to perform their assigned duties.</p>\n\n                <p className=\"bold\">Contact Us</p>\n                <p>DLAS welcomes your comments and invites you to contact us if you have any questions or concerns:\n                    <br />Virginia Division of Legislative Automated Systems\n                    <br />Old City Hall\n                    <br />1001 East Broad Street, Suite 210\n                    <br />Richmond, VA 23219\n                    <br />email: <a href=\"mailto:LIS@dlas.virginia.gov\">LIS@dlas.virginia.gov</a>\n                </p>\n\n                <p className=\"bold\">Disclaimer</p>\n\n                <p>The Virginia Division of Legislative Automated Systems (DLAS) provides links to web sites that are not controlled, maintained, or regulated by DLAS or any organization affiliated with DLAS, and as such DLAS is NOT responsible for the content of those web sites. Use of information obtained from those web sites is voluntary, and reliance on that information should only be undertaken after an independent review of its accuracy. Reference at those web sites to any specific commercial product, process, or service by trade name, trademark, or otherwise DOES NOT constitute or imply endorsement, recommendation, or preference by DLAS. The agency tries to screen all sites included on its web site, but cannot control the content they possess. Any inappropriate information or links they have on their site that pertains to DLAS, or related activities, should be reported to DLAS and can be emailed to <a href=\"mailto:LIS@dlas.virginia.gov\">LIS@dlas.virginia.gov</a>.</p>\n\n            </div>\n        )\n    }\n}\n\nexport default PrivacyComponent","import React from \"react\";\nimport { Link } from \"react-router-dom\"\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { developersActionCreators } from \"../../../stores/lis-developers-store\";\n\nclass DevsPortal extends React.Component {\n  constructor(props) {\n    super(props)\n    this.state = {\n      docList: ''\n    }\n  }\n\n  componentDidMount() {\n    this.props.actions.getDocList(\"?IsPartner=false\");\n  }\n\n  render() {\n    return (\n      <div>\n        <div className=\"alert alert-warning\"><p>API usage is authorized and validated for 2025 session data only. The General Assembly has not authorized the usage of data from sessions prior to 2025 to be extracted with this API toolset. If you require data prior to the 2025 session, please use <a href=\"https://legacylis.virginia.gov\">legacylis.virginia.gov</a> via CSV download. Once the General Assembly has authorized the data for use, you will be notified.</p></div>\n        <h1>LIS Developers Portal</h1>\n        <p>If you are a developer interested in obtaining data from LIS you may register for your own LIS API key.  An LIS API key will give you access to more than 40 APIs. To register for your own API key click the link below.</p>\n        <Link to=\"/apiregistration\" className=\"doc-link\">Complete LIS API Key Registration here.</Link>\n        <p>Below are links to the API documentation. We believe you will find the documentation transparent and convenient. To view the terms of service, <Link to=\"/tos\" className=\"doc-link\">click here</Link>. To view the documentation in Postman, <a href=\"https://documenter.getpostman.com/view/6722140/2sA3e4B9hg\" className=\"doc-link\">click here</a>.</p>\n        <h3>Available LIS API Services</h3>\n        {this.props.developers.docList.length > 0 && this.props.developers.docList.map((b, i) => {\n          return (\n            <React.Fragment key={i}><Link to={{ pathname: \"/developers/\" + b.ApiName }} className=\"doc-link\">{b.ApiName}</Link><br /></React.Fragment>\n          )\n        })}\n      </div>\n    )\n  }\n}\n\nexport default connect(\n  (state) => {\n    const { developers } = state;\n    return {\n      developers\n    }\n  },\n  (dispatch) => {\n    return {\n      actions: bindActionCreators(Object.assign({}, developersActionCreators), dispatch)\n    }\n  }\n)(DevsPortal)","import React from \"react\";\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { RedocStandalone } from \"redoc\";\nimport { developersActionCreators } from \"../../../stores/lis-developers-store\";\nimport { navActionCreators } from \"../../../stores/lis-nav-store\";\n\nclass DocumentComponent extends React.Component {\n    constructor(props) {\n        super(props);\n\n        this.backToList = this.backToList.bind(this);\n    }\n\n    componentDidMount() {\n        this.props.actions.getDoc(\"?ApiName=\" + this.props.match.params.docName, false);\n    }\n\n    backToList() {\n        window.location.href = \"/developers\"\n    }\n\n    render() {\n        return (\n            <div style={{ marginTop: \"20px\" }}>\n                <a onClick={this.backToList} style={{ cursor: \"pointer\" }}>Back to List</a>\n                {this.props.developers.doc != '' ?\n                    <RedocStandalone\n                        spec={JSON.parse(this.props.developers.doc)}\n                        options={{\n                            nativeScrollbars: false,\n                            theme: {\n                                colors: {\n                                    primary: {\n                                        main: \"#34495e\"\n                                    },\n                                    http: {\n                                        get: \"#4BCA81\"\n                                    },\n                                    responses: {\n                                        error: {\n                                            color: \"#fb4f4f\"\n                                        },\n                                        success: {\n                                            color: \"#4BCA81\"\n                                        }\n                                    },\n                                    success: {\n                                        main: \"#4BCA81\"\n                                    },\n                                    error: {\n                                        main: \"#fb4f4f\"\n                                    }\n                                },\n                                typography: {\n                                    fontFamily: \"Lato\",\n                                    fontWeight: \"400\",\n                                    fontSize: \"14px\",\n                                    lineHeight: \"1.4\",\n                                    color: \"#333\",\n                                    code: {\n                                        fontSize: \"13px\",\n                                        fontFamily: \"consolas\"\n                                    },\n                                    headings: {\n                                        fontFamily: \"Lato\",\n                                        fontWeight: \"400\",\n                                        color: \"#34495e\"\n                                    },\n                                    links: {\n                                        color: \"#3498db\",\n                                        visited: \"#3498db\",\n                                        hover: \"#196090\"\n                                    },\n                                    optimizeSpeed: true\n                                },\n                                sidebar: {\n                                    backgroundColor: \"#F1F1F1\"\n                                },\n                                rightPanel: {\n                                    backgroundColor: \"#34495e\"\n                                },\n                                spacing: {\n                                    sectionHorizontal: 8,\n                                    sectionVertical: 4\n                                }\n                            },\n                            lazyRendering: true\n                        }}\n                    />\n                    :\n                    <div><span className=\"small-spinner\"></span></div>\n                }\n            </div>\n        )\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { developers, nav } = state;\n        return {\n            developers,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, developersActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(DocumentComponent)","import React from \"react\";\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { developersActionCreators } from \"../../../stores/lis-developers-store\";\nimport { navActionCreators } from \"../../../stores/lis-nav-store\";\n\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,}))$/;\n\nclass KeyRegistration extends React.Component {\n    constructor(props) {\n        super(props)\n        this.state = {\n            email: \"\",\n            isSubmitting: false,\n            emailError: ''\n        }\n\n        this.checkEmail = this.checkEmail.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n        this.submit = this.submit.bind(this);\n    }\n\n    checkEmail() {\n        const email = this.state.email.toLowerCase();\n\n        if (!emailRegex.test(email)) {\n            this.setState({\n                emailError: 'A valid email is required'\n            }, () => {\n                this.props.actions.makeToast([{ message: this.state.emailError, type: \"failure\" }])\n            });\n            return true;\n        }\n        this.setState({\n            emailError: ''\n        });\n    }\n\n    handleChange(state, value) {\n        this.setState({\n            [state]: value\n        })\n    }\n\n    submit() {\n        this.setState({\n            isSubmitting: true\n        }, () => {\n            let error = false\n            error = this.checkEmail();\n\n            if (!error) {\n                let params = \"\";\n\n                params = params + \"?emailAddress=\" + encodeURIComponent(this.state.email);\n\n                this.props.actions.submitKeyRegistration(params)\n                    .then(() => {\n                        //No need to reset isSubmitting because the user will be redirected\n                        this.props.actions.makeToast([{ message: \"Your registration was successful. You will receive a confirmation email shortly.\", type: \"success\", long: true }])\n                        //Give the user time to read the toast, then forward to the homepage\n                        setTimeout(() => { window.location.href = \"/home\"; }, 5000);\n                    })\n                    .catch(() => {\n                        this.props.actions.makeToast([{ message: this.props.developers.keyRegistrationError, type: \"failure\" }])\n                    })\n            } else {\n                this.setState({\n                    isSubmitting: false\n                })\n            }\n        })\n    }\n\n    render() {\n        const { email, isSubmitting } = this.state;\n\n        return (\n            <div>\n                <div className=\"alert alert-warning\"><p>API usage is authorized and validated for 2025 session data only. The General Assembly has not authorized the usage of data from sessions prior to 2025 to be extracted with this API toolset. If you require data prior to the 2025 session, please use <a href=\"https://legacylis.virginia.gov\">legacylis.virginia.gov</a> via CSV download. Once the General Assembly has authorized the data for use, you will be notified.</p></div>\n                <form className=\"dlas-forms key-registration-form\">\n                    <h3>LIS API Key Registration</h3>\n                    <p>Enter your email address here and submit the form. You will receive an email containing a link that you can use to complete your API key registration.</p>\n                    <div className=\"inner-grid short-one-three\">\n                        <label htmlFor=\"email\">Email</label>\n                        <input\n                            id=\"email\"\n                            type=\"text\"\n                            value={email}\n                            onChange={(e) => this.handleChange(\"email\", e.target.value)}\n                        />\n                    </div>\n                    <div className=\"inner-grid reverse-short-one-three\">\n                        <div />\n                        <div className=\"align-right\">\n                            <button onClick={this.submit} disabled={isSubmitting || !email} type=\"button\" className=\"button\">Submit</button>\n                        </div>\n                    </div>\n                </form>\n            </div>\n        )\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { nav, developers } = state;\n        return {\n            nav,\n            developers\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, developersActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(KeyRegistration)","import React from \"react\";\nimport moment from 'moment-timezone';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { developersActionCreators } from \"../../../stores/lis-developers-store\";\nimport { navActionCreators } from \"../../../stores/lis-nav-store\";\n\nconst phoneRegex = /^[\\+]?[(]?[0-9]{3}[)]?[-\\s\\.]?[0-9]{3}[-\\s\\.]?[0-9]{4,6}$/im;\nconst urlRegex = /((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\\+\\$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[\\+~%\\/.\\w-_]*)?\\??(?:[-\\+=&;%@.\\w_]*)#?(?:[\\w]*))?)/\n\nclass KeyConfirmation extends React.Component {\n    constructor(props) {\n        super(props)\n        this.state = {\n            isSubmitting: false,\n            phoneError: '',\n            urlError: '',\n            name: '',\n            organization: '',\n            phone: '',\n            url: '',\n            agree: false\n        }\n\n        this.checkPhone = this.checkPhone.bind(this);\n        this.checkUrl = this.checkUrl.bind(this);\n        this.handleChange = this.handleChange.bind(this);\n        this.submit = this.submit.bind(this);\n    }\n\n    checkPhone() {\n        if (!phoneRegex.test(this.state.phone)) {\n            this.setState({\n                phoneError: 'Invalid Phone Number'\n            }, () => {\n                this.props.actions.makeToast([{ message: this.state.phoneError, type: \"failure\" }])\n            });\n            return true;\n        }\n        this.setState({\n            phoneError: ''\n        });\n    }\n\n    checkUrl() {\n        if (!urlRegex.test(this.state.url)) {\n            this.setState({\n                urlError: 'Invalid URL'\n            }, () => {\n                this.props.actions.makeToast([{ message: this.state.urlError, type: \"failure\" }])\n            });\n            return true;\n        }\n        this.setState({\n            urlError: ''\n        });\n    }\n\n    handleChange(state, value) {\n        this.setState({\n            [state]: value\n        })\n    }\n\n    submit() {\n        this.setState({\n            isSubmitting: true\n        }, () => {\n            let error = false\n            if (this.state.phone.length > 0) {\n                error = this.checkPhone();\n            }\n            if (this.state.url.length > 0) {\n                error = this.checkUrl();\n            }\n\n            if (!error && this.state.name.length > 0 && this.state.phone.length > 0) {\n                let body= {};\n\n                body.ContactName = this.state.name;\n                body.OrganizationName = this.state.organization;\n                body.Phone = this.state.phone;\n                body.Url = this.state.url;\n                body.HashedWord = this.props.match.params.params.split(\"/\")[0]\n                body.EulaDate = moment(new Date()).format('MM/DD/YYYY')\n\n                this.props.actions.submitConfirmKeyRegistration(body)\n                    .then(() => {\n                        //Don't need to reset isSubmitting because the user will be redirected\n                        this.props.actions.makeToast([{ message: \"Your registration is now complete. You will receive an email with more details shortly.\", type: \"success\", long: true }])\n                        //Give the user time to read the toast, then forward to the homepage\n                        setTimeout(() => { window.location.href = \"/home\"; }, 5000);\n                    })\n                    .catch(() => {\n                        this.setState({\n                            isSubmitting: false\n                        }, () => {\n                            this.props.actions.makeToast([{ message: this.props.developers.keyRegistrationError, type: \"failure\" }])\n                        })\n                    })\n            } else {\n                this.setState({\n                    isSubmitting: false\n                })\n            }\n        })\n    }\n\n    render() {\n        const { name, organization, phone, url, isSubmitting, agree } = this.state;\n\n        return (\n            <div>\n                <form className=\"dlas-forms key-registration-form\">\n                    <h3>Complete LIS API Key Registration</h3>\n                    <div className=\"inner-grid short-one-three\">\n                        <label htmlFor=\"name\">Name*</label>\n                        <input\n                            id=\"name\"\n                            type=\"text\"\n                            value={name}\n                            onChange={(e) => this.handleChange(\"name\", e.target.value)}\n                        />\n                    </div>\n                    <div className=\"inner-grid short-one-three\">\n                        <label htmlFor=\"organization\">Organization</label>\n                        <input\n                            id=\"organization\"\n                            type=\"text\"\n                            value={organization}\n                            onChange={(e) => this.handleChange(\"organization\", e.target.value)}\n                        />\n                    </div>\n                    <div className=\"inner-grid short-one-three\">\n                        <label htmlFor=\"url\">Organization URL</label>\n                        <input\n                            id=\"url\"\n                            type=\"text\"\n                            value={url}\n                            onChange={(e) => this.handleChange(\"url\", e.target.value)}\n                        />\n                    </div>\n                    <div className=\"inner-grid short-one-three\">\n                        <label htmlFor=\"phone\">Phone Number*</label>\n                        <input\n                            id=\"phone\"\n                            type=\"text\"\n                            value={phone}\n                            onChange={(e) => this.handleChange(\"phone\", e.target.value)}\n                        />\n                    </div>\n                    <div className=\"inner-grid reverse-short-one-three\">\n                        <div>\n                            <label>By checking this box you agree to the <a href=\"/tos\" className=\"doc-link\">terms of service</a>.</label>\n                            <input\n                                type=\"checkbox\"\n                                checked={agree}\n                                onClick={(e) => this.handleChange(\"agree\", !agree)}\n                            />\n                        </div>\n                        <div className=\"align-right\">\n                            <button onClick={this.submit} disabled={isSubmitting || (!name || !phone || !agree)} type=\"button\" className=\"button\">Submit</button>\n                        </div>\n                    </div>\n                </form>\n            </div>\n        )\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { nav, developers } = state;\n        return {\n            nav,\n            developers\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, developersActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(KeyConfirmation)","import React from \"react\";\n\nclass TermsOfService extends React.Component {\n    constructor(props) {\n        super(props)\n\n    }\n\n    render() {\n        return (\n            <div>\n                <h1>LIS API Terms of Service</h1>\n                <p>These Terms of Service (“Terms”) apply when you use any of its APIs (collectively, the “Services”) that links or refers to the Terms. These terms are a legal contract between you and the Division of Legislative Automated Systems (“DLAS,” “we” or “us”) so it is important that you review them carefully before using the Services. Your use of the Services indicates that you agree to follow and be bound by the Terms. If you do not agree to the Terms, do not access or use the Services.</p>\n                <h3>1. General</h3>\n                <p>We may change the Terms or modify any features of the Services at any time at our sole discretion. The most current version of the Terms can be viewed by clicking on the “Terms of Service” link at the top of the “For Developers” page. If you continue to use the Services after changes are posted you will be deemed to have accepted the change.</p>\n                <h3>2. Compliance With Applicable Laws</h3>\n                <p>As a condition of your access to and use of the Services, you agree that you will not use the Services for any purpose that is unlawful or prohibited by these Terms and that you will comply with all applicable laws and any conditions or restrictions imposed by these terms. The Services are offered for your personal and non-commercial use only, and you are prohibited from using, and are expressly not granted the right to use, the Services for any other purpose.</p>\n                <h3>3. Privacy</h3>\n                <p>By using the Services, you indicate that you understand the information collection, use, and disclosure practices described in the Privacy Policy.</p>\n                <h3>4. Prohibited Conduct</h3>\n                <p>You may not access or use, or attempt to access or use, the Services to take any action that could harm us or any third party, interfere with the operation of the Services, or use the Services in a manner that violates any laws. For example, and without limitation, you may not:</p>\n                <ul>\n                    <li>Make use of the contents of the Services in any manner that constitutes an infringement of our rights or the rights of other users or third parties.</li>\n                    <li>Access parts of the Services to which you are not authorized, or attempt to circumvent any restrictions imposed on your use or access of the Services.</li>\n                    <li>Take any action that imposes an unreasonable or disproportionately large load on our network or infrastructure.</li>\n                    <li>Use any device, software, or routine to interfere or attempt to interfere with the proper working of the Services or any activity conducted on the Services.</li>\n                    <li>Attempt to decipher, decompile, disassemble, or reverse-engineer any of the software comprising or in any way making up a part of the Services.</li>\n                    <li>Engage in any other conduct that restricts or inhibits any other person from using the Services.</li>\n                    <li>Take any action that violates or threatens our system or network security.</li>\n                </ul>\n                <p>Violations of these Terms may result in civil or criminal liability. We may investigate violations of these Terms and we may also work with law enforcement authorities to prosecute users who violate the Terms.</p>\n                <h3>5. Registration and Security</h3>\n                <p>To register for Services, you will create login credentials by providing an email address to us and by selecting a password. You also provide us certain information during the registration process. Each login is for a single user only. You are not allowed to share or disclose your login credentials with any other user or person. We may cancel or suspend your access to the Services if you share your credentials.</p>\n                <p>You will be responsible for all usage and activity on your account, including use of the account by any third party authorized by you to use your login credentials, and for all charges for any goods or services. You are also responsible for all statements made or materials posted under your account, including liability for harm caused by such statements or materials. You may not transfer, sell, or otherwise assign your rights or obligations under these Terms.</p>\n                <p>You must meet the minimum age of digital consent in your country (13 years old in the United States of America) to use the Services. Any fraudulent, abusive, or otherwise illegal activity may be grounds for termination of your account, at our sole discretion, and we may refer you to appropriate law enforcement agencies.</p>\n                <p>DLAS maintains security standards and procedures regarding unauthorized access to customer information to prevent unauthorized removal or alteration of data. DLAS protects its records in accordance with its obligations as defined by applicable Virginia statutes, including, but not limited to, the Government Data Collection and Dissemination Practices Act, the Virginia Freedom of Information Act, and by any applicable U.S. federal laws.</p>\n                <h3>6. Charges for Services</h3>\n                <p>We may charge for access to portions of the Services or to the Services as a whole, and we reserve the right at any time to change the amount we charge for such access or subscriptions that include authorization to access the Services. In such an event, we will notify you in advance, and give you an opportunity to subscribe (or un-subscribe) to the Service(s). More information about any such subscriptions can be found on the appropriate locations of the Services. You shall pay all applicable taxes relating to use of the services, and recognize that any fees to third parties that may be required for you to receive the service (such as mobile data plans and text-message charges) are not included in the cost of the services.</p>\n                <h3>7. Third-Party Content and Links to Third-Party Websites</h3>\n                <p>The Services may contain links to websites that are not controlled, maintained, or regulated by DLAS or any organization affiliated with DLAS, and as such DLAS is NOT responsible for the content of those websites (“Linked Sites”). Use of information obtained from those web sites is voluntary, and reliance on that information should only be undertaken after an independent review of its accuracy. Reference at those web sites to any specific commercial product, process, or service by trade name, trademark, or otherwise DOES NOT constitute or imply endorsement, recommendation, or preference by DLAS. The agency tries to screen all sites included on its web site, but cannot control the content they possess.</p>\n                <h3>8. Disclaimer of Warranty and Limitation of Liability</h3>\n                <p>DLAS attempts to maintain the highest accuracy of content on its website. However, DLAS makes no claims, promises or guarantees about the accuracy, completeness, or adequacy of the contents of the Services and expressly disclaims all liability, whether direct or indirect, for any loss or damage arising out of use, reference to, or reliance on any information presented on or by the Services.</p>\n                <p>DLAS makes no warranty, representations, express or implied (a) that the information provided through the Services will be free from error, omission, interruption, defect or delay in operation, or from technical inaccuracies or typographical errors, (b) that the services will be available at any particular time or location (c) that defects or errors in the services will be corrected, or (d) that the content on the services are free of viruses or other harmful components. Any information on the Services is subject to change without notice, and DLAS disclaims all responsibility for the Services. We reserve the right to correct any errors or omissions in the Services. We also reserve the right to change, suspend or discontinue the availability of any Services at any time with or without notice. We provide the Services and associated documentation \"as is\" and you use them at your own risk. Further, there is no warranty that the Services will meet your needs or requirements or the needs or requirements of any other person.</p>\n                <h3>9. Termination</h3>\n                <p>DLAS may terminate this agreement for any reason at any time. DLAS reserves the right, in its sole discretion, to restrict, suspend, or terminate your access to and use of the Service, with or without prior notice. Otherwise applicable sections of the Terms shall survive termination. In addition to any termination rights, we reserve the right to enforce and prosecute any violations of these Terms.</p>\n            </div>\n        )\n    }\n}\n\nexport default TermsOfService;","import React from \"react\";\nimport { Link } from \"react-router-dom\"\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { developersActionCreators } from \"../../../stores/lis-developers-store\";\n\nclass AdminDevsPortal extends React.Component {\n  constructor(props) {\n    super(props)\n    this.state = {\n      docList: ''\n    }\n  }\n\n  componentDidMount() {\n    this.props.actions.getDocList(\"?IsPartner=true\");\n  }\n\n  render() {\n    return (\n      <div>\n        <h1>LIS Admin Developers Portal</h1>        \n        {this.props.developers.docList.length > 0 && this.props.developers.docList.map((b, i) => {\n          return (\n            <React.Fragment key={i}><Link to={{ pathname: \"/admin-developers/\" + b.ApiName }} className=\"doc-link\">{b.ApiName}</Link><br /></React.Fragment>\n          )\n        })}\n      </div>\n    )\n  }\n}\n\nexport default connect(\n  (state) => {\n    const { developers } = state;\n    return {\n      developers\n    }\n  },\n  (dispatch) => {\n    return {\n      actions: bindActionCreators(Object.assign({}, developersActionCreators), dispatch)\n    }\n  }\n)(AdminDevsPortal)","import React from \"react\";\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { RedocStandalone } from \"redoc\";\n\nimport { developersActionCreators } from \"../../../stores/lis-developers-store\";\nimport { navActionCreators } from \"../../../stores/lis-nav-store\";\n\nclass AdminDocumentComponent extends React.Component {\n    constructor(props) {\n        super(props);\n\n        this.backToList = this.backToList.bind(this);\n    }\n\n    componentDidMount() {    \n        this.props.actions.getDoc(\"?ApiName=\" + this.props.match.params.docName, true);\n    }\n\n    backToList() {\n        window.location.href = \"/admin-developers\"\n    }\n\n    render() {\n        return (\n            <div style={{ marginTop: \"20px\" }}>\n                <a onClick={this.backToList} style={{cursor: \"pointer\"}}>Back to List</a>\n                {this.props.developers.doc != '' ?\n                    <RedocStandalone\n                        spec={JSON.parse(this.props.developers.doc)}\n                        options={{\n                            nativeScrollbars: false,\n                            theme: {\n                                colors: {\n                                    primary: {\n                                        main: \"#34495e\"\n                                    },\n                                    http: {\n                                        get: \"#4BCA81\"\n                                    },\n                                    responses: {\n                                        error: {\n                                            color: \"#fb4f4f\"\n                                        },\n                                        success: {\n                                            color: \"#4BCA81\"\n                                        }\n                                    },\n                                    success: {\n                                        main: \"#4BCA81\"\n                                    },\n                                    error: {\n                                        main: \"#fb4f4f\"\n                                    }\n                                },\n                                typography: {\n                                    fontFamily: \"Lato\",\n                                    fontWeight: \"400\",\n                                    fontSize: \"14px\",\n                                    lineHeight: \"1.4\",\n                                    color: \"#333\",\n                                    code: {\n                                        fontSize: \"13px\",\n                                        fontFamily: \"consolas\"\n                                    },\n                                    headings: {\n                                        fontFamily: \"Lato\",\n                                        fontWeight: \"400\",\n                                        color: \"#34495e\"\n                                    },\n                                    links: {\n                                        color: \"#3498db\",\n                                        visited: \"#3498db\",\n                                        hover: \"#196090\"\n                                    },\n                                    optimizeSpeed: true\n                                },\n                                sidebar: {\n                                    backgroundColor: \"#F1F1F1\"\n                                },\n                                rightPanel: {\n                                    backgroundColor: \"#34495e\"\n                                },\n                                spacing: {\n                                    sectionHorizontal: 8,\n                                    sectionVertical: 4\n                                }\n                            },\n                            lazyRendering: true\n                        }}\n                    />\n                    :\n                    <div><span className=\"small-spinner\"></span></div>\n                }\n            </div>\n        )\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { developers, nav } = state;\n        return {\n            developers,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, developersActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(AdminDocumentComponent)","import React from 'react';\nimport { Route } from 'react-router';\nimport AdminDevsPortal from './lis-admin-developers-portal';\nimport AdminDocumentComponent from './lis-admin-document';\n\nclass AdminDocs extends React.Component {\n\n    render() {       \n\n        return (\n            <div>                \n                <Route exact path={`${this.props.match.path}`} component={AdminDevsPortal} />\n                <Route exact path={`${this.props.match.path}/:docName`} component={AdminDocumentComponent} />\n            </div>\n        )\n    }\n}\n\nexport default AdminDocs;","import React from \"react\"\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { Link, withRouter } from 'react-router-dom';\nimport { navActionCreators } from '../../stores/lis-nav-store';\nimport moment from 'moment-timezone';\n\nclass Footer extends React.Component {\n    render() {\n        return (\n            <div className={this.props.location.pathname === \"/\" || this.props.location.pathname.includes(\"/home\") ? \"footer-wrapper home\" : \"footer-wrapper\"} >\n                <div className=\"footer\">\n                    <div>\n                        <Link to=\"/home\">LIS Home</Link>\n                        <a href=\"mailto:LIS@dlas.virginia.gov\">Website Feedback</a>\n                        {this.props.login && this.props.login.userClaims.roles.find(x => x === \"Admin\"/* \"APIDocumentation\" */) ? <a href=\"/admin-developers\">For Developers</a> : <a href=\"/developers\">For Developers</a>}\n                        <Link to=\"/privacy\">Privacy Policy</Link>\n                        <Link to=\"/data-files\">Data Files</Link>\n                    </div>\n                    <div>\n                        <span>{\"© Copyright Commonwealth of Virginia \" + moment().format(\"YYYY\") + \". All rights reserved. Site developed by the \"}<a href=\"http://dlas.virginia.gov/\">Division of Legislative Automated Systems (DLAS)</a></span>\n                    </div>\n                </div>\n            </div>\n        )\n    }\n}\n\nconst FooterWrapper = connect(\n    (state) => {\n        const { nav, login } = state;\n        return {\n            nav,\n            login\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, navActionCreators), dispatch)\n        }\n    }\n)(Footer)\n\nexport default withRouter(FooterWrapper)","import React from 'react';\nimport ReactTable from 'react-table';\n\nclass ConfigurationsTable extends React.Component {\n\n    getTdProps = (state, rowInfo, instance) => {\n        if (rowInfo) {\n            //if we're showing differences for this row, get the associated admin assignment so we can compare accordingly\n            let associatedAdminAssignment;\n            const { uniqueIdentifier } = this.props;\n            if (instance.id && this.props.adminAssignments && this.props.showDifferences && this.props.showDifferences[rowInfo.original[uniqueIdentifier]]) {\n                associatedAdminAssignment = this.props.adminAssignments.find(aca => aca[uniqueIdentifier] === rowInfo.original[uniqueIdentifier]);\n            }\n\n            //If this is the CategoryCode column, we need to set the value for filtering to include the chamber in case they want to say \"BRREF (H)\" for example\n            //otherwise, if they entered \"BRREF (H)\" as a filter, it will not return any rows since they are all techincally just \"BRREF\" whether H or S\n            let originalValue = rowInfo.original[instance.id];\n            let associatedAdminValue = associatedAdminAssignment && associatedAdminAssignment[instance.id] !== undefined ? associatedAdminAssignment[instance.id] : undefined;\n            if (instance.id === \"CategoryCode\" && this.props.categories && this.props.uniqueCategoryIdentifier) {\n                const associatedRowCategoryCodeHasMultipleChambers = this.props.categories.filter(c => c.CategoryCode === rowInfo.original.CategoryCode);\n                if (associatedRowCategoryCodeHasMultipleChambers.length > 1) {\n                    originalValue += \" (\" + associatedRowCategoryCodeHasMultipleChambers.find(c => c[this.props.uniqueCategoryIdentifier] === rowInfo.original[this.props.uniqueCategoryIdentifier]).ChamberCode + \")\"\n                }\n\n                //if we have an associated admin assignment (which also means we are displaying both and comparing), then and only then also do the same logic as above for the associated admin value\n                if (associatedAdminAssignment) {\n                    const associatedRowAdminCategoryCodeHasMultipleChambers = this.props.categories.filter(c => c.CategoryCode === associatedAdminAssignment.CategoryCode);\n                    if (associatedRowAdminCategoryCodeHasMultipleChambers.length > 1) {\n                        associatedAdminValue += \" (\" + associatedRowAdminCategoryCodeHasMultipleChambers.find(c => c[this.props.uniqueCategoryIdentifier] === associatedAdminAssignment[this.props.uniqueCategoryIdentifier]).ChamberCode + \")\"\n                    }\n                }\n            }\n            return {\n                style: {\n                    //if it's new, always keep it to the same color; otherwise, if we're comparing against the associated admin assignment, show red or green based on equality comparison result\n                    'backgroundColor': rowInfo.original.new ? 'rgba(0,0,0,.025)' : this.props.showDifferences[rowInfo.original[uniqueIdentifier]] && instance.id ? associatedAdminValue !== originalValue ? '#ff9797' : 'rgba(91, 178, 114, 0.5)' : '',\n                    //set the bottom border a little larger for the 'new' top row to make it appear differently than the rest of the rows\n                    'borderBottomWidth': rowInfo.original.new ? '2px' : '1px',\n                }\n            }\n        }\n        return {};\n    }\n\n    render() {\n        const { isLoaded, header, assignments, newAssignment, columns, sort, categories, uniqueCategoryIdentifier } = this.props;\n        return (\n            <div>\n                <h3 className=\"no-margin-top margin-bottom-twentyfive\">{header}</h3>\n                <div>\n                    <ReactTable\n                        loading={!isLoaded}\n                        resizable={false}\n                        filterable={true}\n                        data={newAssignment ? [newAssignment, ...assignments] : assignments}\n                        columns={columns}\n                        getTdProps={this.getTdProps}\n                        getTheadProps={() => ({\n                            style: { position: 'sticky', top: '0px', zIndex: 5 }\n                        })}\n                        getTheadFilterThProps={(finalState, rowInfo, column, instance) => {\n                            if (column.Header !== finalState.columns[finalState.columns.length - 1].Header)\n                                return ({ style: { borderRight: '1px solid #fff' } })\n                            else\n                                return {}\n                        }}\n                        getTheadThProps={(finalState, rowInfo, column, instance) => sort ? ({\n                            onClick: () => sort(column)\n                        }) : () => null}\n                        defaultFilterMethod={(filter, row, column) => {\n                            const id = filter.pivotId || filter.id\n                            //always show the insertable/new assignment row\n                            const isNewRow = newAssignment && row._original && row._original.new;\n                            //allow filtering by chamber of category code if present\n                            let rowValue = row[id];\n                            if (id === \"CategoryCode\" && row._original && categories && uniqueCategoryIdentifier) {\n                                const associatedRowCategoryCodeHasMultipleChambers = categories.filter(c => c.CategoryCode === row._original.CategoryCode);\n                                if (associatedRowCategoryCodeHasMultipleChambers.length > 1) {\n                                    rowValue += \" (\" + associatedRowCategoryCodeHasMultipleChambers.find(c => c[uniqueCategoryIdentifier] === row._original[uniqueCategoryIdentifier]).ChamberCode + \")\"\n                                }\n                            }\n                            return rowValue !== undefined ? isNewRow || String(rowValue).toLowerCase().includes(filter.value.toLowerCase()) : false\n                        }}\n                        defaultPageSize={20}\n                        className=\"-striped -highlight overflow-visible\"\n                        style={{ overflow: 'visible' }}\n                    />\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default ConfigurationsTable\n\n\n\n\n\n\n\n","import React from 'react';\nimport ReactTooltip from 'react-tooltip';\nimport Select from 'react-select';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { calendarActionCreators } from \"../../stores/lis-calendar-store\";\nimport { navActionCreators } from \"../../stores/lis-nav-store\";\nimport ConfigurationsTable from './lis-configurations-table';\nimport { billActionCreators } from '../../stores/lis-legislation-store';\n\nconst EVENT = 0;\nconst CHAMBER = 1;\nconst TYPE = 2;\nconst CLASS = 3;\nconst PASSED = 4;\nconst UNCONTESTED = 5;\nconst CATEGORY = 6;\n\nconst uniqueIdentifier = \"CalendarAssignmentID\";\nconst uniqueCategoryIdentifier = \"CalendarCategoryTypeID\";\nconst categoryChamberIdentifier = \"calendarCategoryChamber\";\n\nconst requiredFields = [\"EventCode\", \"LegislationChamberCode\", \"LegislationTypeCode\", \"CategoryCode\"];\n\nconst newAssignmentFreshValues = {\n    CategoryCode: null,\n    EventCode: null,\n    p_LegislationDescription: null,\n    LegislationClass: null,\n    LegislationTypeCode: null,\n    LegislationChamberCode: null,\n    IsPassed: null,\n    IsUncontested: null,\n    [categoryChamberIdentifier]: null,\n    new: true\n};\n\nclass CalendarConfigurations extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            assignments: [],\n            adminAssignments: [],\n            categories: [],\n            legislationClassOptions: [],\n            loadedCategories: false,\n            loadedAssignments: false,\n            loadedAdminAssignments: false,\n            loadedLegislationClassOptions: false,\n            categoriesError: false,\n            assignmentsError: false,\n            legislationClassOptionsError: false,\n            adminAssignmentsError: false,\n            newAssignment: newAssignmentFreshValues,\n            duplicates: [],\n            showDifferences: {},\n            saving: {},\n            editing: {},\n            showAllDifferences: false,\n            filteringMismatches: false,\n            assignmentMismatches: []\n        };\n\n        this.getCategories = this.getCategories.bind(this);\n        this.getAssignments = this.getAssignments.bind(this);\n        this.getAdminAssignments = this.getAdminAssignments.bind(this);\n        this.getLegislationClasses = this.getLegislationClasses.bind(this);\n        this.handleAssignmentChange = this.handleAssignmentChange.bind(this);\n        this.sort = this.sort.bind(this);\n        this.handleSave = this.handleSave.bind(this);\n        this.showDifferences = this.showDifferences.bind(this);\n        this.buttonText = this.buttonText.bind(this);\n        this.checkDuplicates = this.checkDuplicates.bind(this);\n        this.toggleEdit = this.toggleEdit.bind(this);\n        this.getUneditedAssignment = this.getUneditedAssignment.bind(this);\n        this.toggleDifferences = this.toggleDifferences.bind(this);\n        this.findDifferences = this.findDifferences.bind(this);\n    }\n\n    componentDidMount() {\n        this.getCategories();\n        this.getAssignments();\n        this.getAdminAssignments();\n        this.getLegislationClasses();\n    }\n\n    getCategories() {\n        this.setState({ loadedCategories: false }, () => {\n            this.props.actions.getCalendarCategoriesReferences('')\n                .then(() => {\n                    this.setState({\n                        loadedCategories: true,\n                        categories: [...this.props.calendar.calendarCategoriesReferences].sort((a, b) => a.ChamberCode.localeCompare(b.ChamberCode) || a.CategoryCode.localeCompare(b.CategoryCode))\n                    });\n                }).catch(err => {\n                    if (err === \"Aborted\") {\n                        return;\n                    }\n                    console.error(err);\n                    this.setState({ loadedCategories: true, categories: [], categoriesError: true })\n                });\n        });\n    }\n\n    getAssignments() {\n        this.setState({ loadedAssignments: false }, () => {\n            this.props.actions.getCalendarAssignments().then(() => {\n                let assignments = JSON.parse(JSON.stringify(this.props.calendar.calendarAssignments));\n                assignments.sort((a, b) => a.CategoryCode.localeCompare(b.CategoryCode))\n\n                this.setState({\n                    loadedAssignments: true,\n                    assignments\n                })\n            }).catch(err => {\n                if (err === \"Aborted\") {\n                    return;\n                }\n                console.error(err);\n                this.setState({ loadedAssignments: true, assignments: [], assignmentsError: true })\n            })\n        });\n    }\n\n    getAdminAssignments() {\n        this.setState({ loadedAdminAssignments: false }, () => {\n            this.props.actions.getAdminCalendarAssignments().then(() => {\n                let adminAssignments = JSON.parse(JSON.stringify(this.props.calendar.adminCalendarAssignments));\n\n                this.setState({\n                    loadedAdminAssignments: true,\n                    adminAssignments\n                })\n            }).catch(err => {\n                if (err === \"Aborted\") {\n                    return;\n                }\n                console.error(err);\n                this.setState({ loadedAdminAssignments: true, adminAssignments: [], adminAssignmentsError: true })\n            })\n        });\n    }\n\n    getLegislationClasses() {\n        this.setState({ loadedLegislationClassOptions: false }, () => {\n            this.props.actions.getLegislationClasses().then(() => {\n                let legislationClassOptions = [...this.props.bills.legislationClasses];\n                legislationClassOptions.forEach(legClass => {\n                    legClass.label = legClass.LegislationClass;\n                    legClass.value = legClass.LegislationClassID;\n                });\n\n                this.setState({ loadedLegislationClassOptions: true, legislationClassOptions });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err);\n                this.setState({ loadedLegislationClassOptions: true, legislationClassOptions: [], legislationClassOptionsError: true })\n            });\n        })\n    }\n\n    handleAssignmentChange(uid, key, value) {\n        let assignments = [...this.state.assignments];\n        let assignment;\n        if (uid) {\n            assignment = assignments.find(ca => ca[uniqueIdentifier] === uid);\n        } else {\n            assignment = { ...this.state.newAssignment }\n        }\n        switch (key) {\n            case EVENT:\n                assignment.EventCode = value.label;\n                break;\n            case CHAMBER:\n                assignment.LegislationChamberCode = value ? value.label : null;\n                break;\n            case TYPE:\n                assignment.LegislationTypeCode = value.label;\n                break;\n            case PASSED:\n                assignment.IsPassed = value.label;\n                break;\n            case CLASS:\n                assignment.LegislationClass = value ? value.LegislationClass : null;\n                assignment.LegislationClassID = value ? value.LegislationClassID : null;\n                break;\n            case UNCONTESTED:\n                assignment.IsUncontested = value.label;\n                break;\n            case CATEGORY:\n                assignment[uniqueCategoryIdentifier] = value[uniqueCategoryIdentifier];\n                assignment.CategoryCode = value.CategoryCode;\n                assignment[categoryChamberIdentifier] = value.ChamberCode;\n                break;\n        }\n\n        let duplicates = [...this.state.duplicates];\n        //if there is an event code and legislationchambercode selected, this is enough to show the user the associated legislationdescription\n        if (assignment.EventCode && assignment.LegislationChamberCode !== null) {\n            const referenceEvent = [...this.props.billEventOptions].find(b => b.EventCode === assignment.EventCode && b.LegislationChamberCode === assignment.LegislationChamberCode && (assignment.IsPassed === null || assignment.IsPassed === b.IsPassed));\n            assignment.p_LegislationDescription = referenceEvent ? referenceEvent.LegislationDescription : null;\n\n            //if they have chosen an option for every required field (except category code), check to see if this is a duplicate entry, in which case prevent saving\n            if (requiredFields.every(val => assignment[val] !== null) && this.checkDuplicates(assignment)) {\n                duplicates.push({ uid: assignment[uniqueIdentifier] })\n            } else {\n                //there isn't a duplicate or there isn't enough values yet to determine; remove it from the duplicates if it's there\n                duplicates = duplicates.filter(d => d.uid !== assignment[uniqueIdentifier])\n            }\n        } else {\n            //there isn't enough info to determine the legislation description of the event, so set to null\n            assignment.p_LegislationDescription = null\n            //can't determine if there's a duplicate since we don't have enough values; remove it from the list of duplicates if it's there\n            duplicates = duplicates.filter(d => d.uid !== assignment[uniqueIdentifier])\n        }\n\n        if (uid) {\n            this.setState({ assignments, duplicates })\n        } else {\n            this.setState({ newAssignment: assignment, duplicates })\n        }\n    }\n\n    checkDuplicates(editedAssignment) {\n        const assignments = [...this.state.assignments];\n        if (!editedAssignment[categoryChamberIdentifier]) {\n            //assign the categoryChamberIdentifier if it hasn't been yet\n            editedAssignment[categoryChamberIdentifier] = this.state.categories.find(c => c[uniqueCategoryIdentifier] === editedAssignment[uniqueCategoryIdentifier]).ChamberCode;\n        }\n\n        //legislation class is not required, but we must include it in our logic for duplicates\n        return assignments.find(a => a[uniqueIdentifier] !== editedAssignment[uniqueIdentifier] &&\n            ((!a.LegislationClass || !editedAssignment.LegislationClass || a.LegislationClass === editedAssignment.LegislationClass) &&\n                (!a.LegislationType || !editedAssignment.LegislationType || a.LegislationType === editedAssignment.LegislationType) &&\n                ((!a.IsPassed && !editedAssignment.IsPassed) || a.IsPassed === editedAssignment.IsPassed) &&\n                ((!a.IsUncontested && !editedAssignment.IsUncontested) || a.IsUncontested === editedAssignment.IsUncontested) &&\n                requiredFields.every(val => (val === \"CategoryCode\" && editedAssignment[categoryChamberIdentifier] === this.state.categories.find(c => c[uniqueCategoryIdentifier] === a[uniqueCategoryIdentifier]).ChamberCode) || (val !== \"CategoryCode\" && a[val] === editedAssignment[val]))))\n    }\n\n    sort(column) {\n        if (column.sortable === false) { return; }\n        let assignments = [...this.state.assignments];\n        assignments = this.props.sort(assignments, column);\n        this.setState({ assignments })\n    }\n\n    handleSave(assignment) {\n        let saving = { ...this.state.saving };\n        saving[assignment[uniqueIdentifier]] = true;\n        this.setState({ saving }, () => {\n            const preSaveEventControlID = assignment.EventControlID;\n            //nullify EventControlID and let DB resolve it based on other values, but if it fails then we need to put it back for comparison checks in the table between admin/new\n            assignment.EventControlID = null;\n            this.props.actions.saveCalendarAssignment(assignment)\n                .then(() => {\n                    this.props.actions.makeToast([{ message: \"Save Successful\", type: \"success\" }]);\n\n                    //though the api is saving to both the current env and the admin db, the response is the one from the current env db. Update the assignments state value with this response\n                    const assignmentSave = JSON.parse(JSON.stringify(this.props.calendar.calendarAssignmentSave))[0];\n                    let assignments = [...this.state.assignments];\n                    const existingAssignmentIndex = assignments.findIndex(ca => ca[uniqueIdentifier] === assignmentSave[uniqueIdentifier]);\n                    if (existingAssignmentIndex > -1) {\n                        assignments[existingAssignmentIndex] = assignmentSave;\n                    } else {\n                        assignments.splice(0, 0, assignmentSave);\n                    }\n\n                    //reset editing and saving values\n                    let editing = { ...this.state.editing };\n                    editing[assignment[uniqueIdentifier]] = false;\n                    saving[assignment[uniqueIdentifier]] = false;\n                    this.setState({\n                        assignments,\n                        saving,\n                        editing,\n                        newAssignment: assignment.new ? newAssignmentFreshValues : this.state.newAssignment\n                    }, () => {\n                        this.getAdminAssignments(); //don't just assume the admin db save worked; refresh the admin assignments\n                    })\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n                    console.log(err);\n\n                    //reset EventControlID since it was removed\n                    let assignments = [...this.state.assignments];\n                    const associatedAssignment = assignments.find(a => a[uniqueIdentifier] === assignment[uniqueIdentifier]);\n                    if (associatedAssignment) {\n                        assignment.EventControlID = preSaveEventControlID;\n                    }\n                    //reset the saving state value but keep in edit mode by not resetting the editing state value\n                    saving[assignment[uniqueIdentifier]] = false;\n                    this.setState({ assignments, saving });\n                })\n        })\n    }\n\n    showDifferences(assignment) {\n        let showDifferences = { ...this.state.showDifferences };\n        showDifferences[assignment[uniqueIdentifier]] = !showDifferences[assignment[uniqueIdentifier]];\n        this.setState({ showDifferences });\n    }\n\n    getAssociatedAdminAssignmentWithoutModDate = (assignment) => {\n        const associatedAdminAssignment = this.state.adminAssignments.find(aca => aca[uniqueIdentifier] === assignment[uniqueIdentifier]);\n        if (!associatedAdminAssignment) { return false; }\n        //remove the categoryChamberIdentifier and ModificationDate from the object so we can compare objects between the current env and the admin db\n        const { ModificationDate, [categoryChamberIdentifier]: value, ...associatedAdminAssignmentWithoutModificationDate } = associatedAdminAssignment;\n        return associatedAdminAssignmentWithoutModificationDate;\n    }\n\n    toggleEdit(original) {\n        let editing = { ...this.state.editing };\n        editing[original[uniqueIdentifier]] = !editing[original[uniqueIdentifier]];\n\n        //if they're exiting edit mode for this row, reset the values to what they were before going into edit mode, and re-check duplicates\n        let assignments = [...this.state.assignments];\n        let duplicates = [...this.state.duplicates];\n        if (!editing[original[uniqueIdentifier]]) {\n            const assignmentIndex = assignments.findIndex(c => c[uniqueIdentifier] === original[uniqueIdentifier]);\n            const uneditedAssignment = JSON.parse(JSON.stringify(this.getUneditedAssignment(original)));\n            assignments[assignmentIndex] = uneditedAssignment;\n\n            if (!this.checkDuplicates(assignments[assignmentIndex])) {\n                duplicates = duplicates.filter(d => d.uid !== assignments[assignmentIndex][uniqueIdentifier])\n            }\n        }\n\n        this.setState({ editing, assignments, duplicates });\n    }\n\n    buttonText = (pendingSave, original) => {\n        if (pendingSave || original[uniqueIdentifier]) {\n            return this.state.saving[original[uniqueIdentifier]] ? \"Saving\" : \"Save\";\n        } else {\n            return \"Insert\";\n        }\n    }\n\n    getUneditedAssignment(assignment) {\n        //if we've saved the assignment, that's the latest/unedited version; otherwise, the Get should be the latest/unedited version\n        return [...this.props.calendar.calendarAssignmentSave] && [...this.props.calendar.calendarAssignmentSave].find(cas => cas[uniqueIdentifier] === assignment[uniqueIdentifier]) ? [...this.props.calendar.calendarAssignmentSave].find(cas => cas[uniqueIdentifier] === assignment[uniqueIdentifier]) : [...this.props.calendar.calendarAssignments].find(ca => ca[uniqueIdentifier] === assignment[uniqueIdentifier]);\n    }\n\n    toggleDifferences() {\n        this.setState({\n            showAllDifferences: !this.state.showAllDifferences\n        }, () => {\n            if (this.state.showAllDifferences) {\n                this.findDifferences();\n            }\n        })\n    }\n\n    findDifferences() {\n        this.setState({ filteringMismatches: true }, () => {\n            const assignmentMismatches = this.props.findDifferences([...this.state.assignments], uniqueIdentifier, categoryChamberIdentifier, this.getAssociatedAdminAssignmentWithoutModDate)\n            this.setState({ assignmentMismatches, filteringMismatches: false })\n        })\n    }\n\n    render() {\n        const { loadedAssignments, loadedAdminAssignments, loadedCategories, loadedLegislationClassOptions,\n            assignments, adminAssignments, newAssignment, categories, legislationClassOptions,\n            duplicates, showDifferences, showAllDifferences, assignmentMismatches, filteringMismatches,\n            categoriesError, assignmentsError, legislationClassOptionsError, adminAssignmentsError,\n            saving, editing } = this.state;\n        const { billEventOptions, billEventOptionsError, loadedBillEventOptions, customStyles } = this.props;\n\n        const isLoaded = loadedAssignments && loadedAdminAssignments && loadedCategories && loadedBillEventOptions && loadedLegislationClassOptions;\n\n        const columns =\n            [\n                {\n                    Header: \"Category Code\",\n                    accessor: \"CategoryCode\",\n                    width: 125,\n                    Placeholder: \"Filter...\",\n                    Cell: ({ original }) => {\n                        const associatedAdminAssignmentWithoutModDate = this.getAssociatedAdminAssignmentWithoutModDate(original);\n                        const { ModificationDate, [categoryChamberIdentifier]: value, ...originalWithoutModificationDate } = original;\n                        const differentInAdminDB = associatedAdminAssignmentWithoutModDate && JSON.stringify(associatedAdminAssignmentWithoutModDate) !== JSON.stringify(originalWithoutModificationDate);\n                        const doesNotExistInAdminDB = original[uniqueIdentifier] && !associatedAdminAssignmentWithoutModDate;\n                        const showTooltip = differentInAdminDB || doesNotExistInAdminDB || showDifferences[original[uniqueIdentifier]]\n                        const tooltip = showTooltip && (\n                            <React.Fragment>\n                                {differentInAdminDB && <i data-tip={`This assignment is different in the admin database.${showDifferences[original[uniqueIdentifier]] ? \" The assignment in the admin database is displayed on the bottom below.\" : \"\"} Click ${showDifferences[original[uniqueIdentifier]] ? 'again to hide the admin assignment' : 'to show the admin assignment below the currently displayed assignment'}.`} className=\"icon notification calendar-assignment\" onClick={() => this.showDifferences(original)} />}\n                                {doesNotExistInAdminDB && <i data-tip=\"This assignment does not exist in the admin database.\" className=\"icon notification calendar-assignment\" />}\n                                {!differentInAdminDB && !doesNotExistInAdminDB && showDifferences[original[uniqueIdentifier]] && <i data-tip=\"This assignment is no longer different than in the admin database. Click again to hide the admin assignment.\" className=\"icon notification calendar-assignment\" onClick={() => this.showDifferences(original)} />}\n                                {showTooltip && <ReactTooltip key={new Date()} />} {/*unique key is needed because otherwise, if the user hovers over a tooltip on one page of the table, if they hover over another on a different page, it will not work*/}\n                            </React.Fragment>\n                        )\n\n                        let originalCategoryDisplayCode = original.CategoryCode;\n                        if (categories.find(c => c[uniqueCategoryIdentifier] === original[uniqueCategoryIdentifier]) && categories.find(c => c[uniqueCategoryIdentifier] === original[uniqueCategoryIdentifier]).ChamberCode) {\n                            originalCategoryDisplayCode += \" (\" + categories.find(c => c[uniqueCategoryIdentifier] === original[uniqueCategoryIdentifier]).ChamberCode + \")\";\n                        }\n                        let associatedAdminCategoryDisplayCode = associatedAdminAssignmentWithoutModDate.CategoryCode;\n                        if (categories.find(c => c[uniqueCategoryIdentifier] === associatedAdminAssignmentWithoutModDate[uniqueCategoryIdentifier]) && categories.find(c => c[uniqueCategoryIdentifier] === associatedAdminAssignmentWithoutModDate[uniqueCategoryIdentifier]).ChamberCode) {\n                            associatedAdminCategoryDisplayCode += \" (\" + categories.find(c => c[uniqueCategoryIdentifier] === associatedAdminAssignmentWithoutModDate[uniqueCategoryIdentifier]).ChamberCode + \")\";\n                        }\n\n                        return (\n                            <React.Fragment>\n                                {original[uniqueIdentifier] && isLoaded &&\n                                    <div className={`calendar-assignment icons${showTooltip ? ' double' : ''}`}>\n                                        {<button className={`icon ${editing && editing[original[uniqueIdentifier]] ? 'delete' : 'edit'}`} onClick={() => this.toggleEdit(original)} />}\n                                        {tooltip}\n                                    </div>\n                                }\n                                {!original[uniqueIdentifier] || (editing && editing[original[uniqueIdentifier]]) ?\n                                    <Select\n                                        options={categories}\n                                        onChange={(val) => this.handleAssignmentChange(original[uniqueIdentifier], CATEGORY, val)}\n                                        getOptionLabel={opt => (opt.ChamberCode ? \"(\" + opt.ChamberCode + \") \" : \"\") + opt.CategoryCode + \" - \" + opt.Description}\n                                        getOptionValue={opt => opt[uniqueCategoryIdentifier]}\n                                        value={categories.find(c => c[uniqueCategoryIdentifier] === original[uniqueCategoryIdentifier])}\n                                        styles={customStyles(true)}\n                                    />\n                                    :\n                                    <span title={categories.find(c => c[uniqueCategoryIdentifier] === original[uniqueCategoryIdentifier]) ? categories.find(c => c[uniqueCategoryIdentifier] === original[uniqueCategoryIdentifier]).Description : ''}>{String(originalCategoryDisplayCode || '')}</span>\n                                }\n                                {showDifferences[original[uniqueIdentifier]] &&\n                                    <React.Fragment>\n                                        {!editing || !editing[original[uniqueIdentifier]] && <br />}\n                                        <span title={categories.find(c => c[uniqueCategoryIdentifier] === associatedAdminAssignmentWithoutModDate[uniqueCategoryIdentifier]) ? categories.find(c => c[uniqueCategoryIdentifier] === associatedAdminAssignmentWithoutModDate[uniqueCategoryIdentifier]).Description : ''}>{String(associatedAdminCategoryDisplayCode || '')}</span>\n                                    </React.Fragment>\n                                }\n                            </React.Fragment>\n                        )\n                    },\n                    style: { textAlign: 'center', overflow: 'visible' }\n                },\n                {\n                    Header: \"Event\",\n                    accessor: \"EventCode\",\n                    width: 90,\n                    style: { textAlign: 'center', overflow: 'visible' },\n                    Placeholder: \"Filter...\",\n                    Cell: ({ original }) => {\n                        const associatedAdminAssignmentWithoutModDate = this.getAssociatedAdminAssignmentWithoutModDate(original);\n                        return (\n                            <div>\n                                {!original[uniqueIdentifier] || (editing && editing[original[uniqueIdentifier]]) ?\n                                    <Select\n                                        options={[...billEventOptions].filter((value, index, self) =>\n                                            index === self.findIndex((t) => (\n                                                t.EventCode === value.EventCode\n                                            ))\n                                        )}\n                                        onChange={(val) => this.handleAssignmentChange(original[uniqueIdentifier], EVENT, val)}\n                                        value={billEventOptions.find(b => b.label === original.EventCode)}\n                                        styles={customStyles(false)}\n                                    />\n                                    :\n                                    String(original.EventCode)\n                                }\n                                {showDifferences[original[uniqueIdentifier]] &&\n                                    <React.Fragment>\n                                        {!editing || !editing[original[uniqueIdentifier]] && <br />}\n                                        {String(associatedAdminAssignmentWithoutModDate.EventCode || '')}\n                                    </React.Fragment>\n                                }\n                            </div>\n                        )\n                    }\n                },\n                {\n                    Header: \"Event Description\",\n                    accessor: \"p_LegislationDescription\",\n                    filter: 'includesValue',\n                    Placeholder: \"Filter...\",\n                    Cell: ({ original }) => {\n                        const associatedAdminAssignment = showDifferences[original[uniqueIdentifier]] && adminAssignments.find(aca => aca[uniqueIdentifier] === original[uniqueIdentifier]);\n                        return (\n                            <React.Fragment>\n                                <span title={String(original.p_LegislationDescription || '')}>{String(original.p_LegislationDescription || '')}</span>\n                                {showDifferences[original[uniqueIdentifier]] &&\n                                    <React.Fragment>\n                                        <br />\n                                        <span title={String(associatedAdminAssignment.p_LegislationDescription || '')}>{String(associatedAdminAssignment.p_LegislationDescription || '')}</span>\n                                    </React.Fragment>\n                                }\n                            </React.Fragment>\n                        )\n                    }\n                },\n                {\n                    Header: \"Leg Chamber\",\n                    accessor: \"LegislationChamberCode\",\n                    Placeholder: \"Filter...\",\n                    width: 100,\n                    style: { textAlign: 'center', overflow: 'visible' },\n                    Cell: ({ original }) => {\n                        const associatedAdminAssignment = showDifferences[original[uniqueIdentifier]] && adminAssignments.find(aca => aca[uniqueIdentifier] === original[uniqueIdentifier]);\n                        const options = [{ label: \"H\" }, { label: \"S\" }];\n                        return (\n                            <div>\n                                {!original[uniqueIdentifier] || (editing && editing[original[uniqueIdentifier]]) ?\n                                    <Select\n                                        options={options}\n                                        onChange={(val) => this.handleAssignmentChange(original[uniqueIdentifier], CHAMBER, val)}\n                                        getOptionValue={opt => opt.label}\n                                        value={options.find(b => b.label === original.LegislationChamberCode)}\n                                        styles={customStyles(false)}\n                                    />\n                                    :\n                                    String(original.LegislationChamberCode || '')\n                                }\n                                {showDifferences[original[uniqueIdentifier]] &&\n                                    <React.Fragment>\n                                        {!editing || !editing[original[uniqueIdentifier]] && <br />}\n                                        {String(associatedAdminAssignment.LegislationChamberCode || '')}\n                                    </React.Fragment>\n                                }\n                            </div>\n                        )\n                    }\n                },\n                {\n                    Header: \"Leg Type\",\n                    accessor: \"LegislationTypeCode\",\n                    Placeholder: \"Filter...\",\n                    width: 80,\n                    style: { textAlign: 'center', overflow: 'visible' },\n                    Cell: ({ original }) => {\n                        const options = [{ label: \"B\" }, { label: \"J\" }, { label: \"R\" }]\n                        const associatedAdminAssignment = showDifferences[original[uniqueIdentifier]] && adminAssignments.find(aca => aca[uniqueIdentifier] === original[uniqueIdentifier]);\n                        return (\n                            <div>\n                                {!original[uniqueIdentifier] || (editing && editing[original[uniqueIdentifier]]) ?\n                                    <Select\n                                        options={options}\n                                        onChange={(val) => this.handleAssignmentChange(original[uniqueIdentifier], TYPE, val)}\n                                        getOptionValue={opt => opt.label}\n                                        value={options.find(b => b.label === original.LegislationTypeCode)}\n                                        styles={customStyles(false)}\n                                    />\n                                    :\n                                    String(original.LegislationTypeCode || '')\n                                }\n                                {showDifferences[original[uniqueIdentifier]] &&\n                                    <React.Fragment>\n                                        {!editing || !editing[original[uniqueIdentifier]] && <br />}\n                                        {String(associatedAdminAssignment.LegislationTypeCode || '')}\n                                    </React.Fragment>\n                                }\n                            </div>\n                        )\n                    }\n                },\n                {\n                    Header: \"Leg Class\",\n                    accessor: \"LegislationClass\",\n                    Placeholder: \"Filter...\",\n                    width: 160,\n                    style: { textAlign: 'center', overflow: 'visible' },\n                    Cell: ({ original }) => {\n                        const associatedAdminAssignment = showDifferences[original[uniqueIdentifier]] && adminAssignments.find(aca => aca[uniqueIdentifier] === original[uniqueIdentifier]);\n                        return (\n                            <div>\n                                {!original[uniqueIdentifier] || (editing && editing[original[uniqueIdentifier]]) ?\n                                    <Select\n                                        options={legislationClassOptions}\n                                        onChange={(val) => this.handleAssignmentChange(original[uniqueIdentifier], CLASS, val)}\n                                        value={legislationClassOptions.find(b => b.LegislationClassID === original.LegislationClassID)}\n                                        styles={customStyles(false)}\n                                        isClearable\n                                    />\n                                    :\n                                    String(original.LegislationClass || '')\n                                }\n                                {showDifferences[original[uniqueIdentifier]] &&\n                                    <React.Fragment>\n                                        {!editing || !editing[original[uniqueIdentifier]] && <br />}\n                                        {String(associatedAdminAssignment.LegislationClass || '')}\n                                    </React.Fragment>\n                                }\n                            </div>\n                        )\n                    }\n                },\n                {\n                    Header: \"Passed\",\n                    id: \"IsPassed\",\n                    accessor: cm => cm.IsPassed && cm.IsPassed.toString(),\n                    Placeholder: \"Filter...\",\n                    width: 75,\n                    style: { textAlign: 'center', overflow: 'visible' },\n                    Cell: ({ original }) => {\n                        const associatedAdminAssignment = showDifferences[original[uniqueIdentifier]] && adminAssignments.find(aca => aca[uniqueIdentifier] === original[uniqueIdentifier]);\n                        const options = [{ label: true }, { label: false }];\n                        return (\n                            <div>\n                                {!original[uniqueIdentifier] || (editing && editing[original[uniqueIdentifier]]) ?\n                                    <Select\n                                        options={options}\n                                        onChange={(val) => this.handleAssignmentChange(original[uniqueIdentifier], PASSED, val)}\n                                        getOptionLabel={opt => opt.label.toString()}\n                                        getOptionValue={opt => opt.label.toString()}\n                                        value={options.find(b => b.label === original.IsPassed)}\n                                        styles={customStyles(false)}\n                                    />\n                                    :\n                                    String(original.IsPassed !== undefined ? original.IsPassed : '')\n                                }\n                                {showDifferences[original[uniqueIdentifier]] &&\n                                    <React.Fragment>\n                                        {!editing || !editing[original[uniqueIdentifier]] && <br />}\n                                        {String(associatedAdminAssignment.IsPassed !== undefined ? associatedAdminAssignment.IsPassed : '')}\n                                    </React.Fragment>\n                                }\n                            </div>\n                        )\n                    }\n                },\n                {\n                    Header: \"Uncontested\",\n                    id: \"IsUncontested\",\n                    Placeholder: \"Filter...\",\n                    accessor: cm => cm.IsUncontested && cm.IsUncontested.toString(),\n                    width: 110,\n                    style: { textAlign: 'center', overflow: 'visible' },\n                    Cell: ({ original }) => {\n                        const associatedAdminAssignment = showDifferences[original[uniqueIdentifier]] && adminAssignments.find(aca => aca[uniqueIdentifier] === original[uniqueIdentifier]);\n                        const options = [{ label: true }, { label: false }];\n                        return (\n                            <div>\n                                {!original[uniqueIdentifier] || (editing && editing[original[uniqueIdentifier]]) ?\n                                    <Select\n                                        options={options}\n                                        onChange={(val) => this.handleAssignmentChange(original[uniqueIdentifier], UNCONTESTED, val)}\n                                        getOptionLabel={opt => opt.label.toString()}\n                                        getOptionValue={opt => opt.label.toString()}\n                                        value={options.find(b => b.label === original.IsUncontested)}\n                                        styles={customStyles(false)}\n                                    />\n                                    :\n                                    String(original.IsUncontested !== undefined ? original.IsUncontested : '')\n                                }\n                                {showDifferences[original[uniqueIdentifier]] &&\n                                    <React.Fragment>\n                                        {!editing || !editing[original[uniqueIdentifier]] && <br />}\n                                        {String(associatedAdminAssignment.IsUncontested !== undefined ? associatedAdminAssignment.IsUncontested : '')}\n                                    </React.Fragment>\n                                }\n                            </div>\n                        )\n                    }\n                },\n                {\n                    Header: \"Actions\",\n                    width: 100,\n                    sortable: false,\n                    filterable: false,\n                    Cell: ({ original }) => {\n                        if (duplicates.find(d => d.uid === original[uniqueIdentifier])) {\n                            return <span className=\"input-feedback\" style={{ fontWeight: 'bold', fontSize: '90%' }}>DUPLICATE</span>\n                        } else {\n                            const requiredFieldsNotCompleted = requiredFields.some(val => original[val] === null);\n                            //to compare between unedited and current, remove the categoryChamberIdentifier since the unedited will not have it\n                            //to compare between current and admin, remove the ModificationDate and categoryChamberIdentifier\n                            const uneditedAssignment = original[uniqueIdentifier] && this.getUneditedAssignment(original);\n                            const key = 'ModificationDate';\n                            //get unedited without category chamber identifier in order to use later to compare between unedited and current\n                            const { [categoryChamberIdentifier]: value, ...uneditedWithoutCategoryChamberIdentifier } = uneditedAssignment || {};\n                            //now get associated admin assignment without category chamber identifier and mod date in order to use later to compare between current and admin\n                            const associatedAdminAssignmentWithoutModDate = this.getAssociatedAdminAssignmentWithoutModDate(original);\n                            //now get current assignment without category chamber identifier in order to use later to compare between unedited and current\n                            const { [categoryChamberIdentifier]: value3, ...originalWithoutCategoryChamberIdentifier } = original;\n                            //now get current assignment without category chamber identifier and mod date in order to use later to compare between current and admin\n                            const { [key]: value4, ...originalWithoutCategoryChamberIdentifierAndModificationDate } = originalWithoutCategoryChamberIdentifier;\n                            //check if it's different or inexistent in admin db\n                            const differentOrNonExistentInAdminDB = original[uniqueIdentifier] && this.props.isDifferentOrNonExistentInAdminDB(originalWithoutCategoryChamberIdentifierAndModificationDate, associatedAdminAssignmentWithoutModDate)\n                            //if it's different from admin or different from the unedited version, set it as saveable\n                            const pendingSave = original[uniqueIdentifier] && (differentOrNonExistentInAdminDB || (uneditedWithoutCategoryChamberIdentifier && JSON.stringify(uneditedWithoutCategoryChamberIdentifier) !== JSON.stringify(originalWithoutCategoryChamberIdentifier)));\n                            return (\n                                <button className=\"button\"\n                                    disabled={!saving || Object.values(saving).indexOf(true) > -1 || requiredFieldsNotCompleted || (original[uniqueIdentifier] && !pendingSave)}\n                                    onClick={() => this.handleSave(original)}>{this.buttonText(pendingSave, original)}</button>\n                            )\n                        }\n                    },\n                    style: { textAlign: 'center' }\n                }\n            ]\n\n        return (\n            <div>\n                <div>\n                    {(billEventOptionsError || categoriesError || assignmentsError || adminAssignmentsError || legislationClassOptionsError) ?\n                        <React.Fragment>\n                            {billEventOptionsError && <p>Error loading legislation event options</p>}\n                            {categoriesError && <p>Error loading calendar category options</p>}\n                            {legislationClassOptionsError && <p>Error loading legislation class options</p>}\n                            {assignmentsError && <p>Error loading calendar assignments</p>}\n                            {adminAssignmentsError && <p>Error loading admin calendar assignments</p>}\n                        </React.Fragment>\n                        :\n                        <React.Fragment>\n                            <button className=\"button\" style={{ float: 'right' }} disabled={!isLoaded || filteringMismatches} onClick={this.toggleDifferences}>{showAllDifferences ? 'Show All' : 'Show Admin Mismatches'}</button>\n                            <ConfigurationsTable header={\"Calendar Assignments\"} assignments={showAllDifferences ? [...assignments].filter(ca => assignmentMismatches.includes(ca[uniqueIdentifier])) : assignments} adminAssignments={adminAssignments} newAssignment={newAssignment} categories={categories} uniqueCategoryIdentifier={uniqueCategoryIdentifier} isLoaded={isLoaded} columns={columns} sort={this.sort} showDifferences={showDifferences} uniqueIdentifier={uniqueIdentifier} />\n                        </React.Fragment>\n                    }\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { nav, bills, calendar } = state;\n        return {\n            nav,\n            bills,\n            calendar\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, navActionCreators, billActionCreators, calendarActionCreators), dispatch)\n        }\n    }\n)(CalendarConfigurations)\n\n\n\n\n\n\n\n","import React from 'react';\nimport ReactTooltip from 'react-tooltip';\nimport Select from 'react-select';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { communicationsActionCreators } from \"../../stores/lis-communications-store\";\nimport { navActionCreators } from \"../../stores/lis-nav-store\";\nimport ConfigurationsTable from './lis-configurations-table';\nimport { billActionCreators } from '../../stores/lis-legislation-store';\n\nconst EVENT = 0;\nconst CHAMBER = 1;\nconst TYPE = 2;\nconst PASSED = 3;\nconst CATEGORY = 4;\nconst UNCONTESTED = 5;\n\nconst uniqueIdentifier = \"CommunicationAssignmentID\";\nconst uniqueCategoryIdentifier = \"CommunicationCategoryTypeID\";\nconst categoryChamberIdentifier = \"communicationCategoryChamber\";\n\nconst requiredFields = [\"EventCode\", \"LegislationChamberCode\", \"LegislationTypeCode\", \"CategoryCode\"];\n\nconst newAssignmentFreshValues = {\n    CategoryCode: null,\n    EventCode: null,\n    p_LegislationDescription: null,\n    LegislationTypeCode: null,\n    LegislationChamberCode: null,\n    IsPassed: null,\n    [categoryChamberIdentifier]: null,\n    new: true\n};\n\nclass CommunicationsConfigurations extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            assignments: [],\n            adminAssignments: [],\n            categories: [],\n            loadedCategories: false,\n            loadedAssignments: false,\n            loadedAdminAssignments: false,\n            categoriesError: false,\n            assignmentsError: false,\n            adminAssignmentsError: false,\n            newAssignment: newAssignmentFreshValues,\n            duplicates: [],\n            showDifferences: {},\n            saving: {},\n            editing: {},\n            showAllDifferences: false,\n            filteringMismatches: false,\n            assignmentMismatches: []\n        };\n\n        this.getCategories = this.getCategories.bind(this);\n        this.getAssignments = this.getAssignments.bind(this);\n        this.getAdminAssignments = this.getAdminAssignments.bind(this);\n        this.handleAssignmentChange = this.handleAssignmentChange.bind(this);\n        this.sort = this.sort.bind(this);\n        this.handleSave = this.handleSave.bind(this);\n        this.showDifferences = this.showDifferences.bind(this);\n        this.buttonText = this.buttonText.bind(this);\n        this.toggleEdit = this.toggleEdit.bind(this);\n        this.checkDuplicates = this.checkDuplicates.bind(this);\n        this.getUneditedAssignment = this.getUneditedAssignment.bind(this);\n        this.toggleDifferences = this.toggleDifferences.bind(this);\n        this.findDifferences = this.findDifferences.bind(this);\n    }\n\n    componentDidMount() {\n        this.getCategories();\n        this.getAssignments();\n        this.getAdminAssignments();\n    }\n\n    getCategories() {\n        this.setState({ loadedCategories: false }, () => {\n            this.props.actions.getCommCategories('')\n                .then(() => {\n                    this.setState({\n                        loadedCategories: true,\n                        categories: [...this.props.communications.commCategories].sort((a, b) => a.ChamberCode.localeCompare(b.ChamberCode) || a.CategoryCode.localeCompare(b.CategoryCode))\n                    });\n                }).catch(err => {\n                    if (err === \"Aborted\") {\n                        return;\n                    }\n                    console.error(err);\n                    this.setState({ loadedCategories: true, categories: [], categoriesError: true })\n                });\n        });\n    }\n\n    getAssignments() {\n        this.setState({ loadedAssignments: false }, () => {\n            this.props.actions.getCommunicationAssignments().then(() => {\n                let assignments = JSON.parse(JSON.stringify(this.props.communications.communicationAssignments));\n                assignments.sort((a, b) => a.CategoryCode.localeCompare(b.CategoryCode))\n\n                this.setState({\n                    loadedAssignments: true,\n                    assignments\n                })\n            }).catch(err => {\n                if (err === \"Aborted\") {\n                    return;\n                }\n                console.error(err);\n                this.setState({ loadedAssignments: true, assignments: [], assignmentsError: true })\n            })\n        });\n    }\n\n    getAdminAssignments() {\n        this.setState({ loadedAdminAssignments: false }, () => {\n            this.props.actions.getAdminCommunicationAssignments().then(() => {\n                let adminAssignments = JSON.parse(JSON.stringify(this.props.communications.adminCommunicationAssignments));\n\n                this.setState({\n                    loadedAdminAssignments: true,\n                    adminAssignments\n                })\n            }).catch(err => {\n                if (err === \"Aborted\") {\n                    return;\n                }\n                console.error(err);\n                this.setState({ loadedAdminAssignments: true, adminAssignments: [], adminAssignmentsError: true })\n            })\n        });\n    }\n\n    handleAssignmentChange(uid, key, value) {\n        let assignments = [...this.state.assignments];\n        let assignment;\n        if (uid) {\n            assignment = assignments.find(c => c[uniqueIdentifier] === uid);\n        } else {\n            assignment = { ...this.state.newAssignment };\n        }\n\n        switch (key) {\n            case EVENT:\n                assignment.EventCode = value.label;\n                break;\n            case CHAMBER:\n                assignment.LegislationChamberCode = value ? value.label : null;\n                break;\n            case TYPE:\n                assignment.LegislationTypeCode = value.label;\n                break;\n            case PASSED:\n                assignment.IsPassed = value.label;\n                break;\n            case UNCONTESTED:\n                assignment.IsUncontested = value.label;\n                break;\n            case CATEGORY:\n                assignment[uniqueCategoryIdentifier] = value[uniqueCategoryIdentifier];\n                assignment.CategoryCode = value.CategoryCode;\n                assignment[categoryChamberIdentifier] = value.ChamberCode;\n                break;\n        }\n\n        let duplicates = [...this.state.duplicates];\n        //if there is an event code and legislationchambercode selected, this is enough to show the user the associated legislationdescription\n        if (assignment.EventCode && assignment.LegislationChamberCode !== null) {\n            const referenceEvent = [...this.props.billEventOptions].find(b => b.EventCode === assignment.EventCode && b.LegislationChamberCode === assignment.LegislationChamberCode && (assignment.IsPassed === null || assignment.IsPassed === b.IsPassed));\n            assignment.p_LegislationDescription = referenceEvent ? referenceEvent.LegislationDescription : null;\n\n            //if they have chosen an option for every required field (except category code), check to see if this is a duplicate entry, in which case prevent saving\n            if (requiredFields.every(val => assignment[val] !== null) && this.checkDuplicates(assignment)) {\n                duplicates.push({ uid: assignment[uniqueIdentifier] })\n            } else {\n                //there isn't a duplicate or there isn't enough values yet to determine; remove it from the duplicates if it's there\n                duplicates = duplicates.filter(d => d.uid !== assignment[uniqueIdentifier])\n            }\n        } else {\n            //there isn't enough info to determine the legislation description of the event, so set to null\n            assignment.p_LegislationDescription = null\n            //can't determine if there's a duplicate since we don't have enough values; remove it from the list of duplicates if it's there\n            duplicates = duplicates.filter(d => d.uid !== assignment[uniqueIdentifier])\n        }\n\n        if (uid) {\n            this.setState({ assignments, duplicates })\n        } else {\n            this.setState({ newAssignment: assignment, duplicates })\n        }\n    }\n\n    checkDuplicates(editedAssignment) {\n        const assignments = [...this.state.assignments];\n        if (!editedAssignment[categoryChamberIdentifier]) {\n            //assign the categoryChamberIdentifier if it hasn't been yet\n            const refCategory = this.state.categories.find(c => c[uniqueCategoryIdentifier] === editedAssignment[uniqueCategoryIdentifier]);\n            editedAssignment[categoryChamberIdentifier] = refCategory ? refCategory.ChamberCode : null;\n        }\n        return assignments.find(a => a[uniqueIdentifier] !== editedAssignment[uniqueIdentifier] &&\n            (!a.LegislationTypeCode || !editedAssignment.LegislationTypeCode || a.LegislationTypeCode === editedAssignment.LegislationTypeCode) &&\n            ((!a.IsPassed && !editedAssignment.IsPassed) || a.IsPassed === editedAssignment.IsPassed) &&\n            requiredFields.every(val => (val === \"CategoryCode\" && (!this.state.categories.find(c => c[uniqueCategoryIdentifier] === a[uniqueCategoryIdentifier]) || editedAssignment[categoryChamberIdentifier] === this.state.categories.find(c => c[uniqueCategoryIdentifier] === a[uniqueCategoryIdentifier]).ChamberCode)) || (val !== \"CategoryCode\" && a[val] === editedAssignment[val])))\n    }\n\n    sort(column) {\n        if (column.sortable === false) { return; }\n        let assignments = [...this.state.assignments];\n        assignments = this.props.sort(assignments, column);\n        this.setState({ assignments })\n    }\n\n    handleSave(assignment) {\n        let saving = { ...this.state.saving };\n        saving[assignment[uniqueIdentifier]] = true;\n        this.setState({ saving }, () => {\n            //nullify EventControlID and let DB resolve it based on other values, but if it fails then we need to put it back for comparison checks in the table between admin/new\n            const preSaveEventControlID = assignment.EventControlID;\n            assignment.EventControlID = null;\n            this.props.actions.saveCommunicationAssignment(assignment)\n                .then(() => {\n                    this.props.actions.makeToast([{ message: \"Save Successful\", type: \"success\" }]);\n\n                    //though the api is saving to both the current env and the admin db, the response is the one from the current env db. Update the assignments state value with this response\n                    const assignmentSave = JSON.parse(JSON.stringify(this.props.communications.communicationAssignmentSave))[0];\n                    let assignments = [...this.state.assignments];\n                    const existingAssignmentIndex = assignments.findIndex(ca => ca[uniqueIdentifier] === assignmentSave[uniqueIdentifier]);\n                    if (existingAssignmentIndex > -1) {\n                        assignments[existingAssignmentIndex] = assignmentSave;\n                    } else {\n                        assignments.splice(0, 0, assignmentSave);\n                    }\n\n                    //reset editing and saving values\n                    let editing = { ...this.state.editing };\n                    editing[assignment[uniqueIdentifier]] = false;\n                    saving[assignment[uniqueIdentifier]] = false;\n                    this.setState({\n                        assignments,\n                        saving,\n                        editing,\n                        newAssignment: assignment.new ? newAssignmentFreshValues : this.state.newAssignment\n                    }, () => {\n                        this.getAdminAssignments(); //don't just assume the admin db save worked; refresh the admin assignments\n                    })\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    this.props.actions.makeToast([{ message: \"Save Failed\", type: \"failure\" }]);\n                    console.log(err);\n\n                    //reset EventControlID since it was removed\n                    let assignments = [...this.state.assignments];\n                    const associatedAssignment = assignments.find(a => a[uniqueIdentifier] === assignment[uniqueIdentifier]);\n                    if (associatedAssignment) {\n                        assignment.EventControlID = preSaveEventControlID;\n                    }\n\n                    //reset the saving state value but keep in edit mode by not resetting the editing state value\n                    saving[assignment[uniqueIdentifier]] = false;\n                    this.setState({ assignments, saving });\n                })\n        })\n    }\n\n    showDifferences(assignment) {\n        let showDifferences = { ...this.state.showDifferences };\n        showDifferences[assignment[uniqueIdentifier]] = !showDifferences[assignment[uniqueIdentifier]];\n        this.setState({ showDifferences });\n    }\n\n    getAssociatedAdminAssignmentWithoutModDate = (assignment) => {\n        const associatedAdminAssignment = this.state.adminAssignments.find(aca => aca[uniqueIdentifier] === assignment[uniqueIdentifier]);\n        if (!associatedAdminAssignment) { return false; }\n        //remove the categoryChamberIdentifier and ModificationDate from the object so we can compare objects between the current env and the admin db\n        const { ModificationDate, [categoryChamberIdentifier]: value, ...associatedAdminAssignmentWithoutModificationDate } = associatedAdminAssignment || {};\n        return associatedAdminAssignmentWithoutModificationDate;\n    }\n\n    toggleEdit(original) {\n        let editing = { ...this.state.editing };\n        editing[original[uniqueIdentifier]] = !editing[original[uniqueIdentifier]];\n\n        //if they're exiting edit mode for this row, reset the values to what they were before going into edit mode, and re-check duplicates\n        let assignments = [...this.state.assignments];\n        let duplicates = [...this.state.duplicates];\n        if (!editing[original[uniqueIdentifier]]) {\n            const assignmentIndex = assignments.findIndex(c => c[uniqueIdentifier] === original[uniqueIdentifier]);\n            const uneditedAssignment = JSON.parse(JSON.stringify(this.getUneditedAssignment(original)));\n            assignments[assignmentIndex] = uneditedAssignment;\n\n            if (!this.checkDuplicates(assignments[assignmentIndex])) {\n                duplicates = duplicates.filter(d => d.uid !== assignments[assignmentIndex][uniqueIdentifier])\n            }\n        }\n\n        this.setState({ editing, assignments, duplicates });\n    }\n\n    buttonText = (pendingSave, original) => {\n        if (pendingSave || original[uniqueIdentifier]) {\n            return this.state.saving[original[uniqueIdentifier]] ? \"Saving\" : \"Save\";\n        } else {\n            return \"Insert\";\n        }\n    }\n\n    getUneditedAssignment(assignment) {\n        //if we've saved the assignment, that's the latest/unedited version; otherwise, the Get should be the latest/unedited version\n        return [...this.props.communications.communicationAssignmentSave] && [...this.props.communications.communicationAssignmentSave].find(cas => cas[uniqueIdentifier] === assignment[uniqueIdentifier]) ? [...this.props.communications.communicationAssignmentSave].find(cas => cas[uniqueIdentifier] === assignment[uniqueIdentifier]) : [...this.props.communications.communicationAssignments].find(ca => ca[uniqueIdentifier] === assignment[uniqueIdentifier]);\n    }\n\n    toggleDifferences() {\n        this.setState({\n            showAllDifferences: !this.state.showAllDifferences\n        }, () => {\n            if (this.state.showAllDifferences) {\n                this.findDifferences();\n            }\n        })\n    }\n\n    findDifferences() {\n        this.setState({ filteringMismatches: true }, () => {\n            const assignmentMismatches = this.props.findDifferences([...this.state.assignments], uniqueIdentifier, categoryChamberIdentifier, this.getAssociatedAdminAssignmentWithoutModDate)\n            this.setState({ assignmentMismatches, filteringMismatches: false })\n        })\n    }\n\n    render() {\n        const { loadedAssignments, loadedAdminAssignments, loadedCategories,\n            assignments, adminAssignments, newAssignment, categories,\n            duplicates, showDifferences, showAllDifferences, assignmentMismatches, filteringMismatches,\n            categoriesError, assignmentsError, adminAssignmentsError,\n            saving, editing } = this.state;\n        const { billEventOptions, billEventOptionsError, loadedBillEventOptions, customStyles } = this.props;\n\n        const isLoaded = loadedAssignments && loadedAdminAssignments && loadedCategories && loadedBillEventOptions;\n\n        const columns =\n            [\n                {\n                    Header: \"Category Code\",\n                    accessor: \"CategoryCode\",\n                    width: 140,\n                    Placeholder: \"Filter...\",\n                    Cell: ({ original }) => {\n                        const associatedAdminAssignmentWithoutModDate = this.getAssociatedAdminAssignmentWithoutModDate(original);\n                        const { ModificationDate, [categoryChamberIdentifier]: value, ...originalWithoutModificationDate } = original;\n                        const differentInAdminDB = associatedAdminAssignmentWithoutModDate && JSON.stringify(associatedAdminAssignmentWithoutModDate) !== JSON.stringify(originalWithoutModificationDate);\n                        const doesNotExistInAdminDB = original[uniqueIdentifier] && !associatedAdminAssignmentWithoutModDate;\n                        const showTooltip = differentInAdminDB || doesNotExistInAdminDB || showDifferences[original[uniqueIdentifier]]\n                        const tooltip = showTooltip && (\n                            <React.Fragment>\n                                {differentInAdminDB && <i data-tip={`This assignment is different in the admin database.${showDifferences[original[uniqueIdentifier]] ? \" The assignment in the admin database is displayed on the bottom below.\" : \"\"} Click ${showDifferences[original[uniqueIdentifier]] ? 'again to hide the admin assignment' : 'to show the admin assignment below the currently displayed assignment'}.`} className=\"icon notification communication-assignment\" onClick={() => this.showDifferences(original)} />}\n                                {doesNotExistInAdminDB && <i data-tip=\"This assignment does not exist in the admin database.\" className=\"icon notification communication-assignment\" />}\n                                {!differentInAdminDB && !doesNotExistInAdminDB && showDifferences[original[uniqueIdentifier]] && <i data-tip=\"This assignment is no longer different than in the admin database. Click again to hide the admin assignment.\" className=\"icon notification communication-assignment\" onClick={() => this.showDifferences(original)} />}\n                                {showTooltip && <ReactTooltip key={new Date()} />} {/*unique key is needed because otherwise, if the user hovers over a tooltip on one page of the table, if they hover over another on a different page, it will not work*/}\n                            </React.Fragment>\n                        )\n\n                        let originalCategoryDisplayCode = original.CategoryCode;\n                        if (categories.filter(c => c.CategoryCode === original.CategoryCode).length > 1) {\n                            const refCategory = categories.find(c => c[uniqueCategoryIdentifier] === original[uniqueCategoryIdentifier]);\n                            if (refCategory) {\n                                originalCategoryDisplayCode += \" (\" + refCategory.ChamberCode + \")\";\n                            }\n                        }\n                        let associatedAdminCategoryDisplayCode = associatedAdminAssignmentWithoutModDate.CategoryCode;\n                        if (categories.filter(c => c.CategoryCode === associatedAdminAssignmentWithoutModDate.CategoryCode).length > 1) {\n                            const refCategory = categories.find(c => c[uniqueCategoryIdentifier] === associatedAdminAssignmentWithoutModDate[uniqueCategoryIdentifier]);\n                            if (refCategory) {\n                                associatedAdminCategoryDisplayCode += \" (\" + refCategory.ChamberCode + \")\";\n                            }\n                        }\n\n                        return (\n                            <React.Fragment>\n                                {original[uniqueIdentifier] && isLoaded &&\n                                    <div className={`communication-assignment icons${showTooltip ? ' double' : ''}`}>\n                                        {<button className={`icon ${editing && editing[original[uniqueIdentifier]] ? 'delete' : 'edit'}`} onClick={() => this.toggleEdit(original)} />}\n                                        {tooltip}\n                                    </div>\n                                }\n                                {!original[uniqueIdentifier] || (editing && editing[original[uniqueIdentifier]]) ?\n                                    <Select\n                                        options={categories}\n                                        onChange={(val) => this.handleAssignmentChange(original[uniqueIdentifier], CATEGORY, val)}\n                                        getOptionLabel={opt => opt.CategoryCode + (opt.ChamberCode && categories.filter(c => c.CategoryCode === opt.CategoryCode).length > 1 ? \" (\" + opt.ChamberCode + \")\" : \"\") + \" - \" + opt.Description}\n                                        getOptionValue={opt => opt[uniqueCategoryIdentifier]}\n                                        value={categories.find(c => c[uniqueCategoryIdentifier] === original[uniqueCategoryIdentifier])}\n                                        styles={customStyles(true)}\n                                    />\n                                    :\n                                    <span title={categories.find(c => c[uniqueCategoryIdentifier] === original[uniqueCategoryIdentifier]) ? categories.find(c => c[uniqueCategoryIdentifier] === original[uniqueCategoryIdentifier]).Description : ''}>{String(originalCategoryDisplayCode || '')}</span>\n                                }\n                                {showDifferences[original[uniqueIdentifier]] &&\n                                    <React.Fragment>\n                                        {!editing || !editing[original[uniqueIdentifier]] && <br />}\n                                        <span title={categories.find(c => c[uniqueCategoryIdentifier] === associatedAdminAssignmentWithoutModDate[uniqueCategoryIdentifier]) ? categories.find(c => c[uniqueCategoryIdentifier] === associatedAdminAssignmentWithoutModDate[uniqueCategoryIdentifier]).Description : ''}>{String(associatedAdminCategoryDisplayCode || '')}</span>\n                                    </React.Fragment>\n                                }\n                            </React.Fragment>\n                        )\n                    },\n                    style: { textAlign: 'center', overflow: 'visible' }\n                },\n                {\n                    Header: \"Event\",\n                    accessor: \"EventCode\",\n                    width: 120,\n                    style: { textAlign: 'center', overflow: 'visible' },\n                    Placeholder: \"Filter...\",\n                    Cell: ({ original }) => {\n                        const associatedAdminAssignment = showDifferences[original[uniqueIdentifier]] && adminAssignments.find(aca => aca[uniqueIdentifier] === original[uniqueIdentifier]);\n                        return (\n                            <div>\n                                {!original[uniqueIdentifier] || (editing && editing[original[uniqueIdentifier]]) ?\n                                    <Select\n                                        options={[...billEventOptions].filter((value, index, self) =>\n                                            index === self.findIndex((t) => (\n                                                t.EventCode === value.EventCode\n                                            ))\n                                        )}\n                                        onChange={(val) => this.handleAssignmentChange(original[uniqueIdentifier], EVENT, val)}\n                                        value={billEventOptions.find(b => b.label === original.EventCode)}\n                                        styles={customStyles(false)}\n                                    />\n                                    :\n                                    String(original.EventCode)\n                                }\n                                {showDifferences[original[uniqueIdentifier]] &&\n                                    <React.Fragment>\n                                        {!editing || !editing[original[uniqueIdentifier]] && <br />}\n                                        {String(associatedAdminAssignment.EventCode || '')}\n                                    </React.Fragment>\n                                }\n                            </div>\n                        )\n                    }\n                },\n                {\n                    Header: \"Event Description\",\n                    accessor: \"p_LegislationDescription\",\n                    filter: 'includesValue',\n                    Placeholder: \"Filter...\",\n                    Cell: ({ original }) => {\n                        const associatedAdminAssignment = showDifferences[original[uniqueIdentifier]] && adminAssignments.find(aca => aca[uniqueIdentifier] === original[uniqueIdentifier]);\n                        return (\n                            <React.Fragment>\n                                <span title={String(original.p_LegislationDescription || '')}>{String(original.p_LegislationDescription || '')}</span>\n                                {showDifferences[original[uniqueIdentifier]] &&\n                                    <React.Fragment>\n                                        <br />\n                                        <span title={String(associatedAdminAssignment.p_LegislationDescription || '')}>{String(associatedAdminAssignment.p_LegislationDescription || '')}</span>\n                                    </React.Fragment>\n                                }\n                            </React.Fragment>\n                        )\n                    }\n                },\n                {\n                    Header: \"Leg Chamber\",\n                    accessor: \"LegislationChamberCode\",\n                    width: 100,\n                    Placeholder: \"Filter...\",\n                    style: { textAlign: 'center', overflow: 'visible' },\n                    Cell: ({ original }) => {\n                        const associatedAdminAssignment = showDifferences[original[uniqueIdentifier]] && adminAssignments.find(aca => aca[uniqueIdentifier] === original[uniqueIdentifier]);\n                        const options = [{ label: \"H\" }, { label: \"S\" }];\n                        return (\n                            <div>\n                                {!original[uniqueIdentifier] || (editing && editing[original[uniqueIdentifier]]) ?\n                                    <Select\n                                        options={options}\n                                        onChange={(val) => this.handleAssignmentChange(original[uniqueIdentifier], CHAMBER, val)}\n                                        getOptionValue={opt => opt.label}\n                                        value={options.find(b => b.label === original.LegislationChamberCode)}\n                                        styles={customStyles(false)}\n                                    />\n                                    :\n                                    String(original.LegislationChamberCode || '')\n                                }\n                                {showDifferences[original[uniqueIdentifier]] &&\n                                    <React.Fragment>\n                                        {!editing || !editing[original[uniqueIdentifier]] && <br />}\n                                        {String(associatedAdminAssignment.LegislationChamberCode || '')}\n                                    </React.Fragment>\n                                }\n                            </div>\n                        )\n                    }\n                },\n                {\n                    Header: \"Leg Type\",\n                    accessor: \"LegislationTypeCode\",\n                    width: 100,\n                    Placeholder: \"Filter...\",\n                    style: { textAlign: 'center', overflow: 'visible' },\n                    Cell: ({ original }) => {\n                        const associatedAdminAssignment = showDifferences[original[uniqueIdentifier]] && adminAssignments.find(aca => aca[uniqueIdentifier] === original[uniqueIdentifier]);\n                        const options = [{ label: \"B\" }, { label: \"J\" }, { label: \"R\" }]\n                        return (\n                            <div>\n                                {!original[uniqueIdentifier] || (editing && editing[original[uniqueIdentifier]]) ?\n                                    <Select\n                                        options={options}\n                                        onChange={(val) => this.handleAssignmentChange(original[uniqueIdentifier], TYPE, val)}\n                                        getOptionValue={opt => opt.label}\n                                        value={options.find(b => b.label === original.LegislationTypeCode)}\n                                        styles={customStyles(false)}\n                                    />\n                                    :\n                                    String(original.LegislationTypeCode || '')\n                                }\n                                {showDifferences[original[uniqueIdentifier]] &&\n                                    <React.Fragment>\n                                        {!editing || !editing[original[uniqueIdentifier]] && <br />}\n                                        {String(associatedAdminAssignment.LegislationTypeCode || '')}\n                                    </React.Fragment>\n                                }\n                            </div>\n                        )\n                    }\n                },\n                {\n                    Header: \"Passed\",\n                    id: \"IsPassed\",\n                    accessor: cm => cm.IsPassed && cm.IsPassed.toString(),\n                    width: 100,\n                    Placeholder: \"Filter...\",\n                    style: { textAlign: 'center', overflow: 'visible' },\n                    Cell: ({ original }) => {\n                        const associatedAdminAssignment = showDifferences[original[uniqueIdentifier]] && adminAssignments.find(aca => aca[uniqueIdentifier] === original[uniqueIdentifier]);\n                        const options = [{ label: true }, { label: false }];\n                        return (\n                            <div>\n                                {!original[uniqueIdentifier] || (editing && editing[original[uniqueIdentifier]]) ?\n                                    <Select\n                                        options={options}\n                                        onChange={(val) => this.handleAssignmentChange(original[uniqueIdentifier], PASSED, val)}\n                                        getOptionLabel={opt => opt.label.toString()}\n                                        getOptionValue={opt => opt.label.toString()}\n                                        value={options.find(b => b.label === original.IsPassed)}\n                                        styles={customStyles(false)}\n                                    />\n                                    :\n                                    String(original.IsPassed !== undefined ? original.IsPassed : '')\n                                }\n                                {showDifferences[original[uniqueIdentifier]] &&\n                                    <React.Fragment>\n                                        {!editing || !editing[original[uniqueIdentifier]] && <br />}\n                                        {String(associatedAdminAssignment.IsPassed !== undefined ? associatedAdminAssignment.IsPassed : '')}\n                                    </React.Fragment>\n                                }\n                            </div>\n                        )\n                    }\n                },\n                {\n                    Header: \"Actions\",\n                    width: 110,\n                    sortable: false,\n                    filterable: false,\n                    Cell: ({ original }) => {\n                        if (duplicates.find(d => d.uid === original[uniqueIdentifier])) {\n                            return <span className=\"input-feedback\" style={{ fontWeight: 'bold', fontSize: '90%' }}>DUPLICATE</span>\n                        } else {\n                            const requiredFieldsNotCompleted = requiredFields.some(val => original[val] === null);\n                            //to compare between unedited and current, remove the categoryChamberIdentifier since the unedited will not have it\n                            //to compare between current and admin, remove the ModificationDate and categoryChamberIdentifier\n                            const uneditedAssignment = original[uniqueIdentifier] && this.getUneditedAssignment(original);\n                            const key = 'ModificationDate';\n                            //get unedited without category chamber identifier in order to use later to compare between unedited and current\n                            const { [categoryChamberIdentifier]: value, ...uneditedWithoutCategoryChamberIdentifier } = uneditedAssignment || {};\n                            //now get associated admin assignment without category chamber identifier and mod date in order to use later to compare between current and admin\n                            const associatedAdminAssignmentWithoutModDate = this.getAssociatedAdminAssignmentWithoutModDate(original);\n                            //now get current assignment without category chamber identifier in order to use later to compare between unedited and current\n                            const { [categoryChamberIdentifier]: value3, ...originalWithoutCategoryChamberIdentifier } = original;\n                            //now get current assignment without category chamber identifier and mod date in order to use later to compare between current and admin\n                            const { [key]: value4, ...originalWithoutCategoryChamberIdentifierAndModificationDate } = originalWithoutCategoryChamberIdentifier;\n                            //check if it's different or inexistent in admin db\n                            const differentOrNonExistentInAdminDB = original[uniqueIdentifier] && this.props.isDifferentOrNonExistentInAdminDB(originalWithoutCategoryChamberIdentifierAndModificationDate, associatedAdminAssignmentWithoutModDate)\n                            //if it's different from admin or different from the unedited version, set it as saveable\n                            const pendingSave = original[uniqueIdentifier] && (differentOrNonExistentInAdminDB || (uneditedWithoutCategoryChamberIdentifier && JSON.stringify(uneditedWithoutCategoryChamberIdentifier) !== JSON.stringify(originalWithoutCategoryChamberIdentifier)));\n                            return (\n                                <button className=\"button\"\n                                    disabled={!saving || Object.values(saving).indexOf(true) > -1 || requiredFieldsNotCompleted || (original[uniqueIdentifier] && !pendingSave)}\n                                    onClick={() => this.handleSave(original)}>{this.buttonText(pendingSave, original)}</button>\n                            )\n                        }\n                    },\n                    style: { textAlign: 'center' }\n                }\n            ]\n\n        return (\n            <div>\n                <div>\n                    {(billEventOptionsError || categoriesError || assignmentsError || adminAssignmentsError) ?\n                        <React.Fragment>\n                            {billEventOptionsError && <p>Error loading legislation event options</p>}\n                            {categoriesError && <p>Error loading communication category options</p>}\n                            {assignmentsError && <p>Error loading communication assignments</p>}\n                            {adminAssignmentsError && <p>Error loading admin communication assignments</p>}\n                        </React.Fragment>\n                        :\n                        <React.Fragment>\n                            <button className=\"button\" style={{ float: 'right' }} disabled={!isLoaded || filteringMismatches} onClick={this.toggleDifferences}>{showAllDifferences ? 'Show All' : 'Show Admin Mismatches'}</button>\n                            <ConfigurationsTable header={\"Communication Assignments\"} assignments={showAllDifferences ? [...assignments].filter(ca => assignmentMismatches.includes(ca[uniqueIdentifier])) : assignments} adminAssignments={adminAssignments} newAssignment={newAssignment} categories={categories} uniqueCategoryIdentifier={uniqueCategoryIdentifier} isLoaded={isLoaded} columns={columns} sort={this.sort} showDifferences={showDifferences} uniqueIdentifier={uniqueIdentifier} />\n                        </React.Fragment>\n                    }\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { nav, bills, communications } = state;\n        return {\n            nav,\n            bills,\n            communications\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, navActionCreators, billActionCreators, communicationsActionCreators), dispatch)\n        }\n    }\n)(CommunicationsConfigurations)\n\n\n\n\n\n\n\n","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nclass ConfigurationsGrid extends React.Component {\n    render() {\n        return (\n            <div>\n                <div className=\"configurations configurations-icon-links\">\n                    <div className=\"grid-wrapper three\">\n                        <div className=\"configurations\">\n                            <Link className=\"configurations info-link calendar\" to=\"/configurations-management/calendar\"></Link>\n                            <Link to=\"/configurations-management/calendar\">Calendar</Link>\n                        </div>\n                        <div className=\"configurations\">\n                            <Link className=\"configurations info-link communications\" to=\"/configurations-management/communications\"></Link>\n                            <Link to=\"/configurations-management/communications\">Communications</Link>\n                        </div>\n                        <div className=\"configurations\">\n                            <a className=\"configurations info-link category-action\"></a>\n                            <a>Category Action<br/>(Coming Soon)</a>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default ConfigurationsGrid","import React from 'react';\nimport { Route } from 'react-router';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport CalendarConfigurations from './lis-calendar-configurations';\nimport CommunicationsConfigurations from './lis-communications-configurations';\nimport ConfigurationsGrid from './lis-configurations-grid';\nimport { billActionCreators } from '../../stores/lis-legislation-store';\nimport { Link } from 'react-router-dom';\n\nconst customStyles = (categoryColumn) => ({\n    option: (base, state) => ({\n        ...base,\n        fontSize: '0.8em',\n    }),\n    control: (base) => ({\n        ...base,\n        padding: '1px',\n        margin: 0,\n        minHeight: 0,\n        fontSize: '0.8em',\n    }),\n    singleValue: (base, state) => {\n        return { ...base, };\n    },\n    valueContainer: base => ({\n        ...base,\n        padding: '2px 4px'\n    }),\n    dropdownIndicator: base => ({\n        ...base,\n        padding: '2px'\n    }),\n    clearIndicator: base => ({\n        ...base,\n        padding: '0px',\n    }),\n    menu: base => ({\n        ...base,\n        width: categoryColumn ? 'auto' : '100%',\n        maxWidth: '600px',\n        textAlign: categoryColumn ? 'left' : 'center'\n    })\n})\n\nconst isAscending = (arr, header) => {\n    return arr.every(function (x, i) {\n        return i === 0 || [null, undefined].includes(x[header]) || [null, undefined].includes(arr[i - 1][header]) || x[header].toString().toLowerCase() >= arr[i - 1][header].toString().toLowerCase();\n    });\n}\n\nclass ConfigurationsManagement extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            billEventOptions: [],\n            loadedBillEventOptions: false,\n            billEventOptionsError: false\n        };\n\n        this.getEventReferences = this.getEventReferences.bind(this);\n        this.sort = this.sort.bind(this);\n    }\n\n    componentDidMount() {\n        this.getEventReferences();\n    }\n\n    getEventReferences() {\n        this.setState({ loadedBillEventOptions: false }, () => {\n            this.props.actions.getBillEventReferences(\"?isActive=true\")\n                .then(() => {\n                    let billEventReferences = [...this.props.bills.billEventRef];\n\n                    billEventReferences.forEach(ref => {\n                        ref.label = ref.EventCode\n                        ref.value = ref.EventCode\n                    });\n\n                    this.setState({\n                        loadedBillEventOptions: true,\n                        billEventOptions: billEventReferences\n                    });\n                }).catch(err => {\n                    if (err === 'Aborted') {\n                        return;\n                    }\n                    console.log(err);\n                    this.setState({ loadedBillEventOptions: true, billEventOptions: [], billEventOptionsError: true })\n                });\n        })\n    }\n\n    sort(assignments, column) {\n        const currentlyAsc = isAscending(assignments, column.id);\n        assignments.sort((first, second) => {\n            let a = first[column.id]\n            let b = second[column.id]\n            // force null and undefined to the bottom\n            a = a === null || a === undefined ? Infinity : a\n            if (a === Infinity) { return 1 }\n            b = b === null || b === undefined ? Infinity : b\n            if (b === Infinity) { return -1 }\n            // force any string values to lowercase\n            a = typeof a === 'string' ? a.toLowerCase() : a\n            b = typeof b === 'string' ? b.toLowerCase() : b\n            // Return either 1 or -1 to indicate a sort priority\n            if (a > b) {\n                return currentlyAsc ? -1 : 1;\n            }\n            if (a < b) {\n                return currentlyAsc ? 1 : -1;\n            }\n            //secondarily sort by category code ascending\n            if (first['CategoryCode'] && second['CategoryCode']) {\n                if (first['CategoryCode'].toLowerCase() > second['CategoryCode'].toLowerCase()) {\n                    return 1;\n                }\n                if (second['CategoryCode'].toLowerCase() > first['CategoryCode'].toLowerCase()) {\n                    return -1;\n                }\n            }\n            //tertiarily sort by event code ascending\n            if (first['EventCode'] && second['EventCode']) {\n                if (first['EventCode'].toLowerCase() > second['EventCode'].toLowerCase()) {\n                    return 1;\n                }\n                if (second['EventCode'].toLowerCase() > first['EventCode'].toLowerCase()) {\n                    return -1;\n                }\n            }\n            // returning 0 or undefined will use any subsequent column sorting methods or the row index as a tiebreaker\n            return 0\n        })\n        return assignments;\n    }\n\n    findDifferences(assignments, uniqueIdentifier, categoryChamberIdentifier, getAssociatedAdminAssignmentFn) {\n        let assignmentMismatches = [];\n        assignments.forEach(assignment => {\n            const associatedAdminAssignment = getAssociatedAdminAssignmentFn(assignment);\n            if (!associatedAdminAssignment) {\n                assignmentMismatches.push(assignment[uniqueIdentifier]);\n                return;\n            }\n            const { ModificationDate, [categoryChamberIdentifier]: value, ...originalWithoutCategoryChamberAndModificationDate } = assignment;\n            if (this.isDifferentOrNonExistentInAdminDB(originalWithoutCategoryChamberAndModificationDate, associatedAdminAssignment)) {\n                assignmentMismatches.push(assignment[uniqueIdentifier]);\n            }\n        });\n        return assignmentMismatches;\n    }\n\n    isDifferentOrNonExistentInAdminDB(current, admin) {\n        return (!admin || JSON.stringify(admin) !== JSON.stringify(current));\n    }\n\n    render() {\n        const { loadedBillEventOptions, billEventOptions, billEventOptionsError } = this.state;\n        return (\n            <div style={{ paddingBottom: '40px' }}>\n                <div>\n                    <h1 className=\"no-margin-bottom\">{this.props.location.pathname.endsWith('/configurations-management') ? \"Configurations Management\" : <Link className=\"no-margin-bottom\" style={{ textDecoration: 'none' }} to=\"/configurations-management\">Configurations Management</Link>}</h1>\n                </div>\n                <Route exact path={this.props.match.path} render={props => <ConfigurationsGrid\n                    {...props}\n                />} />\n                <Route path={\"/configurations-management/calendar\"} render={props => <CalendarConfigurations\n                    {...props}\n                    loadedBillEventOptions={loadedBillEventOptions}\n                    billEventOptions={billEventOptions}\n                    billEventOptionsError={billEventOptionsError}\n                    customStyles={customStyles}\n                    isAscending={isAscending}\n                    sort={this.sort}\n                    findDifferences={this.findDifferences}\n                    isDifferentOrNonExistentInAdminDB={this.isDifferentOrNonExistentInAdminDB}\n                />} />\n                <Route path={\"/configurations-management/communications\"} render={props => <CommunicationsConfigurations\n                    {...props}\n                    loadedBillEventOptions={loadedBillEventOptions}\n                    billEventOptions={billEventOptions}\n                    billEventOptionsError={billEventOptionsError}\n                    customStyles={customStyles}\n                    isAscending={isAscending}\n                    sort={this.sort}\n                    findDifferences={this.findDifferences}\n                    isDifferentOrNonExistentInAdminDB={this.isDifferentOrNonExistentInAdminDB}\n                />} />\n            </div>\n        )\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { bills } = state;\n        return {\n            bills\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, billActionCreators), dispatch)\n        }\n    }\n)(ConfigurationsManagement)\n\n","import React from \"react\";\nimport ReactTable from \"react-table\";\nimport { Link } from 'react-router-dom';\nimport '../../../stylesheets/shared/react-table.css';\nimport moment from 'moment-timezone';\nimport * as Fields from '../../../lis-shared/lis-layout/components/lis-forms-component';\nimport DatePicker from \"react-datepicker\";\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { journalActionCreators } from '../../../stores/lis-journal-store';\nimport { sessionActionCreators } from '../../../stores/lis-session-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport { navActionCreators } from \"../../../stores/lis-nav-store\";\n\nclass JournalGridComponent extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            journalDate: moment(),\n            journalList: [],\n            isLoaded: false,\n            selected: {},\n            sessionList: [],\n            sessionDropdown: [],\n            selectedSessionToolbar: '',\n            selectedSessionGrid: '',\n            filtered: [{ id: 'all', value: 'true' }],\n            filterAll: 'true',\n        };\n        this.handleDateChange = this.handleDateChange.bind(this);\n        this.handleSendCategory = this.handleSendCategory.bind(this);\n        this.handleDeleteJournal = this.handleDeleteJournal.bind(this);\n    };\n\n    //When component has mounted, make the call to the list users API\n    componentDidMount() {\n        let selectedSession = this.props.selectedSession;\n        let defaultSession = '';\n        this.props.actions.getSessionList().then(() => {\n            let sessionList = [...this.props.session.sessionList].reverse();\n            sessionList.forEach(session => {\n                session.label = session.SessionYear + ' ' + session.DisplayName;\n                session.value = session.SessionID;\n                if (session.IsDefault) {\n                    selectedSession = selectedSession || session;\n                    defaultSession = session;\n                }\n            });\n            this.setState({\n                sessionDropdown: sessionList,\n                sessionList: sessionList,\n                selectedSessionGrid: defaultSession\n            });\n            this.props.handleSessionChange(selectedSession, () => this.getJournalData());\n        });\n\n        this.props.actions.getJournalCategories();\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    getJournalData() {\n        if (!this.props.selectedSession) {\n            return\n        }\n        const params = 'sessionID=' + this.props.selectedSession.SessionID;\n        this.setState({\n            isLoaded: false\n        });\n        this.props.actions.getJournals(params).then(() => {\n            const journalList = this.props.journal.journalList;\n            this.setState({\n                isLoaded: true,\n                journalDate: journalList.find(j => moment(j.JournalDate).isSame(moment(), 'day')) ? null : this.state.journalDate || moment(),\n                journalList,\n            });\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            this.setState({\n                isLoaded: true,\n                message: err.toString()\n            });\n        });\n    }\n\n    handleDateChange(date) {\n        this.setState({\n            journalDate: moment(date)\n        });\n    }\n\n    handleDropDownChange = (value, state) => {\n        this.setState({\n            [state]: value\n        })\n    }\n\n    handleSessionSelectChange = value => {\n        this.props.handleSessionChange(value, () => this.getJournalData())\n    }\n\n    handleCategoryChange = value => {\n        this.props.handleCategoryChange(value);\n    }\n\n    onFilteredChange(filtered) {\n        if (filtered.length > 1 && this.state.filterAll.length) {\n            // NOTE: this removes any FILTER ALL filter\n            const filterAll = '';\n            this.setState({ filtered: filtered.filter((item) => item.id !== 'all'), filterAll })\n        }\n        else\n            this.setState({ filtered });\n    }\n\n    getTrProps = (state, rowInfo, instance) => {\n        if (rowInfo) {\n            return {\n                style: {\n                    background: rowInfo.original.IsDefault ? 'rgb(202, 225, 241)' : null,\n                }\n            }\n        }\n        return {};\n    }\n\n    sendCreateDetails() {\n        this.setState({\n            isSaving: true\n        });\n        this.props.actions.buildJournal('?sessionID=' + this.state.selectedSessionGrid.SessionID + '&JournalDay=' + moment(this.state.journalDate).format(\"MM/DD/yyyy\")).then(() => {\n            this.setState({\n                showCreateSuccess: true,\n                isSaving: false\n            })\n            setTimeout(function () {\n                this.setState({ showCreateSuccess: false });\n            }.bind(this), 5000);\n            this.props.handleSessionChange(this.state.selectedSessionGrid, () => this.getJournalData())\n        }).catch(err => {\n            if (err === 'Aborted') {\n                return;\n            }\n            this.setState({\n                showCreateFailure: true,\n                isSaving: false\n            });\n            setTimeout(function () {\n                this.setState({ showCreateFailure: false });\n            }.bind(this), 5000);\n        });\n    }\n\n    handleSendCategory() {\n        let params = \"journalCategoryType=\" + this.props.selectedCategory.label + \"&sessionId=\" + this.props.selectedSession.SessionID\n        this.props.actions.getCategoryData(params)\n            .then(() => {\n                let downloadLink = document.createElement('a');\n                let url = window.URL.createObjectURL(new Blob([this.props.journal.categoryData]))\n                downloadLink.setAttribute('href', url);\n                downloadLink.setAttribute('download', this.props.selectedSession.label + \"-\" + this.props.selectedCategory.label + \".mml\");\n\n                downloadLink.style.display = 'none';\n                document.body.appendChild(downloadLink);\n                downloadLink.click();\n\n                document.body.removeChild(downloadLink);\n            })\n    }\n\n    handleDeleteJournal(journalId) {\n        this.props.actions.deleteJournal(journalId)\n            .then(() => {\n                if (this.props.journal.journalDeleteError.length === 0) {\n                    this.props.actions.makeToast([{ message: \"Journal Day Deleted\", type: \"success\" }]);\n                    this.getJournalData();\n                } else {\n                    this.props.actions.makeToast([{ message: \"Journal Day Delete Failed\", type: \"failure\" }]);\n                }\n            })\n    }\n\n    render() {\n        return (\n            <div>\n                <div className=\"header-half\">\n                    <h1>Journal Management</h1>\n                </div>\n                <div className=\"toolbar journal-toolbar dlas-forms\">\n                    <div>\n                        <Fields.Dropdown\n                            value={this.props.selectedSession}\n                            options={this.state.sessionDropdown}\n                            id=\"sessionDropdown\"\n                            onChange={this.handleSessionSelectChange}\n                        />\n                    </div>\n                    <div>\n                        <Fields.Dropdown\n                            value={this.props.selectedCategory}\n                            options={this.props.journal.journalCategoryList}\n                            id=\"category-dropdown\"\n                            onChange={this.handleCategoryChange}\n                        />\n                    </div>\n                    <button className=\"button primary\" onClick={() => this.handleSendCategory()}>Generate Category</button>\n                </div>\n                {this.state.message &&\n                    <span className=\"fail small-text\">{this.state.message}</span>\n                }\n                <ReactTable\n                    resizable={false}\n                    loading={!this.state.isLoaded}\n                    data={this.state.journalList}\n                    ref={r => this.reactTable = r}\n                    defaultFilterMethod={(filter, row) =>\n                        String(row[filter.id]) === filter.value}\n                    noDataText={this.props.journal.journalMessage}\n                    onFilteredChange={this.onFilteredChange.bind(this)}\n                    columns={[\n                        {\n                            Header: \"Journal Date\",\n                            accessor: \"JournalDate\",\n                            sortable: false,\n                            filterAll: true,\n                            width: 250,\n                            columns: [\n                                {\n                                    Header: (\n                                        <div className=\"dlas-forms datepicker-container\">\n                                            {!this.state.showCreateSuccess && !this.state.showCreateFailure &&\n                                                <DatePicker\n                                                    id=\"journalDate\"\n                                                    className=\"dnd-field\"\n                                                    selected={this.state.journalDate}\n                                                    onChange={this.handleDateChange}\n                                                    excludeDates={this.state.journalList.map(j => j.JournalDate)}\n                                                    placeholderText=\"Journal Date\"\n                                                />\n                                            }\n                                        </div>\n                                    ),\n                                    headerClassName: \"header-insert\",\n                                    accessor: \"JournalDate\",\n                                    sortable: false,\n                                    filterAll: true,\n                                    width: 200,\n                                    Cell: row => {\n                                        return (\n                                            <span id={'cm-datecell-' + row.index}>{moment(row.original.JournalDate).format('L')}</span>\n                                        )\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            Header: \"Session\",\n                            columns: [\n                                {\n                                    Header: (\n                                        <div>\n                                            {!this.state.showCreateSuccess && !this.state.showCreateFailure &&\n                                                <Fields.Dropdown\n                                                    value={this.state.selectedSessionGrid}\n                                                    options={this.state.sessionList}\n                                                    className=\"grid-selector-dropdown\"\n                                                    classNamePrefix=\"grid-selector-dropdown\"\n                                                    id=\"sessionDropdown\"\n                                                    onChange={(value) => { this.handleDropDownChange(value, 'selectedSessionGrid') }} />\n                                            }\n                                            {this.state.showCreateSuccess &&\n                                                <span className=\"insert-message\">Journal created successfully</span>\n                                            }\n                                            {this.state.showCreateFailure &&\n                                                <span className=\"insert-message fail\">Journal creation failed</span>\n                                            }\n                                        </div>\n                                    ),\n                                    headerClassName: \"header-insert-dropdown\",\n                                    accessor: \"SessionName\",\n                                    sortable: false,\n                                    filterAll: true,\n                                    Cell: row => {\n                                        return <span id={'mm-session-' + row.index}>{row.value}</span>\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            Header: \"Actions\",\n                            headerClassName: \"submit-action\",\n                            columns: [\n\n                                {\n                                    Header: (<span><button id=\"submit-new-journal\" onClick={this.sendCreateDetails.bind(this)} disabled={!this.state.journalDate || this.state.isSaving} className=\"button\">Create</button></span>),\n                                    headerClassName: \"header-action\",\n                                    accessor: \"action\",\n                                    sortable: false,\n                                    className: \"action-column\",\n                                    width: 100,\n                                    Cell: row => {\n                                        return (\n                                            <div className=\"grid-wrapper two\">\n                                                <Link id={'cm-edit-' + row.index} to={`/journal-management/edit-journal/${row.original.JournalID}`} className=\"button edit\">Edit</Link>\n                                                <span className=\"icon delete no-repeat\" onClick={() => this.handleDeleteJournal(row.original.JournalID)} />\n                                            </div>\n                                        )\n                                    }\n                                },\n                            ]\n                        }\n                    ]}\n                    defaultSorted={[\n                        {\n                            id: \"Name\",\n                            desc: false\n                        }\n                    ]}\n                    defaultPageSize={15}\n                    pageSizeOptions={[5, 10, 15, 20, 25, 50, 100]}\n                    className=\"committee-table -striped -highlight\"\n                />\n                <br />\n\n            </div>\n        );\n    }\n}\n\nconst JournalManagementGrid = connect(\n    (state) => {\n        const { journal, session } = state;\n        return {\n            journal,\n            session\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, sessionActionCreators, journalActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(JournalGridComponent)\n\n\nexport default JournalManagementGrid;","import React from 'react';\n\nclass JournalDetails extends React.Component {\n\n    render() {\n        const { categories } = this.props;\n        return (\n            <div>\n                {categories.filter(c => c.JournalEntries && c.JournalEntries.length).map((category, index) => {\n                    return (<div key={index} className=\"preview-entry\">\n                        <div className=\"entry-index\">\n                            <p>{index + 1}</p>\n                        </div>\n                        <div className=\"entry-text\">\n                            <ul>\n                                <li className={`category-heading`}>{category.CategoryDescription}</li>\n                                {category.JournalEntries.sort((a, b) => a.Sequence - b.Sequence).map((entry, i) => (\n                                    <li key={i}>\n                                        {entry.EntryText}\n                                    </li>\n                                ))}\n                            </ul>\n                        </div>\n                    </div>);\n                })}\n            </div>\n        )\n    }\n}\n\nexport default JournalDetails;\n","import React from \"react\";\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';\nimport { journalActionCreators } from \"../../../stores/lis-journal-store\";\n\nconst getListStyle = isDraggingOver => ({\n    background: isDraggingOver ? '#8b9fb3' : '#666666',\n    width: '100%',\n});\n\nclass JournalVote extends React.Component {\n    constructor(props) {\n        super(props)\n        this.state = {\n        };\n        this.onEntryDragEnd = this.onEntryDragEnd.bind(this);\n        this.toggleMenu = this.toggleMenu.bind(this);\n        this.formInput = this.formInput.bind(this);\n\n        this.infoBoxRef = React.createRef();\n        this.menuBoxRef = React.createRef();\n    }\n\n    onEntryDragEnd(result) {\n        if (!result.destination) {\n            return;\n        }\n        if (result.destination.index === result.source.index) {\n            return;\n        }\n        let entries = [...this.props.formData.JournalEntries];\n        const [removed] = entries.splice(result.source.index, 1);\n        entries.splice(result.destination.index, 0, removed);\n        entries.forEach((element, index) => {\n            element.Sequence = index + 1;\n        });\n        this.props.onMultipleEntryChange(entries, this.props.currentActivitySequence);\n    }\n\n    toggleMenu(entryIndex, e) {\n        if (e) {\n            //Do not hide the small motion form if a child of the form is focused\n            if (e.currentTarget.contains(e.relatedTarget)) {\n                return;\n            }\n        }\n        this.setState({\n            showMenu: entryIndex\n        }, () => {\n            if (this.menuBoxRef.current) {\n                this.menuBoxRef.current.focus();\n            }\n        });\n    }\n\n    formInput(entry, entryIndex, provided = {}) {\n        return (\n            <div key={entryIndex}>\n                <div className=\"journal-grid\">\n                    <div style={{ textAlign: 'center' }}>\n                        <span {...provided.dragHandleProps} className=\"icon menu\" onClick={(e) => this.toggleMenu(entryIndex)}></span>\n                        {this.state.showMenu === entryIndex &&\n                            <div style={{ textAlign: 'left', marginLeft: '-15px', width: 'auto' }} className=\"info-box blue\" ref={this.menuBoxRef} onBlur={(e) => this.toggleMenu(-1, e)} contentEditable suppressContentEditableWarning={true}>\n                                <div contentEditable={false}>\n                                </div>\n                            </div>\n                        }\n                    </div>\n                    <div>\n                        <span>{entry.EntryText}</span>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n\n    render() {\n        const entries = this.props.formData.JournalEntries;\n        return (\n            <div>\n                <div className=\"journal-entry-grid\">\n                    <div>\n                        <span></span>\n                    </div>\n                    <div>\n                        <span>{this.props.formData.CategoryDescription}</span>\n                    </div>\n                </div>\n                <div>\n                    <DragDropContext onDragEnd={this.onEntryDragEnd}>\n                        <Droppable droppableId={`entries-droppable`}>\n                            {(provided, snapshot) =>\n                                <div ref={provided.innerRef} style={getListStyle(snapshot.isDraggingOver)}>\n                                    {entries.map((entry, entryIndex) => {\n                                        if (entry) {\n                                            return (\n                                                <Draggable key={`${entry.JournalEntryID}-${entry.Sequence}`} draggableId={`${entry.JournalEntryID}-${entry.Sequence}`} index={entryIndex}>\n                                                    {(provided, snapshot) =>\n                                                        <div\n                                                            ref={provided.innerRef}\n                                                            {...provided.draggableProps}>\n                                                            {this.formInput(entry, entryIndex, provided)}\n                                                        </div>}\n                                                </Draggable>\n                                            );\n                                        }\n                                    })}\n                                    {provided.placeholder}\n                                </div>\n                            }\n                        </Droppable>\n                    </DragDropContext>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default connect(\n    (state) => {\n        const { journal } = state;\n        return {\n            journal\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, journalActionCreators), dispatch)\n        }\n    },\n    null,\n    {\n        forwardRef: true\n    }\n)(JournalVote)","import React from \"react\";\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { Prompt } from 'react-router';\nimport { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';\nimport { navActionCreators } from '../../../stores/lis-nav-store';\nimport { cancelRequest } from '../../../services/request.service';\nimport moment from 'moment-timezone'\nimport LoaderComponent from '../../../lis-shared/lis-layout/components/lis-loader-component';\nimport JournalDetails from './lis-journal-details';\nimport ReactTable from 'react-table';\nimport { journalActionCreators } from \"../../../stores/lis-journal-store\";\nimport JournalVote from \"../forms/journal-vote\";\n\nclass JournalManagementForm extends React.Component {\n\n    constructor(props) {\n        super(props)\n        this.state = {\n            activity: '',\n            journal: {},\n            currentActivitySequence: 0,\n            isLoaded: false,\n            disableChanges: false,\n            //Fieldsets\n            indexFieldsetIsActive: true,\n            activityFieldsetIsActive: false,\n            previewFieldsetIsActive: false,\n            categoriesToMove: [],\n            selectedCategoryToMoveTo: -1,\n            saving: false,\n            isDirty: false\n        }\n\n        //Ref used to scroll down to activity section\n        this.activityRef = React.createRef();\n        this.entryFormRef = React.createRef();\n\n        this.entryChange = this.entryChange.bind(this);\n        this.multipleEntryChange = this.multipleEntryChange.bind(this);\n        this.toggleMoveEntry = this.toggleMoveEntry.bind(this);\n        this.moveEntry = this.moveEntry.bind(this);\n        this.handleSequenceChange = this.handleSequenceChange.bind(this);\n        this.saveJournal = this.saveJournal.bind(this);\n        this.generateMml = this.generateMml.bind(this);\n        this.showActivity = this.showActivity.bind(this);\n    }\n\n    toggleFieldsetCollapse(isActive) {\n        this.setState(state => ({\n            [isActive]: !state[isActive]\n        }));\n    }\n\n    entryChange(index, entry, sequence) {\n        //Takes the sequence, which is always one more than the index, and change the values for that JournalEntry\n        let newFormData = JSON.parse(JSON.stringify(this.state.journal));\n        newFormData.JournalCategories[sequence - 1].JournalEntries[index] = entry;\n        this.setState({\n            journal: newFormData,\n            isDirty: true\n        });\n    }\n\n    multipleEntryChange(entries, sequence) {\n        let newFormData = JSON.parse(JSON.stringify(this.state.journal));\n        newFormData.JournalCategories[sequence - 1].JournalEntries = entries;\n        this.setState({\n            journal: newFormData,\n            isDirty: true\n        });\n    }\n\n    toggleMoveEntry(open, categoryIndex, entryIndex) {\n        if (open) {\n            const currentCategory = this.state.journal.JournalCategories[categoryIndex];\n            const applicableCategories = this.state.journal.JournalCategories.filter(cat => cat.CategoryType === currentCategory.CategoryType && cat.JournalCategoryID !== currentCategory.JournalCategoryID);\n            this.setState({\n                movingCategorySource: categoryIndex,\n                movingEntrySource: entryIndex,\n                categoriesToMove: applicableCategories,\n                showMoveEntryDialog: open\n            });\n        } else {\n            this.setState({\n                showMoveEntryDialog: false,\n                categoriesToMove: [],\n                selectedCategoryToMoveTo: -1,\n                movingCategorySource: -1,\n                movingEntrySource: -1,\n            });\n        }\n    }\n\n    moveEntry(destinationCategoryIndex) {\n        let sourceCategory = { ...this.state.journal.JournalCategories[this.state.movingCategorySource] }\n        let sourceEntry = { ...sourceCategory.JournalEntries[this.state.movingEntrySource] };\n        let destinationCategory = this.state.journal.JournalCategories.find(cat => cat.JournalCategoryID === this.state.categoriesToMove[destinationCategoryIndex].JournalCategoryID);\n        if (destinationCategory) {\n            let newEntry = {\n                ...sourceEntry,\n                JournalCategoryID: destinationCategory.JournalCategoryID,\n                Sequence: destinationCategory.JournalEntries && destinationCategory.JournalEntries.length > 0 ? destinationCategory.JournalEntries[destinationCategory.JournalEntries.length - 1].Sequence + 1 : 1\n            };\n            this.saveEntry(newEntry);\n            this.showActivity(destinationCategory);\n            this.toggleMoveEntry(false);\n\n            //Remove the old entry from the state variable\n            let journal = { ...this.state.journal };\n            journal.JournalCategories[this.state.movingCategorySource].JournalEntries.splice(this.state.movingEntrySource, 1);\n            this.setState({\n                journal: journal,\n                isDirty: true\n            });\n        }\n    }\n\n    handleSequenceChange(categories) {\n        //The sequence change has been handled by the JournalIndex class. So the new list of Journal Categories is sent here to modify the journal\n        let journal = this.state.journal;\n        //Check and see if the currently opened activity has been affected by the sequence change. If so, then update the current activity state item \n        let newCategoryIndex = this.state.currentActivitySequence - 1;\n        if (categories[this.state.currentActivitySequence - 1] !== this.state.journal.JournalCategories[this.state.currentActivitySequence - 1]) {\n            newCategoryIndex = categories.findIndex(category => category === this.state.journal.JournalCategories[this.state.currentActivitySequence - 1])\n        }\n        journal.JournalCategories = categories;\n        //currentActivitySequence is 0 by default so we don't want to set currentActivitySequence to an undefined value. \n        //So make a check to see if the user has clicked on a category item yet. If not then leave it at zero\n        this.setState({\n            journal: journal,\n            isDirty: true,\n            currentActivitySequence: categories[newCategoryIndex] ? categories[newCategoryIndex].Sequence : 0\n        });\n    }\n\n    showActivity(category, e) {\n        let journal = JSON.parse(JSON.stringify(this.state.journal));\n        //Open the activity drawer\n        this.setState({\n            activityFieldsetIsActive: true,\n            currentActivitySequence: category.Sequence,\n            activity: category,\n            journal: journal\n        }, () => {\n            //Get the size and position of the activity form and scroll down to it\n            const activityRect = this.activityRef.current.getBoundingClientRect();\n            const windowY = window.scrollY;\n            window.scrollTo({\n                top: activityRect.top + windowY,\n                behavior: 'smooth'\n            });\n\n        });\n    }\n\n    saveJournal() {\n        let journal = JSON.parse(JSON.stringify(this.state.journal));\n        //Disable changes so the user doesn't try to save something else while this is being saved\n        this.setState({ disableChanges: true })\n        this.props.actions.saveJournal({ journals: [journal] })\n            .then(() => {\n                const newJournal = this.props.journal.journalSave;\n                this.setState({\n                    journal: newJournal,\n                    disableChanges: false,\n                    saving: false,\n                    isDirty: false\n                }, () => {\n                    this.props.actions.makeToast([{ message: 'Save Success', type: \"success\" }])\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err);\n                this.setState({ saving: false })\n                this.props.actions.makeToast([{ message: 'Save Failed', type: \"failure\" }])\n            });\n    }\n\n    generateMml() {\n        this.setState({ generatingMml: true, disableChanges: true })\n        this.props.actions.generateJournal('?sessionID=' + this.state.journal.SessionID + '&journalDay=' + this.state.journal.JournalDate)\n            .then(() => {\n                this.setState({\n                    disableChanges: false,\n                    generatingMml: false\n                }, () => {\n                    const blob = new Blob([this.props.journal.journalGeneration], { type: 'text/html' });\n                    const filename = `Journal ${moment(this.state.journal.JournalDate).format(\"MM/DD/yyyy\")}.mml`;\n                    const url = URL.createObjectURL(blob);\n\n                    const link = document.createElement('a');\n                    link.href = url;\n                    link.download = filename;\n                    document.body.appendChild(link);\n                    link.click();\n\n                    // Clean up\n                    document.body.removeChild(link);\n                    URL.revokeObjectURL(url);\n                    this.props.actions.makeToast([{ message: 'Generation Success', type: \"success\" }])\n                });\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return;\n                }\n                console.log(err);\n                this.setState({ generatingMml: false })\n                this.props.actions.makeToast([{ message: 'Generation Failed', type: \"failure\" }])\n            });\n    }\n\n    componentDidMount() {\n        this.props.actions.getJournalById('journalID=' + this.props.match.params.journalid, true)\n            .then(() => {\n                if (!this.props.journal.journalById || !this.props.journal.journalById.length) { throw 'No Journals found' }\n                let journal = this.props.journal.journalById[0];\n                if (journal.JournalCategories) {\n                    //Check if the Sequence for each category is linear\n                    const sequences = journal.JournalCategories.map(mc => mc.Sequence);\n                    if (journal.JournalCategories.length > 0 && (journal.JournalCategories[0].Sequence !== 1 || !sequences.every((seq, i) => i === sequences.length - 1 || seq + 1 === sequences[i + 1]))) {\n                        //Get the sequence right. Sometimes the result back from the server has a lot of skipped indices\n                        journal.JournalCategories.forEach((category, index) => {\n                            category.Sequence = index + 1;\n                        });\n                        this.setState({\n                            journal: journal,\n                            isLoaded: true,\n                            previewFieldsetIsActive: true\n                        }, //Save the new sequence so we don't have to do this process again for this journal\n                            () => { this.saveJournal(); });\n                    } else { //It is in order so display the journal\n                        this.setState({\n                            journal: journal,\n                            isLoaded: true,\n                            previewFieldsetIsActive: true\n                        });\n                    }\n                } else {\n                    this.setState({\n                        journal: '',\n                        isLoaded: true,\n                        previewFieldsetIsActive: false\n                    });\n                    this.props.actions.makeToast([{ message: \"Loading Failed\", type: \"failure\" }])\n                }\n            }).catch(err => {\n                if (err === 'Aborted') {\n                    return\n                }\n                console.log(err);\n                this.setState({\n                    journal: '',\n                    isLoaded: true,\n                });\n            });\n\n    }\n\n    componentWillUnmount() {\n        cancelRequest();\n    }\n\n    render() {\n        if (this.state.isLoaded) {\n            return (\n                <div className=\"user-forms dlas-forms\">\n                    <div>\n                        <Prompt\n                            when={this.state.isDirty}\n                            message={`You have unsaved changes. Are you sure you would like to leave?`}\n                        />\n                    </div>\n                    <h2>{moment(this.state.journal.JournalDate).format(\"LL\")}</h2>\n                    {this.state.showMoveEntryDialog &&\n                        <div className='popup' onClick={() => this.toggleMoveEntry(false)}>\n                            <div className='popup-inner tall-content' onClick={e => e.stopPropagation()}>\n                                {this.state.categoriesToMove.length === 0 ?\n                                    <p>There are no categories where you can move this entry</p>\n                                    :\n                                    <p>Choose a category to move the entry to</p>\n                                }\n                                <div style={{ paddingBottom: '10px' }}>\n                                    <ReactTable\n                                        data={this.state.categoriesToMove}\n                                        getTrProps={(_state, rowInfo) => {\n                                            return {\n                                                style: {\n                                                    background: rowInfo && rowInfo.index === this.state.selectedCategoryToMoveTo ? '#89ff89' : '',\n                                                    cursor: rowInfo ? 'pointer' : 'default'\n                                                },\n                                                onClick: () => this.setState({ selectedCategoryToMoveTo: rowInfo.index })\n                                            }\n                                        }}\n                                        noDataText=\"\"\n                                        columns={[\n                                            {\n                                                id: \"checkbox\",\n                                                accessor: \"\",\n                                                className: \"checkbox-column\",\n                                                Cell: ({ index }) => {\n                                                    return <span className={index === this.state.selectedCategoryToMoveTo ? \"icon checkmark\" : \"\"}></span>;\n                                                },\n                                                sortable: false,\n                                                filterable: false,\n                                                width: 45\n                                            },\n                                            {\n                                                Header: \"Sequence\",\n                                                accessor: \"Sequence\",\n                                                width: 50\n                                            },\n                                            {\n                                                Header: \"Type\",\n                                                accessor: \"CategoryType\"\n                                            },\n                                            {\n                                                Header: \"Description\",\n                                                accessor: \"CategoryDescription\"\n                                            }\n                                        ]}\n                                        defaultPageSize={5}\n                                        className=\"-striped -highlight\"\n                                    />\n                                </div>\n                                <div className=\"flex-row\" sty>\n                                    <button className=\"button secondary\" onClick={() => this.toggleMoveEntry(false)}>Cancel</button>\n                                    {this.state.categoriesToMove.length > 0 &&\n                                        <button disabled={this.state.selectedCategoryToMoveTo === -1} onClick={() => this.moveEntry(this.state.selectedCategoryToMoveTo)} className=\"button\">Move</button>\n                                    }\n                                </div>\n                            </div>\n                        </div>\n                    }\n                    <fieldset className={this.state.indexFieldsetIsActive ? 'fieldset-collapse fieldset-open' : 'fieldset-collapse fieldset-closed'} >\n                        <legend onClick={this.toggleFieldsetCollapse.bind(this, 'indexFieldsetIsActive')}>Index</legend>\n                        <div>\n                            <JournalIndex\n                                categories={this.state.journal.JournalCategories ? this.state.journal.JournalCategories : []}\n                                onSequenceChange={this.handleSequenceChange}\n                                showActivity={this.showActivity}\n                                currentActivitySequence={this.state.currentActivitySequence}\n                                disableChanges={this.state.disableChanges} />\n                        </div>\n                    </fieldset>\n                    <fieldset ref={this.activityRef} className={this.state.activityFieldsetIsActive ? 'fieldset-collapse fieldset-open' : 'fieldset-collapse fieldset-closed'} >\n                        <legend onClick={this.toggleFieldsetCollapse.bind(this, 'activityFieldsetIsActive')}>Activity</legend>\n                        {this.state.currentActivitySequence && this.state.currentActivitySequence !== 0 ?\n                            <TypeSwitcher\n                                type={this.state.activity}\n                                ref={this.entryFormRef}\n                                onEntryChange={this.entryChange}\n                                onMultipleEntryChange={this.multipleEntryChange}\n                                currentActivitySequence={this.state.currentActivitySequence}\n                                toggleMoveEntry={this.toggleMoveEntry}\n                                formData={this.state.journal.JournalCategories ? this.state.journal.JournalCategories[this.state.currentActivitySequence - 1] : {}} />\n                            : null}\n                    </fieldset>\n                    <fieldset className={this.state.previewFieldsetIsActive ? 'fieldset-collapse fieldset-open' : 'fieldset-collapse fieldset-closed'} >\n                        <legend onClick={this.toggleFieldsetCollapse.bind(this, 'previewFieldsetIsActive')}>Preview</legend>\n                        <Preview\n                            categories={this.state.journal.JournalCategories ? this.state.journal.JournalCategories : []}\n                            save={this.saveJournal}\n                            saving={this.state.saving}\n                            generateMml={this.generateMml}\n                            generatingMml={this.state.generatingMml}\n                            isDirty={this.state.isDirty}\n                        />\n                    </fieldset>\n                </div>\n\n            )\n        } else {\n            return (\n                <div className=\"user-forms dlas-forms\">\n                    <LoaderComponent className=\"center-spinner\" data={this.state.isLoaded} />\n                </div>\n            )\n        }\n    }\n}\n\nconst getItemStyle = (isDisabled, isDragging, draggableStyle, pendingDeletion) => ({\n    userSelect: 'none',\n    background: isDisabled ? '#c7c7c7' : isDragging ? '#34495e' : 'white',\n    color: isDisabled ? 'black' : isDragging ? 'white' : '#34495e',\n    border: pendingDeletion ? 'red' : 'none',\n    ...draggableStyle,\n});\n\nconst getListStyle = isDraggingOver => ({\n    background: isDraggingOver ? '#8b9fb3' : '#666666',\n    width: '100%',\n});\n\nclass JournalIndex extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n        }\n    }\n\n    onDragEnd(result) {\n        // dropped outside the list\n        if (!result.destination) {\n            return;\n        }\n        const items = (() => {\n            const list = Array.from(this.props.categories);\n            const [removed] = list.splice(result.source.index, 1);\n\n            list.splice(result.destination.index, 0, removed);\n            // Reorder the Sequence value too because the sequence value is used to show what order the preview is in\n            list.forEach(function (element, index) {\n                element.Sequence = index + 1\n            });\n            return list;\n        })();\n        //Send the new values up to the parent to be set in the parent's state\n        this.props.onSequenceChange(items);\n    }\n\n\n    render() {\n        if (this.props.categories) {\n            return (\n                <div className={this.props.disableChanges ? 'dnd-disabled' : ''}>\n                    <DragDropContext onDragEnd={this.onDragEnd.bind(this)}>\n                        <Droppable droppableId=\"droppable\">\n                            {(provided, snapshot) => (\n                                <table\n                                    className=\"dnd-grid-table journal-categories-grid\"\n                                    ref={provided.innerRef}\n                                    style={getListStyle(snapshot.isDraggingOver)}\n                                >\n                                    <thead className=\"dnd-grid-header\" style={getListStyle(snapshot.isDraggingOver)}>\n                                        <tr>\n                                            <th scope=\"col\" id={'-grabber-column'}></th>\n                                            <th scope=\"col\" id={'-display-column'}>Display #</th>\n                                            <th scope=\"col\" id={'-display-column'}>Section</th>\n                                            <th scope=\"col\" id={'-actions-column'}>Actions</th>\n                                        </tr>\n                                    </thead>\n                                    <tbody>\n                                        {this.props.categories.map((item, index) => (\n                                            <Draggable key={`${item.Sequence}-${item.JournalCategoryID}`} draggableId={`${item.Sequence}-${item.JournalCategoryID}`} index={index}>\n                                                {(provided, snapshot) => (\n                                                    <tr\n                                                        ref={provided.innerRef}\n                                                        {...provided.draggableProps}\n                                                        {...provided.dragHandleProps}\n                                                        className={this.props.categories[this.props.currentActivitySequence - 1] === item ? 'selected' : 'not-selected'}\n                                                        style={getItemStyle(\n                                                            this.props.disableChanges,\n                                                            snapshot.isDragging,\n                                                            provided.draggableProps.style\n                                                        )} >\n                                                        <td><button id={item.JournalCategoryID + '-grabber-button'} className=\"button draggable\">Drag and drop</button></td>\n                                                        <td>{index + 1}</td>\n                                                        <td className='category-desc' onClick={(e) => this.props.showActivity(this.props.categories[index], e)}>\n                                                            {<button type=\"button\">{item.CategoryDescription}</button>}\n                                                        </td>\n                                                        <td>\n                                                            <button\n                                                                type=\"button\"\n                                                                onClick={(e) => this.props.showActivity(this.props.categories[index], e)}\n                                                                className={this.props.categories[this.props.currentActivitySequence - 1] === item\n                                                                    ? 'icon edit-alt'\n                                                                    : 'icon edit'}>\n                                                            </button>\n                                                        </td>\n                                                    </tr>\n                                                )}\n                                            </Draggable>\n                                        ))}\n                                        {provided.placeholder}\n                                    </tbody>\n                                </table>\n                            )}\n                        </Droppable>\n                    </DragDropContext>\n                </div>\n            )\n        } else {\n            return (<div></div>)\n        }\n    }\n\n}\n\nclass Preview extends React.Component {\n    render() {\n        const previewLengthStyle = { height: '500px', overflowY: 'scroll', backgroundColor: 'white' }\n        return (\n            <React.Fragment>\n                <div style={{ display: 'flex', gap: '5px', justifyContent: 'flex-end' }}>\n                    <button type=\"button\" disabled={this.props.isDirty || this.props.generatingMml} className=\"button\" onClick={this.props.generateMml}>Generate MML</button>\n                    <button type=\"button\" disabled={this.props.saving || this.props.generatingMml} className=\"button\" onClick={this.props.save}>Save</button>\n                </div>\n                <div style={previewLengthStyle}>\n                    <JournalDetails\n                        categories={this.props.categories}\n                    />\n                </div>\n            </React.Fragment>\n        )\n    }\n}\n\nconst TypeSwitcher = React.forwardRef((props, ref) => {\n    switch (props.ObjectName) {\n        case 'Vote':\n        default:\n            return <JournalVote {...props} />\n    }\n});\n\nexport default connect(\n    (state) => {\n        const { journal, nav } = state;\n        return {\n            journal,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, journalActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(JournalManagementForm)","import React from 'react';\nimport { Route } from 'react-router';\nimport JournalManagementGrid from './lis-journal-grid';\nimport JournalManagementForm from './lis-journal-form';\n\nclass JournalManagement extends React.Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            selectedSession: '',\n            selectedCategory: ''\n        };\n        this.handleCategoryChange = this.handleCategoryChange.bind(this);\n        this.handleSessionChange = this.handleSessionChange.bind(this);\n    }\n\n    handleCategoryChange(value) {\n        this.setState({\n            selectedCategory: value\n        })\n    }\n\n    handleSessionChange(value, callback) {\n        this.setState({\n            selectedSession: value\n        }, () => callback());\n    }\n\n    render() {\n        return (\n            <div>\n                <Route exact path={this.props.match.path} render={props => <JournalManagementGrid\n                    {...props}\n                    selectedCategory={this.state.selectedCategory}\n                    selectedSession={this.state.selectedSession}\n                    handleSessionChange={this.handleSessionChange}\n                    handleCategoryChange={this.handleCategoryChange}\n                />} />\n                <Route path={`${this.props.match.path}/edit-journal/:journalid`} component={JournalManagementForm} />\n            </div>\n        )\n    }\n}\n\nexport default JournalManagement;","import React, { Component } from 'react';\nimport { Route, Redirect, withRouter } from 'react-router';\nimport queryString from 'query-string';\nimport { AuthenticatedTemplate, useMsal } from \"@azure/msal-react\";\nimport { loginRequest } from \"./authConfig\";\n\nimport Layout from './lis-shared/lis-layout/components/lis-layout-component';\nimport Login from './lis-shared/lis-login/components/lis-login-form';\nimport CreateAccount from './lis-shared/lis-login/components/lis-create-account-form';\nimport RegisterAccount from './lis-shared/lis-login/components/lis-register-account-form';\nimport ForgotPassword from './lis-shared/lis-login/components/lis-forgot-password-form';\nimport ChangePassword from './lis-shared/lis-login/components/lis-change-password-form';\n\nimport MemberManagement from './lis-admin/lis-member-management/components/lis-member-management';\nimport SessionManagement from './lis-admin/lis-session-management/components/lis-session-management';\nimport CommitteeManagement from './lis-admin/lis-committee-management/components/lis-committee-management';\nimport DocketManagement from './lis-admin/lis-docket-management/components/lis-docket-management';\nimport CalendarManagement from './lis-admin/lis-calendar-management/components/lis-calendar-management';\nimport MinutesManagement from './lis-admin/lis-minutes-management/components/lis-minutes-management';\nimport VersionManagement from './lis-admin/lis-version-management/components/lis-version-management';\nimport BillManagement from './lis-admin/lis-bill-management/components/lis-bill-management';\nimport CommunicationsManagement from './lis-admin/lis-communications-management/components/lis-communications-management';\nimport VoteManagement from './lis-admin/lis-vote-management/components/lis-vote-management';\nimport PrintManagement from './lis-admin/lis-print-management/components/lis-print-management';\nimport ReportManagement from './lis-admin/lis-report-management/components/lis-report-management';\nimport AmendmentManagement from './lis-admin/lis-amendment-management/components/lis-amendment-management';\nimport AdminDashboard from './lis-admin/lis-admin-dashboard/components/lis-admin-dashboard';\nimport NotificationManagement from './lis-admin/lis-notifications-management/components/lis-notification-management';\nimport PartnerManagement from './lis-admin/lis-partner-management/components/lis-partner-management';\nimport UserManagement from './lis-admin/lis-user-management/components/lis-user-management';\n\nimport Home from './lis-public/components/lis-home/lis-public-home';\nimport PublicSessionInformation from './lis-public/components/lis-public-session-list';\nimport PublicCommitteeInformation from './lis-public/components/lis-committee/lis-public-committee-information';\nimport PublicMemberInformation from './lis-public/components/lis-public-members-list';\nimport PublicMemberDetails from './lis-public/components/lis-public-member-details';\nimport PublicBillSearch from './lis-public/components/lis-bill-search/lis-public-bill-search';\nimport SearchReportPage from './lis-public/components/lis-bill-search/lis-report-bill-search';\nimport SearchTranslator from './lis-public/components/lis-bill-search/search-translator';\nimport ShorthandUrlTranslator from './lis-public/components/lis-bill-search/shorthand-url-translator';\nimport SearchHelp from './lis-public/components/lis-bill-search/lis-search-help';\nimport PublicBillDetails from './lis-public/components/lis-bill-details/lis-public-bill-details';\nimport PublicVoteDetails from './lis-public/components/lis-public-vote-details';\nimport PublicDataFiles from './lis-public/components/lis-public-data-files';\nimport PublicCommunicationsList from './lis-public/components/lis-public-communications';\nimport PublicCalendarList from './lis-public/components/lis-public-calendar-list';\nimport PublicCalendarDetails from './lis-public/components/lis-public-calendar-details';\nimport PublicMinutesList from './lis-public/components/lis-public-minutes';\nimport PublicMinutesDetails from './lis-public/components/lis-public-minutes-details';\nimport FullText from './lis-public/components/lis-public-full-text';\nimport PublicSchedule from './lis-public/components/lis-public-schedule';\nimport PublicVoteSearch from './lis-public/components/lis-public-vote-search';\nimport PublicMemberLegislation from './lis-public/components/lis-public-member-legislation';\nimport PublicCommunicationDetails from './lis-public/components/lis-public-communication-details';\nimport CommitteeStatDetails from './lis-public/components/lis-committee-statistics';\nimport SessionStatDetails from './lis-public/components/lis-session-statistics';\nimport Unauthorized from './lis-public/components/lis-unauthorized';\nimport ProfileForm from './lis-shared/lis-profile/components/lis-profile-form';\nimport PrivacyComponent from './lis-public/components/lis-privacy';\nimport WatchlistsComponent from './lis-public/components/lis-watchlists';\n\nimport DevsPortal from './lis-developers/public/components/lis-developers-portal';\nimport DocumentComponent from './lis-developers/public/components/lis-document';\nimport KeyRegistration from './lis-developers/public/components/lis-api-key-registration';\nimport KeyConfirmation from './lis-developers/public/components/lis-api-key-confirmation';\nimport TermsOfService from './lis-developers/public/components/lis-terms-of-service';\n\nimport AdminDocs from './lis-developers/admin/components/lis-admin-docs';\n\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { authActionCreators } from './stores/lis-auth-store';\nimport { navActionCreators } from './stores/lis-nav-store';\nimport IdleTimer from 'react-idle-timer'\nimport { parse } from 'query-string';\nimport jwtDecode from 'jwt-decode';\n\nimport Footer from './lis-public/components/lis-footer';\nimport ConfigurationsManagement from './lis-admin/lis-configurations/lis-configurations-management';\nimport JournalManagement from './lis-admin/lis-journal-management/components/lis-journal-management';\nimport moment from 'moment-timezone';\n\nconst idToken = 'LIS_ID_TOKEN';\nconst refreshToken = 'LIS_REFRESH_TOKEN';\nconst refreshTokenExpiration = 'LIS_REFRESH_TOKEN_EXPIRATION';\nconst graphToken = 'GRAPH_ID_TOKEN';\nconst claimsObject = 'LIS_CLAIMS';\n\n// Private route component for auth-only paths. If authstatus == true, show the component.\n// Will eventually need to add on to it for Admin-only paths\nconst PrivateRoute = ({ authstatus, hasPermission, checkingToken, component: Component, ...rest }) => {\n    const redirect = '?redirect=' + window.location.pathname + encodeURIComponent(window.location.search);\n    return (<Route {...rest} render={(props) => (\n        authstatus && hasPermission\n            ? <Component {...props} />\n            : checkingToken ? <div className=\"center-spinner spinner\" />\n                : !authstatus ? <Redirect to={'/login' + redirect} />\n                    : <Redirect to=\"/unauthorized\" />\n    )} />)\n}\n\nclass LISApp extends Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            isIdle: false,\n            popupMessage: '',\n            counter: null,\n            resources: 0,\n            permissions: null,\n            houseToken: \"\",\n            checkingToken: true\n        };\n        this.idleTimer = null\n        this.onActive = this.onActive.bind(this)\n        this.onIdle = this.onIdle.bind(this)\n        this.checkPermissions = this.checkPermissions.bind(this);\n        this.setHouseToken = this.setHouseToken.bind(this);\n    };\n\n    checkPermissions() {\n        //determine permissions for specific pages in case of direct url navigation from a logged in user who does not have specific permissions\n        let permissions = [];\n        this.setState({ resources: this.props.login.userClaims.resources.length })\n        for (let i = 0; i < this.props.login.userClaims.resources.length; i++) {\n            switch (this.props.login.userClaims.resources[i]) {\n                case \"All\":\n                    permissions.push(\n                        { canAccessMemberMgmt: true },\n                        { canAccessSessionMgmt: true },\n                        { canAccessCommitteeMgmt: true },\n                        { canAccessMinutesMgmt: true },\n                        { canAccessDocketMgmt: true },\n                        { canAccessBillMgmt: true },\n                        { canAccessVersionMgmt: true },\n                        { canAccessAmendmentMgmt: true },\n                        { canAccessCommMgmt: true },\n                        { canAccessCalendarMgmt: true },\n                        { canAccessConfigurationsMgmt: true },\n                        { canAccessJournalMgmt: true },\n                        { canAccessVoteMgmt: true },\n                        { canAccessPrintMgmt: true },\n                        { canAccessReportMgmt: true },\n                        { canAccessMeetingsMgmt: true },\n                        { canAccessWatchlists: true },\n                        { canAccessPartnerMgmt: true },\n                        { canAccessUserMgmt: true },\n                        { canAccessDocs: true },\n                        { canAccessBds: true },\n                        { canAccessSenateLinks: true },\n                        { canAccessPatronStatusReport: true }\n                    );\n                    this.setState({ permissions })\n                    return; //If the user is admin allow access to all links and exit\n                case \"Session\":\n                    permissions.push({ canAccessSessionMgmt: true })\n                    break;\n                case \"Committee\":\n                    permissions.push({ canAccessCommitteeMgmt: true })\n                    break;\n                case \"Subcommittee\":\n                    permissions.push({ canAccessCommitteeMgmt: true })\n                    break;\n                case \"MinutesBook\":\n                    permissions.push({ canAccessMinutesMgmt: true })\n                    break;\n                case \"Docket\":\n                    permissions.push({ canAccessDocketMgmt: true })\n                    break;\n                case \"Agenda\":\n                    permissions.push({ canAccessDocketMgmt: true })\n                    break;\n                case \"LegislationEvent\":\n                    permissions.push({ canAccessBillMgmt: true })\n                    break;\n                case \"LegislationText\":\n                    permissions.push({ canAccessVersionMgmt: true, canAccessAmendmentMgmt: true })\n                    break;\n                case \"LegislationCommunications\":\n                    permissions.push({ canAccessCommMgmt: true })\n                    break;\n                case \"Calendar\":\n                    permissions.push({ canAccessCalendarMgmt: true })\n                    break;\n                case \"Vote\":\n                    permissions.push({ canAccessVoteMgmt: true })\n                    break;\n                case \"Schedule\":\n                    permissions.push({ canAccessMeetingsMgmt: true })\n                    break;\n                case \"PrintDocuments\":\n                    permissions.push({ canAccessPrintMgmt: true })\n                    break;\n                case \"JournalFileGeneration\":\n                    permissions.push({ canAccessJournalMgmt: true })\n                    break;\n                //Roles unaccounted for in navbar list items                \n                case \"AdvancedLegislationSearch\":\n                    break;\n                case \"CalendarFileGeneration\":\n                    break;\n                case \"CommunicationFileGeneration\":\n                    break;\n                case \"CommitteeLegislationReferral\":\n                    break;\n                case \"CommitteesByMemberSearch\":\n                    break;\n                case \"Communication\":\n                    break;\n                case \"Contact\":\n                    break;\n                case \"Groups\":\n                    break;\n                case \"GroupsRoles\":\n                    break;\n                case \"LegislationByCommitteeSearch\":\n                    break;\n                case \"LegislationByMember\":\n                    break;\n                case \"LegislationFileGeneration\":\n                    break;\n                case \"LegislationPatron\":\n                    break;\n                case \"LegislationSummary\":\n                    break;\n                case \"LegislationVersion\":\n                    break;\n                case \"Member\":\n                    permissions.push({ canAccessMemberMgmt: true })\n                    break;\n                case \"MembersByCommittee\":\n                    break;\n                case \"MembersSearch\":\n                    break;\n                case \"MinuteEntries\":\n                    break;\n                case \"Organization\":\n                    break;\n                case \"PatronTypeByRole\":\n                    break;\n                case \"PartnerAuthentication\":\n                    break;\n                case \"Person\":\n                    permissions.push({ canAccessUserMgmt: true })\n                    break;\n                case \"Personnel\":\n                    permissions.push({ canAccessUserMgmt: true })\n                    break;\n                case \"Roles\":\n                    break;\n                case \"User\":\n                    break;\n                case \"VoteFileGeneration\":\n                    break;\n                case \"LegislationCollections\":\n                    if (this.props.login.userClaims.claims.find(claim => claim.Scope === \"Paid\" && claim.Resource === \"LegislationCollections\" && claim.RoleName === \"PaidLegislationCollectionsAuthor\")) permissions.push({ canAccessWatchlists: true })\n                    break;\n                case \"ReportFileGeneration\":\n                    permissions.push({ canAccessReportMgmt: true })\n                    break;\n                case \"APIDocumentation\":\n                    permissions.push({ canAccessDocs: true })\n                    break;\n                case \"BDSDrafter\":\n                    permissions.push({ canAccessBds: true })\n                    break;\n                case \"SenateLinks\":\n                    permissions.push({ canAccessSenateLinks: true })\n                    break;\n                default:\n                    console.log(\"Resource unaccounted for: \", this.props.login.userClaims.resources[i]);\n                    break;\n            }\n        }\n\n        //If a signed in member, then provide a link to the member status report page.\n        const jwt = localStorage.getItem(idToken);\n        if (jwt) {\n            try {\n                const parsedToken = jwtDecode(jwt);\n                const mNumber = parsedToken.MemberNumber;\n                if (mNumber) {\n                    permissions.push({ canAccessPatronStatusReport: true })\n                }\n            } catch (e) {\n                if (Object.getPrototypeOf(e).toString() === 'InvalidTokenError') {\n                    //Token is malformed..nothing to do\n                } else {\n                    console.error(e);\n                }\n            }\n        }\n\n        this.setState({ permissions })\n    }\n\n    componentDidMount() {\n        let tokenExp = localStorage.getItem(refreshTokenExpiration);\n        if (tokenExp !== null && tokenExp !== 'undefined') {\n            if (tokenExp < new Date().getTime()) {\n                localStorage.removeItem(idToken);\n                localStorage.removeItem(refreshToken);\n                localStorage.removeItem(refreshTokenExpiration);\n                localStorage.removeItem(graphToken);\n                localStorage.removeItem(claimsObject);\n                this.setState({ checkingToken: false })\n            } else {\n                if (this.props.login.isTokenExpired) {\n                    if (localStorage.getItem(idToken)) {\n                        this.props.actions.refreshAccessToken().finally(() => {\n                            this.setState({ checkingToken: false })\n                        })\n                    } else {\n                        this.setState({ checkingToken: false })\n                    }\n                } else {\n                    this.setState({ checkingToken: false })\n                }\n            }\n        } else {\n            this.setState({ checkingToken: false })\n        }\n        this.checkPermissions();\n    }\n\n    componentDidUpdate(prevProps) {\n        if ((this.props.login.initiateRedirect !== prevProps.login.initiateRedirect) && this.props.login.initiateRedirect === true) {\n            const parsed = parse(window.location.search);\n            // If there is a redirect then send the user there, if not then just refresh the current page, which is easier then trying to figure out what endpoint need to be re-run to get partner information\n            if (parsed.redirect) {\n                this.props.history.push(parsed.redirect);\n            } else if (window.location.pathname === \"/login\") {\n                this.props.history.push(\"/\");\n            } else if (!window.location.pathname === \"/change-password\") { // we are manually logging in users after they successfully change their password, prevent an undesired refresh as a result of changing props\n                window.location.reload();\n            }\n        }\n\n        //If user permissions have changed\n        if (this.props.login.userClaims.resources.length !== this.state.resources) {\n            this.checkPermissions();\n        }\n    }\n\n    onActive(e) {\n        console.log('user is active', e)\n        console.log('time elapsed', this.idleTimer.getElapsedTime())\n        this.setState({\n            isIdle: false\n        });\n    }\n\n    onIdle(e) {\n        console.log('user is idle', e)\n        console.log('last active', this.idleTimer.getLastActiveTime())\n        if (this.props.login.isAuthenticated) {\n            this.setState({\n                isIdle: true,\n                popupMessage: 'It looks like you have been away and you are about to time out. Need more time?'\n            });\n        }\n    }\n\n    setHouseToken(houseToken, expirationDate) {\n        this.setState({\n            houseToken\n        }, () => {\n            //Find the refresh token in the mess MSAL drops into local storage because they won't give me a function to get it properly -JGB\n            let keys = Object.keys(localStorage);\n            let refreshToken = \"\";\n            keys.forEach((k, i) => {\n                let value = localStorage.getItem(k);\n                if (typeof value === \"object\") {\n                    let currentItem = JSON.parse(value);\n                    if (currentItem[\"credentialType\"] === \"RefreshToken\") {\n                        refreshToken = currentItem[\"secret\"];\n                    }\n                }\n            })\n            this.props.actions.houseLogin(this.state.houseToken, refreshToken, expirationDate);\n        })\n    }\n\n    render() {\n        const { isAuthenticated } = this.props.login;\n        const { permissions, checkingToken } = this.state;\n\n        // IHOD wants to display the bill details page in an iframe without the site header\n        if (window.location.pathname.includes(\"static/bill-details\")) {\n            return (\n                <div>\n                    <Route path=\"/static/bill-details/:sessionCode/:billnumber\" component={PublicBillDetails} />\n                </div>\n            )\n        }\n\n        return (\n            permissions &&\n            <IdleTimer\n                ref={ref => { this.idleTimer = ref }}\n                element={document}\n                onActive={this.onActive}\n                onIdle={this.onIdle}\n                //2 hours\n                timeout={60000 * 120}\n            >\n                <div ref={(divElement) => { this.divElement = divElement; }} className={this.divElement && this.divElement.offsetHeight > window.innerHeight ? \"overheight\" : \"\"} id=\"height-checker\">\n                    <Layout isIdle={this.state.isIdle} popupMessage={this.state.popupMessage} location={this.props.location} permissions={permissions} >\n                        <Route exact path='/' component={Home} />\n                        <Route exact path='/home' component={Home} />\n                        <Route exact path='/home/:sessionCode' component={Home} />\n                        <Route exact path=\"/bill-search\" component={PublicBillSearch} />\n                        <Route exact path=\"/bill-search-report/:id\" component={SearchReportPage} />\n                        <Route exact path=\"/bill-search-report/composite/:id\" component={SearchReportPage} />\n                        <Route exact path={[\"/bill-search/:id/:word\", \"/bill-search/:id/:word/:wordparam\"]} component={SearchTranslator} />\n                        <Route exact path=\"/q\" component={ShorthandUrlTranslator} />\n                        <Route exact path=\"/q/:params\" component={ShorthandUrlTranslator} />\n                        <Route exact path='/search-help' component={SearchHelp} />\n                        <Route exact path='/bill-details/:sessionCode/:billnumber' component={!this.props.nav.showOverlay && PublicBillDetails} />\n                        <Route exact path='/bill-details/:sessionCode/:billnumber/text/:documentcode' component={FullText} />\n                        <Route exact path='/bill-details/:sessionCode/:billnumber/text/:documentcode/hilite' component={FullText} />\n                        <Route exact path='/vote-details/:billnumber/:sessioncode/:votenumber' component={PublicVoteDetails} />\n                        <Route exact path='/data-files' component={PublicDataFiles} />\n                        <Route exact path='/data-files/:sessionCode' component={PublicDataFiles} />\n                        <Route exact path='/schedule' component={PublicSchedule} />\n                        <Route exact path='/session-information' component={PublicSessionInformation} />\n                        <Route exact path='/session-details/:sessioncode/communications' component={PublicCommunicationsList} />\n                        <Route exact path='/session-details/:sessioncode/communications/:commid' component={PublicCommunicationDetails} />\n                        <Route exact path='/session-details/:sessioncode/calendar' component={PublicCalendarList} />\n                        <Route exact path='/session-details/:sessioncode/calendar/:calendarid' component={PublicCalendarDetails} />\n                        <Route exact path='/session-details/:sessioncode/minutes-list/:chamber' component={PublicMinutesList} />\n                        <Route exact path='/session-details/:sessioncode/minutes/:minutesid' component={PublicMinutesDetails} />\n                        <Route path='/session-details/:sessioncode/committee-information' component={PublicCommitteeInformation} />\n                        <Route path={['/vote-search/:sessioncode/:membernumber', '/vote-search/:sessioncode']} component={PublicVoteSearch} />\n                        <Route exact path='/session-details/:sessioncode/member-information' component={PublicMemberInformation} />\n                        <Route exact path='/session-details/:sessioncode/member-information/:membernumber/member-details' component={PublicMemberDetails} />\n                        <Route exact path='/session-details/:sessioncode/member-legislation/:chambercode' component={PublicMemberLegislation} />\n                        <Route exact path='/session-details/:sessioncode/statistics/committee/:chambercode' component={CommitteeStatDetails} />\n                        <Route exact path='/session-details/:sessioncode/statistics/status/' component={SessionStatDetails} />\n                        <Route exact path='/watchlists' component={WatchlistsComponent} />\n\n                        <Route exact path='/register-account' component={RegisterAccount} />\n                        <Route exact path='/registration/:registerhash' component={CreateAccount} />\n                        <Route exact path='/forgot-password' component={ForgotPassword} />\n                        <Route exact path={'/passwordreset/:resethash'} component={ChangePassword} />\n\n                        <Route exact path='/login' component={Login} authstatus={isAuthenticated} />\n\n                        <Route exact path='/developers' component={DevsPortal} />\n                        <Route exact path='/developers/:docName' component={DocumentComponent} />\n                        <Route exact path='/apiregistration' component={KeyRegistration} />\n                        <Route exact path='/apiregistration/:params' component={KeyConfirmation} />\n                        <Route exact path='/tos' component={TermsOfService} />\n\n                        <Route exact path='/unauthorized' component={Unauthorized} />\n\n                        <Route exact path='/privacy' component={PrivacyComponent} />\n\n                        <PrivateRoute path='/member-management' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessMemberMgmt))} component={MemberManagement} />\n                        <PrivateRoute path='/session-management' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessSessionMgmt))} component={SessionManagement} />\n                        <PrivateRoute path='/committee-management' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessCommitteeMgmt))} component={CommitteeManagement} />\n                        <PrivateRoute path='/docket-management' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessDocketMgmt))} component={DocketManagement} />\n                        <PrivateRoute path='/calendar-management' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessCalendarMgmt))} component={CalendarManagement} />\n                        <PrivateRoute path='/configurations-management' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessConfigurationsMgmt))} component={ConfigurationsManagement} />\n                        <PrivateRoute path='/minutes-management' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessMinutesMgmt))} component={MinutesManagement} />\n                        <PrivateRoute path='/communications-management' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessCommMgmt))} component={CommunicationsManagement} />\n                        <PrivateRoute path='/version-management' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessVersionMgmt))} component={VersionManagement} />\n                        <PrivateRoute path='/bill-management' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessBillMgmt))} component={BillManagement} />\n                        <PrivateRoute path='/vote-management' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessVoteMgmt))} component={VoteManagement} />\n                        <PrivateRoute path='/print-management' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessPrintMgmt))} component={PrintManagement} />\n                        <PrivateRoute path='/report-management' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessReportMgmt))} component={ReportManagement} />\n                        <PrivateRoute path='/amendment-management' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessAmendmentMgmt))} component={AmendmentManagement} />\n                        <PrivateRoute path='/partner-management' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessPartnerMgmt))} component={PartnerManagement} />\n                        <PrivateRoute path='/user-management' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessMemberMgmt))} component={UserManagement} />\n                        <PrivateRoute path='/journal-management' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessJournalMgmt))} component={JournalManagement} />\n                        <PrivateRoute path='/dashboard' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={true} component={AdminDashboard} />\n                        <PrivateRoute path='/notifications' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={true} component={NotificationManagement} />\n                        <PrivateRoute path='/profile' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={true} component={ProfileForm} />\n                        <PrivateRoute path='/change-password' checkingToken={checkingToken} authstatus={isAuthenticated || (this.props.location.search && queryString.parse(this.props.location.search).emailaddress)} hasPermission={true} component={ChangePassword} />\n                        <PrivateRoute path='/admin-developers' checkingToken={checkingToken} authstatus={isAuthenticated} hasPermission={Boolean(permissions.find(p => p.canAccessDocs))} component={AdminDocs} />\n                    </Layout>\n                </div>\n\n                {!this.props.location.pathname.includes(\"management\") &&\n                    <Footer />\n                }\n\n                <AuthenticatedTemplate>\n                    <ProfileContent\n                        setHouseToken={this.setHouseToken}\n                        houseToken={this.state.houseToken}\n                        isAuthenticated={this.props.login.isAuthenticated}\n                    />\n                </AuthenticatedTemplate>\n\n            </IdleTimer>\n        );\n    }\n}\n\nfunction ProfileContent(props) {\n    const { instance, accounts } = useMsal();\n\n    function RequestAccessToken() {\n        const request = {\n            ...loginRequest,\n            account: accounts[0]\n        };\n\n        instance.acquireTokenSilent(request).then((response) => {\n            props.setHouseToken(response.accessToken, response.expiresOn);\n            return true;\n        }).catch((e) => {\n            console.log(e)\n        });\n    }\n\n    if (props.houseToken === \"\" && !props.isAuthenticated) {\n        RequestAccessToken();\n    }\n\n    return (\n        null\n    );\n};\n\n// Connect is wrapped by withRouter. \n// This is the only way history.push and Redirect will work when also using Connect. \nconst App = withRouter(connect(\n    (state) => {\n        const { login, nav } = state;\n        return {\n            login,\n            nav\n        }\n    },\n    (dispatch) => {\n        return {\n            actions: bindActionCreators(Object.assign({}, authActionCreators, navActionCreators), dispatch)\n        }\n    }\n)(LISApp))\n\nexport default App;","// In production, we register a service worker to serve assets from local cache.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\n// cached resources are updated in the background.\n\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\n// This link also includes instructions on opting out of this behavior.\n\nconst isLocalhost = Boolean(\n  window.location.hostname === 'localhost' ||\n    // [::1] is the IPv6 localhost address.\n    window.location.hostname === '[::1]' ||\n    // 127.0.0.1/8 is considered localhost for IPv4.\n    window.location.hostname.match(\n      /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n    )\n);\n\nexport default function register() {\n  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n    // The URL constructor is available in all browsers that support SW.\n    const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\n    if (publicUrl.origin !== window.location.origin) {\n      // Our service worker won't work if PUBLIC_URL is on a different origin\n      // from what our page is served on. This might happen if a CDN is used to\n      // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\n      return;\n    }\n\n    window.addEventListener('load', () => {\n      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n      if (isLocalhost) {\n        // This is running on localhost. Lets check if a service worker still exists or not.\n        checkValidServiceWorker(swUrl);\n      } else {\n        // Is not local host. Just register service worker\n        registerValidSW(swUrl);\n      }\n    });\n  }\n}\n\nfunction registerValidSW(swUrl) {\n  navigator.serviceWorker\n    .register(swUrl)\n    .then(registration => {\n      registration.onupdatefound = () => {\n        const installingWorker = registration.installing;\n        installingWorker.onstatechange = () => {\n          if (installingWorker.state === 'installed') {\n            if (navigator.serviceWorker.controller) {\n              // At this point, the old content will have been purged and\n              // the fresh content will have been added to the cache.\n              // It's the perfect time to display a \"New content is\n              // available; please refresh.\" message in your web app.\n                console.log('New content is available; please refresh.');\n                // delete browser cache and hard reload\n                window.location.reload(true);\n            } else {\n              // At this point, everything has been precached.\n              // It's the perfect time to display a\n              // \"Content is cached for offline use.\" message.\n              console.log('Content is cached for offline use.');\n            }\n          }\n        };\n      };\n    })\n    .catch(error => {\n      console.error('Error during service worker registration:', error);\n    });\n}\n\nfunction checkValidServiceWorker(swUrl) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl)\n    .then(response => {\n      // Ensure service worker exists, and that we really are getting a JS file.\n      if (\n        response.status === 404 ||\n        response.headers.get('content-type').indexOf('javascript') === -1\n      ) {\n        // No service worker found. Probably a different app. Reload the page.\n        navigator.serviceWorker.ready.then(registration => {\n          registration.unregister().then(() => {\n            window.location.reload();\n          });\n        });\n      } else {\n        // Service worker found. Proceed as normal.\n        registerValidSW(swUrl);\n      }\n    })\n    .catch(() => {\n      console.log(\n        'No internet connection found. App is running in offline mode.'\n      );\n    });\n}\n\nexport function unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready.then(registration => {\n      registration.unregister();\n    });\n  }\n}\n","import { applyMiddleware, compose, createStore } from 'redux';\nimport thunk from 'redux-thunk';\nimport { routerMiddleware } from 'connected-react-router'\nimport { createBrowserHistory } from 'history'\nimport createRootReducer from './reducers'\n\nexport const history = createBrowserHistory();\nconst reactRouterMiddleware = routerMiddleware(history);\n\nconst middleWares = [\n    thunk,\n    reactRouterMiddleware\n]\n\nexport default function configureStore(preloadedState) {\n    const store = createStore(\n        createRootReducer(history), // root reducer with router state\n        preloadedState,\n        compose(applyMiddleware(...middleWares))\n    )\n\n    return store\n}","\nimport './stylesheets/shared/global.css';\nimport './stylesheets/lis-public-view/public-view.css';\nimport './stylesheets/shared/mobile.css';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Provider } from 'react-redux';\nimport { ConnectedRouter } from 'connected-react-router'\nimport App from './App';\nimport registerServiceWorker from './registerServiceWorker';\nimport configureStore, { history } from './configureStore';\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web'\nimport { PublicClientApplication } from \"@azure/msal-browser\";\nimport { MsalProvider } from \"@azure/msal-react\";\nimport { msalConfig } from \"./authConfig\";\n\nconst msalInstance = new PublicClientApplication(msalConfig);\n\nconst store = configureStore();\nconst rootElement = document.getElementById('root');\n\n//Setup the app to use Azure Application Insights.\nlet iKey = '';\nif (window.env.API_SERVER === 'QA') {\n    iKey = 'df7a0319-ce88-47d1-9283-fdf1153bff55';\n} else if (window.env.API_SERVER === 'Test') {\n    iKey = '0c3c8e03-65f5-4a51-8f94-21301445bf6d';\n}\n\nif (iKey) {\n    const appInsights = new ApplicationInsights({\n        config: {\n            instrumentationKey: iKey\n        }\n    });\n    appInsights.loadAppInsights();\n}\n\nwindow.store = store;\nReactDOM.render(\n    <Provider store={store}>\n        <ConnectedRouter history={history}>\n            <MsalProvider instance={msalInstance}>\n                <App />\n            </MsalProvider>\n        </ConnectedRouter>\n    </Provider>,\n    rootElement);\n\nregisterServiceWorker();\n","import * as Login from './stores/lis-auth-store';\nimport * as Users from './stores/lis-user-store';\nimport * as Session from './stores/lis-session-store';\nimport * as Committee from './stores/lis-committee-store';\nimport * as Calendar from './stores/lis-calendar-store';\nimport * as Minutes from './stores/lis-minutes-store';\nimport * as Members from './stores/lis-members-store';\nimport * as Bills from './stores/lis-legislation-store';\nimport * as Communications from './stores/lis-communications-store';\nimport * as Patrons from './stores/lis-patron-store';\nimport * as Personnel from './stores/lis-personnel-store';\nimport * as Votes from './stores/lis-votes-store';\nimport * as Print from './stores/lis-print-store';\nimport * as Schedule from './stores/lis-schedule-store';\nimport * as Report from './stores/lis-report-store';\nimport * as Collection from './stores/lis-collection-store';\nimport * as Stat from './stores/lis-statistics-store';\nimport * as Nav from './stores/lis-nav-store';\nimport * as Org from './stores/lis-org-store';\nimport * as Dev from './stores/lis-developers-store';\nimport * as Journal from './stores/lis-journal-store';\nimport { combineReducers } from 'redux';\nimport { connectRouter } from 'connected-react-router';\n\nexport default (history) => combineReducers({\n    router: connectRouter(history),\n    login: Login.reducer,\n    users: Users.reducer,\n    session: Session.reducer,\n    committee: Committee.reducer,\n    calendar: Calendar.reducer,\n    members: Members.reducer,\n    bills: Bills.reducer,\n    nav: Nav.reducer,\n    patrons: Patrons.reducer,\n    minutes: Minutes.reducer,\n    personnel: Personnel.reducer,\n    votes: Votes.reducer,\n    communications: Communications.reducer,\n    schedule: Schedule.reducer,\n    print: Print.reducer,\n    report: Report.reducer,\n    collection: Collection.reducer,\n    stats: Stat.reducer,\n    organizations: Org.reducer,\n    developers: Dev.reducer,\n    journal: Journal.reducer\n});","import { partnerRequest, publicRequest } from '../services/request.service'\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst committeeListRequest = \"GET_COMMITTEE_LIST_REQUEST\";\nconst committeeListSuccess = \"GET_COMMITTEE_LIST_SUCCESS\";\nconst committeeListFailure = \"GET_COMMITTEE_LIST_FAILURE\";\n\nconst createCommitteeRequest = \"CREATE_COMMITTEE_REQUEST\";\nconst createCommitteeSuccess = \"CREATE_COMMITTEE_SUCCESS\";\nconst createCommitteeFailure = \"CREATE_COMMITTEE_FAILURE\";\n\nconst saveCommitteeRequest = \"SAVE_COMMITTEE_REQUEST\";\nconst saveCommitteeSuccess = \"SAVE_COMMITTEE_SUCCESS\";\nconst saveCommitteeFailure = \"SAVE_COMMITTEE_FAILURE\";\n\nconst partnerCommitteeListRequest = \"GET_PARTNER_COMMITTEE_LIST_REQUEST\";\nconst partnerCommitteeListSuccess = \"GET_PARTNER_COMMITTEE_LIST_SUCCESS\";\nconst partnerCommitteeListFailure = \"GET_PARTNER_COMMITTEE_LIST_FAILURE\";\n\nconst partnerCommitteesRequest = \"GET_PARTNER_COMMITTEES_REQUEST\";\nconst partnerCommitteesSuccess = \"GET_PARTNER_COMMITTEES_SUCCESS\";\nconst partnerCommitteesFailure = \"GET_PARTNER_COMMITTEES_FAILURE\";\n\nconst committeeByIdRequest = \"GET_COMMITTEE_BY_ID_REQUEST\";\nconst committeeByIdSuccess = \"GET_COMMITTEE_BY_ID_SUCCESS\";\nconst committeeByIdFailure = \"GET_COMMITTEE_BY_ID_FAILURE\";\n\nconst committeeByNumberRequest = \"GET_COMMITTEE_BY_NUMBER_REQUEST\";\nconst committeeByNumberSuccess = \"GET_COMMITTEE_BY_NUMBER_SUCCESS\";\nconst committeeByNumberFailure = \"GET_COMMITTEE_BY_NUMBER_FAILURE\";\n\nconst committeePartnerByIdRequest = \"GET_PARTNER_COMMITTEE_BY_ID_REQUEST\";\nconst committeePartnerByIdSuccess = \"GET_PARTNER_COMMITTEE_BY_ID_SUCCESS\";\nconst committeePartnerByIdFailure = \"GET_PARTNER_COMMITTEE_BY_ID_FAILURE\";\n\nconst committeesByMemberRequest = \"GET_COMMITTEES_BY_MEMBER_REQUEST\";\nconst committeesByMemberSuccess = \"GET_COMMITTEES_BY_MEMBER_SUCCESS\";\nconst committeesByMemberFailure = \"GET_COMMITTEES_BY_MEMBER_FAILURE\";\n\nconst toggleChamber = \"COMMITTEES_TOGGLE_CHAMBER\";\n\nconst initialState = {\n    committeeList: [],\n    savedCommittee: '',\n    partnerCommitteeList: [],\n    partnerCommitteeListError: 'Could not retrieve subcommittees.',\n    partnerCommittees: [],\n    membersList: '',\n    committeeByIdData: [],\n    committeeByNumberData: [],\n    committeesByMember: [],\n    createdCommittee: '',\n    partnerCommitteeByIdData: {},\n    createCommitteeMessage: '',\n    saveCommitteeError: '',\n    committeeChamber: ''\n};\n\n\n\nexport const committeeActionCreators = {\n\n    // SAVE AN EXISTING COMMITTEE\n    saveCommitteeRequest: () => ({\n        type: saveCommitteeRequest,\n        isFetching: true\n    }),\n\n    receiveSaveCommittee: (responseObj) => ({\n        type: saveCommitteeSuccess,\n        isFetching: false,\n        savedCommittee: responseObj\n    }),\n\n    saveCommitteeError: saveCommitteeError => ({\n        type: saveCommitteeFailure,\n        isFetching: false,\n        saveCommitteeError: saveCommitteeError\n    }),\n\n    saveCommittee: (body) => {\n        return dispatch => {\n            dispatch(committeeActionCreators.saveCommitteeRequest());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_COMMITTEE_API_URL) + '/Committee/api/saveCommitteeAsync', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(committeeActionCreators.saveCommitteeError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(committeeActionCreators.receiveSaveCommittee(result[1][0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(committeeActionCreators.saveCommitteeError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    // CREATE A NEW COMMITTEE\n    createCommitteeRequest: () => ({\n        type: createCommitteeRequest,\n        isFetching: true\n    }),\n\n    receiveCreateCommittee: (responseObj) => ({\n        type: createCommitteeSuccess,\n        isFetching: false,\n        createdCommittee: responseObj,\n    }),\n\n    createCommitteeError: message => ({\n        type: createCommitteeFailure,\n        isFetching: false,\n        createCommitteeMessage: message\n    }),\n\n    createNewCommittee: (body) => {\n        return dispatch => {\n            dispatch(committeeActionCreators.createCommitteeRequest());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_COMMITTEE_API_URL) + '/Committee/api/createCommitteeAsync', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(committeeActionCreators.createCommitteeError('Fail ' + result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(committeeActionCreators.receiveCreateCommittee(result[1]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(committeeActionCreators.createCommitteeError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    // GET PARTNER COMMITTEE LIST FOR COMMITTEE MANAGEMENT SUBCOMMITTEES\n    requestPartnerCommitteeList: () => ({\n        type: partnerCommitteeListRequest,\n        isFetching: true\n    }),\n\n    receivePartnerCommitteeList: responseObj => ({\n        type: partnerCommitteeListSuccess,\n        isFetching: false,\n        partnerCommitteeList: responseObj\n    }),\n\n    partnerCommitteeListError: message => ({\n        type: partnerCommitteeListFailure,\n        isFetching: false,\n        partnerCommitteeListError: message\n    }),\n\n    getPartnerCommitteeList: (params) => {\n        return dispatch => {\n            dispatch(committeeActionCreators.requestPartnerCommitteeList());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_COMMITTEE_API_URL) + '/Committee/api/GetPartnerCommitteeListAsync?', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === 1) {\n                        dispatch(committeeActionCreators.partnerCommitteeListError('Could not retrieve subcommittees.'))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === 0) {\n                        // Dispatch the success action\n                        dispatch(committeeActionCreators.receivePartnerCommitteeList(result[1].Committees))\n                    } else if (result[0] === 2) {\n                        dispatch(committeeActionCreators.receivePartnerCommitteeList([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    // GET PARTNER COMMITTEES FOR COMMITTEE MANAGEMENT GRID\n    requestPartnerCommittees: () => ({\n        type: partnerCommitteesRequest,\n        isFetching: true\n    }),\n\n    receivePartnerCommittees: responseObj => ({\n        type: partnerCommitteesSuccess,\n        isFetching: false,\n        partnerCommittees: responseObj\n    }),\n\n    partnerCommitteesError: message => ({\n        type: partnerCommitteesFailure,\n        isFetching: false,\n        partnerCommitteesError: message\n    }),\n\n    getPartnerCommittees: (params) => {\n        return dispatch => {\n            dispatch(committeeActionCreators.requestPartnerCommittees());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_COMMITTEE_API_URL) + '/Committee/api/GetPartnerCommitteesAsync?', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(committeeActionCreators.partnerCommitteesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(committeeActionCreators.receivePartnerCommittees(result[1].Committees))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(committeeActionCreators.partnerCommitteesError('No Content'))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    requestCommitteesByMember: () => ({\n        type: committeesByMemberRequest,\n        isFetching: true\n    }),\n\n    receiveCommitteesByMember: responseObj => ({\n        type: committeesByMemberSuccess,\n        isFetching: false,\n        committeesByMember: responseObj\n    }),\n\n    committeesByMemberError: message => ({\n        type: committeesByMemberFailure,\n        isFetching: false,\n        message\n    }),\n\n    // GET ALL COMMITTEES BY MEMBER ID\n    getCommitteesByMember: (params) => {\n        return dispatch => {\n            dispatch(committeeActionCreators.requestCommitteesByMember());\n\n            return publicRequest((API_URL || process.env.REACT_APP_MEMBERS_API_URL) + '/Member/api/GetCommitteesListAsync/?', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(committeeActionCreators.committeesByMemberError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(committeeActionCreators.receiveCommitteesByMember(result[1].Committees))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(committeeActionCreators.receiveCommitteesByMember([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    requestCommitteeList: () => ({\n        type: committeeListRequest,\n        isFetching: true\n    }),\n\n    receiveCommitteeList: responseObj => ({\n        type: committeeListSuccess,\n        isFetching: false,\n        committeeList: responseObj\n    }),\n\n    committeeListError: message => ({\n        type: committeeListFailure,\n        isFetching: false,\n        committeeList: [],\n        message\n    }),\n\n    // Get all committees for a session start date & chamber\n    getCommitteeList: (params) => {\n        //Common params:\n        //effectiveDate (must be URI encoded ISO date string),\n        //chamberCode, \n        //parentCommitteeID\n\n        return dispatch => {\n            dispatch(committeeActionCreators.requestCommitteeList());\n\n            return publicRequest((API_URL || process.env.REACT_APP_COMMITTEE_API_URL) + '/Committee/api/GetCommitteeListAsync?', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(committeeActionCreators.committeeListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(committeeActionCreators.receiveCommitteeList(result[1].Committees))\n                        return (result[1])\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(committeeActionCreators.receiveCommitteeList([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    // GET COMMITTEE BY ID FOR PUBLIC VIEWS\n    requestCommitteeById: () => ({\n        type: committeeByIdRequest,\n        isFetching: true\n    }),\n\n    receiveCommitteeById: responseObj => ({\n        type: committeeByIdSuccess,\n        isFetching: false,\n        committeeByIdData: responseObj\n    }),\n\n    committeeByIdError: message => ({\n        type: committeeByIdFailure,\n        isFetching: false,\n        message\n    }),\n\n    // GET COMMITTEE DETAILS BY COMMITTEE ID\n    getCommitteeById: (params) => {\n\n        return dispatch => {\n            dispatch(committeeActionCreators.requestCommitteeById());\n\n            return publicRequest((API_URL || process.env.REACT_APP_COMMITTEE_API_URL) + '/Committee/api/getCommitteeByIdAsync/', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(committeeActionCreators.committeeByIdError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(committeeActionCreators.receiveCommitteeById(result[1].Committees[0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(committeeActionCreators.committeeByIdError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    // GET COMMITTEE BY NUMBER FOR PUBLIC VIEWS\n    requestCommitteeByNumber: () => ({\n        type: committeeByNumberRequest,\n        isFetching: true\n    }),\n\n    receiveCommitteeByNumber: responseObj => ({\n        type: committeeByNumberSuccess,\n        isFetching: false,\n        committeeByNumberData: responseObj\n    }),\n\n    committeeByNumberError: message => ({\n        type: committeeByNumberFailure,\n        isFetching: false,\n        message\n    }),\n\n    // GET COMMITTEE DETAILS BY COMMITTEE NUMBER\n    getCommitteeByNumber: (params) => {\n\n        return dispatch => {\n            dispatch(committeeActionCreators.requestCommitteeByNumber());\n\n            return publicRequest((API_URL || process.env.REACT_APP_COMMITTEE_API_URL) + '/Committee/api/GetCommitteesAsync/', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(committeeActionCreators.committeeByNumberError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(committeeActionCreators.receiveCommitteeByNumber(result[1].Committees[0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(committeeActionCreators.committeeByNumberError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    // GET COMMITTEE BY ID FOR COMMITTEE MANAGEMENT (W/ PARTNER AUTH)\n    requestPartnerCommitteeById: () => ({\n        type: committeePartnerByIdRequest,\n        isFetching: true\n    }),\n\n    receivePartnerCommitteeById: responseObj => ({\n        type: committeePartnerByIdSuccess,\n        isFetching: false,\n        partnerCommitteeByIdData: responseObj\n    }),\n\n    committeePartnerByIdError: message => ({\n        type: committeePartnerByIdFailure,\n        isFetching: false,\n        message\n    }),\n\n    getPartnerCommitteeById: (params) => {\n\n        return dispatch => {\n            dispatch(committeeActionCreators.requestPartnerCommitteeById());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_COMMITTEE_API_URL) + '/Committee/api/GetPartnerCommitteeByIdAsync/', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(committeeActionCreators.committeePartnerByIdError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(committeeActionCreators.receivePartnerCommitteeById(result[1].Committees[0]))\n                        return result[1].Committees[0];\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(committeeActionCreators.committeePartnerByIdError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    toggleChamber: (value) => ({\n        type: toggleChamber,\n        committeeChamber: value\n    })\n};\n\nexport const reducer = (state, action) => {\n    state = state || initialState;\n\n    switch (action.type) {\n        case createCommitteeRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case createCommitteeSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                createdCommittee: action.createdCommittee,\n                createCommitteeMessage: ''\n            });\n        case createCommitteeFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                createCommitteeMessage: action.createCommitteeMessage\n            });\n        case partnerCommitteeListRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case partnerCommitteeListSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                partnerCommitteeList: action.partnerCommitteeList,\n                partnerCommitteeListError: ''\n            });\n        case partnerCommitteeListFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                partnerCommitteeListError: action.partnerCommitteeListError\n            });\n        case partnerCommitteesRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case partnerCommitteesSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                partnerCommittees: action.partnerCommittees,\n                partnerCommitteesError: ''\n            });\n        case partnerCommitteesFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                partnerCommitteesError: action.partnerCommitteesError\n            });\n        case committeesByMemberRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case committeesByMemberSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                committeesByMember: action.committeesByMember,\n                errorMessage: ''\n            });\n        case committeesByMemberFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.message\n            });\n        case committeeListRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case committeeListSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                committeeList: action.committeeList,\n                errorMessage: ''\n            });\n        case committeeListFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.message\n            });\n        case committeeByIdRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case committeeByIdSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                committeeByIdData: action.committeeByIdData,\n                errorMessage: ''\n            });\n        case committeeByIdFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.message\n            });\n        case committeeByNumberRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case committeeByNumberSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                committeeByNumberData: action.committeeByNumberData,\n                errorMessage: ''\n            });\n        case committeeByNumberFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.message\n            });\n        case committeePartnerByIdRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case committeePartnerByIdSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                partnerCommitteeByIdData: action.partnerCommitteeByIdData,\n                errorMessage: ''\n            });\n        case committeePartnerByIdFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.message\n            });\n        case saveCommitteeRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case saveCommitteeSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                savedCommittee: action.savedCommittee,\n                saveCommitteeError: ''\n            });\n        case saveCommitteeFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                saveCommitteeError: action.saveCommitteeError\n            });\n        case toggleChamber:\n            return Object.assign({}, state, {\n                committeeChamber: action.committeeChamber\n            });\n        default:\n            return state;\n    }\n};\n","import { partnerRequest, publicRequest } from '../services/request.service'\n\nconst API_URL = window.env ? window.env.API_SERVER : '';\nconst NO_CONTENT = 2;\nconst REQUEST_FAILURE = 1;\nconst REQUEST_SUCCESS = 0;\n\nconst districtListSuccess = \"GET_DISTRICTS_SUCCESS\";\nconst districtListFailure = \"GET_DISTRICTS_FAILURE\";\n\nconst memberStatusesSuccess = \"GET_STATUSES_SUCCESS\";\nconst memberStatusesFailure = \"GET_STATUSES_FAILURE\";\n\nconst partyCodeListSuccess = \"GET_PARTIES_SUCCESS\";\nconst partyCodeListFailure = \"GET_PARTIES_FAILURE\";\n\nconst memberNumbersRequest = \"GET_ALL_MEMBERS_REQUEST\";\nconst memberNumbersSuccess = \"GET_ALL_MEMBERS_SUCCESS\";\nconst memberNumbersFailure = \"GET_ALL_MEMBERS_FAILURE\";\n\nconst memberListRequest = \"GET_MEMBER_LIST_REQUEST\";\nconst memberListSuccess = \"GET_MEMBER_LIST_SUCCESS\";\nconst memberListFailure = \"GET_MEMBER_LIST_FAILURE\";\n\nconst memberContactRequest = \"GET_MEMBER_CONTACT_REQUEST\";\nconst memberContactSuccess = \"GET_MEMBER_CONTACT_SUCCESS\";\nconst memberContactFailure = \"GET_MEMBER_CONTACT_FAILURE\";\n\nconst memberListContactRequest = \"GET_MEMBER_LIST_CONTACT_REQUEST\";\nconst memberListContactSuccess = \"GET_MEMBER_LIST_CONTACT_SUCCESS\";\nconst memberListContactFailure = \"GET_MEMBER_LIST_CONTACT_FAILURE\";\n\nconst memberByIdSuccess = \"GET_MEMBER_BY_ID_SUCCESS\";\nconst memberByIdFailure = \"GET_MEMBER_BY_ID_FAILURE\";\n\nconst membersByCommitteeRequest = \"GET_MEMBERS_BY_COMMITTEE_REQUEST\";\nconst membersByCommitteeSuccess = \"GET_MEMBERS_BY_COMMITTEE_SUCCESS\";\nconst membersByCommitteeFailure = \"GET_MEMBERS_BY_COMMITTEE_FAILURE\";\n\nconst committeeMemberRolesRequest = \"GET_COMMITTEE_MEMBER_ROLES_REQUEST\";\nconst committeeMemberRolesSuccess = \"GET_COMMITTEE_MEMBER_ROLES_SUCCESS\";\nconst committeeMemberRolesFailure = \"GET_COMMITTEE_MEMBER_ROLES_FAILURE\";\n\nconst memberCommitteeSaveSuccess = 'MEMBER_COMMITTEE_SAVE_SUCCESS';\nconst memberCommitteeSaveFailure = 'MEMBER_COMMITTEE_SAVE_FAILURE';\n\nconst memberCreateSuccess = 'MEMBER_CREATE_SUCCESS';\nconst memberCreateFailure = 'MEMBER_CREATE_FAILURE';\n\nconst memberSaveSuccess = 'MEMBER_SAVE_SUCCESS';\nconst memberSaveFailure = 'MEMBER_SAVE_FAILURE';\n\nconst memberLegislationSuccess = 'MEMBER_LEGISLATION_SUCCESS';\nconst memberLegislationFailure = 'MEMBER_LEGISLATION_FAILURE';\n\nconst memberVotesSuccess = 'MEMBER_VOTES_SUCCESS';\nconst memberVotesFailure = 'MEMBER_VOTES_FAILURE';\n\nconst memberConferenceBillsSuccess = 'MEMBER_CONFERENCE_BILLS_SUCCESS';\nconst memberConferenceBillsFailure = 'MEMBER_CONFERENCE_BILLS_FAILURE';\n\nconst initialState = {\n    districtList: [],\n    districtListError: '',\n    memberStatuses: [],\n    memberStatusesError: '',\n    partyCodeList: [],\n    partyCodeListError: '',\n    memberList: [],\n    memberData: [],\n    memberContactData: [],\n    memberListContactData: [],\n    committeeHouseRoles: [],\n    committeeSenateRoles: [],\n    membersByCommittee: [],\n    membersByCommitteeError: '',\n    member: '',\n    memberError: '',\n    memberCommitteeSave: '',\n    memberCommitteeSaveError: '',\n    memberCreate: '',\n    memberCreateError: '',\n    memberSave: '',\n    memberSaveError: null,\n    memberLegislation: [],\n    memberLegislationError: '',\n    memberVotes: '',\n    memberVotesError: '',\n    memberConferenceBills: [],\n    memberConferenceBillsError: '',\n    memberListContactError: ''\n};\n\nexport const memberActionCreators = {\n\n    receiveDistricts: (responseObj) => ({\n        type: districtListSuccess,\n        districtList: responseObj\n    }),\n\n    districtListError: message => ({\n        type: districtListFailure,\n        districtListError: message\n    }),\n\n    getDistricts: () => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_MEMBERS_API_URL) + '/Member/api/getdistrictreferencesasync', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(memberActionCreators.districtListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(memberActionCreators.receiveDistricts(result[1].Districts))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(memberActionCreators.districtListError('No Content'))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n\n    },\n\n    receivePartyCodeList: (responseObj) => ({\n        type: partyCodeListSuccess,\n        partyCodeList: responseObj\n    }),\n\n    partyCodeListError: message => ({\n        type: partyCodeListFailure,\n        partyCodeListError: message\n    }),\n\n    getPartyCodeList: () => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_MEMBERS_API_URL) + '/Member/api/getpartyreferencesasync', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(memberActionCreators.partyCodeListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(memberActionCreators.receivePartyCodeList(result[1].Parties))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(memberActionCreators.partyCodeListError('No Content'))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n\n    },\n\n    receiveMemberStatuses: (responseObj) => ({\n        type: memberStatusesSuccess,\n        memberStatuses: responseObj\n    }),\n\n    memberStatusesError: message => ({\n        type: memberStatusesFailure,\n        memberStatusesError: message\n    }),\n\n    getMemberStatuses: () => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_MEMBERS_API_URL) + '/Member/api/getmemberstatustypereferencesasync', 'GET', headers, '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(memberActionCreators.memberStatusesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(memberActionCreators.receiveMemberStatuses(result[1].MemberStatuses))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(memberActionCreators.memberStatusesError('No Content'))\n                        throw 'No Content'\n                    }\n                }).catch(err => console.log(err))\n        }\n\n    },\n\n    // GET MEMBERS BY COMMITTEE ID - PARTNER AUTH\n    requestMembersByCommittee: () => ({\n        type: membersByCommitteeRequest,\n        isFetching: true\n    }),\n\n    receiveMembersByCommittee: (responseObj) => ({\n        type: membersByCommitteeSuccess,\n        isFetching: false,\n        membersByCommittee: responseObj\n    }),\n\n    membersByCommitteeError: message => ({\n        type: membersByCommitteeFailure,\n        isFetching: false,\n        membersByCommitteeError: message\n    }),\n\n    getMembersByCommittee: (params, partner) => {\n        return dispatch => {\n            dispatch(memberActionCreators.requestMembersByCommittee());\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            let request = '';\n            if (partner) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_MEMBERS_BY_COMMITTEE_API_URL) + '/MembersByCommittee/api/getPartnerMembersByCommitteeAsync?', 'GET', headers, '', params)\n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_MEMBERS_BY_COMMITTEE_API_URL) + '/MembersByCommittee/api/GetCommitteeMembersListAsync?', 'GET', headers, '', params)\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(memberActionCreators.membersByCommitteeError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(memberActionCreators.receiveMembersByCommittee(result[1].MemberList))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(memberActionCreators.receiveMembersByCommittee([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n\n    },\n\n    // GET COMMITTEE MEMBER ROLES - USED ON COMM MGMT FORM DROPDOWN\n    requestCommitteeMemberRoles: () => ({\n        type: committeeMemberRolesRequest,\n        isFetching: true\n    }),\n\n    receiveCommitteeMemberRoles: (houseRoles, senateRoles) => ({\n        type: committeeMemberRolesSuccess,\n        isFetching: false,\n        committeeHouseRoles: houseRoles,\n        committeeSenateRoles: senateRoles\n    }),\n\n    committteeMemberRolesError: message => ({\n        type: committeeMemberRolesFailure,\n        isFetching: false,\n        message\n    }),\n\n    getCommitteeMemberRoles: () => {\n        return dispatch => {\n            dispatch(memberActionCreators.requestCommitteeMemberRoles());\n\n            return publicRequest((API_URL || process.env.REACT_APP_MEMBERS_BY_COMMITTEE_API_URL) + '/MembersByCommittee/api/getCommitteeRolesAsync/', 'GET', '', '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(memberActionCreators.committeeMemberRolesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        let members = result[1];\n                        var committeeMembersArray = members.CommitteeRoles;\n                        var committeeMemberSenateRoles = [];\n                        var committeeMemberHouseRoles = [];\n                        committeeMembersArray.forEach(function (element) {\n                            var elemObj = { label: element.Title, value: element.CommitteeRoleID }\n                            if (element.ChamberCode === 'H') {\n                                committeeMemberHouseRoles.push(elemObj)\n                            } else {\n                                committeeMemberSenateRoles.push(elemObj)\n                            }\n                        })\n                        dispatch(memberActionCreators.receiveCommitteeMemberRoles(committeeMemberHouseRoles, committeeMemberSenateRoles))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(memberActionCreators.committeeMemberRolesError('No Content'))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    // GET MEMBER SHALLOW LIST\n    requestMemberNumbers: () => ({\n        type: memberNumbersRequest,\n        isFetching: true\n    }),\n\n    receiveMemberNumbers: responseObj => ({\n        type: memberNumbersSuccess,\n        isFetching: false,\n        memberNumbers: responseObj\n    }),\n\n    memberNumbersError: message => ({\n        type: memberNumbersFailure,\n        isFetching: false,\n        memberNumbers: [],\n        memberNumbersError: message\n    }),\n\n    getMemberNumbers: () => {\n        return dispatch => {\n            dispatch(memberActionCreators.requestMemberNumbers());\n\n            return publicRequest((API_URL || process.env.REACT_APP_MEMBERS_API_URL) + '/Member/api/GetMemberNumberListAsync', 'GET', '', '', '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(memberActionCreators.memberNumbersError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(memberActionCreators.receiveMemberNumbers(result[1].MemberNumberList))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(memberActionCreators.receiveMemberNumbers([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n\n        }\n    },\n\n    // GET MEMBER SHALLOW LIST\n    requestMemberList: () => ({\n        type: memberListRequest,\n        isFetching: true\n    }),\n\n    receiveMemberList: responseObj => ({\n        type: memberListSuccess,\n        isFetching: false,\n        memberList: responseObj\n    }),\n\n    memberListError: message => ({\n        type: memberListFailure,\n        isFetching: false,\n        memberList: [],\n        memberListError: message\n    }),\n\n    getMemberList: (params) => {\n        return dispatch => {\n            dispatch(memberActionCreators.requestMemberList());\n\n            return publicRequest((API_URL || process.env.REACT_APP_MEMBERS_API_URL) + '/Member/api/GetMemberListAsync/?', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(memberActionCreators.memberListError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(memberActionCreators.receiveMemberList(result[1].ShallowMembers))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(memberActionCreators.receiveMemberList([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n\n        }\n    },\n\n    receiveMember: responseObj => ({\n        type: memberByIdSuccess,\n        member: responseObj\n    }),\n\n    memberError: message => ({\n        type: memberByIdFailure,\n        memberError: message\n    }),\n\n    getMember: (params, partner) => {\n        return dispatch => {\n            let request = '';\n            if (partner) {\n                request = partnerRequest((API_URL || process.env.REACT_APP_MEMBERS_API_URL) + '/Member/api/GetPartnerMemberByIdAsync/', 'GET', '', '', params)\n            } else {\n                request = publicRequest((API_URL || process.env.REACT_APP_MEMBERS_API_URL) + '/Member/api/GetMemberByIdAsync/', 'GET', '', '', params)\n            }\n            return request\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(memberActionCreators.memberError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(memberActionCreators.receiveMember(result[1].Members[0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(memberActionCreators.memberError('Member not found'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err));\n        }\n    },\n\n    // GET MEMBER CONTACT INFO - USED ON MEMBER DETAILS PAGE\n    requestMemberContact: () => ({\n        type: memberContactRequest,\n        isFetching: true\n    }),\n\n    receiveMemberContact: responseObj => ({\n        type: memberContactSuccess,\n        isFetching: false,\n        memberContactData: responseObj\n    }),\n\n    memberContactError: message => ({\n        type: memberContactFailure,\n        isFetching: false,\n        message\n    }),\n\n    getMemberContact: (params) => {\n        return dispatch => {\n            dispatch(memberActionCreators.requestMemberContact());\n\n            return publicRequest((API_URL || process.env.REACT_APP_MEMBERS_API_URL) + '/Member/api/GetMembersContactInformationListAsync/?', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(memberActionCreators.memberContactError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(memberActionCreators.receiveMemberContact(result[1].MemberContactInformationList))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(memberActionCreators.receiveMemberContact([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    // GET MEMBER CONTACT INFO - USED ON MEMBER MANAGEMENT GRID\n    requestMemberListContact: () => ({\n        type: memberListContactRequest,\n        isFetching: true\n    }),\n\n    receiveMemberListContact: responseObj => ({\n        type: memberListContactSuccess,\n        isFetching: false,\n        memberListContactData: responseObj\n    }),\n\n    memberListContactError: message => ({\n        type: memberListContactFailure,\n        isFetching: false,\n        message\n    }),\n\n    getMemberListContact: (params) => {\n        return dispatch => {\n            dispatch(memberActionCreators.requestMemberContact());\n\n            return partnerRequest((API_URL || process.env.REACT_APP_MEMBERS_API_URL) + '/Member/api/GetPartnerMembersContactInformationListAsync/?', 'GET', '', '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(memberActionCreators.memberListContactError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(memberActionCreators.receiveMemberListContact(result[1].MemberContactInformationList))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(memberActionCreators.receiveMemberListContact([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveMemberCommitteeSave: (message) => ({\n        type: memberCommitteeSaveSuccess,\n        memberCommitteeSave: message\n    }),\n\n    memberCommitteeSaveError: (message) => ({\n        type: memberCommitteeSaveFailure,\n        memberCommitteeSaveError: message\n    }),\n\n    saveMemberCommittee: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_MEMBERS_BY_COMMITTEE_API_URL) + '/MembersByCommittee/api/SaveMembersByCommitteeAsync/', 'PUT', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(memberActionCreators.memberCommitteeSaveError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(memberActionCreators.receiveMemberCommitteeSave(result[1]))\n                        return Promise.resolve(result[1])\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(memberActionCreators.memberCommitteeSaveError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveMemberCreate: (resObj) => ({\n        type: memberCreateSuccess,\n        memberCreate: resObj\n    }),\n\n    memberCreateError: (message) => ({\n        type: memberCreateFailure,\n        memberCreateError: message\n    }),\n\n    createMember: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_MEMBERS_API_URL) + '/Member/api/creatememberasync/', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(memberActionCreators.memberCreateError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(memberActionCreators.receiveMemberCreate(result[1][0]))\n                        return Promise.resolve(result[1])\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(memberActionCreators.memberCreateError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveMemberSave: (resObj) => ({\n        type: memberSaveSuccess,\n        memberSave: resObj\n    }),\n\n    memberSaveError: (message) => ({\n        type: memberSaveFailure,\n        memberSaveError: message\n    }),\n\n    saveMember: (body) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return partnerRequest((API_URL || process.env.REACT_APP_MEMBERS_API_URL) + '/Member/api/savememberasync/', 'POST', headers, body, '')\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(memberActionCreators.memberSaveError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        dispatch(memberActionCreators.receiveMemberSave(result[1][0]))\n                        return Promise.resolve(result[1])\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(memberActionCreators.memberSaveError('No Content'))\n                        return Promise.reject('No Content')\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n    },\n\n    receiveMemberLegislation: (responseObj) => ({\n        type: memberLegislationSuccess,\n        memberLegislation: responseObj\n    }),\n\n    memberLegislationError: message => ({\n        type: memberLegislationFailure,\n        memberLegislationError: message\n    }),\n\n    getMemberLegislation: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_PATRON_SERVICE) + '/LegislationPatron/api/GetLegislationPatronListAsync?', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(memberActionCreators.memberLegislationError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(memberActionCreators.receiveMemberLegislation(result[1].PatronLegislation))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(memberActionCreators.receiveMemberLegislation([]))\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n\n    },\n\n    receiveMemberVotes: (responseObj) => ({\n        type: memberVotesSuccess,\n        memberVotes: responseObj\n    }),\n\n    memberVotesError: message => ({\n        type: memberVotesFailure,\n        memberVotesError: message\n    }),\n\n    getMemberVotes: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_MEMBER_VOTE_SEARCH_SERVICE) + '/MemberVoteSearch/api/GetMemberVoteListAsync', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(memberActionCreators.memberVotesError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(memberActionCreators.receiveMemberVotes(result[1].MemberVoteList[0]))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(memberActionCreators.receiveMemberVotes([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n\n    },\n\n    receiveMemberConferenceBills: (responseObj) => ({\n        type: memberConferenceBillsSuccess,\n        memberConferenceBills: responseObj\n    }),\n\n    memberConferenceBillsError: message => ({\n        type: memberConferenceBillsFailure,\n        memberConferenceBillsError: message\n    }),\n\n    getMemberConferenceBills: (params) => {\n        return dispatch => {\n            let headers = {\n                'content-type': \"application/json; charset=utf-8\"\n            }\n            return publicRequest((API_URL || process.env.REACT_APP_LEGISLATION_API_URL) + '/Legislation/api/GetConferenceLegislationListAsync', 'GET', headers, '', params)\n                .then(result => {\n                    if (result[0] === REQUEST_FAILURE) {\n                        dispatch(memberActionCreators.memberConferenceBillsError(result[1]))\n                        return Promise.reject(result[1])\n                    } else if (result[0] === REQUEST_SUCCESS) {\n                        // Dispatch the success action\n                        dispatch(memberActionCreators.receiveMemberConferenceBills(result[1].ConferenceLegislationList))\n                    } else if (result[0] === NO_CONTENT) {\n                        dispatch(memberActionCreators.receiveMemberConferenceBills([]));\n                    } else if (result.name === 'AbortError') {\n                        return Promise.reject(\"Aborted\");\n                    }\n                }).catch(err => Promise.reject(err))\n        }\n\n    }\n};\n\nexport const reducer = (state, action) => {\n    state = state || initialState;\n\n    switch (action.type) {\n        case districtListSuccess:\n            return Object.assign({}, state, {\n                districtList: action.districtList,\n                districtListError: ''\n            });\n        case districtListFailure:\n            return Object.assign({}, state, {\n                districtListError: action.districtListError\n            });\n        case memberStatusesSuccess:\n            return Object.assign({}, state, {\n                memberStatuses: action.memberStatuses,\n                memberStatusesError: ''\n            });\n        case memberStatusesFailure:\n            return Object.assign({}, state, {\n                memberStatusesError: action.memberStatusesError\n            });\n        case partyCodeListSuccess:\n            return Object.assign({}, state, {\n                partyCodeList: action.partyCodeList,\n                partyCodeListError: ''\n            });\n        case partyCodeListFailure:\n            return Object.assign({}, state, {\n                partyCodeListError: action.partyCodeListError\n            });\n        case membersByCommitteeRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case membersByCommitteeSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                membersByCommittee: action.membersByCommittee,\n                errorMessage: ''\n            });\n        case membersByCommitteeFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.message\n            });\n        case committeeMemberRolesRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case committeeMemberRolesSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                committeeSenateRoles: action.committeeSenateRoles,\n                committeeHouseRoles: action.committeeHouseRoles,\n                errorMessage: ''\n            });\n        case committeeMemberRolesFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.message\n            });\n        case memberNumbersRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case memberNumbersSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                memberNumbers: action.memberNumbers,\n                errorMessage: ''\n            });\n        case memberNumbersFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                memberNumbersError: action.memberNumbersError\n            });\n        case memberListRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case memberListSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                memberList: action.memberList,\n                errorMessage: ''\n            });\n        case memberListFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                memberListError: action.memberListError\n            });\n        case memberByIdSuccess:\n            return Object.assign({}, state, {\n                member: action.member,\n                memberError: ''\n            });\n        case memberByIdFailure:\n            return Object.assign({}, state, {\n                memberError: action.memberError\n            });\n        case memberContactRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case memberContactSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                memberContactData: action.memberContactData,\n                errorMessage: ''\n            });\n        case memberContactFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                errorMessage: action.message\n            });\n        case memberListContactRequest:\n            return Object.assign({}, state, {\n                isFetching: true\n            });\n        case memberListContactSuccess:\n            return Object.assign({}, state, {\n                isFetching: false,\n                memberListContactData: action.memberListContactData,\n                memberListContactError: ''\n            });\n        case memberListContactFailure:\n            return Object.assign({}, state, {\n                isFetching: false,\n                memberListContactError: action.message\n            });\n        case memberCommitteeSaveSuccess:\n            return Object.assign({}, state, {\n                memberCommitteeSave: action.memberCommitteeSave,\n                memberCommitteeSaveError: ''\n            })\n        case memberCommitteeSaveFailure:\n            return Object.assign({}, state, {\n                memberCommitteeSaveError: action.memberCommitteeSaveError\n            })\n        case memberCreateSuccess:\n            return Object.assign({}, state, {\n                memberCreate: action.memberCreate,\n                memberCreateError: ''\n            })\n        case memberCreateFailure:\n            return Object.assign({}, state, {\n                memberCreateError: action.memberCreateError\n            })\n        case memberSaveSuccess:\n            return Object.assign({}, state, {\n                memberSave: action.memberSave,\n                memberSaveError: null\n            })\n        case memberSaveFailure:\n            return Object.assign({}, state, {\n                memberSaveError: action.memberSaveError\n            })\n        case memberLegislationSuccess:\n            return Object.assign({}, state, {\n                memberLegislation: action.memberLegislation,\n                memberLegislationError: ''\n            })\n        case memberLegislationFailure:\n            return Object.assign({}, state, {\n                memberLegislationError: action.memberLegislationError\n            })\n        case memberVotesSuccess:\n            return Object.assign({}, state, {\n                memberVotes: action.memberVotes,\n                memberVotesError: ''\n            })\n        case memberVotesFailure:\n            return Object.assign({}, state, {\n                memberVotesError: action.memberVotesError\n            })\n        case memberConferenceBillsSuccess:\n            return Object.assign({}, state, {\n                memberConferenceBills: action.memberConferenceBills,\n                memberConferenceBillsError: ''\n            })\n        case memberConferenceBillsFailure:\n            return Object.assign({}, state, {\n                memberConferenceBillsError: action.memberConferenceBillsError\n            })\n        default:\n            return state;\n    }\n};\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport tinymce from 'tinymce/tinymce';\n\nfunction copyStyles(sourceDoc, targetDoc) {\n    Array.from(sourceDoc.styleSheets).forEach(styleSheet => {\n        if (styleSheet.cssRules) { // true for inline styles\n            const newStyleEl = sourceDoc.createElement('style');\n\n            Array.from(styleSheet.cssRules).forEach(cssRule => {\n                newStyleEl.appendChild(sourceDoc.createTextNode(cssRule.cssText));\n            });\n\n            targetDoc.head.appendChild(newStyleEl);\n        } else if (styleSheet.href) { // true for stylesheets loaded from a URL\n            const newLinkEl = sourceDoc.createElement('link');\n\n            newLinkEl.rel = 'stylesheet';\n            newLinkEl.href = styleSheet.href;\n            targetDoc.head.appendChild(newLinkEl);\n        }\n    });\n}\n\nclass Popout extends React.Component {\n    constructor(props) {\n        super(props);\n\n        this.containerEl = document.createElement('div'); \n        \n        // open a new browser window and store a reference to it\n        const width = this.props.windowWidth || 900;\n        const height = this.props.windowHeight || 500;\n        this.externalWindow = window.open('', '', `width=${width},height=${height},left=200,top=200`);\n\n        // append the container <div> (that has props.children appended to it) to the body of the new window\n        this.externalWindow.document.body.appendChild(this.containerEl);\n\n        this.externalWindow.document.title = this.props.windowTitle;\n        copyStyles(document, this.externalWindow.document);\n\n    }\n\n    componentDidMount() {\n        // update the state in the parent component if the user closes the new window\n        this.externalWindow.addEventListener('beforeunload', () => {\n            this.props.togglePortal(true);\n        });\n    }\n\n    \n    componentWillUnmount() {\n        this.externalWindow.close();\n    }\n\n    render() {\n        return ReactDOM.createPortal(this.props.children, this.containerEl);\n    }\n}\n\nexport default Popout;"],"sourceRoot":""}