;\n\n case 'TOUCHNET':\n return \n {\n await confirmModal('Confirm Offsite Payment',\n 'You will be redirected to your payment provider to complete this transaction. Click Yes to continue');\n\n // Remove old form\n const oldForm = document.querySelector('#TOUCHNET_FORM');\n if (oldForm && oldForm.parentNode) {\n oldForm.parentNode.removeChild(oldForm);\n }\n // Create ticket\n let ticketName = '';\n if (type === 'ENROLLMENT') {\n ticketName = `ENROLLMENT_${referenceData.enrollmentIds.join('_')}`;\n } else if (type === 'EVENT') {\n ticketName = `EVENT_${referenceData.registrationIds.join('_')}`;\n } else {\n throw new Error(`Unsupported type ${type}`);\n }\n\n // Get Touchnet Ticket\n const {ticket} = await backendClient.touchnetGenerateTicket({\n configId: session.settings.state.stateId,\n returnTo: referenceData.returnTo || window.location.href,\n }, {\n ticketName, nameValuePairs: {\n AMT: amountWithFee.toFixed(2), //.padStart(8, '0'),\n BILL_NAME: `${household?.firstName} ${household?.lastName}`,\n BILL_EMAIL_ADDRESS: household?.email || '',\n BILL_STREET1: household?.address?.street1 || '',\n BILL_STREET2: household?.address?.street2 || '',\n BILL_CITY: household?.address?.city || '',\n BILL_STATE: household?.address?.state || '',\n BILL_POSTAL_CODE: household?.address?.zip || '',\n BILL_COUNTRY: 'US',\n //CREDIT_ACCT_CODE: (paymentMethod.countyItemCodes || {})[referenceData.countyId],\n CREDIT_ACCT_CODE: creditAcctCode,\n EXT_TRANS_ID: ticketName\n },\n });\n if (!ticket) {\n throw new Error('NO TICKET');\n }\n const form = document.createElement('FORM') as HTMLFormElement;\n form.id = 'TOUCHNET_FORM';\n form.action = paymentMethod.upayUrl; //'https://test.secure.touchnet.net:8443/C30002test_upay/web/index.jsp';\n form.method = 'post';\n const values = {\n 'TICKET': ticket,\n 'TICKET_NAME': ticketName,\n UPAY_SITE_ID: paymentMethod.upaySiteId,\n };\n Object.entries(values).forEach(([name, value]) => {\n const input = document.createElement('INPUT') as HTMLInputElement;\n input.type = 'hidden';\n input.name = name;\n input.value = value;\n form.append(input);\n });\n document.body.append(form);\n form.submit();\n }}>Pay with Touchnet \n
;\n case 'CASHNET':\n return \n {\n await confirmModal('Confirm Offsite Payment',\n 'You will be redirected to your payment provider to complete this transaction. Click Yes to continue');\n const url = createURL(paymentMethod.cashnetUrl, {\n itemcode: referenceData.itemCode || paymentMethod.cashnetItemCode,\n amount: amountWithFee.toFixed(2),\n USERID: account?.id,\n NAME_G: `${household?.firstName || ''} ${household?.lastName || ''}`,\n ADDR_G: `${household?.address?.street1 || ''} ${household?.address?.street2 || ''}`.trim(),\n CITY_G: household?.address?.city || '',\n STATE_G: household?.address?.state || '',\n ZIP_G: household?.address?.zip || '',\n EMAIL_G: household?.email || '',\n REF1: type,\n ...(referenceData.enrollmentIds ? {REF2: referenceData.enrollmentIds.join('_')} : {}),\n ...(referenceData.registrationIds ? {REF2: referenceData.registrationIds.join('_')} : {})\n });\n // console.log('URL', url);\n window.open(url, '_blank');\n }}>Pay with Cashnet \n
;\n case 'AUTHORIZE_NET':\n return ;\n case 'NELNET':\n /* TX fee will be computed and added on backend */\n return \n case 'EXTERNAL':\n return \n
{paymentMethod.externalLinkDesc}
\n
{\n await runModalForm(() => \n You are leaving ZSuite to an external payment system. \n Payments may not be processed immediately.\n
, {\n title: 'Confirm Action',\n noCancel: true,\n submitLabel: 'Confirm and Continue',\n });\n window.location.href = paymentMethod.externalLinkUrl;\n }}>\n Continue to {paymentMethod.methodLabel} \n \n
;\n }\n return '';\n }\n\n async onSubmitStripe(paymentMethod: PaymentMethodSetting) {\n const {\n session: {backendClient, orgId, settings: {state, county}}, onSubmit = () => ({}),\n type, referenceData, amount, history, hostCountySetting\n } = this.props,\n {getStripeToken, submittingStripe} = this.state;\n\n if (!getStripeToken) {\n return this.setState({error: 'Error retrieving token'});\n }\n if (!state) {\n return this.setState({error: 'Error retrieving State Id'});\n }\n if (submittingStripe) {\n return;\n }\n await new Promise(resolve => this.setState({submittingStripe: true}, () => resolve(undefined)));\n let token;\n try {\n token = await getStripeToken();\n\n if (paymentMethod.methodType === 'STRIPE_CONNECT') {\n if (!county) {\n return this.setState({error: 'Error retrieving County Id'});\n }\n\n await backendClient.processStripeConnectCheckout({}, {\n stateId: state.stateId, countyId: hostCountySetting ? hostCountySetting?.countyId : county.countyId,\n orgId, token, type: type as string,\n enrollmentIds: referenceData.enrollmentIds,\n registrationIds: referenceData.registrationIds,\n amount,\n });\n }\n } catch (e) {\n this.setState({error: await extractError(e, 'Unknown Error'), submittingStripe: false});\n return;\n }\n\n try {\n let result;\n if (paymentMethod.methodType === 'STRIPE_CONNECT') {\n if (!this.props.onSubmit) {\n history.push(referenceData.returnTo || '/');\n } else {\n // Don't pass token since it has already been charged\n result = onSubmit({paymentMethod: paymentMethod.methodType});\n }\n } else {\n // Process 'STRIPE' method type\n // TODO: move token processing into render_payment_methods for LMS course purchase and remove this else block\n result = onSubmit({paymentMethod: paymentMethod.methodType, token});\n }\n // await result to prevent setting submittingStripe to false too early\n if (result && result instanceof Promise) {\n await result;\n }\n } finally {\n this.setState({submittingStripe: false});\n }\n }\n\n render() {\n const {\n session: {\n backendClient, settings: {disableEnrollmentPayments}\n },\n amount, type, referenceData, history\n } = this.props,\n paymentsDisabled = type === 'ENROLLMENT' && disableEnrollmentPayments,\n availableMethods = paymentsDisabled ? [] : (this.props.availableMethods || []);\n let {paymentMethod, paymentMethodType} = this.state || {};\n\n // Use Nop Checkout method if amount is zero\n if (amount <= 0) {\n return \n {\n await backendClient.nopCheckout({}, {\n type: type || '',\n registrationIds: referenceData.registrationIds,\n enrollmentIds: referenceData.enrollmentIds,\n });\n await runSweetAlert({\n success: true,\n title: 'Success!',\n body: 'Payment successfully submitted',\n }).catch(() => {\n });\n history.push(referenceData.returnTo || '/');\n }}>\n Continue\n \n
;\n }\n\n if (!availableMethods.length) {\n return \n \n
;\n }\n if (paymentMethodType) {\n paymentMethod = availableMethods.find(m =>\n m.methodType === paymentMethodType);\n }\n if (!paymentMethod && availableMethods.length === 1) {\n paymentMethod = availableMethods[0];\n }\n\n return (\n \n {availableMethods.length > 1 ?\n {\n if (s.paymentMethodType) {\n const paymentMethod = availableMethods.find(\n m => m.methodType === s.paymentMethodType);\n if (paymentMethod) {\n this.updateTransactionFee(paymentMethod);\n }\n }\n this.setState(s);\n }}>\n ({\n label: m.methodLabel || m.methodType,\n value: m.methodType,\n }))}/>\n : ''}\n\n {paymentMethod ? this.renderPaymentMethod(paymentMethod) : ''}\n
\n );\n }\n}\n\nexport default RenderPaymentMethods;\n\nclass StripePaymentFormWrapper\n extends Component {\n\n constructor(props: any) {\n super(props);\n this.state = {stripe: null, data: {}};\n }\n\n async componentDidMount() {\n const {session: {backendClient}} = this.props;\n this.setState({stripe: await loadStripeInstance(backendClient)});\n }\n\n render() {\n return \n \n this.setState(\n (s: any) => ({data: Object.assign({}, s.data, data)}))}\n />\n \n ;\n }\n}\n\nconst stripeFormStyles = {\n cardInfo: {\n '& label': {\n display: 'inline-block',\n paddingBottom: '1rem',\n },\n },\n table: {\n marginTop: '3rem',\n },\n};\n\nclass StripePaymentForm extends Component {\n componentDidMount() {\n if (this.props.setCallback) {\n this.props.setCallback(this.getFormData.bind(this));\n }\n }\n\n async getFormData() {\n const {data} = this.props;\n if (!data.cardholderName) {\n throw new Error('Card holder name is required');\n }\n let resp = await this.props.stripe.createToken({name: data.cardholderName});\n if (!resp.token) {\n throw new Error(\n resp.error ? resp.error.message : 'Card information is invalid');\n }\n return resp.token.id;\n }\n\n render() {\n const {onChange, classes, data} = this.props;\n\n return (\n
\n \n
\n
\n Cardholder Name}\n helperText=\"Name as appears on card\"\n id=\"cardholderName\"\n formControlProps={{fullWidth: true}}\n inputProps={{\n value: data.cardholderName || '',\n onChange: (e: any) => onChange(\n {cardholderName: e.target.value}),\n }}\n />\n
\n
\n );\n }\n}\n\nconst StripePaymentFormComp = injectStripe(\n withStyles(stripeFormStyles as any)(StripePaymentForm) as any) as any;","import React, {Component} from 'react';\nimport {withSession} from '../../session_context';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport Select from '@material-ui/core/Select';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport FormControl from '@material-ui/core/FormControl';\n\nimport styles from '../../../vendor/assets/jss/material-dashboard-pro-react/customSelectStyle';\nimport {withStyles} from '@material-ui/core';\nimport CountySelect from './county_select';\nimport GridContainer from '../../../vendor/components/Grid/GridContainer';\nimport GridItem from '../../../vendor/components/Grid/GridItem';\nimport {FormDataContext} from '../form_data/';\nimport {sortBy} from '../../shared/shared_helpers';\n\nclass ClubSelect extends Component {\n\n async componentDidMount() {\n await this.componentDidUpdate({}, {}, {});\n }\n\n async componentDidUpdate(prevProps, prevState, snapshot) {\n if (this.props.value && prevProps.value !== this.props.value) {\n await this.loadFromClub(this.props.value);\n } else if (this.props.countyId && prevProps.countyId !== this.props.countyId) {\n await this.loadFromCounty(this.props.countyId);\n }\n }\n\n async loadFromClub(clubId) {\n const {session: {backendClient, settings, orgId}} = this.props;\n const {newClubId} = this.state || {};\n if (clubId && newClubId !== clubId) {\n const club = await backendClient.findClub({id: clubId});\n this.setState({\n clubs: sortBy('name', await backendClient.listClubs({countyId: club.countyId, orgId, includeStateWide: true})),\n countyId: club.countyId,\n label: settings.state.clubLabel,\n clubDescription: club.properties.clubDescription,\n });\n }\n }\n\n async loadFromCounty(countyId) {\n const {session: {backendClient, settings, orgId}} = this.props;\n if (countyId) {\n this.setState({\n clubs: sortBy('name', await backendClient.listClubs({countyId, orgId, includeStateWide: true})),\n countyId,\n label: settings.state.clubLabel\n });\n }\n }\n\n async changeCounty(countyId) {\n const {session: {backendClient, orgId, settings}} = this.props;\n if (countyId) {\n this.setState(\n {\n clubs: sortBy('name', await backendClient.listClubs({countyId, orgId, includeStateWide: true})),\n countyId,\n label: settings.state.clubLabel,\n clubDescription: '',\n });\n }\n }\n\n // Gets the club description for the selected club.\n async getClubDescription(selectedClub) {\n const {session: {backendClient, orgId, settings}} = this.props;\n const club = await backendClient.findClub({id: selectedClub});\n this.setState({clubDescription: club.properties.clubDescription})\n }\n\n render() {\n const {\n classes,\n value,\n disabled,\n onChange,\n id,\n showCountySelect,\n showStateSelect,\n stateId,\n role,\n filter = () => true,\n session:{state, settings},\n fullWidth\n } = this.props,\n {clubs = [], countyId, label, clubDescription} = this.state || {};\n // console.log(\"SETTINGS\", settings.showClubRoleDescription);\n\n\n const clubRole = [\n {selectedRole: \"Volunteer\", accessRole: \"The role you have selected has no access to member information in ZSuite. You will be counted as a volunteer in the system and still be able to act as a volunteer in your county, but there is no additional functionality to the role you have selected.\", Link: },\n {selectedRole: \"Leader\", accessRole: \"The role you have selected grants you access to the club management tools. This will allow you to look at a listing of club members and volunteers/leaders for your club. There are other helpful club management tools you will have access to. Follow this link for help docs on your new club management tools:\", Link: Tools },\n {selectedRole: \"ProjectLeader\", accessRole: \"The role you have selected will have you count as a “Project Leader” in ZSuite. You will currently need to reach out to your county admin for “Project Leader” access in our system which will allow you to view a list of club members in the project you are a leader of as well as other Project Leader Management tools.\", Link: }\n ];\n\n return (\n {/*START OF COUNTY AND CLUB SELECT GRID ITEM*/}\n \n {this.props.countyId && !showCountySelect ? ''\n : {\n await this.changeCounty(newCountyId);\n if (newCountyId !== countyId) {\n onChange();\n }\n }}\n showStateSelect={showStateSelect}/>\n }\n {countyId &&\n \n \n {label || 'Club'}\n \n {\n this.setState({newClubId: e.target.value});\n onChange(e.target.value);\n const selectedClub = e.target.value;\n this.getClubDescription(selectedClub);\n }}\n inputProps={{name: id, id}}>\n {clubs.filter(filter).map((club) =>\n {club.name} )}\n\n \n \n }\n \n {/*END OF COUNTY AND CLUB SELECT GRID ITEM*/}\n\n {/*START ROLE ACCESS DESCRIPTION GRID ITEM*/}\n {\n settings.showClubRoleDescription ?\n clubRole.filter(club => club.selectedRole === role).map((club, index) =>\n (\n \n \n Chosen Role Access In ZSuite: \n {club.accessRole}\n {club.Link}\n
\n \n )) : ''\n }\n {/*END ROLE ACCESS DESCRIPTION GRID ITEM*/}\n\n {/*START OF CLUB DESCRIPTION GRID ITEM*/}\n {state?.id !== 'US-UT' &&\n \n {clubDescription ?\n \n {settings.state.clubLabel} Description: \n {clubDescription}\n
: ''\n }\n \n }\n\n {/*END OF CLUB DESCRIPTION GRID ITEM*/}\n\n\n {/*Old Code*/}\n {/*{this.props.countyId && !showCountySelect ? ''*/}\n {/* : */}\n {/* {*/}\n {/* await this.changeCounty(newCountyId);*/}\n {/* if (newCountyId !== countyId) {*/}\n {/* onChange();*/}\n {/* }*/}\n {/* }}*/}\n {/* showStateSelect={showStateSelect}/>*/}\n {/* }*/}\n {/*{countyId && */}\n {/* */}\n {/* */}\n {/* {label || 'Club'}*/}\n {/* */}\n {/* {*/}\n {/* this.setState({newClubId: e.target.value});*/}\n {/* onChange(e.target.value);*/}\n {/* }}*/}\n {/* inputProps={{name: id, id}}>*/}\n {/* {clubs.filter(filter).map((club) =>*/}\n {/* {club.name} )}*/}\n\n {/* */}\n {/* */}\n {/* }*/}\n );\n }\n}\n\nexport default withSession(withStyles(styles)(ClubSelect));\n\nexport const ClubSelectFormData = withSession(withStyles(styles)(props => {\n ({data, onChange}) => onChange({...data, [props.id]: id})}/>\n} ))","import React, { Component } from 'react';\nimport { withSession } from '../../session_context';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport Select from '@material-ui/core/Select';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport FormControl from '@material-ui/core/FormControl';\n\nimport styles from '../../../vendor/assets/jss/material-dashboard-pro-react/customSelectStyle';\nimport { withStyles } from '@material-ui/core';\nimport GridContainer from '../../../vendor/components/Grid/GridContainer';\nimport GridItem from '../../../vendor/components/Grid/GridItem';\nimport StateSelect from './state_select';\nimport { sortBy } from '../../shared/shared_helpers';\nimport { FormDataContext } from '../form_data/';\n\nclass CountySelect extends Component {\n\n async componentDidMount() {\n await this.componentDidUpdate({}, {}, {});\n }\n\n async componentDidUpdate(prevProps, prevState, snapshot) {\n\n if (prevProps.value !== this.props.value) {\n await this.loadFromCounty(this.props.value);\n }\n if (prevProps.stateId !== this.props.stateId || prevProps.districtId !== this.props.districtId) {\n await this.loadFromStateOrDistrict(this.props.stateId, this.props.districtId);\n }\n }\n\n async loadFromCounty(countyId) {\n const {session: {backendClient, orgId}} = this.props;\n const {newCountyId} = this.state || {};\n if (countyId && newCountyId !== countyId && countyId !== 'all') {\n const county = await backendClient.findCounty({id: countyId});\n const {countyLabel} = await backendClient.getStateSelectSettings(\n {stateId: county.stateId, orgId});\n this.setState({\n counties: sortBy('name', await backendClient.listCounties(\n {stateId: county.stateId})),\n stateId: county.stateId,\n label: countyLabel\n });\n }\n }\n\n async loadFromStateOrDistrict(stateId, districtId) {\n const {session: {backendClient, orgId}} = this.props;\n if ((stateId && stateId !== 'all') || districtId) {\n const {countyLabel} = await backendClient.getStateSelectSettings(\n {stateId, orgId});\n this.setState({\n counties: sortBy('name', await backendClient.listCounties(\n {districtId, stateId})),\n label: countyLabel,\n stateId\n });\n }\n }\n\n\n async changeState(stateId) {\n const {\n session: {backendClient, orgId}, onChange,\n onStateChange = x => null, getStateSettings = x => null\n } = this.props;\n if (stateId) {\n const selectStateSettings = await backendClient.getStateSelectSettings({stateId, orgId});\n getStateSettings(selectStateSettings);\n this.setState({\n counties: sortBy('name',\n await backendClient.listCounties({stateId})),\n stateId,\n label: selectStateSettings.countyLabel\n });\n }\n if (stateId === 'all') {\n this.setState({counties: [], stateId});\n }\n onChange();\n onStateChange(stateId);\n }\n\n render() {\n const {\n classes, value, onChange, id, districtId, countyFilter,\n stateId, stateLabel, stateFilter, showBlankState, showBlankCounty, showStateSelect = !(stateId ||\n districtId), fullWidth, disabled\n } = this.props,\n {counties = [], label} = this.state || {};\n let countiesWithPossibleBlank = counties;\n if (showBlankCounty) {\n countiesWithPossibleBlank = [{name: 'All Counties', id: 'all'}].concat(\n counties);\n }\n if (countyFilter) {\n countiesWithPossibleBlank = countiesWithPossibleBlank.filter(\n countyFilter);\n }\n return (\n {showStateSelect ? \n \n : ''}\n {counties.length ? \n \n \n {label || 'County'}\n \n {\n this.setState({newCountyId: e.target.value});\n onChange(e.target.value);\n }}\n inputProps={{name: id, id}}>\n {countiesWithPossibleBlank.map((county) =>\n {county.name} )}\n\n \n \n : ''}\n );\n }\n}\n\nexport default withSession(withStyles(styles)(CountySelect));\n\nexport const CountySelectFormData = withSession(withStyles(styles)(props => {\n ({data, onChange}) =>\n onChange({...data, [props.id]: id})}/>\n} ));","import React, { Component } from 'react';\nimport { withSession } from '../../session_context';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport Select from '@material-ui/core/Select';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport FormControl from '@material-ui/core/FormControl';\n\nimport styles from '../../../vendor/assets/jss/material-dashboard-pro-react/customSelectStyle';\nimport { withStyles } from '@material-ui/core';\nimport DistrictSelect from './district_select';\nimport GridContainer from '../../../vendor/components/Grid/GridContainer';\nimport GridItem from '../../../vendor/components/Grid/GridItem';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport { FormDataContext } from '../form_data/';\n\nclass CountySelectMultiple extends Component {\n\n async componentDidMount() {\n const {session: {backendClient}, value, districtId} = this.props;\n if (districtId) {\n await this.changeDistrict(districtId);\n } else if (value) {\n const county = await backendClient.findCounty({id: value[0]});\n this.setState({\n counties: await backendClient.listCounties(\n {districtId: county.districtId}),\n districtId: county.districtId,\n });\n }\n }\n\n async changeDistrict(districtId) {\n const {session: {backendClient}, onChange} = this.props;\n if (districtId) {\n this.setState(\n {counties: await backendClient.listCounties({districtId}), districtId});\n }\n onChange();\n }\n\n handleChange(values) {\n const {onChange} = this.props;\n onChange(values);\n this.setState(values);\n }\n\n render() {\n const {classes, label = 'County', stateId, value = [], id} = this.props,\n {counties = [], districtId} = this.state || {};\n return (\n {this.props.districtId ? '' : \n \n }\n {districtId && \n \n \n {label}\n \n this.handleChange(e.target.value)}\n renderValue={selected => (selected.map(\n id => counties.find(c => c.id === id).name)).join(', ')}\n inputProps={{name: id, id}}>\n {counties.map((county) =>\n -1}/>\n {county.name} )}\n\n \n \n }\n );\n }\n}\n\nexport default withSession(withStyles(styles)(CountySelectMultiple));\n\nexport const CountySelectMultipleFormData = withSession(withStyles(styles)((props) => {\n ({data, onChange}) =>\n onChange({...data, [props.id]: ids})}/>\n} ));","import React, { Component } from 'react';\nimport { withSession } from '../../session_context';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport Select from '@material-ui/core/Select';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport FormControl from '@material-ui/core/FormControl';\n\nimport styles from '../../../vendor/assets/jss/material-dashboard-pro-react/customSelectStyle';\nimport { withStyles } from '@material-ui/core';\nimport StateSelect from './state_select';\nimport GridContainer from '../../../vendor/components/Grid/GridContainer';\nimport GridItem from '../../../vendor/components/Grid/GridItem';\n\nclass DistrictSelect extends Component {\n\n async componentDidMount() {\n const {session: {backendClient}, value, stateId} = this.props;\n if (stateId) {\n this.setState(\n {districts: await backendClient.listDistricts({stateId}), stateId});\n } else if (value) {\n const district = await backendClient.findDistrict({id: value});\n this.setState({\n districts: await backendClient.listDistricts(\n {stateId: district.stateId}),\n stateId: district.stateId,\n });\n }\n }\n\n async componentDidUpdate(prevProps, prevState) {\n const {session: {backendClient}, value} = this.props;\n if ((value !== prevProps.value) && !this.state) {\n const district = await backendClient.findDistrict({id: value});\n this.setState({\n districts: await backendClient.listDistricts(\n {stateId: district.stateId}),\n stateId: district.stateId,\n });\n }\n }\n\n async changeState(stateId) {\n const {session: {backendClient}, onChange} = this.props;\n this.setState(\n {districts: await backendClient.listDistricts({stateId}), stateId});\n onChange();\n }\n\n render() {\n const {classes, label = 'District', value, onChange, id} = this.props,\n {districts = [], stateId} = this.state || {};\n return (\n {this.props.stateId ? '' : \n \n }\n {stateId && \n \n \n {label}\n \n onChange(e.target.value)}\n inputProps={{name: id, id}}>\n {districts.map((district) =>\n {district.name} )}\n\n \n \n }\n );\n }\n}\n\nexport default withSession(withStyles(styles)(DistrictSelect));","import React, { Component } from 'react';\nimport { withSession } from '../../session_context';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport Select from '@material-ui/core/Select';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport FormControl from '@material-ui/core/FormControl';\n\nimport styles from '../../../vendor/assets/jss/material-dashboard-pro-react/customSelectStyle';\nimport { withStyles } from '@material-ui/core';\nimport { sortBy } from '../../shared/shared_helpers';\n\nclass StateSelect extends Component {\n\n async componentDidMount() {\n const {session: {backendClient}, filter = () => true} = this.props,\n states = (await backendClient.listStates()).filter(filter);\n this.setState({states: sortBy('name', states)});\n }\n\n render() {\n const {\n classes, label = 'State', value, onChange, id, showBlank,\n fullWidth\n } = this.props,\n {states = []} = this.state || {};\n let statesWithPossibleBlank = states;\n if (showBlank) {\n statesWithPossibleBlank = [{name: 'All States', id: 'all'}].concat(states);\n }\n return (\n \n \n {label}\n \n onChange(e.target.value)}\n inputProps={{name: id, id}}>\n {statesWithPossibleBlank.map((state) =>\n {state.name} )}\n\n \n \n );\n }\n}\n\nexport default withSession(withStyles(styles)(StateSelect));","import React from 'react';\nimport Spinner from './spinner';\n\nimport {CloudDownload as DownloadIcon, Email, Warning} from '@material-ui/icons';\nimport pdfMake from 'pdfmake/build/pdfmake';\nimport newFonts from '../shared/fonts/vfs_fonts';\nimport {withSession} from '../session_context';\nimport {\n blobToArrayPolyfill,\n current4HYear,\n extractError, format4HYear, formatYear,\n loadScriptTag,\n resolveRelativePath,\n} from '../shared/shared_helpers';\nimport Button from '../../vendor/components/CustomButtons/Button';\nimport {withStyles} from '@material-ui/core';\nimport moment from 'moment';\nimport {runSweetAlert} from './Modal/Modal';\nimport SnackbarContent from '../../vendor/components/Snackbar/SnackbarContent';\n\nconst MAX_WIDTH = 680;\n\nconst styles = {\n reportViewer: {\n margin: '0 auto',\n maxWidth: 848,\n '& h2': {marginTop: 0, textAlign: 'center'},\n '& #report-viewer-buttons': {\n textAlign: 'right', margin: '1rem 2.25rem',\n },\n '& #report-viewer-pages': {\n textAlign: 'center', overflowX: 'auto',\n },\n },\n};\n\nclass ReportViewer extends React.Component {\n constructor(props, context) {\n super(props, context);\n this.reportRoot = React.createRef();\n }\n\n async componentDidMount() {\n this.renderStarted = false;\n await loadScriptTag(resolveRelativePath('/pdfjs/pdf.min.js'));\n this.pdfJS = window.pdfjsLib;\n this.pdfJS.GlobalWorkerOptions.workerSrc = resolveRelativePath(\n '/pdfjs/pdf.worker.min.js');\n pdfMake.vfs = newFonts;\n await Promise.all([this.loadReport(), this.loadSubmission()]);\n }\n\n async loadReport() {\n const {reportName, report, params, session: {backendClient, orgId}} = this.props;\n this.setState({pdfData: undefined, errors: undefined});\n if (reportName) {\n return await this.renderReport();\n }\n if (report) {\n const reportData = await report.load({orgId, ...params}, backendClient);\n this.setState({reportData});\n await this.renderReport(reportData);\n }\n }\n\n async componentDidUpdate(prevProps, prevState) {\n const {report, reportName, params} = prevProps;\n if (report !== this.props.report || params !== this.props.params\n || reportName !== this.props.reportName) {\n this.renderStarted = false;\n await this.componentDidMount();\n }\n }\n\n async renderReport(reportData) {\n const targetEl = this.reportRoot.current;\n\n if (!targetEl || this.renderStarted) {\n return;\n }\n this.renderStarted = true;\n targetEl.innerHTML = '';\n let pdfData, fileName, reportTitle;\n const {report, reportName, params} = this.props;\n\n if (this.props.reportName) {\n const reportServerUrl = process.env.REACT_APP_REPORT_SERVER\n || this.props.session.settings?.reportServer || 'http://localhost:4000';\n const {_pdfData, _filename, _reportTitle} = await fetch(reportServerUrl + '/' + this.props.reportName, {\n method: 'POST',\n headers: new Headers({\n 'Content-Type': 'application/json',\n }),\n body: JSON.stringify({\n params: this.props.params,\n token: this.props.session.token,\n }),\n }).then(async (resp) => {\n let contentDisposition = resp.headers.get('Content-Disposition'),\n _filename = contentDisposition.indexOf('attachment; filename=') === 0\n ? contentDisposition.substr('attachment; filename='.length)\n : '', _reportTitle = resp.headers.get('X-Report-Title');\n return {_pdfData: await resp.blob().then(blobToArrayPolyfill), _filename, _reportTitle};\n }).catch(async (e) => {\n console.error('Unable to reach server ', e);\n this.setState({errors: [...(this.state.errors || []), `Error fetching report from server: ${await extractError(e)}`]});\n throw e;\n });\n reportTitle = _reportTitle;\n fileName = _filename;\n pdfData = _pdfData;\n } else if (reportData.pdfUrl) {\n pdfData = await fetch(reportData.pdfUrl)\n .then(resp => resp.blob()).then(blobToArrayPolyfill);\n } else if (reportData) {\n pdfData = await new Promise(res =>\n pdfMake.createPdf(reportData.document).getBuffer(res));\n } else {\n return console.log('no reportName or reportData given!');\n }\n\n // We check if the report is the same one as the currently set one to make sure we don't\n // accidentally overwrite or append to a newer report\n if (report === this.props.report && params === this.props.params\n && reportName === this.props.reportName) {\n this.setState({pdfData, fileName, reportTitle});\n\n const divWidth = document.getElementById('report-viewer')?.offsetWidth - 16;\n\n const pdfJSDoc = await this.pdfJS.getDocument(pdfData).promise;\n await Promise.all(\n new Array(pdfJSDoc.numPages).fill(0).map(async (_, i) => {\n const page = await pdfJSDoc.getPage(i + 1),\n canvas = document.createElement('canvas'),\n viewport = page.getViewport({scale: 2});\n canvas.style.boxShadow = '5px 5px 12px -4px #aaa';\n targetEl.appendChild(canvas);\n const canvasContext = canvas.getContext('2d');\n canvas.height = viewport.height;\n canvas.width = viewport.width;\n //canvas.style.width = (divWidth > MAX_WIDTH ? MAX_WIDTH : divWidth) + 'px';\n canvas.style.width = divWidth + 'px';\n await page.render({canvasContext, viewport}).promise;\n }));\n }\n }\n\n async downloadReport() {\n if (this.props.reportName) {\n const {pdfData, filename} = this.state || {};\n if (!pdfData) {\n return;\n }\n const link = document.createElement('a');\n link.href = window.URL.createObjectURL(\n new Blob([pdfData], {type: 'application/pdf'}),\n );\n link.download = filename || (\n this.props.reportName.replaceAll('/', '') + '.pdf');\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } else {\n const _name = this.state.reportData.filename,\n name = _name.endsWith('.pdf') ? _name : _name + '.pdf';\n if (this.state.reportData && this.state.reportData.pdfUrl) {\n const link = document.createElement('a');\n link.href = this.state.reportData.pdfUrl;\n link.download = name;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } else if (this.state.reportData && this.state.reportData.document) {\n pdfMake.createPdf(this.state.reportData.document).download(name);\n }\n }\n }\n\n async loadSubmission() {\n if (!this.props.session.currentRecordBook) return;\n const {session: {backendClient, currentRecordBook: {id: recordBookId}, settings}} = this.props,\n year = current4HYear(settings.state);\n this.setState({\n submission: await backendClient.findRecordBookSubmission({recordBookId, year})\n .catch(() => {\n // This is purposefully empty to avoid throwing errors\n // when the book has not been submitted\n return undefined;\n }),\n });\n }\n\n //Submit Report\n async submitReport() {\n const {session: {backendClient, currentRecordBook: {id: recordBookId, name, year, endYear}, settings}} = this.props;\n const submissionYear = endYear || year || current4HYear(settings.state);\n //console.log(\"RECORD BOOK SUBMISSION YEAR\", submissionYear);\n const {pdfData} = this.state || {};\n if (!pdfData) {\n return;\n }\n try {\n await backendClient.createOrUpdateRecordBookSubmission(\n {recordBookId, year: submissionYear}, {\n report: new Blob([pdfData], {type: 'application/pdf'}),\n });\n await this.loadSubmission();\n await runSweetAlert({\n success: true, body: `Successfully submitted ${name}!`,\n });\n } catch (e) {\n console.error('ERROR', e);\n this.setState({errors: [...(this.state.errors || []), `Error: ${await extractError(e)}`]});\n }\n }\n\n render() {\n const {\n report, reportName, classes, submittable, session: {backendClient, orgId, settings: {county}}, params, submitLabel = 'Submit',\n resubmitLabel = 'Re-Submit', spinnerText\n } = this.props, {\n reportData, submission, pdfData,\n reportTitle = '', errors\n } = this.state ||\n {};\n\n const countyRecordBookSubmissionDeadline =\n //THIS CHECKS IF RECORDBOOK SUBMISSION DEADLINE MONTH DAY AND YEAR ARE SET. IF THEY ARE NOT ALL SET THEN MAKE THE VALUE NULL\n (\n county.recordBookSubmissionDeadlineMonth\n & county.recordBookSubmissionDeadlineDay\n & current4HYear(county.recordBookSubmissionDeadlineYear)\n ) ?\n county.recordBookSubmissionDeadlineMonth + '/' + county.recordBookSubmissionDeadlineDay + '/' + current4HYear(county.recordBookSubmissionDeadlineYear)\n : null;\n\n const beforeSubmissionDeadline =countyRecordBookSubmissionDeadline !== null ? moment().isBefore(countyRecordBookSubmissionDeadline) : true;\n //console.log(\"REPORT VIEWER PROPS\", this.props);\n //console.log(\"COUNTY RECORD BOOK SUBMISSION DEADLINE\", countyRecordBookSubmissionDeadline);\n //console.log(\"COUNTY RECORD BOOK SUBMISSION DEADLINE\", beforeSubmissionDeadline);\n if (!reportData && !reportName) {\n return ;\n }\n\n return (\n \n
{report ? report.name : reportTitle} \n
\n\n {!pdfData ?
: ''}\n {errors?.length > 0 ? this.setState(\n {errors: undefined})}\n icon={Warning} color=\"danger\"/> : ''}\n \n
\n );\n }\n}\n\nexport default withSession(withStyles(styles)(ReportViewer));","import React, { Component } from 'react';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport Select from '@material-ui/core/Select';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport FormControl from '@material-ui/core/FormControl';\n\nimport customSelectStyle from '../../vendor/assets/jss/material-dashboard-pro-react/customSelectStyle';\nimport customCheckboxRadioSwitch from '../../vendor/assets/jss/material-dashboard-pro-react/customCheckboxRadioSwitch';\nimport { withStyles } from '@material-ui/core';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport ListSubheader from '@material-ui/core/ListSubheader';\n\nconst styles = {\n ...customCheckboxRadioSwitch,\n ...customSelectStyle,\n};\n\nclass SelectMultiple extends Component {\n\n handleChange(values) {\n const {onChange, options: _options = []} = this.props,\n options = _options.map(\n o => (typeof o === 'string') ? {name: o, id: o} : o);\n onChange(values.map(id => (options.find(c => c.id === id) || {}).id)\n .filter(x => !!x));\n }\n\n render() {\n const {\n classes, label = 'Select One or Multiple', value: _value, id,\n options: _options = [], noSort, required, helperText, endAdornment,\n fullWidth, disabled\n } = this.props,\n value = _value || [],\n options = _options.map(\n o => (typeof o === 'string') ? {name: o, id: o} : o);\n\n const sortedOptions = noSort ? options : options.sort(\n (a, b) => (a.name || '').localeCompare(b.name || ''));\n return (\n \n \n {label}\n \n this.handleChange(e.target.value)}\n renderValue={selected => Array.isArray(selected) ? selected.map(\n id => (sortedOptions.find(c => c.id === id) || '').name)\n .filter(x => !!x).join(', ') : selected}\n inputProps={{\n name: id,\n id,\n readOnly: this.props.readOnly,\n }}\n endAdornment={endAdornment ? {endAdornment} : undefined}>\n {sortedOptions.map((option) => option.subHeader\n ? {option.name} \n : -1}/>\n {option.name} )}\n\n \n {helperText ? {helperText} : ''}\n \n );\n }\n}\n\nexport default withStyles(styles)(SelectMultiple);","import React, { Component } from 'react';\nimport { CircularProgress } from '@material-ui/core';\n\nclass Spinner extends Component {\n componentDidMount() {\n this.timerId = setTimeout(() => {\n if (!this.props.text) {\n this.setState({text: 'Stuck loading? Try Pressing Ctrl-F5 (Cmd-Shift-F5 on Mac). \\nIf you are on a laptop with an FN key press Ctrl-FN-F5.'});\n }\n }, 20000);\n }\n\n componentWillUnmount() {\n clearTimeout(this.timerId);\n }\n\n render() {\n const {text} = this.props;\n return (\n \n
{text || this.state?.text}
\n
\n );\n }\n}\n\nexport default Spinner;","import React, {PureComponent} from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment';\nimport {\n Add as AddIcon,\n ArrowBack,\n Archive,\n Attachment,\n Check as CheckIcon,\n Check,\n Clear,\n Delete as RemoveIcon,\n Edit as EditIcon,\n Save,\n Warning,\n} from '@material-ui/icons';\nimport Table from '../../vendor/components/Table/Table';\nimport Button from '../../vendor/components/CustomButtons/Button';\nimport CustomInput from '../../vendor/components/CustomInput/CustomInput';\nimport GridItem from '../../vendor/components/Grid/GridItem';\nimport GridContainer from '../../vendor/components/Grid/GridContainer';\nimport FormControl from '@material-ui/core/FormControl';\nimport styles from '../../vendor/assets/jss/material-dashboard-pro-react/customSelectStyle.js';\nimport {withStyles} from '@material-ui/core';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport Select from '@material-ui/core/Select';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport SnackbarContent from '../../vendor/components/Snackbar/SnackbarContent';\nimport ImageInput from './image_input';\nimport Avatar from '@material-ui/core/Avatar';\nimport checkboxStyles from '../../vendor/assets/jss/material-dashboard-pro-react/customCheckboxRadioSwitch.js';\nimport Modal from './Modal/Modal';\nimport CountySelect from './region_select/county_select_multiple';\nimport StateSelect from './region_select/state_select';\nimport {withSession} from '../session_context';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport TextField from '@material-ui/core/TextField';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport SelectMultiple from '../../core/components/select_multiple';\nimport Typography from '@material-ui/core/Typography';\nimport Switch from '@material-ui/core/Switch';\nimport defaultImage from '../shared/img/blank_200x200.png';\nimport WithPaging from './with_paging';\nimport LoadingButton from './loading_button';\nimport {extractError} from '../shared/shared_helpers';\nimport Success from '../../vendor/components/Typography/Success';\nimport Danger from '../../vendor/components/Typography/Danger';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport DateTimeFormInput from './form_data/date_time_picker_form_input';\nimport CustomFileFormInput from './form_data/custom_file_form_input';\nimport CustomFormInput from './form_data/custom_form_input';\nimport {FormData, FormListEditor} from './form_data';\n\nconst fill_space = ' ';\nconst style = {\n ...styles,\n ...checkboxStyles,\n};\n\nclass TableEdit extends PureComponent {\n constructor(props, context) {\n super(props, context);\n this.state = {};\n this.root = React.createRef();\n }\n\n //////////////////////////////////////////////////////////////////////////\n //\n // FORMAT THE COLUMN TYPES FOR THE TABLE COLUMNS\n // TYPES ARE:\n // date\n // time\n // datetime\n // enum\n // select_multiple\n // money\n // weight\n // image\n // boolean\n // file\n // file_attachments\n // password\n // state_select\n // county_select\n //\n //////////////////////////////////////////////////////////////////////////\n formatCell(col, row, reloadPage) {\n const value = row[col.key];\n if (col.format) {\n return col.format(value, row, {reloadPage});\n }\n if (col.type === 'date' && value) {\n return moment(value, 'YYYY-MM-DD').format('l');\n }\n if (col.type === 'time' && value) {\n return moment(value, 'HH:mm a').format('h:mm A');\n }\n if (col.type === 'datetime' && value) {\n return moment(value).format('MMM D YYYY h:mm a');\n }\n if (col.type === 'enum' && value) {\n const {rows = []} = this.props;\n const values = (typeof col.values) === 'function'\n ? col.values(row, {rows, getAllValues: true})\n : col.values;\n if (values instanceof Array) {\n const option = values.find(v => v === value || v.value === value);\n return (option && option.label) ? option.label : option;\n } else {\n return values ? values[value] : '';\n }\n }\n if (col.type === 'select_multiple' && value) {\n const values = (col.values || []).map(\n v => (typeof v === 'string') ? {name: v, id: v} : v);\n if (value instanceof Array) {\n return value.map((val) => (\n values.find((option) => option.id === val) || {}).name,\n ).join(', ');\n } else {\n return value;\n }\n }\n if (col.type === 'money' && (value || value === 0)) {\n return typeof value === 'number' ? `$${value.toFixed(2)}` : '$' + value;\n }\n if (col.type === 'weight' && (value || value === 0)) {\n return typeof value === 'number' ? `${value.toFixed(2)} lbs` : value +\n ' lbs';\n }\n if (col.type === 'image' && value) {\n /*return this.setState(\n {showImage: {src: value, alt: col.alt}})}\n src={value} alt={col.alt}\n style={{maxWidth: 100, maxHeight: 80}}/>;*/\n return ;\n }\n if (col.type === 'boolean') {\n return value ? \n : ;\n }\n\n if (col.type === 'file') {\n return value ? \n window.open(value, '_blank')}> \n : '';\n }\n\n if (col.type === 'file_attachments') {\n return \n {(value || []).map((a, i) => a && i < 3 ?\n \n window.open(a, '_blank')}> \n : '')}\n {(value || []).length > 3 ? ' . . .' : ''}\n ;\n }\n\n return value;\n }\n\n cellEditor(col, row) {\n const value = row[col.key];\n const {classes, session: {backendClient}} = this.props;\n if (col.formatEditor) {\n return col.formatEditor(value, row, v => this.setValue(col, v), col);\n }\n if (col.type === 'date') {\n return this.setValue(col, newRow[col.key])}>\n \n ;\n }\n if (col.type === 'time') {\n return this.setValue(col, newRow[col.key])}>\n \n ;\n }\n if (col.type === 'datetime') {\n return this.setValue(col, newRow[col.key])}>\n \n ;\n }\n if (col.type === 'enum') {\n const {classes, rows = []} = this.props,\n {isNew} = this.state || {};\n let values = col.values instanceof Function\n ? col.values(row, {rows, isNew})\n : col.values;\n //.map(k => ({label: col.values[k], value: k}));\n return (\n \n \n {col.label}\n \n this.setValue(col, value)}\n inputProps={{name: col.key, id: col.key}}>\n {(values instanceof Array\n ? values.map(v => v.label ? v : {label: v, value: v})\n : Object.keys(values || {})\n .sort((a, b) =>\n (values[a] || '').localeCompare(values[b]))\n .map(k => ({label: values[k], value: k}))\n ).map(({label, value}) =>\n \n {label}\n )}\n \n );\n }\n if (col.type === 'password') {\n return (\n this.setValue(col, value),\n }}/>);\n }\n if (col.type === 'image') {\n return \n {\n this.setValue(col, value);\n // This saves the row to prevent deleting an upload\n // then forgetting to save, resulting in a broken link\n if (row.id !== undefined) {\n return this.saveRow();\n }\n }}/>\n {col.imageDesc &&\n {col.imageDesc} }\n
;\n }\n if (col.type === 'boolean') {\n return this.setValue(col, checked)}\n checkedIcon={}\n checked={!!value}\n icon={}\n classes={{checked: classes.checked}}\n />}\n classes={{label: classes.label}}\n label={col.label}\n />;\n }\n if (col.type === 'state_select') {\n return \n
{col.label} \n this.setValue(col, value)}/>\n ;\n }\n if (col.type === 'county_select') {\n return \n
{col.label} \n this.setValue(col, value)}/>\n ;\n }\n if (col.type === 'select_multiple') {\n return this.setValue(col, value)}/>;\n }\n if (col.type === 'file') {\n return {\n this.setValue(col, newRow[col.key]);\n // This saves the row to prevent deleting an upload\n // then forgetting to save, resulting in a broken link\n if (row.id !== undefined) {\n return this.saveRow();\n }\n }}>\n {col.label ? {col.label} : ''}\n \n ;\n }\n if (col.type === 'file_attachments') {\n return ({url: val}))}} onChange={(newRow) => {\n this.setValue(col, (newRow[col.key] || []).map(val => val.url));\n // This saves the row to prevent deleting an upload\n // then forgetting to save, resulting in a broken link\n if (row.id !== undefined) {\n return this.saveRow();\n }\n }}>\n {col.label ? {col.label} : ''}\n {\n return <>\n \n \n {\n if (row[col.key][index]) {\n await window.fetch(row[col.key][index],\n {method: 'DELETE', headers: backendClient.defaultHeaders});\n }\n onRemove();\n }}> \n \n \n \n \n \n >;\n }}/>\n ;\n }\n if (col.type === 'switch') {\n return \n this.setValue(col, checked)}\n classes={col.color ? {} : {\n switchBase: classes.switchBase,\n checked: classes.switchChecked,\n thumb: classes.switchIcon,\n track: classes.switchBar,\n }}\n color={col.color}\n />\n }\n classes={{\n label: classes.label,\n }}\n label={col.label}\n />\n\n
;\n\n }\n /*if (col.type === 'longtext') {\n return ( this.setValue(col, value)}/>);\n }*/\n if (col.type === 'weight') {\n return this.setValue(col, value),\n placeholder: col.placeholder,\n endAdornment: Lbs ,\n }}/>;\n }\n\n if (col.type === 'number') {\n return this.setValue(col, value),\n placeholder: col.placeholder,\n }}/>;\n }\n if (col.type === 'money') {\n return this.setValue(col, value),\n placeholder: col.placeholder,\n startAdornment: $ ,\n }}/>;\n }\n if (col.type === 'longtext') {\n return this.setValue(col, e.target.value)}\n variant=\"outlined\"\n id=\"longtext\"\n label={col.label}\n placeholder={col.placeholder}\n multiline\n fullWidth\n rows={col.rows || 4}\n disabled={col.disabled}\n style={{marginTop: '1rem'}}\n value={value || ''}/>;\n }\n return this.setValue(col, value),\n placeholder: col.placeholder,\n disabled: col.disabled,\n }}/>;\n }\n\n editRow(row, isNew = false) {\n const {onEnterEdit} = this.props;\n if (onEnterEdit) onEnterEdit(row);\n this.scrollUpToTop();\n this.setState({curRow: row, isNew});\n }\n\n validateAndUpdate(row) {\n const {cols} = this.props,\n newRow = Object.assign({}, row),\n errors = [];\n cols.forEach(col => {\n if (['money', 'weight', 'number'].indexOf(col.type) > -1) {\n newRow[col.key] = parseFloat(row[col.key] || '0');\n if (isNaN(newRow[col.key]) ||\n !/^-?(\\d)*\\.?(\\d)*$/.test(row[col.key] || '0')) {\n errors.push(\n {field: col.key, message: `${col.label} must be a number`});\n }\n }\n const isRequired = typeof col.required === 'function'\n ? col.required(newRow) : !!col.required;\n if (isRequired && (newRow[col.key] === undefined || newRow[col.key] === null)) {\n errors.push({field: col.key, message: `${col.label} is required`});\n }\n if (col.type === 'date' && row[col.key]) {\n const mDate = moment(toISODateStr(row[col.key]), 'YYYY-MM-DD');\n if (!mDate.isValid() || mDate.year() < 1000) {\n errors.push({\n field: col.key,\n message: `${col.label} isn't a valid date format, use / to separate the day, month, and year. Example: 1/1/${new Date().getFullYear()}`,\n });\n } else {\n newRow[col.key] = toISODateStr(mDate);\n }\n }\n if (col.validate) {\n col.validate(newRow[col.key], newRow).forEach(e => {\n errors.push({field: col.key, message: e});\n });\n }\n });\n if (errors.length) {\n this.setState({errors});\n } else {\n this.setState({errors: null});\n return newRow;\n }\n }\n\n async saveRow() {\n const {curRow} = this.state,\n row = this.validateAndUpdate(curRow);\n if (!row) {\n return;\n }\n try {\n let result;\n if (curRow.id || !this.props.onCreateRow) {\n result = this.props.onSaveRow && this.props.onSaveRow(row);\n } else {\n result = this.props.onCreateRow(row);\n }\n if (result instanceof Promise) {\n await result;\n }\n return true;\n } catch (error) {\n console.error(error);\n if (error instanceof Response) {\n const {errors = [], message} = await error.json()\n .catch(() => ({}));\n console.log('Error while saving row', errors, error);\n if (message) {\n errors.push(message);\n }\n if (!errors.length) {\n errors.push('Unknown Error');\n }\n this.setState({errors: errors.map(message => ({message}))});\n } else {\n const message = await extractError(error, 'Unknown Error');\n this.setState({errors: [{message}]});\n }\n return false;\n }\n }\n\n scrollUpToTop() {\n const {session: {scrollToTop}} = this.props;\n if (scrollToTop) {\n const cumulativeOffset = function (element) {\n let top = 0;\n do {\n top += element.offsetTop || 0;\n element = element.offsetParent;\n } while (element);\n return top;\n };\n scrollToTop(cumulativeOffset(this.root.current) - 80);\n }\n }\n\n exitEditView() {\n if (this.props.onExitEdit) {\n this.props.onExitEdit();\n }\n if (this.root.current && this.props.session) {\n\n this.scrollUpToTop();\n }\n this.setState({curRow: undefined, errors: undefined, isNew: undefined});\n }\n\n removeRow(item) {\n this.setState({confirmDeleteItem: undefined});\n return (this.props.onRemoveRow &&\n this.props.onRemoveRow(item, (this.props.rows || []).indexOf(item)));\n }\n\n setValue(col, value) {\n const {curRow} = this.state,\n {onChange = x => x} = this.props,\n newRow = onChange(Object.assign({}, curRow, {[col.key]: value}));\n this.setState({curRow: newRow});\n }\n\n async editNewRow() {\n this.editRow(this.props.newRow ? await this.props.newRow() : {}, true);\n }\n\n renderEditView() {\n const {\n cols = [], title,\n newTitle = `New ${title}`, editTitle = `Edit ${title}`,\n rows = [], noGridStyling\n } = this.props,\n {curRow, isNew, errors} = this.state,\n editCols = cols.filter(c => (typeof c.editable) === 'function'\n ? c.editable(curRow, {rows})\n : c.editable);\n return (\n
{isNew ? newTitle : editTitle} \n
\n {editCols.map(c =>\n \n {this.cellEditor(c, curRow)}\n )}\n \n {errors &&
\n
this.setState({errors: undefined})}\n icon={Warning} color=\"danger\">\n \n {errors.map((e, i) => {e.message} )}\n \n \n
}\n
Back\n
{\n if (await this.saveRow()) {\n this.exitEditView();\n }\n }}> Save \n
);\n }\n\n renderTable(rows, page = 0, reloadPage = () => {\n }) {\n const {\n cols = [], title, updateOnly, noDelete, limitRows, addButtonPosition = 'bottom-left',\n noEdit, showArchiveButton, canDelete = () => true, canEdit = () => true,\n } = this.props,\n {confirmDeleteItem} = this.state,\n formCols = cols.filter(c => !c.formOnly);\n\n return \n {!updateOnly && (!limitRows || limitRows > rows.length) && (addButtonPosition.startsWith('top')) ?\n
{\n this.setState({lastPage: page});\n this.editNewRow();\n }}>\n {title}\n : ''}\n
c.label).concat(noEdit ? [] : ['Edit'])}\n tableData={rows.map((r, i) =>\n formCols.map(c => this.formatCell(c, r, () => reloadPage(page)),\n ).concat(canEdit(r) ? !noEdit ? [\n {\n this.setState({lastPage: page});\n this.editRow(r);\n }}>\n \n ,\n ] : [] : ['']).concat(canDelete(r) ? !updateOnly ? !noDelete ? showArchiveButton ? [ this.setState({\n lastPage: page, confirmDeleteItem: r,\n })}>\n {showArchiveButton ? : }\n ,\n ] :\n [\n this.setState({\n lastPage: page, confirmDeleteItem: r,\n })}>\n {showArchiveButton ? : }\n ,\n ] : [] : [] : ['']),\n )}\n />\n {!updateOnly && (!limitRows || limitRows > rows.length) && (addButtonPosition.startsWith('bottom')) ?\n {\n this.setState({lastPage: page});\n this.editNewRow();\n }}>\n {title}\n : ''}\n {\n showArchiveButton ?\n this.setState(\n {confirmDeleteItem: undefined})}\n onConfirm={() => this.setState(\n {confirmDeleteItem: undefined})}\n actions={ this.setState(\n {confirmDeleteItem: undefined})}\n color=\"primary\" simple>\n Cancel\n \n {\n const result = this.removeRow(confirmDeleteItem);\n if (result instanceof Promise) {\n await result;\n }\n reloadPage(page);\n }}\n color=\"info\">\n Archive\n
}>\n Are you sure you want to archive this profile?\n \n :\n this.setState(\n {confirmDeleteItem: undefined})}\n onConfirm={() => this.setState(\n {confirmDeleteItem: undefined})}\n actions={ this.setState(\n {confirmDeleteItem: undefined})}\n color=\"primary\" simple>\n Cancel\n \n {\n const result = this.removeRow(confirmDeleteItem);\n if (result instanceof Promise) {\n await result;\n }\n reloadPage(page);\n }}\n color=\"danger\">\n Delete\n
}>\n Are you sure you want to delete this?\n \n }\n ;\n }\n\n render() {\n const {rows = [], withPaging, loadPageData, pageSize} = this.props;\n const {curRow, lastPage = 0} = this.state;\n\n return \n {curRow ? this.renderEditView() :\n (withPaging\n ? \n this.renderTable(pageData, pageIndex, reloadPage)}\n pageSize={pageSize}\n initialPage={lastPage}\n loadPageData={loadPageData ? loadPageData\n : async (page) => page === 0 ? rows : []}/>\n : this.renderTable(rows))}\n
;\n }\n}\n\nTableEdit.propTypes = {\n rows: PropTypes.array.isRequired,\n cols: PropTypes.array.isRequired,\n title: PropTypes.string,\n newTitle: PropTypes.string,\n editTitle: PropTypes.string,\n withPaging: PropTypes.bool,\n updateOnly: PropTypes.bool,\n noDelete: PropTypes.bool,\n limitRows: PropTypes.number,\n noEdit: PropTypes.bool,\n canDelete: PropTypes.func,\n showArchiveButton: PropTypes.bool,\n canEdit: PropTypes.func,\n onChange: PropTypes.func,\n loadPageData: PropTypes.func,\n newRow: PropTypes.func,\n onRemoveRow: PropTypes.func,\n onSaveRow: PropTypes.func,\n onCreateRow: PropTypes.func,\n onEnterEdit: PropTypes.func,\n onExitEdit: PropTypes.func,\n pageSize: PropTypes.number,\n addButtonPosition: PropTypes.oneOf(['bottom-left', 'bottom-right', 'top-left', 'top-right']),\n classes: PropTypes.any,\n session: PropTypes.any,\n};\n\nexport default withSession(withStyles(style)(TableEdit));\n\nfunction toISODateStr(value) {\n if (value && value.format) {\n return value.format('YYYY-MM-DD');\n }\n return /\\d{1,2}\\/\\d{1,2}\\/\\d{4}/.test(value) ?\n moment(value, 'M/D/YYYY').utc().format('YYYY-MM-DD') : value;\n}","import * as React from 'react';\nimport createSvgIcon from './utils/createSvgIcon';\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z\"\n}), 'ArrowForward');","import React, { Component } from 'react';\nimport {\n Button,\n Checkbox,\n Grid,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Paper,\n withStyles,\n} from '@material-ui/core';\nimport {\n ArrowBack,\n ArrowUpward,\n KeyboardArrowDown,\n KeyboardArrowLeft,\n KeyboardArrowRight,\n KeyboardArrowUp\n} from '../../../mvc/react/ReactIcons';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { ArrowDownward, ArrowForward } from '@material-ui/icons';\n\nconst styles = {\n rootContainer: {\n margin: 'auto',\n width: '100%',\n marginTop: '0.75rem',\n display: 'flex',\n alignItems: 'center',\n },\n listContainer: {\n flexGrow: 1,\n width: '100%',\n // minWidth: '40%'\n },\n paper: {\n // maxWidth: 220,\n // width: '100%',\n height: 200,\n overflow: 'auto',\n },\n button: {\n margin: '5px',\n },\n};\n\nfunction not(a, b) {\n return a.filter(value => b.indexOf(value) === -1);\n}\n\nfunction intersection(a, b) {\n return a.filter(value => b.indexOf(value) !== -1);\n}\n\nclass TransferList extends Component {\n constructor(props) {\n super(props);\n this.state = {\n right: [],\n left: [],\n checked: [],\n leftChecked: [],\n rightChecked: [],\n };\n }\n\n componentDidMount() {\n const {choices = [], data = []} = this.props;\n this.setLeft(not(choices, data));\n this.setRight(data);\n }\n\n setLeft(left) {\n const {noSort} = this.props;\n this.setState({left: noSort ? left : left.sort((a, b) => a < b ? -1 : 1)});\n }\n\n setRight(right) {\n const {noSort} = this.props;\n right = noSort ? right : right.sort((a, b) => a < b ? -1 : 1);\n this.setState({right}, () => this.props.onChange?.(right));\n }\n\n setChecked(checked) {\n this.setState({checked});\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const {data, choices} = this.props;\n if (prevProps.choices !== choices || prevProps.data !== data) {\n this.setLeft(not(choices, data));\n this.setRight(data);\n }\n }\n\n handleToggle(value) {\n const {checked} = this.state;\n const currentIndex = checked.indexOf(value);\n const newChecked = [...checked];\n\n if (currentIndex === -1) {\n newChecked.push(value);\n } else {\n newChecked.splice(currentIndex, 1);\n }\n\n this.setState({checked: newChecked});\n };\n\n handleAllRight() {\n const {right, left} = this.state;\n this.setRight(right.concat(left));\n this.setLeft([]);\n };\n\n handleCheckedRight() {\n const {right, left, checked} = this.state;\n const leftChecked = intersection(checked, left);\n this.setRight(right.concat(leftChecked));\n this.setLeft(not(left, leftChecked));\n this.setChecked(not(checked, leftChecked));\n };\n\n handleCheckedLeft() {\n const {right, left, checked} = this.state;\n const rightChecked = intersection(checked, right);\n this.setLeft(left.concat(rightChecked));\n this.setRight(not(right, rightChecked));\n this.setChecked(not(checked, rightChecked));\n };\n\n handleAllLeft() {\n const {right, left} = this.state;\n this.setLeft(left.concat(right));\n this.setRight([]);\n };\n\n customList(items) {\n const {classes} = this.props;\n const {checked} = this.state;\n return \n \n {items.map(value => {\n const labelId = `transfer-list-item-${value}-label`;\n\n return (\n \n \n \n \n \n \n );\n })}\n \n
\n ;\n };\n\n render() {\n const {classes, vertical} = this.props;\n const {right, left, checked} = this.state;\n const leftChecked = intersection(checked, left);\n const rightChecked = intersection(checked, right);\n return <>\n {!vertical &&\n \n
\n
Options
\n {this.customList(left)}\n
\n
\n
\n {/*The span tags are needed since when the button is disabled it doesn't emit events for the Tooltip component*/}\n \n \n \n \n \n \n
\n \n \n \n
\n \n \n \n \n
\n \n \n \n \n
\n
\n
Selected
\n {this.customList(right)}\n
\n
}\n\n {vertical &&\n \n \n \n
Options
\n {this.customList(left)}\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Selected
\n {this.customList(right)}\n
\n \n }\n >;\n };\n}\n\nexport default withStyles(styles)(TransferList);","import React, { Component } from 'react';\nimport Spinner from './spinner';\nimport Paginations from '../../vendor/components/Pagination/Pagination';\n\n\ninterface Props {\n renderPage(params: {\n pageData: Array, pageIndex: number, reloadPage(pageIndex?: number): Promise\n }): React.ReactNode;\n\n loadPageData(pageIndex: number, pageSize: number, lastElement?: T): Promise>;\n\n initialPage?: number;\n pageSize?: number;\n}\n\ninterface State {\n data?: Array;\n pageIndex: number;\n pageSize: number;\n lastPage?: number;\n loading: boolean;\n}\n\nclass WithPaging extends Component, State> {\n constructor(props: Readonly>) {\n super(props);\n this.state = {pageIndex: 0, pageSize: this.props.pageSize || 5, loading: false};\n this.loadPage = this.loadPage.bind(this);\n }\n\n async componentDidMount() {\n const {initialPage = 0} = this.props;\n await this.reloadPage(initialPage);\n }\n\n async componentDidUpdate(prevProps: Props) {\n if (prevProps.loadPageData !== this.props.loadPageData) {\n const {initialPage = 0} = this.props;\n await this.reloadPage(initialPage);\n }\n }\n\n async loadPage(newPageIndex: number) {\n const {loadPageData} = this.props,\n {data, pageSize, lastPage} = this.state,\n lastOffset = (newPageIndex + 1) * pageSize;\n\n this.setState({loading: true});\n\n try {\n if ((!data || lastOffset >= data.length) && newPageIndex !== lastPage) {\n const newData = await loadPageData(newPageIndex, pageSize, data ? data[data.length - 1] : data);\n if (newData.length === 0) {\n const lastPage = Math.floor((data || []).length / pageSize); // Math.floor gives us a 0-based index\n this.setState({pageIndex: Math.min(newPageIndex, lastPage), lastPage});\n } else {\n this.setState({\n data: (data || []).concat(newData),\n pageIndex: newPageIndex,\n lastPage: newData.length < pageSize ? newPageIndex : undefined\n });\n }\n } else {\n this.setState({pageIndex: newPageIndex});\n }\n } finally {\n this.setState({loading: false});\n }\n }\n\n async reloadPage(pageIndex: number) {\n const {loadPageData} = this.props,\n {pageSize} = this.state;\n this.setState({\n data: await loadPageData(0, (pageIndex + 1) * pageSize),\n pageIndex, lastPage: undefined\n });\n }\n\n render() {\n const {renderPage} = this.props,\n {data, pageIndex, pageSize, lastPage, loading} = this.state;\n\n if (!data) {\n return ;\n }\n\n const pageData = data.slice(pageIndex * pageSize, (pageIndex + 1) * pageSize),\n isLastPage = lastPage === undefined ? false : pageIndex >= lastPage;\n\n return (\n \n {loading ?
: renderPage({\n pageData, pageIndex, reloadPage: this.reloadPage.bind(this)\n })}\n
{\n if (pageIndex > 0) {\n return this.loadPage(pageIndex - 1);\n }\n },\n }, {\n disabled: false,\n active: true,\n text: pageIndex + 1,\n onClick: () => {\n }\n }, {\n disabled: isLastPage || loading,\n text: 'NEXT', onClick: () => {\n if (!isLastPage) {\n return this.loadPage(pageIndex + 1)\n }\n }\n }] as any}\n color=\"info\"\n />\n \n );\n }\n}\n\nexport default WithPaging;","import { useContext, useEffect, useState } from 'react';\nimport SessionContext from '../session_context';\nexport interface Activities { \n id: number;\n activityName: string;\n fourHYear: number;\n isVisible: boolean;\n accountIds: Array;\n countyIds: Array;\n countyNames: Array;\n createdByAcctId: number;\n createdByAcctName: string;\n createdByAcctType: string;\n activityRegion: string;\n stateId: string;\n orgId: string;\n clubId: number;\n deliveryMode: string;\n createdAt: string;\n updatedAt: string;\n location: string;\n description: string;\n date: string;\n timeStart: string;\n timeEnd: string;\n totalHours: number;\n}\nexport interface ActivityParticipantList { \n accountId: number;\n householdMemberId: number;\n countyId: number;\n accountFirstName: string;\n accountLastName: string;\n accountType: string;\n countyName: string;\n stateId: string;\n stateName: string;\n uniqueProfileId: string;\n householdEmail: string;\n}\nexport interface MemberActivityList { \n activityName: string;\n deliveryMode: string;\n location: string;\n description: string;\n date: string;\n timeStart: string;\n timeEnd: string;\n totalHours: string;\n}\nexport interface AgeDivisions { \n id: number;\n divisionName: string;\n divisionBasedOn: Array;\n divisionMinAge: number;\n divisionMinAgeAsOfMonth: number;\n divisionMinAgeAsOfDay: number;\n divisionMinAgeAsOfYear: number;\n divisionMaxAge: number;\n divisionMaxAgeAsOfMonth: number;\n divisionMaxAgeAsOfDay: number;\n divisionMaxAgeAsOfYear: number;\n divisionMinGrade: string;\n divisionMaxGrade: string;\n divisionGroup: Array;\n stateId: string;\n createdAt: string;\n updatedAt: string;\n}\nexport interface CreateAccountFlagRequest { \n accountId: number;\n householdMemberId?: number;\n orgId?: string;\n description?: string;\n}\nexport interface UpdateAccountFlagRequest { \n id: number;\n accountId: number;\n householdMemberId?: number;\n orgId?: string;\n description?: string;\n resolved?: boolean;\n}\nexport interface AccountFlag { \n id: number;\n accountId: number;\n householdMemberId: number;\n orgId: string;\n description: string;\n createdAt: string;\n updatedAt: string;\n resolved: boolean;\n}\nexport interface Account { \n id: number;\n email: string;\n firstName: string;\n lastName: string;\n photoUrl: string;\n accountType: 'SysAdmin' | 'Household' | 'CountyAdmin' | 'DistrictAdmin' | 'StateAdmin' | 'ServiceAccount' | 'ApiUser' | 'NationalAdmin' | 'StateUser';\n passwordChangeRequired: boolean;\n isFlagged: boolean;\n}\nexport interface PagedResultsAccount { \n results: Array;\n pageIndex: number;\n pageSize: number;\n totalCount: number;\n}\nexport interface Address { \n street1: string;\n street2: string;\n city: string;\n state: string;\n zip: string;\n}\nexport interface AccountCommunicationPreferences { \n type: string;\n}\nexport interface UpdateAccountRequest { \n email: string;\n firstName: string;\n lastName: string;\n phone: string;\n pin: string;\n address: Address;\n photoUrl: string;\n countyId: number;\n districtId: number;\n stateId: string;\n orgAssociations: Array;\n profileVisibility: 'EMAIL_AND_PHONE' | 'EMAIL' | 'PHONE' | 'NONE';\n communicationPreferences: AccountCommunicationPreferences;\n contactEmail: string;\n}\nexport interface CreateAccountRequest { \n email?: string;\n firstName: string;\n lastName: string;\n password: string;\n phone?: string;\n pin?: string;\n address?: Address;\n photoUrl: string;\n passwordChangeRequired?: boolean;\n countyId?: number;\n districtId?: number;\n stateId?: string;\n orgAssociations?: Array;\n accountType: string;\n}\nexport interface AdminAccountDetails { \n accountId: number;\n countyId: number;\n districtId: number;\n stateId: string;\n lastName: string;\n firstName: string;\n email: string;\n accountType: string;\n stateName: string;\n countyName: string;\n districtName: string;\n phone: string;\n contactEmail: string;\n}\nexport interface UpdateAccountPassword { \n oldPassword: string;\n newPassword: string;\n requireReset: boolean;\n}\nexport interface CreateHouseholdAccountRequest { \n email: string;\n firstName: string;\n lastName: string;\n orgId: string;\n password: string;\n pin?: string;\n phone?: string;\n countyId?: number;\n phoneSMS?: string;\n optInSMS?: boolean;\n photoUrl: string;\n address?: Address;\n passwordChangeRequired?: boolean;\n}\nexport interface SystemAccountStats { \n accountTotalsByState: Record;\n householdMemberTotalsByState: Record;\n countyAdminTotalsByState: Record;\n stateAdminTotalsByState: Record;\n districtAdminTotalsByState: Record;\n stateUserTotalsByState: Record;\n}\nexport interface SystemAccountStatsWithHMembers { \n systemAccountStats: SystemAccountStats;\n householdMembers: number;\n nationalAdmins: number;\n}\nexport interface ImportAdminAccountsRequest { \n sendEmail: boolean;\n skipHeader: boolean;\n orgId: string;\n password: string;\n stateId: string;\n file: any;\n}\nexport interface AffectedRowsResponse { \n affectedRows: number;\n}\nexport interface ImportHouseholdAccountsRequest { \n requirePasswordReset: boolean;\n orgId: string;\n password: string;\n pin: string;\n stateId: string;\n file: any;\n}\nexport interface Recipient { \n stateId: string;\n districtId: number;\n countyId: number;\n clubId: number;\n}\nexport interface Announcement { \n id: number;\n title: string;\n body: string;\n createdAt: string;\n accountId: number;\n householdMemberId: number;\n systemWide: boolean;\n isNational: boolean;\n stateId: string;\n orgId: string;\n districtId: number;\n countyId: number;\n clubId: number;\n recipients: Array;\n expirationDate: string;\n videoLink: string;\n}\nexport interface ReturnAnnouncement { \n id: number;\n title: string;\n body: string;\n createdAt: string;\n accountType: string;\n recipients: Array;\n expirationDate: string;\n videoLink: string;\n}\nexport interface ClubDocument { \n id: number;\n clubId: number;\n name: string;\n type: string;\n orgId: string;\n createdAt: string;\n updatedAt: string;\n entries: any;\n}\nexport interface ClubRoleAssignmentResponse { \n name: string;\n clubName: string;\n countyName: string;\n orgId: string;\n id: number;\n accountId: number;\n householdMemberId: number;\n clubId: number;\n role: 'Member' | 'Volunteer' | 'Leader' | 'ProjectLeader' | 'ClubVolunteer' | 'ProjectVolunteer' | 'PrimaryCommunityLeader' | 'AssistantCommunityLeader' | 'CoCommunityLeader' | 'TreasurerAdvisor' | 'RecordBookCoordinator' | 'EnrollmentCoordinator' | 'OfficeAdvisor' | 'OfficerAdvisor' | 'OtherVolunteer' | 'AdultChaperone' | 'CampManager' | 'CampStaff' | 'CampDirector' | 'ActivityLeader' | 'RecordsLeader' | 'notSureNew' | 'YouthPresident' | 'YouthVicePresident' | 'YouthTreasurer' | 'YouthSecretary' | 'YouthSergeantAtArms' | 'YouthHistorian' | 'YouthCivicEngagementOfficer' | 'YouthHealthyLivingOfficer' | 'YouthCommunicationsOfficer' | 'YouthOtherOfficer';\n status: 'Active' | 'PendingLeaderApproval';\n year: number;\n}\nexport interface ClubRoleAssignment { \n id: number;\n accountId: number;\n householdMemberId: number;\n clubId: number;\n orgId: string;\n role: 'Member' | 'Volunteer' | 'Leader' | 'ProjectLeader' | 'ClubVolunteer' | 'ProjectVolunteer' | 'PrimaryCommunityLeader' | 'AssistantCommunityLeader' | 'CoCommunityLeader' | 'TreasurerAdvisor' | 'RecordBookCoordinator' | 'EnrollmentCoordinator' | 'OfficeAdvisor' | 'OfficerAdvisor' | 'OtherVolunteer' | 'AdultChaperone' | 'CampManager' | 'CampStaff' | 'CampDirector' | 'ActivityLeader' | 'RecordsLeader' | 'notSureNew' | 'YouthPresident' | 'YouthVicePresident' | 'YouthTreasurer' | 'YouthSecretary' | 'YouthSergeantAtArms' | 'YouthHistorian' | 'YouthCivicEngagementOfficer' | 'YouthHealthyLivingOfficer' | 'YouthCommunicationsOfficer' | 'YouthOtherOfficer';\n status: 'Active' | 'PendingLeaderApproval';\n year: number;\n}\nexport interface Club { \n id: number;\n countyId: number;\n orgId: string;\n name: string;\n properties: Record;\n assignedProjectTypes: Array;\n}\nexport interface ClubMember { \n householdMemberId: number;\n accountId: number;\n enrollmentId: number;\n fourHAge: number;\n firstName: string;\n lastName: string;\n role: string;\n status: string;\n email: string;\n phone: string;\n householdName: string;\n enrollmentStatus: string;\n enrollmentComments: string;\n stateComments: string;\n parentPhone: string;\n photoUrl: string;\n}\nexport interface ClubMemberEnrollmentNotEnabled { \n householdMemberId: number;\n accountId: number;\n enrollmentId: number;\n firstName: string;\n lastName: string;\n role: string;\n status: string;\n email: string;\n phone: string;\n householdName: string;\n enrollmentStatus: string;\n enrollmentComments: string;\n stateComments: string;\n photoUrl: string;\n}\nexport interface ClubLeader { \n firstName: string;\n lastName: string;\n email: string;\n photoUrl: string;\n clubName: string;\n}\nexport interface ClubLeadersStateReport { \n firstName: string;\n lastName: string;\n email: string;\n photoUrl: string;\n clubName: string;\n countyName: string;\n clubType: string;\n}\nexport interface ClubVolunteers { \n firstName: string;\n lastName: string;\n email: string;\n clubName: string;\n phone: string;\n role: string;\n countyName: string;\n}\nexport interface ClubMembersByCountyAndClub { \n householdMemberId: number;\n accountId: number;\n countyId: number;\n clubId: number;\n enrollmentId: number;\n countyName: string;\n clubName: string;\n lastName: string;\n firstName: string;\n role: string;\n status: string;\n email: string;\n phone: string;\n householdName: string;\n enrollmentStatus: string;\n enrollmentComments: string;\n stateComments: string;\n birthday: string;\n isPrimary: string;\n enrollmentProjects: Array;\n photoUrl: string;\n}\nexport interface MemberProjectCompletion { \n householdMemberId: number;\n accountId: number;\n countyId: number;\n clubId: number;\n enrollmentId: number;\n countyName: string;\n clubName: string;\n lastName: string;\n firstName: string;\n role: string;\n status: string;\n email: string;\n phone: string;\n householdName: string;\n enrollmentStatus: string;\n enrollmentComments: string;\n stateComments: string;\n projectName: string;\n projectCompletedDate: string;\n enrollmentProjects: Array;\n photoUrl: string;\n}\nexport interface MemberMultiCountyProjectCompletion { \n householdMemberId: number;\n accountId: number;\n countyId: number;\n clubId: number;\n enrollmentId: number;\n countyName: string;\n clubName: string;\n lastName: string;\n firstName: string;\n role: string;\n status: string;\n email: string;\n phone: string;\n householdName: string;\n enrollmentStatus: string;\n enrollmentComments: string;\n stateComments: string;\n projectName: string;\n projectCompletedDate: string;\n enrollmentProjects: Array;\n photoUrl: string;\n}\nexport interface County { \n id: number;\n name: string;\n stateId: string;\n}\nexport interface AdminContactInfo { \n name: string;\n email: string;\n phone: string;\n profileVisibility: string;\n}\nexport interface CustomReport { \n id: number;\n name: string;\n accountId: number;\n countyId: number;\n stateId: string;\n customReport: any;\n createdAt: string;\n districtId: number;\n}\nexport interface PagedResultsCustomReport { \n results: Array;\n pageIndex: number;\n pageSize: number;\n totalCount: number;\n}\nexport interface District { \n id: number;\n stateId: string;\n orgId: string;\n name: string;\n}\nexport interface EmailFilter { \n type: string;\n}\nexport interface EmailList { \n id: number;\n name: string;\n orgId: string;\n stateId: string;\n countyId: number;\n districtId: number;\n filters: Array;\n createdAt: string;\n updatedAt: string;\n additionalEmails: Array;\n lastSyncedEmails: Array;\n}\nexport interface EmailRecipientResponse { \n firstName: string;\n lastName: string;\n email: string;\n}\nexport interface EmailBuilderEmailRequest { \n email: string;\n body: string;\n stateId: string;\n orgId: string;\n templateName: string;\n subject: string;\n accountId: number;\n districtId: number;\n countyId: number;\n emailList: Array;\n}\nexport interface EmailTemplate { \n id: number;\n name: string;\n orgId: string;\n stateId: string;\n districtId: number;\n countyId: number;\n data: any;\n createdAt: string;\n}\nexport interface CreateEmailTemplateRequest { \n name: string;\n subject: string;\n data: string;\n stateId: string;\n orgId: string;\n countyId: number;\n districtId: number;\n}\nexport interface CreateUploadRequest { \n file: any;\n}\nexport interface CreateGrapesJSAssetRequest { \n file: any;\n}\nexport interface GrapesJSAssetResp { \n data: Array;\n}\nexport interface GreenbrierSignup { \n id: number;\n firstName: string;\n lastName: string;\n email: string;\n stateId: string;\n}\nexport interface HouseholdContact { \n id: number;\n accountId: number;\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n street1: string;\n street2: string;\n city: string;\n state: string;\n zip: string;\n}\nexport interface HouseholdMember { \n id: number;\n accountId: number;\n firstName: string;\n lastName: string;\n birthday: string;\n photoUrl: string;\n memberType: 'ClubMember' | 'Volunteer' | 'Leader' | 'Parent';\n profileNotes: string;\n archived: boolean;\n isFlagged: boolean;\n hidden: boolean;\n grade: string;\n middleName: string;\n profileData: any;\n}\nexport interface UpdateHouseholdMember { \n firstName: string;\n lastName: string;\n memberType: 'ClubMember' | 'Volunteer' | 'Leader' | 'Parent';\n birthday: string;\n photoUrl: string;\n grade: string;\n archived: boolean;\n middleName: string;\n profileData: any;\n hidden: boolean;\n}\nexport interface HouseholdMemberSearchResult { \n accountId: number;\n id: number;\n firstName: string;\n lastName: string;\n email: string;\n}\nexport interface ImportHouseholdMemberRequest { \n username: string;\n password: string;\n}\nexport interface ImportProject { \n id: number;\n userId: number;\n name: string;\n type: string;\n primaryType: string;\n subType: string;\n startsOn: string;\n endsOn: string;\n data: any;\n}\nexport interface ImportHouseholdMemberResponse { \n userId: number;\n photoUrl: string;\n firstName: string;\n lastName: string;\n stateId: string;\n age: number;\n projects: Array;\n}\nexport interface EmailImportedHouseholdMember { \n userId: number;\n firstName: string;\n lastName: string;\n stateName: string;\n countyName: string;\n clubName: string;\n projectNames: Array;\n}\nexport interface MailJetStatCounter { \n total: number;\n eventClickDelay: number;\n eventClickedCount: number;\n eventOpenedCount: number;\n eventSpamCount: number;\n eventUnsubscribedCount: number;\n eventWorkflowExitedCount: number;\n messageBlockedCount: number;\n messageClickedCount: number;\n messageDeferredCount: number;\n messageHardBouncedCount: number;\n messageOpenedCount: number;\n messageQueuedCount: number;\n messageSentCount: number;\n messageSoftBouncedCount: number;\n messageSpamCount: number;\n messageUnsubscribedCount: number;\n messageWorkFlowExitedCount: number;\n sourceID: number;\n timeslice: string;\n eventOpenDelay: number;\n}\nexport interface MailJetAPIKey { \n name: string;\n id: string;\n}\nexport interface MailJetLinkRequest { \n stateId: string;\n orgId: string;\n}\nexport interface MailJetLinkResponse { \n iframeUrl: string;\n}\nexport interface MemberDocument { \n id: number;\n accountId: number;\n householdMemberId: number;\n orgId: string;\n filename: string;\n url: string;\n createdAt: string;\n updatedAt: string;\n}\nexport interface TokenEndpointRequest { \n client_id: string;\n client_secret: string;\n grant_type: string;\n code: string;\n redirect_uri: string;\n}\nexport interface Organization { \n id: string;\n name: string;\n logoUrl: string;\n}\nexport interface PasswordResetRequest { \n resetPin: boolean;\n email: string;\n}\nexport interface PasswordResetVerification { \n resetPin: boolean;\n accountId: number;\n}\nexport interface ConfirmPasswordResetRequest { \n token: string;\n newPassword: string;\n}\nexport interface UpdatePasswordRequest { \n accountId: number;\n oldPassword: string;\n newPassword: string;\n confirmPassword: string;\n}\nexport interface ProjectLeaderAssignmentRow { \n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n projectTypes: Array;\n}\nexport interface ProjectLeaderAssignment { \n id: number;\n accountId: number;\n householdMemberId: number;\n year: number;\n projectTypes: Array;\n}\nexport interface ProjectLeaderAssignmentRequest { \n accountId: number;\n householdMemberId?: number;\n year: number;\n projectTypes: Array;\n}\nexport interface ProjectMember { \n householdMemberId: number;\n accountId: number;\n clubId: number;\n fourHAge: number;\n enrollmentYear: number;\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n clubName: string;\n projectType: string;\n enrollmentStatus: string;\n photoUrl: string;\n}\nexport interface RecipientCriteria { \n id: string;\n name: string;\n type: string;\n}\nexport interface AccountWithSMSNumber { \n accountId: number;\n householdEmail: string;\n householdName: string;\n smsnumber: string;\n}\nexport interface SMSMessageUpdateRequest { \n isArchived: boolean;\n}\nexport interface SMSMessageSummary { \n id: number;\n countyId: number;\n createdByUserId: number;\n body: string;\n stateId: string;\n recipientCriteria: Array;\n pendingMessageCount: number;\n successfulMessageCount: number;\n failedMessageCount: number;\n isArchived: boolean;\n createdAt: string;\n}\nexport interface PagedResultsSMSMessageSummary { \n results: Array;\n pageIndex: number;\n pageSize: number;\n totalCount: number;\n}\nexport interface SMSMessageRequest { \n recipientCriteria?: Array;\n recipients: Array;\n body: string;\n stateId: string;\n}\nexport interface SMSMessage { \n id: number;\n countyId: number;\n createdByUserId: number;\n body: string;\n stateId: string;\n recipientCriteria: Array;\n isArchived: boolean;\n createdAt: string;\n}\nexport interface SSOProfile { \n id: string;\n name: string;\n email: string;\n phone: string;\n stateId: string;\n orgId: string;\n accountId: number;\n}\nexport interface CreateSSOAccountRequest { \n profileId: string;\n firstName: string;\n lastName: string;\n email: string;\n phone?: string;\n countyId: number;\n}\nexport interface SentEmailBatches { \n id: number;\n templateName: string;\n orgId: string;\n stateId: string;\n getlistNames: any;\n createdAt: string;\n emails: number;\n subject: string;\n}\nexport interface State { \n id: string;\n name: string;\n headerImageUrl: string;\n}\nexport interface PaymentMethodSetting { \n methodType: string;\n methodLabel: string;\n upaySiteId: string;\n upayUrl: string;\n countyItemCodes: Record;\n cashnetUrl: string;\n cashnetItemCode: string;\n braintreeEnv: string;\n braintreeMerchantId: string;\n braintreePublicKey: string;\n braintreePrivateKey: string;\n externalLinkDesc: string;\n externalLinkUrl: string;\n paypalEmail: string;\n txFixedFee: number;\n txPercentFee: number;\n stripeConnectFixedFee: number;\n stripeConnectPercentFee: number;\n stripeConnectStateAccountId: string;\n authNetAPILoginId: string;\n authNetTransactionKey: string;\n authNetEnv: string;\n authNetPublicKey: string;\n nelnetPublicKey: string;\n nelnetPrivateKey: string;\n}\nexport interface EnrollmentRequirement { \n id: string;\n trainingName: string;\n trainingId: string;\n otherName: string;\n otherDesc: string;\n backgroundCheckName: string;\n backgroundCheckId: string;\n type: 'Payment' | 'StateOrCountyApproval' | 'BackgroundCheck' | 'Training' | 'Other';\n paymentAmount: number;\n yearsValid: number;\n expireYear: number;\n expireMonth: number;\n lmsCourseId: number;\n expiresOn: string;\n stateAdminOnly: boolean;\n noBreaks: boolean;\n rollOver: boolean;\n backgroundCheckInvalidByYear: boolean;\n}\nexport interface FlagEnrollmentField { \n key: string;\n value: string;\n}\nexport interface StateEmailMessages { \n clubMember: Record;\n volunteer: Record;\n newVolunteer: Record;\n}\nexport interface AdditionalEnrollmentField { \n id: string;\n name: string;\n stateAdminOnly: boolean;\n rollOver: boolean;\n type: 'Checkbox' | 'Date' | 'Text';\n}\nexport interface AdditionalEnrollmentFields { \n clubMember: Array;\n volunteer: Array;\n newVolunteer: Array;\n}\nexport interface SterlingSettings { \n packageId: string;\n enabled: boolean;\n}\nexport interface StateSettings { \n stateId: string;\n orgId: string;\n districtLabel: string;\n countyLabel: string;\n clubLabel: string;\n minAge: number;\n maxAge: number;\n updatedAt: string;\n districtsEnabled: boolean;\n enableEventRegistration: boolean;\n enrollmentBgCheck: boolean;\n clubMemberApproval: boolean;\n showEnrollmentPopUp: boolean;\n showYearsInEnrollmentProject: boolean;\n clubLeaderViewRecordBook: boolean;\n clubLeaderCanApprove: boolean;\n volunteerClubRequired: boolean;\n hidePrimaryProfile: boolean;\n filterRecordBooksByEnrollment: boolean;\n restrictClubEnrollmentsToCounty: boolean;\n noPin: boolean;\n importCheckBeforeRegister: boolean;\n hideSwitchProfile: boolean;\n freezeActiveMember: boolean;\n requireAddressOnSignup: boolean;\n enrollmentSteps: any;\n stateEnrollmentFeeAccountId: string;\n stateEnrollmentFee: number;\n lmsSignatureName: string;\n logoUrl: string;\n enrollmentPaymentMethods: Array;\n stateEnrollmentCheckInstructions: string;\n enrollmentProjectTypes: Array;\n volunteerClubRoles: Array;\n clubMemberLabel: string;\n volunteerWaiverLabel: string;\n clubMemberRequirements: Array;\n volunteerRequirements: Array;\n newVolunteerRequirements: Array;\n groupEnrollmentFields: Array;\n volunteerLabel: string;\n defaultClubId: number;\n defaultProject: string;\n recordBookLabel: string;\n recordBookNameLabel: string;\n eventPaymentMethods: Array;\n yearStartDay: number;\n yearStartMonth: number;\n ageAsOfMonth: number;\n ageAsOfDay: number;\n ageAsOfYear: number;\n alwaysApproveEnrollmentUpdates: boolean;\n separateNewVolunteers: boolean;\n lockedActiveEnrollmentFields: Array;\n flagFields: Array;\n eventItemCodes: any;\n adminPinRequired: boolean;\n emailMessages: StateEmailMessages;\n additionalEnrollmentFields: AdditionalEnrollmentFields;\n parentLabel: string;\n showSecondaryCountyEvents: boolean;\n blankEnrollment: boolean;\n fourHAgeAsOfMonth: number;\n fourHAgeAsOfDay: number;\n fourHAgeAsOfYear: number;\n stateInvoiceAddress: string;\n invoiceAmountPerEnrollment: string;\n sterlingSettings: SterlingSettings;\n minGrade: number;\n maxGrade: number;\n disableHouseholdEnrollmentStatewide: boolean;\n}\nexport interface CountySettings { \n countyId: number;\n orgId: string;\n updatedAt: string;\n countyEnrollmentFeeAccountId: string;\n paymentInstructions: string;\n countyEnrollmentFee: number;\n emailNotifications: any;\n countyProjectTypes: Array;\n maxMemberFee: number;\n projectAddDropDeadlineDay: number;\n projectAddDropDeadlineMonth: number;\n projectAddDropDeadlineYear: number;\n recordBookSubmissionDeadlineDay: number;\n recordBookSubmissionDeadlineMonth: number;\n recordBookSubmissionDeadlineYear: number;\n disableHouseholdEnrollment: boolean;\n disableOnlinePayments: boolean;\n emailMessages: StateEmailMessages;\n isDemo: boolean;\n}\nexport interface ClubEnrollment { \n clubId: number;\n enrollmentId: number;\n isPrimary: boolean;\n role: 'Member' | 'Volunteer' | 'Leader' | 'ProjectLeader' | 'ClubVolunteer' | 'ProjectVolunteer' | 'PrimaryCommunityLeader' | 'AssistantCommunityLeader' | 'CoCommunityLeader' | 'TreasurerAdvisor' | 'RecordBookCoordinator' | 'EnrollmentCoordinator' | 'OfficeAdvisor' | 'OfficerAdvisor' | 'OtherVolunteer' | 'AdultChaperone' | 'CampManager' | 'CampStaff' | 'CampDirector' | 'ActivityLeader' | 'RecordsLeader' | 'notSureNew' | 'YouthPresident' | 'YouthVicePresident' | 'YouthTreasurer' | 'YouthSecretary' | 'YouthSergeantAtArms' | 'YouthHistorian' | 'YouthCivicEngagementOfficer' | 'YouthHealthyLivingOfficer' | 'YouthCommunicationsOfficer' | 'YouthOtherOfficer';\n status: 'Active' | 'PendingLeaderApproval';\n enrollmentProjects: Array;\n waiverData: any;\n roles: Array;\n}\nexport interface EnrollmentRequirementData { \n approvalDate: string;\n receiptNo: string;\n paymentMethod: string;\n transactionId: number;\n notes: string;\n}\nexport interface AdditionalEnrollmentFieldData { \n notes?: any;\n value?: any;\n type: string;\n}\nexport interface Enrollment { \n id: number;\n householdMemberId: number;\n accountId: number;\n countyId: number;\n memberType: 'ClubMember' | 'Volunteer';\n status: 'PendingApproval' | 'PendingBgCheck' | 'PendingPayment' | 'Active' | 'InProgress' | 'Canceled' | 'PendingStateApproval' | 'Returned' | 'Ineligible' | 'NotParticipating' | 'PendingAdminApproval' | 'Inactive';\n year: number;\n data: any;\n clubEnrollments: Array;\n requirementsData: Record;\n additionalFieldsData: Record;\n restrictions: string;\n submittedAt: string;\n enrollmentComments: string;\n stateComments: string;\n enrollmentFlagResolved: boolean;\n paperenrollment: boolean;\n paperEnrollmentEnteredBy: string;\n paperEnrollmentCompletionDate: string;\n waiversCheckedBy: string;\n waiverCheckCompletionDate: string;\n}\nexport interface LoginSuccessResponse { \n token: string;\n account: Account;\n state: State;\n county: County;\n accountSettings: any;\n stateSettings: StateSettings;\n countySettings: CountySettings;\n householdMember: HouseholdMember;\n householdMembers: Array;\n enrollment: Enrollment;\n clubRoleAssignments: Array;\n projectLeaderAssignment: ProjectLeaderAssignment;\n}\nexport interface MFATokenLoginRequest { \n token: string;\n}\nexport interface PinLoginRequest { \n pin: string;\n email: string;\n password: string;\n}\nexport interface RequestAdditionalAccessCodes { \n name: string;\n county: string;\n state: string;\n email: string;\n numberOfCodes: number;\n numberOfUses: number;\n}\nexport interface ClaimImportedAccountRequest { \n countyId: number;\n email: string;\n password: string;\n}\nexport interface LoginRequest { \n email: string;\n password: string;\n orgId: string;\n nonce: string;\n householdMemberId: number;\n}\nexport interface SystemMessageBody { \n systemMessage: string;\n}\nexport interface ClubSettings { \n clubId: number;\n countyId: number;\n}\nexport interface CountySettingsByState { \n stateId: string;\n countyId: number;\n orgId: string;\n updatedAt: string;\n countyEnrollmentFeeAccountId: string;\n paymentInstructions: string;\n countyEnrollmentFee: number;\n emailNotifications: any;\n countyProjectTypes: Array;\n maxMemberFee: number;\n projectAddDropDeadlineDay: number;\n projectAddDropDeadlineMonth: number;\n projectAddDropDeadlineYear: number;\n recordBookSubmissionDeadlineDay: number;\n recordBookSubmissionDeadlineMonth: number;\n recordBookSubmissionDeadlineYear: number;\n disableHouseholdEnrollment: boolean;\n}\nexport interface StateSelectSettings { \n countyLabel: string;\n districtLabel: string;\n clubLabel: string;\n hidePrimaryProfile: boolean;\n noPin: boolean;\n importCheckBeforeRegister: boolean;\n requireAddressOnSignup: boolean;\n}\nexport interface SharedFile { \n id: number;\n accountId: number;\n type: string;\n orgId: string;\n filePath: string;\n title: string;\n groupId: string;\n uploadedAt: string;\n isClubUpload: boolean;\n expirationDate: string;\n projectTypes: Array;\n clubIds: Array;\n uploadStatus: string;\n}\nexport interface UpdateSharedFileRequest { \n id: number;\n title: string;\n filePath: string;\n expirationDate: string;\n projectTypes: Array;\n clubIds: Array;\n uploadStatus: string;\n}\nexport interface SharedFileResponse { \n id: number;\n accountId: number;\n type: string;\n orgId: string;\n filePath: string;\n title: string;\n groupId: string;\n accountName: string;\n accountType: string;\n uploadedAt: string;\n expirationDate: string;\n projectTypes: Array;\n clubIds: Array;\n uploadStatus: string;\n}\nexport interface UploadSharedFileRequest { \n accountId: number;\n householdMemberId?: number;\n filePath?: string;\n title?: string;\n groupId?: string;\n orgId?: string;\n uploadedAt?: string;\n expirationDate?: string;\n projectTypes?: Array;\n clubIds?: Array;\n uploadStatus?: string;\n}\nexport interface SterlingRequest { \n id: number;\n householdMemberId: number;\n year: number;\n candidateId: string;\n status: string;\n redirectUrl: string;\n responseResult: string;\n responseReportUrl: string;\n response: string;\n createdAt: string;\n updatedAt: string;\n}\nexport interface Ticket { \n accountId: number;\n countyId: number;\n browserUserAgent: string;\n screenResolution: string;\n stateName: string;\n countyName: string;\n orgId: string;\n name: string;\n email: string;\n stateId: string;\n accountType: string;\n createdAt: string;\n title: string;\n description: string;\n solution: string;\n severity: 'Low' | 'Medium' | 'High';\n status: 'Solved' | 'InProgress' | 'New';\n technicians: Array;\n id: number;\n}\nexport interface ToDo { \n householdMemberId: number;\n accountId: number;\n text: string;\n completed: boolean;\n}\nexport interface SetCompletedRequest { \n householdMemberId: number;\n accountId: number;\n id: number;\n completed: boolean;\n}\nexport interface ToDoResponse { \n id: number;\n text: string;\n completed: boolean;\n}\nexport interface CheckVerifyAccountLink { \n linkToken: string;\n}\nexport interface VerifyAccountLinkTokenResponse { \n returnTo: string;\n}\nexport interface ES237StatsByCounty { \n countyName: string;\n communityClubCount: number;\n inSchoolClubCount: number;\n afterSchoolClubCount: number;\n militaryClubCount: number;\n totalClubMembershipCount: number;\n shortTermCount: number;\n overnightCampCount: number;\n dayCampCount: number;\n campingProgramTotal: number;\n schoolEnrichmentCount: number;\n individualStudyCount: number;\n staffTrainingCount: number;\n instructionalCount: number;\n totalWithDupesCount: number;\n}\nexport interface YouthDemographicInfoByEnrollment { \n unitCounty: string;\n isPrimaryUnit: string;\n clubId: number;\n unitName: string;\n householdPostalCode: string;\n role: string;\n area: string;\n deliveryMode: string;\n memberId: number;\n memberFirstname: string;\n memberLastName: string;\n genderMaleBoy: number;\n genderWomanGirl: number;\n genderIdentityNotListed: number;\n genderNonbinary: number;\n genderPreferNotToState: number;\n ethnicityHispanic: number;\n ethnicityNotHispanic: number;\n ethnicityPreferNotToState: number;\n raceAmericanIndianOrAlaskanNative: number;\n raceAsian: number;\n raceBlackOrAfricanAmerican: number;\n raceNativeHawaiianOrOtherPacificIslander: number;\n raceRaceNotListed: number;\n raceWhite: number;\n racePreferNotToState: number;\n raceMoreThanOne: number;\n residenceFarm: number;\n residenceTownUnder10000AndRuralNonFarm: number;\n residenceTownCity10000To50000AndITsSuburbs: number;\n residenceSuburbOfCityMoreThan50000: number;\n residenceCentralCityMoreThan50000: number;\n residencePreferNotToState: number;\n}\nexport interface IlYouthClubEnrollmentInfo { \n memberLastName: string;\n memberFirstname: string;\n memberId: number;\n enrollmentStatus: string;\n enrollmentDateCreated: string;\n clubDistrictName: string;\n clubCounty: string;\n clubName: string;\n clubType: string;\n isPrimaryClub: string;\n enrollmentYear: string;\n fourHAge: string;\n yearsIn4h: string;\n enrollmentRole: string;\n gender: string;\n residence: string;\n grade: string;\n ethnicity: string;\n raceAmericanIndianOrAlaskanNative: string;\n raceAsian: string;\n raceBlackOrAfricanAmerican: string;\n raceNativeHawaiianOrOtherPacificIslander: string;\n raceWhite: string;\n racePreferNotToState: string;\n raceMoreThanOne: string;\n paymentStatus: string;\n}\nexport interface ES237Race { \n race: string;\n}\nexport interface ES237Grade { \n grade: string;\n}\nexport interface ES237Gender { \n gender: string;\n}\nexport interface ES237Ethnicity { \n ethnicity: string;\n}\nexport interface StudentInProjectType { \n firstName: string;\n lastName: string;\n email: string;\n countyName: string;\n}\nexport interface AdultMember { \n firstName: string;\n lastName: string;\n email: string;\n birthday: string;\n clubs: string;\n primaryPhone: string;\n}\nexport interface DistrictAdultMember { \n firstName: string;\n lastName: string;\n email: string;\n birthday: string;\n clubs: string;\n primaryPhone: string;\n countyName: string;\n}\nexport interface MembersInProjectType { \n clubId: number;\n firstName: string;\n lastName: string;\n countyName: string;\n clubName: string;\n enrollmentId: string;\n completedOn: string;\n}\nexport interface StateEnrollmentCounts { \n stateId: string;\n stateName: string;\n date: string;\n submissionCount: number;\n newEnrollmentCount: number;\n}\nexport interface ES237Stats { \n totalYouth: number;\n volunteers: Record;\n youthVolunteers: Record;\n clubMembers: Record;\n eventInfo: Record;\n fieldCounts: Record>;\n}\nexport interface ES237Residence { \n residence: string;\n}\nexport interface MemberProjectType { \n type: string;\n completedOn: string;\n}\nexport interface InactiveEnrollments { \n firstName: string;\n lastName: string;\n countyName: string;\n email: string;\n mailingAddress: string;\n cityAddress: string;\n stateAddress: string;\n zipAddress: string;\n primaryPhone: string;\n lastActiveYear: string;\n clubName: string;\n fourHAge: number;\n birthday: string;\n memberType: 'ClubMember' | 'Volunteer' | 'Leader' | 'Parent';\n}\nexport interface CountyEnrollmentCounts { \n countyId: number;\n countyName: string;\n date: string;\n submissionCount: number;\n newEnrollmentCount: number;\n}\nexport interface SubmitEnrollmentRequest { \n paymentMethod: string;\n stripeToken: string;\n enrollmentUpdates: any;\n sendEmail: boolean;\n extensionPrograms: Array;\n}\nexport interface HouseholdSummary { \n id: number;\n numberOfMembers: number;\n activeEnrollments: number;\n countyId: number;\n totalRows: number;\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n isFlagged: boolean;\n}\nexport interface PagedResultsHouseholdSummary { \n results: Array;\n pageIndex: number;\n pageSize: number;\n totalCount: number;\n}\nexport interface EnrollmentTableRow { \n id: number;\n accountId: number;\n householdMemberId: number;\n countyId: number;\n year: number;\n fourHAge: number;\n totalRows: number;\n firstName: string;\n lastName: string;\n countyName: string;\n primaryClubName: string;\n yearsIn4H: string;\n householdEmail: string;\n householdCountyName: string;\n memberType: 'ClubMember' | 'Volunteer';\n status: 'PendingApproval' | 'PendingBgCheck' | 'PendingPayment' | 'Active' | 'InProgress' | 'Canceled' | 'PendingStateApproval' | 'Returned' | 'Ineligible' | 'NotParticipating' | 'PendingAdminApproval' | 'Inactive';\n requirementsData: Record;\n additionalFieldsData: Record;\n restrictions: string;\n submittedAt: string;\n enrollmentComments: string;\n stateComments: string;\n paymentNotes: string;\n paymentReceiptNo: string;\n paymentMethod: string;\n enrollmentFlagResolved: boolean;\n isClubMember: string;\n ilVolunteerTypes: Array;\n driversLicenseRevokedResponse: string;\n duiResponse: string;\n criminalOffenseResponse: string;\n childAbuseResponse: string;\n cpsResponse: string;\n otherFlagResponse: string;\n paperenrollment: boolean;\n paperEnrollmentEnteredBy: string;\n paperEnrollmentCompletionDate: string;\n waiversCheckedBy: string;\n waiverCheckCompletionDate: string;\n profileNotes: string;\n flagged: boolean;\n}\nexport interface PagedResultsEnrollmentTableRow { \n results: Array;\n pageIndex: number;\n pageSize: number;\n totalCount: number;\n}\nexport interface EnrollmentsByClub { \n enrollmentId: number;\n accountId: number;\n householdMemberId: number;\n enrollmentYear: number;\n enrollmentData: any;\n memberType: 'ClubMember' | 'Volunteer';\n enrollmentStatus: 'PendingApproval' | 'PendingBgCheck' | 'PendingPayment' | 'Active' | 'InProgress' | 'Canceled' | 'PendingStateApproval' | 'Returned' | 'Ineligible' | 'NotParticipating' | 'PendingAdminApproval' | 'Inactive';\n enrollmentComments: string;\n clubEnrollmentId: number;\n clubId: number;\n isClubPrimary: boolean;\n clubEnrollmentProjects: Array;\n}\nexport interface PendingVolunteerEnrollment { \n enrollmentId: number;\n name: string;\n countyName: string;\n enrollmentStatus: 'PendingApproval' | 'PendingBgCheck' | 'PendingPayment' | 'Active' | 'InProgress' | 'Canceled' | 'PendingStateApproval' | 'Returned' | 'Ineligible' | 'NotParticipating' | 'PendingAdminApproval' | 'Inactive';\n enrollmentMemberType: 'ClubMember' | 'Volunteer';\n clubs: Array;\n}\nexport interface UpdateEnrollmentStatusRequest { \n newStatus?: 'PendingApproval' | 'PendingBgCheck' | 'PendingPayment' | 'Active' | 'InProgress' | 'Canceled' | 'PendingStateApproval' | 'Returned' | 'Ineligible' | 'NotParticipating' | 'PendingAdminApproval' | 'Inactive';\n rejectionReason?: string;\n}\nexport interface PendingClubLeaderEnrollment { \n enrollmentId: number;\n clubId: number;\n name: string;\n clubName: string;\n countyName: string;\n}\nexport interface UpdateClubEnrollment { \n role: 'Member' | 'Volunteer' | 'Leader' | 'ProjectLeader' | 'ClubVolunteer' | 'ProjectVolunteer' | 'PrimaryCommunityLeader' | 'AssistantCommunityLeader' | 'CoCommunityLeader' | 'TreasurerAdvisor' | 'RecordBookCoordinator' | 'EnrollmentCoordinator' | 'OfficeAdvisor' | 'OfficerAdvisor' | 'OtherVolunteer' | 'AdultChaperone' | 'CampManager' | 'CampStaff' | 'CampDirector' | 'ActivityLeader' | 'RecordsLeader' | 'notSureNew' | 'YouthPresident' | 'YouthVicePresident' | 'YouthTreasurer' | 'YouthSecretary' | 'YouthSergeantAtArms' | 'YouthHistorian' | 'YouthCivicEngagementOfficer' | 'YouthHealthyLivingOfficer' | 'YouthCommunicationsOfficer' | 'YouthOtherOfficer';\n}\nexport interface StateEnrollmentStat { \n stateId: string;\n enrollmentCount: number;\n}\nexport interface DistrictEnrollmentStat { \n districtId: number;\n enrollmentCount: number;\n}\nexport interface CountyEnrollmentStat { \n countyId: number;\n enrollmentCount: number;\n}\nexport interface ClubEnrollmentStat { \n clubId: number;\n enrollmentCount: number;\n}\nexport interface GroupEnrollment { \n id: number;\n countyId: number;\n stateId: string;\n groupType: string;\n formData: any;\n year: number;\n createdAt: string;\n updatedAt: string;\n numberOfParticipants: number;\n}\nexport interface PagedResultsGroupEnrollment { \n results: Array;\n pageIndex: number;\n pageSize: number;\n totalCount: number;\n}\nexport interface ProjectTypeMapping { \n oldType: string;\n newType: string;\n}\nexport interface ProjectTypeMigration { \n id: string;\n name: string;\n stateId: string;\n orgId: string;\n projectTypeMappings: Array;\n reverted: boolean;\n createdAt: string;\n enrollmentMigration: boolean;\n recordBookMigration: boolean;\n isEnrollmentMigration: boolean;\n isRecordBookMigration: boolean;\n}\nexport interface EventRegistration { \n id: number;\n eventId: number;\n accountId: number;\n householdMemberId: number;\n externalParticipantId: number;\n type: string;\n status: 'Active' | 'PendingApproval' | 'PendingPayment' | 'Canceled' | 'NoShow' | 'InProgress';\n regData: any;\n waiverData: any;\n paymentDetails: any;\n approvalDate: string;\n createdAt: string;\n updatedAt: string;\n}\nexport interface CreateEventRegistrationRequest { \n eventId: number;\n accountId?: number;\n householdMemberId?: number;\n externalParticipantId?: number;\n type: string;\n}\nexport interface AttendeeEvent { \n name: string;\n eventRegistrationStatus: string;\n eventId: string;\n startsAt: string;\n eventRegistrationSubmissionDate: string;\n}\nexport interface EventLimitedOption { \n selectionCount: number;\n limit: number;\n key: string;\n value: string;\n fieldTitle: string;\n selected: boolean;\n}\nexport interface EventRegistrationResponse { \n status: 'Active' | 'PendingApproval' | 'PendingPayment' | 'Canceled' | 'NoShow' | 'InProgress';\n firstName: string;\n lastName: string;\n photoUrl: string;\n email: string;\n phone: string;\n countyName: string;\n stateName: string;\n currentEnrollmentStatus: string;\n primaryClubName: string;\n role: 'ClubMember' | 'Volunteer' | 'Leader' | 'Parent';\n birthday: string;\n createdAt: string;\n updatedAt: string;\n accountId: number;\n householdMemberId: number;\n externalParticipantId: number;\n registrationId: number;\n regData: any;\n waiverData: any;\n enrollmentData: any;\n paymentDetails: any;\n enrollmentRequirementsData: any;\n enrollmentAdditionalData: any;\n approvalDate: string;\n refundDate: string;\n refundAmount: string;\n receiptNo: string;\n}\nexport interface SubmitEventRegistrationRequest { \n eventRegistrationId: number;\n stripeToken?: string;\n receiptEmail?: string;\n}\nexport interface PendingEventRegistrations { \n eventRegistrationId: number;\n householdMemberId: number;\n name: string;\n eventName: string;\n countyName: string;\n}\nexport interface EventFileAttachment { \n name: string;\n url: string;\n}\nexport interface EventEmailMessages { \n clubMember: Record;\n volunteer: Record;\n newVolunteer: Record;\n}\nexport interface EventEmailPreferences { \n messages: EventEmailMessages;\n contactEmails: Record>;\n}\nexport interface Event { \n id: number;\n createdByAccountId: number;\n countyIds: Array;\n clubIds: Array;\n name: string;\n imageUrl: string;\n imageAlt: string;\n desc: string;\n location: string;\n stateId: string;\n externalRegistrationLink: string;\n status: 'Draft' | 'Published' | 'Cancelled' | 'Closed' | 'Hidden';\n fee: number;\n orgId: string;\n contactName: string;\n contactPhone: string;\n contactEmail: string;\n minGrade: string;\n maxGrade: string;\n minAge: number;\n maxAge: number;\n isStatewide: boolean;\n regRequired: boolean;\n isAllDay: boolean;\n allowVolunteerReg: boolean;\n approvalRequired: boolean;\n enrollmentRequired: boolean;\n isCountywide: boolean;\n startsAt: string;\n endsAt: string;\n registrationOpen: string;\n registrationClose: string;\n properties: Record;\n fileAttachments: Array;\n participantRegFields: any;\n participantWaivers: any;\n volunteerRegFields: any;\n volunteerWaivers: any;\n attendeeRegCap: number;\n volunteerRegCap: number;\n minAgeAsOf: string;\n maxAgeAsOf: string;\n eventIndex: string;\n projectTypes: Array;\n onlinePaymentOnly: boolean;\n payAfterApproval: boolean;\n emailPreferences: EventEmailPreferences;\n allowExternalRegistration: boolean;\n disableCountyApprovals: boolean;\n sendEmailAfterPayment: boolean;\n isCalendarEvent: boolean;\n}\nexport interface PagedResultsEvent { \n results: Array;\n pageIndex: number;\n pageSize: number;\n totalCount: number;\n}\nexport interface EventRemainingSpace { \n eventId: number;\n remainingClubMemberSpace: number;\n remainingVolunteerSpace: number;\n}\nexport interface MultiEventTableRow { \n id: number;\n createdByAccountId: number;\n totalRows: number;\n countyIds: Array;\n clubIds: Array;\n name: string;\n imageUrl: string;\n imageAlt: string;\n desc: string;\n location: string;\n stateId: string;\n externalRegistrationLink: string;\n status: 'Draft' | 'Published' | 'Cancelled' | 'Closed' | 'Hidden';\n fee: number;\n orgId: string;\n contactName: string;\n contactPhone: string;\n contactEmail: string;\n minGrade: string;\n maxGrade: string;\n minAge: number;\n maxAge: number;\n isStatewide: boolean;\n regRequired: boolean;\n isAllDay: boolean;\n allowVolunteerReg: boolean;\n allowExternalRegistration: boolean;\n disableCountyApprovals: boolean;\n approvalRequired: boolean;\n enrollmentRequired: boolean;\n isCountywide: boolean;\n startsAt: string;\n endsAt: string;\n registrationOpen: string;\n registrationClose: string;\n properties: Record;\n fileAttachments: Array;\n participantRegFields: any;\n participantWaivers: any;\n volunteerRegFields: any;\n volunteerWaivers: any;\n attendeeRegCap: number;\n volunteerRegCap: number;\n minAgeAsOf: string;\n maxAgeAsOf: string;\n eventIndex: string;\n projectTypes: Array;\n onlinePaymentOnly: boolean;\n payAfterApproval: boolean;\n createdByAccountType: string;\n region: string;\n createdByAccountName: string;\n pendingCount: number;\n totalCount: number;\n pendingPaymentCount: number;\n createdAt: string;\n updatedAt: string;\n isCalendarEvent: boolean;\n}\nexport interface PagedResultsMultiEventTableRow { \n results: Array;\n pageIndex: number;\n pageSize: number;\n totalCount: number;\n}\nexport interface EventAdminTableRow { \n id: number;\n createdByAccountId: number;\n totalRows: number;\n countyIds: Array;\n clubIds: Array;\n name: string;\n imageUrl: string;\n imageAlt: string;\n desc: string;\n location: string;\n stateId: string;\n externalRegistrationLink: string;\n status: 'Draft' | 'Published' | 'Cancelled' | 'Closed' | 'Hidden';\n fee: number;\n orgId: string;\n contactName: string;\n contactPhone: string;\n contactEmail: string;\n minGrade: string;\n maxGrade: string;\n minAge: number;\n maxAge: number;\n isStatewide: boolean;\n regRequired: boolean;\n isAllDay: boolean;\n allowVolunteerReg: boolean;\n allowExternalRegistration: boolean;\n disableCountyApprovals: boolean;\n approvalRequired: boolean;\n enrollmentRequired: boolean;\n isCountywide: boolean;\n startsAt: string;\n endsAt: string;\n registrationOpen: string;\n registrationClose: string;\n properties: Record;\n fileAttachments: Array;\n participantRegFields: any;\n participantWaivers: any;\n volunteerRegFields: any;\n volunteerWaivers: any;\n attendeeRegCap: number;\n volunteerRegCap: number;\n minAgeAsOf: string;\n maxAgeAsOf: string;\n eventIndex: string;\n projectTypes: Array;\n onlinePaymentOnly: boolean;\n payAfterApproval: boolean;\n createdByAccountType: string;\n region: string;\n createdByAccountName: string;\n pendingCount: number;\n totalCount: number;\n pendingPaymentCount: number;\n createdAt: string;\n updatedAt: string;\n}\nexport interface PagedResultsEventAdminTableRow { \n results: Array;\n pageIndex: number;\n pageSize: number;\n totalCount: number;\n}\nexport interface ExternalEventParticipant { \n email: string;\n firstName: string;\n lastName: string;\n birthday: string;\n countyId: number;\n enrollmentData: any;\n id: number;\n}\nexport interface ExtensionClubEnrollment { \n clubId: number;\n enrollmentId: number;\n isPrimary: boolean;\n role: 'Member' | 'Volunteer' | 'Leader' | 'ProjectLeader' | 'ClubVolunteer' | 'ProjectVolunteer' | 'PrimaryCommunityLeader' | 'AssistantCommunityLeader' | 'CoCommunityLeader' | 'TreasurerAdvisor' | 'RecordBookCoordinator' | 'EnrollmentCoordinator' | 'OfficeAdvisor' | 'OfficerAdvisor' | 'OtherVolunteer' | 'AdultChaperone' | 'CampManager' | 'CampStaff' | 'CampDirector' | 'ActivityLeader' | 'RecordsLeader' | 'notSureNew' | 'YouthPresident' | 'YouthVicePresident' | 'YouthTreasurer' | 'YouthSecretary' | 'YouthSergeantAtArms' | 'YouthHistorian' | 'YouthCivicEngagementOfficer' | 'YouthHealthyLivingOfficer' | 'YouthCommunicationsOfficer' | 'YouthOtherOfficer';\n status: 'Active' | 'PendingLeaderApproval';\n enrollmentProjects: Array;\n waiverData: any;\n roles: Array;\n}\nexport interface ExtensionEnrollment { \n id: number;\n householdMemberId: number;\n accountId: number;\n countyId: number;\n memberType: 'ClubMember' | 'Volunteer';\n status: 'PendingApproval' | 'PendingBgCheck' | 'PendingPayment' | 'Active' | 'InProgress' | 'Canceled' | 'PendingStateApproval' | 'Returned' | 'Ineligible' | 'NotParticipating' | 'PendingAdminApproval' | 'Inactive';\n year: number;\n data: any;\n extClubEnrollments: Array;\n requirementsData: Record;\n additionalFieldsData: Record;\n restrictions: string;\n submittedAt: string;\n enrollmentComments: string;\n stateComments: string;\n enrollmentFlagResolved: boolean;\n paperenrollment: boolean;\n paperEnrollmentEnteredBy: string;\n paperEnrollmentCompletionDate: string;\n waiversCheckedBy: string;\n waiverCheckCompletionDate: string;\n}\nexport interface ExtensionPrograms { \n programName: string;\n stateId: string;\n programId: number;\n}\nexport interface UpdateExtensionEnrollmentStatusRequest { \n newStatus?: 'PendingApproval' | 'PendingBgCheck' | 'PendingPayment' | 'Active' | 'InProgress' | 'Canceled' | 'PendingStateApproval' | 'Returned' | 'Ineligible' | 'NotParticipating' | 'PendingAdminApproval' | 'Inactive';\n rejectionReason?: string;\n}\nexport interface SubmitExtensionEnrollmentRequest { \n paymentMethod: string;\n stripeToken: string;\n enrollmentUpdates: any;\n sendEmail: boolean;\n}\nexport interface ExtensionMember { \n householdMemberId: number;\n accountId: number;\n enrollmentId: number;\n fourHAge: number;\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n householdName: string;\n enrollmentStatus: string;\n enrollmentComments: string;\n stateComments: string;\n parentPhone: string;\n photoUrl: string;\n}\nexport interface ExtensionEnrollmentRequirementData { \n approvalDate: string;\n receiptNo: string;\n paymentMethod: string;\n transactionId: number;\n notes: string;\n}\nexport interface ExtensionAdditionalEnrollmentFieldData { \n value?: any;\n type: string;\n}\nexport interface ExtensionEnrollmentTableRow { \n id: number;\n accountId: number;\n householdMemberId: number;\n countyId: number;\n year: number;\n fourHAge: number;\n totalRows: number;\n firstName: string;\n lastName: string;\n countyName: string;\n primaryClubName: string;\n yearsIn4H: string;\n householdEmail: string;\n householdCountyName: string;\n memberType: 'ClubMember' | 'Volunteer';\n status: 'PendingApproval' | 'PendingBgCheck' | 'PendingPayment' | 'Active' | 'InProgress' | 'Canceled' | 'PendingStateApproval' | 'Returned' | 'Ineligible' | 'NotParticipating' | 'PendingAdminApproval' | 'Inactive';\n requirementsData: Record;\n additionalFieldsData: Record;\n restrictions: string;\n submittedAt: string;\n enrollmentComments: string;\n stateComments: string;\n paymentNotes: string;\n paymentReceiptNo: string;\n paymentMethod: string;\n enrollmentFlagResolved: boolean;\n isClubMember: string;\n ilVolunteerTypes: Array;\n driversLicenseRevokedResponse: string;\n duiResponse: string;\n criminalOffenseResponse: string;\n childAbuseResponse: string;\n cpsResponse: string;\n otherFlagResponse: string;\n paperenrollment: boolean;\n paperEnrollmentEnteredBy: string;\n paperEnrollmentCompletionDate: string;\n waiversCheckedBy: string;\n waiverCheckCompletionDate: string;\n extensionOrgNames: string;\n flagged: boolean;\n}\nexport interface PagedResultsExtensionEnrollmentTableRow { \n results: Array;\n pageIndex: number;\n pageSize: number;\n totalCount: number;\n}\nexport interface GroupMembers { \n id: number;\n groupId: number;\n countyId: number;\n districtId: number;\n accountId: number;\n householdMemberId: number;\n groupName: string;\n firstName: string;\n lastName: string;\n memberType: string;\n stateId: string;\n addedAt: string;\n}\nexport interface Groups { \n id: number;\n createdByAccountId: number;\n countyId: number;\n districtId: number;\n groupName: string;\n description: string;\n stateId: string;\n createdAt: string;\n visibility: Array;\n}\nexport interface ReturnGroups { \n id: number;\n createdByAccountId: number;\n groupCountyId: number;\n groupDistrictId: number;\n groupName: string;\n description: string;\n groupStateId: string;\n stateName: string;\n countyName: string;\n createdByName: string;\n accountType: string;\n districtName: string;\n createdAt: string;\n visibility: Array;\n}\nexport interface Invoices { \n id: number;\n invoiceName: string;\n invoiceType: string;\n fourHYear: number;\n invoicePaymentDate: string;\n invoiceAmountPaid: string;\n invoicePaymentMethod: string;\n invoicePaymentStatus: string;\n isVisible: boolean;\n enrollmentIds: Array;\n invoiceCountyId: number;\n invoiceCounty: string;\n createdByAcctId: number;\n createdByAcctName: string;\n stateId: string;\n orgId: string;\n createdAt: string;\n updatedAt: string;\n paymentNumber: string;\n enrollmentsMarkedActive: boolean;\n invoiceCheckNum: string;\n invoiceOverrideValue: number;\n}\nexport interface InvoiceEnrollmentList { \n enrollmentId: number;\n accountId: number;\n householdMemberId: number;\n enrollmentYear: number;\n lastName: string;\n firstName: string;\n householdEmail: string;\n street1: string;\n street2: string;\n city: string;\n state: string;\n zip: string;\n memberType: string;\n enrollmentStatus: string;\n clubId: number;\n clubName: string;\n clubCountyId: number;\n isClubPrimary: boolean;\n stateId: string;\n countyId: number;\n}\nexport interface CoursesInProgress { \n courseId: number;\n enrollmentsInProgress: number;\n}\nexport interface CoursesCompletedData { \n countyId: number;\n completedAt: string;\n firstName: string;\n lastName: string;\n courseName: string;\n}\nexport interface CourseEnrollment { \n id: number;\n courseId: number;\n accountId: number;\n householdMemberId: number;\n createdAt: string;\n updatedAt: string;\n completedAt: string;\n lastModule: string;\n orgId: string;\n}\nexport interface CourseEnrollmentResponse { \n enrollmentId: number;\n courseId: number;\n accountId: number;\n householdMemberId: number;\n completedAt: string;\n createdAt: string;\n progress: number;\n imageUrl: string;\n name: string;\n desc: string;\n}\nexport interface CourseEnrollmentRequest { \n courseId: number;\n accountId: number;\n householdMemberId?: number;\n stripeToken?: string;\n receiptEmail?: string;\n orgId?: string;\n}\nexport interface CourseModuleEntry { \n enrollmentId: number;\n moduleId: string;\n score: number;\n completedAt: string;\n createdAt: string;\n updatedAt: string;\n data: any;\n}\nexport interface CourseProgressResponse { \n enrollmentId: number;\n firstName: string;\n lastName: string;\n countyName: string;\n completedAt: string;\n createdAt: string;\n entries: Record;\n}\nexport interface CourseEnrollmentByState { \n id: number;\n courseId: number;\n accountId: number;\n householdMemberId: number;\n stateId: string;\n completedAt: string;\n}\nexport interface CourseCompletionEmailRequest { \n userId: number;\n enrollmentId: number;\n email: string;\n firstName: string;\n lastName: string;\n courseName: string;\n signature?: string;\n countyName?: string;\n stateName?: string;\n logoUrl?: string;\n attachmentByteString?: string;\n attachmentName?: string;\n}\nexport interface NSSCountyAccountInfo { \n accountId: number;\n firstName: string;\n lastName: string;\n courseNames: Array;\n}\nexport interface CourseModule { \n name: string;\n type: string;\n}\nexport interface Course { \n id: number;\n name: string;\n desc: string;\n startModule: string;\n storagePrefix: string;\n imageUrl: string;\n orgId: string;\n modules: Array;\n tags: Array;\n stateIds: Array;\n price: number;\n}\nexport interface PagedResultsCourse { \n results: Array;\n pageIndex: number;\n pageSize: number;\n totalCount: number;\n}\nexport interface UpdateCourseModuleRequest { \n nextModule: string;\n isFluid: boolean;\n}\nexport interface UploadStaticFileCourseModuleRequest { \n parentPath: string;\n name: string;\n ext: string;\n file: any;\n}\nexport interface UploadScormCourseModuleRequest { \n parentPath: string;\n name: string;\n file: any;\n}\nexport interface ReplaceScormCourseModuleRequest { \n path: string;\n name: string;\n file: any;\n}\nexport interface MoveCourseModuleRequest { \n oldPath: string;\n newPath: string;\n newPosition: number;\n}\nexport interface ExternalLMSCourseProgress { \n courseId: number;\n courseName: string;\n status: string;\n progress: string;\n}\nexport interface ExternalLMSCourseProgressWithCompletionDate { \n courseId: number;\n courseName: string;\n status: string;\n progress: string;\n completionDate: string;\n}\nexport interface ExternalLMSCourseOverview { \n courseId: number;\n courseName: string;\n numEnrolled: number;\n numNotStarted: number;\n numInProgress: number;\n numCompleted: number;\n}\nexport interface ExternalLMSUserCourseProgress { \n courseId: number;\n accountId: number;\n householdMemberId: number;\n progress: number;\n courseName: string;\n name: string;\n email: string;\n countyName: string;\n completionDate: string;\n}\nexport interface LMSTag { \n name: string;\n count: number;\n}\nexport interface TransferLMSUserDataRequest { \n fromAccountId: number;\n fromHouseholdMemberId: number;\n toAccountId: number;\n toHouseholdMemberId: number;\n orgId: string;\n}\nexport interface CourseCompletedDataNewLMS { \n countyId: number;\n lmsCourseId: number;\n completionDate: string;\n firstName: string;\n lastName: string;\n courseName: string;\n}\nexport interface LMSCourseOverviewRow { \n courseId: number;\n enrollmentCount: number;\n completionCount: number;\n}\nexport interface LMSCourseStats { \n date: string;\n inProgressCount: number;\n completeCount: number;\n newEnrollmentCount: number;\n}\nexport interface LMSCourseProgress { \n lmsUserId: number;\n lmsCourseId: number;\n accountId: number;\n householdMemberId: number;\n percentComplete: number;\n completionDate: string;\n lastEventTime: string;\n updatedAt: string;\n createdAt: string;\n}\nexport interface OverviewFile { \n fileurl: string;\n mimetype: string;\n}\nexport interface CustomField { \n name: string;\n shortname: string;\n type: string;\n value: string;\n}\nexport interface LMSCourse { \n id: number;\n shortname: string;\n fullname: string;\n displayname: string;\n categoryname: string;\n categoryid: string;\n idnumber: string;\n summary: string;\n summaryformat: string;\n format: string;\n visible: boolean;\n enrollmentmethods: Array;\n overviewfiles: Array;\n customfields: Array;\n}\nexport interface LMSCoursesResponse { \n enrolledCourses: Array;\n allCourses: Array;\n}\nexport interface HouseholdMemberLMSProgress { \n householdMemberId: number;\n lmsCourseId: number;\n courseName: string;\n percentComplete: number;\n completionDate: string;\n lastEventTime: string;\n}\nexport interface LMSUserCustomField { \n type: string;\n value: string;\n name: string;\n shortname: string;\n}\nexport interface LMSUser { \n id: number;\n username: string;\n firstname: string;\n lastname: string;\n fullname: string;\n email: string;\n auth: string;\n customfields: Array;\n}\nexport interface LMSCourseProgressTableRow { \n accountId: number;\n householdMemberId: number;\n lmsUserId: number;\n firstName: string;\n lastName: string;\n stateName: string;\n countyName: string;\n percentComplete: number;\n totalRows: number;\n completionDate: string;\n lastEventTime: string;\n}\nexport interface PagedResultsLMSCourseProgressTableRow { \n results: Array;\n pageIndex: number;\n pageSize: number;\n totalCount: number;\n}\nexport interface UpdateLMSCourseCompletionDate { \n lmsUserId: number;\n completionDate: string;\n}\nexport interface LMSTagAssignment { \n tagId: number;\n tagName: string;\n stateId: string;\n orgId: string;\n memberType: string;\n}\nexport interface PrepaidCodeBatch { \n id: number;\n accountId: number;\n legacyCourseIds: Array;\n lmsCourseIds: Array;\n createdAt: string;\n notes: string;\n orgId: string;\n invoiceNum: string;\n maxUses: number;\n}\nexport interface PrepaidCodeBatchWithRedemptions { \n prepaidCodeBatch: PrepaidCodeBatch;\n redemptions: number;\n totalCodes: number;\n totalRows: number;\n}\nexport interface PagedResultsPrepaidCodeBatchWithRedemptions { \n results: Array;\n pageIndex: number;\n pageSize: number;\n totalCount: number;\n}\nexport interface CreatePrepaidCodeBatchRequest { \n size: number;\n maxUses: number;\n orgId: string;\n prefix: string;\n notes: string;\n invoiceNum: string;\n legacyCourseIds: Array;\n lmsCourseIds: Array;\n accountId: number;\n}\nexport interface UpdatePrepaidCodeBatchRequest { \n notes: string;\n maxUses: number;\n legacyCourseIds: Array;\n lmsCourseIds: Array;\n invoiceNum: string;\n}\nexport interface PrepaidCodeRedemption { \n redeemedAt: string;\n accountId: number;\n householdMemberId: number;\n}\nexport interface PrepaidCode { \n code: string;\n prepaidCodeBatchId: number;\n createdAt: string;\n redemptions: Array;\n}\nexport interface PrepaidCodeRedemptionInfo { \n firstName: string;\n lastName: string;\n redeemedAt: string;\n accountId: number;\n}\nexport interface PrepaidCodeInfo { \n code: string;\n prepaidCodeBatchId: number;\n createdAt: string;\n maxUses: number;\n courseIds: Array;\n redemptions: Array;\n}\nexport interface RedeemPrepaidCodeRequest { \n code: string;\n orgId: string;\n accountId: number;\n householdMemberId: number;\n useMoodle: boolean;\n}\nexport interface PurchasePrepaidCodeBatchRequest { \n stripeToken: string;\n stateId: string;\n orgId: string;\n courseId: number;\n accountId: number;\n numCodes: number;\n maxUses: number;\n}\nexport interface PaymentTransactionLineItemDetail { \n paymentTransactionLineItemId: number;\n paymentAdjustmentId: number;\n order: number;\n desc: string;\n amount: number;\n}\nexport interface PaymentTransactionLineItem { \n id: number;\n accountId: number;\n householdMemberId: number;\n enrollmentYear: number;\n enrollmentId: number;\n courseId: number;\n eventId: number;\n eventRegistrationId: number;\n prepaidCodeBatchId: number;\n desc: string;\n amount: number;\n externalParticipantId: number;\n details: Array;\n}\nexport interface PrepaidCodeCourseStat { \n courseId: number;\n redeemCount: number;\n courseName: string;\n orgId: string;\n}\nexport interface TouchnetGenerateTicketRequest { \n ticketName: string;\n nameValuePairs: Record;\n}\nexport interface TouchnetGenerateTicketResponse { \n ticket: string;\n ticketExpire: string;\n}\nexport interface TouchnetNotification { \n ticketName: string;\n txId: string;\n amount: string;\n receiptNo: string;\n successful: boolean;\n isSuccessful: boolean;\n}\nexport interface BraintreeTokenRequest { \n customerId: string;\n stateId: string;\n orgId: string;\n type: string;\n}\nexport interface BraintreeTokenResponse { \n token: string;\n}\nexport interface BraintreeCheckoutRequest { \n stateId: string;\n orgId: string;\n type: string;\n nonce: string;\n amount: string;\n enrollmentIds: Array;\n registrationIds: Array;\n}\nexport interface StripeCourseCheckoutRequest { \n accountId: number;\n courseIds: Array;\n householdMemberId?: number;\n stripeToken?: string;\n orgId?: string;\n amount?: string;\n receiptEmail?: string;\n useMoodle?: boolean;\n}\nexport interface PaypalCheckoutData { \n clientId: string;\n}\nexport interface PaypalCheckout { \n type: string;\n orderId: string;\n amountWithFee: string;\n amountWithoutFee: string;\n stateId: string;\n orgId: string;\n enrollmentIds: Array;\n registrationIds: Array;\n}\nexport interface StripeConnectCheckout { \n stateId: string;\n orgId: string;\n type: string;\n token: string;\n countyId: number;\n enrollmentIds: Array;\n registrationIds: Array;\n amount: number;\n}\nexport interface NopCheckout { \n type: string;\n enrollmentIds: Array;\n registrationIds: Array;\n}\nexport interface AuthNetCheckoutRequest { \n stateId: string;\n orgId: string;\n type: string;\n amount: string;\n dataDesc: string;\n dataValue: string;\n description: string;\n enrollmentIds: Array;\n registrationIds: Array;\n}\nexport interface NelnetCheckout { \n type: string;\n stateId: string;\n orgId: string;\n amount: string;\n description: string;\n token: string;\n receiptEmail: string;\n cvv: string;\n registrationIds: Array;\n}\nexport interface PaymentAdjustmentCondition { \n type: string;\n}\nexport interface PaymentAdjustment { \n id: number;\n amount: number;\n notes: string;\n description: string;\n region: string;\n conditions: Array