add pilots
This commit is contained in:
9146
api/package-lock.json
generated
9146
api/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -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",
|
||||||
|
|||||||
@@ -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
7905
app/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -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",
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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
4109
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -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"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user