Skip to content

Commit ed7d474

Browse files
committed
form add pet to owner setup
1 parent 904ea7a commit ed7d474

26 files changed

+307
-85
lines changed

spring-petclinic-reactjs-client/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,5 @@ dist-ssr
2424
*.sw?
2525

2626
node/
27+
28+
tsconfig.tsbuildinfo

spring-petclinic-reactjs-client/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414
"dependencies": {
1515
"@hookform/resolvers": "^3.9.0",
1616
"http-method-enum": "^1.0.0",
17-
"ra-data-json-server": "^5.1.0",
1817
"react": "^18.3.0",
1918
"react-admin": "^5.1.0",
2019
"react-dom": "^18.3.0",
20+
"react-flatpickr": "^3.10.13",
2121
"react-hook-form": "^7.52.2",
2222
"react-router-dom": "^6.26.1",
2323
"yup": "^1.4.0"
@@ -26,6 +26,7 @@
2626
"@types/node": "^20.10.7",
2727
"@types/react": "^18.3.3",
2828
"@types/react-dom": "^18.3.0",
29+
"@types/react-flatpickr": "^3.8.11",
2930
"@typescript-eslint/eslint-plugin": "^5.60.1",
3031
"@typescript-eslint/parser": "^5.60.1",
3132
"@vitejs/plugin-react": "^4.0.1",

spring-petclinic-reactjs-client/src/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import PetForm from "@pages/forms/PetForm";
2020
import VisitsPage from "@pages/owners/Visits";
2121
import VeterinariansPage from "@pages/Veterinarians";
2222
import ErrorPage from "@pages/Error";
23-
import dataProvider from "./providers/dataProvider";
23+
import dataProvider from "./data-providers";
2424
import { Layout } from "./Layout";
2525

2626
export const App = () => (

spring-petclinic-reactjs-client/src/NavigationBar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { Link } from "react-router-dom";
21
import { useState } from "react";
2+
import { Link } from "react-router-dom";
33
import { DASHBOARD, OWNERS, VETERINARIANS } from "@constants/routes";
44

55
export enum ENavBar {
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
export const OWNERS = "owners";
2+
export const PETS = "pets";
3+
export const PET_TYPES = "pettypes";

spring-petclinic-reactjs-client/src/constants/routes.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export const GET_OWNER = `${OWNERS}/:id`;
66
export const EDIT_OWNER = `${GET_OWNER}/edit`;
77

88
export const PET_NEW_FORM = `${GET_OWNER}/pets/new`;
9-
export const GET_PET = `${GET_OWNER}/pets/:id`;
9+
export const GET_PET = `${GET_OWNER}/pets/:petId`;
1010
export const PET_EDIT_FORM = `${GET_PET}/edit`;
1111

1212
export const PET_VISITS = `${GET_PET}/visits/new`;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { combineDataProviders } from "react-admin";
2+
import { OWNERS, PET_TYPES } from "@constants/resources";
3+
import ownersDataProvider from "./ownersDataProvider";
4+
import petTypesDataProvider from "./petTypesDataProvider";
5+
6+
const dataProviders = combineDataProviders((resource) => {
7+
switch (resource) {
8+
case OWNERS:
9+
return ownersDataProvider;
10+
case PET_TYPES:
11+
return petTypesDataProvider;
12+
default:
13+
throw new Error(`Unknown resource: ${resource}`);
14+
}
15+
});
16+
17+
export default dataProviders;

spring-petclinic-reactjs-client/src/providers/dataProvider.ts renamed to spring-petclinic-reactjs-client/src/data-providers/ownersDataProvider.ts

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,17 @@
1-
import { combineDataProviders, DataProvider, fetchUtils, RaRecord, UpdateResult } from "react-admin";
2-
import HTTPMethod from "http-method-enum";
3-
import { stringify } from "query-string";
4-
import { OWNERS } from "@constants/resources";
1+
import { fetchUtils, UpdateResult } from "react-admin";
2+
import { GetOwnersListParams } from "@models/api/GetOwnersListParams";
53
import { LAST_NAME } from "@constants/searchParams";
6-
import { GetListParams } from "@models/api/GetListParams";
4+
import { stringify } from "query-string";
5+
import HTTPMethod from "http-method-enum";
6+
import { OwnersDataProvider } from "@models/api/OwnersDataProvider";
7+
import { PETS } from "@constants/resources";
78

89
const apiUrl = import.meta.env.VITE_SPRING_PETCLINIC_REST_API_URL;
910

1011
const httpClient = fetchUtils.fetchJson;
1112

12-
/**
13-
* The following data was made to manage api calls dedicated to owners path ("/api/owner").
14-
* For other endpoints, it would be ideal to manage them in separate data providers.
15-
* @author Firas Regaieg
16-
*/
17-
const ownersDataProvider: DataProvider = {
18-
getList: async (resource, { filter, signal }: GetListParams) => {
13+
export default {
14+
getList: async (resource, { filter, signal }: GetOwnersListParams) => {
1915
const url = new URL(`${apiUrl}/${resource}`);
2016

2117
const searchParams = new URLSearchParams();
@@ -72,7 +68,6 @@ const ownersDataProvider: DataProvider = {
7268
});
7369
return { data: json };
7470
},
75-
7671
update: async (resource, params) => {
7772
const url = `${apiUrl}/${resource}/${params.id}`;
7873
await httpClient(url, {
@@ -112,16 +107,28 @@ const ownersDataProvider: DataProvider = {
112107
method: HTTPMethod.DELETE
113108
});
114109
return { data: json };
115-
}
116-
};
110+
},
111+
createPet: async (resource: string, { meta: { ownerId }, data }) => {
112+
const { json } = await httpClient(`${apiUrl}/${resource}/${ownerId}/${PETS}`, {
113+
method: HTTPMethod.POST,
114+
body: JSON.stringify(data)
115+
});
116+
return { data: json };
117+
},
118+
getPet: async (resource: string, { id, meta: { petId } }) => {
119+
const { json } = await httpClient(`${apiUrl}/${resource}/${id}/${PETS}/${petId}`, {
120+
method: HTTPMethod.GET
121+
});
117122

118-
const dataProviders = combineDataProviders((resource) => {
119-
switch (resource) {
120-
case OWNERS:
121-
return ownersDataProvider;
122-
default:
123-
throw new Error(`Unknown resource: ${resource}`);
124-
}
125-
});
123+
return { data: json };
124+
},
125+
// TODO: create endpoint handler to edit pet owner
126+
editPet: async (resource: string, { meta: { ownerId }, data: { petId, ...body } }) => {
127+
const { json } = await httpClient(`${apiUrl}/${resource}/${ownerId}/${PETS}/${petId}`, {
128+
method: HTTPMethod.PUT,
129+
body: JSON.stringify(body)
130+
});
126131

127-
export default dataProviders;
132+
return { data: json };
133+
}
134+
} as OwnersDataProvider;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { CreateResult, DataProvider, fetchUtils, UpdateResult, DeleteResult, GetOneResult } from "react-admin";
2+
3+
const apiUrl = import.meta.env.VITE_SPRING_PETCLINIC_REST_API_URL;
4+
5+
const httpClient = fetchUtils.fetchJson;
6+
7+
export default {
8+
create: async () => Promise.resolve<CreateResult>({ data: null }),
9+
delete: () => Promise.resolve<DeleteResult>({ data: null }),
10+
deleteMany: () => Promise.resolve({ data: [] }),
11+
getList: async (resource, { signal }) => {
12+
const url = new URL(`${apiUrl}/${resource}`);
13+
14+
const { json } = await httpClient(url, { signal });
15+
return {
16+
data: json,
17+
total: json ? json.length : 0
18+
};
19+
},
20+
getMany: () => Promise.resolve({ data: [] }),
21+
getManyReference: () => Promise.resolve({ data: [], total: 0 }),
22+
getOne: () => Promise.resolve<GetOneResult>({ data: null }),
23+
update: () => Promise.resolve<UpdateResult>({ data: null }),
24+
updateMany: () => Promise.resolve({ data: [] })
25+
} as DataProvider;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { IApiPetType } from "@models/api/IApiPetType";
2+
import { PetFormSchema } from "@models/form/PetFormSchema";
3+
import { EPetForm } from "@models/enums/EPetForm";
4+
import { CreateParams } from "react-admin";
5+
6+
export interface CreateOrEditOwnerPetData extends CreateParams {
7+
meta: { ownerId: number };
8+
data: Omit<PetFormSchema, EPetForm.PET_TYPE> & { petId?: number; type: IApiPetType };
9+
}

0 commit comments

Comments
 (0)