add pilots

This commit is contained in:
2024-07-13 11:05:07 -05:00
parent f19f46eebf
commit 251abcfbac
10 changed files with 2006 additions and 19307 deletions

BIN
.DS_Store vendored

Binary file not shown.

9146
api/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -35,6 +35,7 @@
"rxjs": "^7.8.1" "rxjs": "^7.8.1"
}, },
"devDependencies": { "devDependencies": {
"@microsoft/microsoft-graph-types": "^2.40.0",
"@nestjs/cli": "^10.0.0", "@nestjs/cli": "^10.0.0",
"@nestjs/schematics": "^10.0.0", "@nestjs/schematics": "^10.0.0",
"@nestjs/testing": "^10.0.0", "@nestjs/testing": "^10.0.0",

View File

@@ -6,6 +6,7 @@ import {
} from '@noahspan/noahspan-modules'; } from '@noahspan/noahspan-modules';
import { FeatureFlagValue } from '@azure/app-configuration'; import { FeatureFlagValue } from '@azure/app-configuration';
import { Public } from '@noahspan/noahspan-modules'; import { Public } from '@noahspan/noahspan-modules';
import { Person } from '@microsoft/microsoft-graph-types';
@Controller() @Controller()
export class AppController { export class AppController {
@@ -56,4 +57,26 @@ export class AppController {
return error; return error;
} }
} }
@Get('personSearch')
async searchUsers(
@Headers() headers: any,
@Query('search') search: any
): Promise<Person[]> {
try {
const graphToken: string = await this.msGraphService.getMsGraphAuth(
headers.authorization.replace('Bearer ', '')
);
const client: MsGraphClient =
await this.msGraphService.getMsGraphClientDelegated(graphToken);
const results: any = await client
.api(`me/people/?$search=${search}`)
.get();
const personResults: Person[] = results.values ? results.values : [];
return personResults;
} catch (error) {
return error;
}
}
} }

7905
app/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -16,7 +16,7 @@
"@fortawesome/free-regular-svg-icons": "^6.5.2", "@fortawesome/free-regular-svg-icons": "^6.5.2",
"@fortawesome/free-solid-svg-icons": "^6.5.2", "@fortawesome/free-solid-svg-icons": "^6.5.2",
"@fortawesome/react-fontawesome": "^0.2.2", "@fortawesome/react-fontawesome": "^0.2.2",
"@noahspan/noahspan-components": "^0.3.8", "@noahspan/noahspan-components": "^0.4.5",
"axios": "^1.7.2", "axios": "^1.7.2",
"framer-motion": "^11.1.7", "framer-motion": "^11.1.7",
"react": "^18.2.0", "react": "^18.2.0",

View File

@@ -9,13 +9,23 @@ import {
DatePicker, DatePicker,
Input, Input,
Option, Option,
PeoplePicker,
Select Select
} from '@noahspan/noahspan-components'; } from '@noahspan/noahspan-components';
import PilotFormCertificates from '../pilotFormCertificates/PilotFormCertificates'; import PilotFormCertificates from '../pilotFormCertificates/PilotFormCertificates';
import PilotFormEndorsements from '../pilotFormEndorsements/PilotFormEndorsements'; import PilotFormEndorsements from '../pilotFormEndorsements/PilotFormEndorsements';
import { Person } from '@microsoft/microsoft-graph-types';
import { AxiosInstance, AxiosResponse } from 'axios';
import { useHttpClient } from '../../hooks/httpClient/UseHttpClient';
import { useAccount } from '@azure/msal-react';
const PilotForm: React.FC<unknown> = () => { const PilotForm: React.FC<unknown> = () => {
const httpClient: AxiosInstance = useHttpClient();
const accountInfo = useAccount();
const [open, setOpen] = useState<number>(0); const [open, setOpen] = useState<number>(0);
const [peoplePickerResults, setPeoplePickerResults] = useState<Person[]>([]);
const [isPeoplePickerLoading, setIsPeoplePickerLoading] =
useState<boolean>(false);
const handleOpen = (value: number) => { const handleOpen = (value: number) => {
setOpen(open === value ? 0 : value); setOpen(open === value ? 0 : value);
}; };
@@ -26,44 +36,46 @@ const PilotForm: React.FC<unknown> = () => {
console.log(data); console.log(data);
}; };
const handlePeoplePickerOnChange = async (
event: React.ChangeEvent<HTMLInputElement>
) => {
const searchString: string = event.target.value;
const response: AxiosResponse = await httpClient.get(
`api/personSearch?search=${searchString}`,
{
headers: {
Authorization: `Bearer ${accountInfo?.idToken}`
}
}
);
};
return ( return (
<FormProvider {...methods}> <FormProvider {...methods}>
<form className="m-10" onSubmit={handleSubmit(onSubmit)}> <form className="m-10" onSubmit={handleSubmit(onSubmit)}>
<Accordion {/* <Accordion
open={open === 1} open={open === 1}
icon={open === 1 ? <ChevronDownIcon /> : <ChevronUpIcon />} icon={open === 1 ? <ChevronDownIcon /> : <ChevronUpIcon />}
> >
<AccordionHeader onClick={() => handleOpen(1)}>Info</AccordionHeader> <AccordionHeader onClick={() => handleOpen(1)}>Info</AccordionHeader>
<AccordionBody> <AccordionBody>
<div className="grid grid-cols-3 gap-4"> <div className="grid grid-cols-1 gap-4">
<div className="col-span-3"> <div className="col-span-1">
<Controller <Controller
name="firstName" name="name"
control={control} control={control}
render={({ field }) => ( render={({ field }) => (
<Input <PeoplePicker
className="w-full" results={peoplePickerResults}
disabled={field.disabled} inputProps={{
label="First Name" onChange: handlePeoplePickerOnChange
value={field.value} }}
loading={isPeoplePickerLoading}
/> />
)} )}
/> />
</div> </div>
<div className="col-span-3"> <div className="col-span-1">
<Controller
name="lastName"
control={control}
render={({ field }) => (
<Input
disabled={field.disabled}
label="Last Name"
value={field.value}
/>
)}
/>
</div>
<div className="col-span-3">
<Controller <Controller
name="address" name="address"
control={control} control={control}
@@ -76,7 +88,7 @@ const PilotForm: React.FC<unknown> = () => {
)} )}
/> />
</div> </div>
<div className="col-span-3"> <div className="col-span-1">
<Controller <Controller
name="city" name="city"
control={control} control={control}
@@ -89,7 +101,7 @@ const PilotForm: React.FC<unknown> = () => {
)} )}
/> />
</div> </div>
<div className="col-span-3"> <div className="col-span-1">
<Controller <Controller
name="state" name="state"
control={control} control={control}
@@ -102,7 +114,7 @@ const PilotForm: React.FC<unknown> = () => {
)} )}
/> />
</div> </div>
<div className="col-span-3"> <div className="col-span-1">
<Controller <Controller
name="postalCode" name="postalCode"
control={control} control={control}
@@ -117,7 +129,7 @@ const PilotForm: React.FC<unknown> = () => {
</div> </div>
</div> </div>
</AccordionBody> </AccordionBody>
</Accordion> </Accordion> */}
<Accordion <Accordion
open={open === 2} open={open === 2}
icon={open === 2 ? <ChevronDownIcon /> : <ChevronUpIcon />} icon={open === 2 ? <ChevronDownIcon /> : <ChevronUpIcon />}
@@ -148,26 +160,28 @@ const PilotForm: React.FC<unknown> = () => {
Medical Medical
</AccordionHeader> </AccordionHeader>
<AccordionBody> <AccordionBody>
<div className="grid grid-cols-3 gap-4"> <div className="grid grid-cols-1 gap-4">
<Controller <div className="col-span1">
name="medicalClass" <Controller
control={control} name="medicalClass"
render={({ field }) => ( control={control}
<Select label="Class" value={field.value}> render={({ field }) => (
<Option>First</Option> <Select label="Class" value={field.value}>
<Option>Second</Option> <Option>First</Option>
<Option>Third</Option> <Option>Second</Option>
<Option>Basic Med</Option> <Option>Third</Option>
</Select> <Option>Basic Med</Option>
)} </Select>
/> )}
</div> />
<div className="col-span-3"> </div>
<Controller <div className="col-span-1">
name="medicalExpiration" <Controller
control={control} name="medicalExpiration"
render={() => <DatePicker />} control={control}
/> render={() => <DatePicker />}
/>
</div>
</div> </div>
</AccordionBody> </AccordionBody>
</Accordion> </Accordion>

View File

@@ -6,7 +6,8 @@ import {
Drawer, Drawer,
DrawerBody, DrawerBody,
DrawerHeader, DrawerHeader,
DrawerFooter DrawerFooter,
PlusIcon
} from '@noahspan/noahspan-components'; } from '@noahspan/noahspan-components';
const Pilots: React.FC<unknown> = () => { const Pilots: React.FC<unknown> = () => {
@@ -19,13 +20,15 @@ const Pilots: React.FC<unknown> = () => {
<div className="container mx-auto"> <div className="container mx-auto">
<div className="px-6"> <div className="px-6">
<h1 role="heading">Pilots</h1> <h1 role="heading">Pilots</h1>
<PlusIcon size="2xl" />
<Button <Button
className="flex items-center gap-3"
variant="filled" variant="filled"
onClick={onOpenCloseDrawer} onClick={onOpenCloseDrawer}
// startContent={<FontAwesomeIcon icon={faPlus} />} data-testid="add-pilot-button"
data-testid="new-pilot-button"
> >
New <PlusIcon size="lg" />
Add Pilot
</Button> </Button>
<DatePicker /> <DatePicker />
<Drawer <Drawer
@@ -34,13 +37,13 @@ const Pilots: React.FC<unknown> = () => {
size={1000} size={1000}
data-testid="pilot-drawer" data-testid="pilot-drawer"
> >
{/* <DrawerHeader text='Add Pilot' onClose={onOpenCloseDrawer} /> */} <DrawerHeader text="Add Pilot" onClose={onOpenCloseDrawer} />
<DrawerBody> <DrawerBody>
<PilotForm /> <PilotForm />
</DrawerBody> </DrawerBody>
<DrawerFooter> <DrawerFooter>
<div className="flex gap-4 justify-end justify-self-center"> <div className="flex gap-2 justify-end justify-self-center">
<div> <div>
<Button <Button
variant="outlined" variant="outlined"

4109
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -27,9 +27,5 @@
}, },
"lint-staged": { "lint-staged": {
"**/*": "prettier --write \"**/src/**/*.ts\" \"**/test/**/*.ts\" --ignore-unknown" "**/*": "prettier --write \"**/src/**/*.ts\" \"**/test/**/*.ts\" --ignore-unknown"
},
"dependencies": {
"@microsoft/mgt-element": "^4.2.2",
"@microsoft/mgt-msal2-provider": "^4.2.2"
} }
} }