diff --git a/hotel-management/src/commons/styles/ButtonIcon.tsx b/hotel-management/src/commons/styles/ButtonIcon.ts
similarity index 100%
rename from hotel-management/src/commons/styles/ButtonIcon.tsx
rename to hotel-management/src/commons/styles/ButtonIcon.ts
diff --git a/hotel-management/src/components/AppLayout.tsx b/hotel-management/src/components/AppLayout.tsx
deleted file mode 100644
index c34ae29..0000000
--- a/hotel-management/src/components/AppLayout.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import styled from 'styled-components';
-import { Outlet } from 'react-router-dom';
-
-// Components
-import Header from './Header';
-import Sidebar from './Sidebar';
-
-const StyledAppLayout = styled.div`
- display: grid;
- grid-template-columns: 300px 1fr;
- grid-template-rows: auto 1fr;
- height: 100vh;
-`;
-
-const Main = styled.main`
- border: 1px solid var(--border-color);
-
- overflow: scroll;
-`;
-
-const AppLayout = () => {
- return (
-
-
-
-
-
-
-
- );
-};
-
-export default AppLayout;
diff --git a/hotel-management/src/components/AppLayout/index.tsx b/hotel-management/src/components/AppLayout/index.tsx
new file mode 100644
index 0000000..49b39e7
--- /dev/null
+++ b/hotel-management/src/components/AppLayout/index.tsx
@@ -0,0 +1,22 @@
+import { Outlet } from 'react-router-dom';
+
+// Components
+import Header from '../Header';
+import Sidebar from '../Sidebar';
+
+// Styled
+import { Main, StyledAppLayout } from './styled';
+
+const AppLayout = () => {
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+export default AppLayout;
diff --git a/hotel-management/src/components/AppLayout/styled.ts b/hotel-management/src/components/AppLayout/styled.ts
new file mode 100644
index 0000000..87fbadd
--- /dev/null
+++ b/hotel-management/src/components/AppLayout/styled.ts
@@ -0,0 +1,16 @@
+import styled from 'styled-components';
+
+const StyledAppLayout = styled.div`
+ display: grid;
+ grid-template-columns: 300px 1fr;
+ grid-template-rows: auto 1fr;
+ height: 100vh;
+`;
+
+const Main = styled.main`
+ border: 1px solid var(--border-color);
+
+ overflow: scroll;
+`;
+
+export { StyledAppLayout, Main };
diff --git a/hotel-management/src/components/Form/index.tsx b/hotel-management/src/components/Form/index.tsx
index 0d2de0b..5fe4a93 100644
--- a/hotel-management/src/components/Form/index.tsx
+++ b/hotel-management/src/components/Form/index.tsx
@@ -1,3 +1,4 @@
+// Styled
import { StyledActionBtn, StyledForm } from './styled';
interface IFormProps {
diff --git a/hotel-management/src/components/FormRow/index.tsx b/hotel-management/src/components/FormRow/index.tsx
index 3a4a1f5..11b62ae 100644
--- a/hotel-management/src/components/FormRow/index.tsx
+++ b/hotel-management/src/components/FormRow/index.tsx
@@ -1,3 +1,4 @@
+// Styled
import { Error, Label, StyledFormRow } from './styled';
interface IFormRow {
diff --git a/hotel-management/src/components/FormRow/styled.ts b/hotel-management/src/components/FormRow/styled.ts
index 6563746..d37bbf4 100644
--- a/hotel-management/src/components/FormRow/styled.ts
+++ b/hotel-management/src/components/FormRow/styled.ts
@@ -16,6 +16,8 @@ const Error = styled.p`
color: var(--error-text);
font-size: var(--fs-sm-2x);
margin-top: 5px;
+ padding-inline: 5px;
+ width: 220px;
`;
export { StyledFormRow, Label, Error };
diff --git a/hotel-management/src/components/Header/index.tsx b/hotel-management/src/components/Header/index.tsx
new file mode 100644
index 0000000..2d20917
--- /dev/null
+++ b/hotel-management/src/components/Header/index.tsx
@@ -0,0 +1,16 @@
+// Components
+import HeaderMenu from '../HeaderMenu';
+
+// Styled
+import { StyledHeader } from './styled';
+
+const Header = () => {
+ return (
+
+ Hi, Admin!
+
+
+ );
+};
+
+export default Header;
diff --git a/hotel-management/src/components/Header.tsx b/hotel-management/src/components/Header/styled.ts
similarity index 53%
rename from hotel-management/src/components/Header.tsx
rename to hotel-management/src/components/Header/styled.ts
index f5f794c..304040e 100644
--- a/hotel-management/src/components/Header.tsx
+++ b/hotel-management/src/components/Header/styled.ts
@@ -1,8 +1,5 @@
import styled from 'styled-components';
-// Components
-import HeaderMenu from './HeaderMenu';
-
const StyledHeader = styled.header`
border-bottom: 1px solid var(--border-color);
padding: 20px 40px;
@@ -13,13 +10,4 @@ const StyledHeader = styled.header`
gap: 30px;
`;
-const Header = () => {
- return (
-
- Hi, Admin!
-
-
- );
-};
-
-export default Header;
+export { StyledHeader };
diff --git a/hotel-management/src/components/HeaderMenu.tsx b/hotel-management/src/components/HeaderMenu/index.tsx
similarity index 74%
rename from hotel-management/src/components/HeaderMenu.tsx
rename to hotel-management/src/components/HeaderMenu/index.tsx
index 109666f..3e24e4b 100644
--- a/hotel-management/src/components/HeaderMenu.tsx
+++ b/hotel-management/src/components/HeaderMenu/index.tsx
@@ -1,14 +1,10 @@
-import styled from 'styled-components';
-
// Components
import { IoPersonCircleOutline } from 'react-icons/io5';
import { HiOutlineLogout } from 'react-icons/hi';
-import ButtonIcon from '../commons/styles/ButtonIcon';
+import ButtonIcon from '../../commons/styles/ButtonIcon';
-const StyledHeaderMenu = styled.ul`
- display: flex;
- gap: 10px;
-`;
+// Styled
+import { StyledHeaderMenu } from './styled';
const HeaderMenu = () => {
return (
diff --git a/hotel-management/src/components/HeaderMenu/styled.ts b/hotel-management/src/components/HeaderMenu/styled.ts
new file mode 100644
index 0000000..9715f1f
--- /dev/null
+++ b/hotel-management/src/components/HeaderMenu/styled.ts
@@ -0,0 +1,8 @@
+import styled from 'styled-components';
+
+const StyledHeaderMenu = styled.ul`
+ display: flex;
+ gap: 10px;
+`;
+
+export { StyledHeaderMenu };
diff --git a/hotel-management/src/components/Message/index.tsx b/hotel-management/src/components/Message/index.tsx
new file mode 100644
index 0000000..bcc0b4f
--- /dev/null
+++ b/hotel-management/src/components/Message/index.tsx
@@ -0,0 +1,8 @@
+// Styled
+import { StyledMessage } from './styled';
+
+const Message = ({ children }: { children: string }) => {
+ return {children};
+};
+
+export default Message;
diff --git a/hotel-management/src/components/Message.tsx b/hotel-management/src/components/Message/styled.ts
similarity index 50%
rename from hotel-management/src/components/Message.tsx
rename to hotel-management/src/components/Message/styled.ts
index 307efb4..10cc192 100644
--- a/hotel-management/src/components/Message.tsx
+++ b/hotel-management/src/components/Message/styled.ts
@@ -6,8 +6,4 @@ const StyledMessage = styled.p`
padding: 20px;
`;
-const Message = ({ children }: { children: string }) => {
- return {children};
-};
-
-export default Message;
+export { StyledMessage };
diff --git a/hotel-management/src/components/Nav/index.tsx b/hotel-management/src/components/Nav/index.tsx
new file mode 100644
index 0000000..4de47fa
--- /dev/null
+++ b/hotel-management/src/components/Nav/index.tsx
@@ -0,0 +1,28 @@
+// Components
+import { MdSpaceDashboard } from 'react-icons/md';
+import { HiUsers } from 'react-icons/hi2';
+import { BsHouseDoorFill } from 'react-icons/bs';
+
+// Styled
+import { StyledNav, StyledNavLink } from './styled';
+
+const Nav = () => {
+ return (
+
+
+
+ Dashboard
+
+
+
+ User
+
+
+
+ Room
+
+
+ );
+};
+
+export default Nav;
diff --git a/hotel-management/src/components/Nav.tsx b/hotel-management/src/components/Nav/styled.ts
similarity index 50%
rename from hotel-management/src/components/Nav.tsx
rename to hotel-management/src/components/Nav/styled.ts
index 5bd3202..52ee29d 100644
--- a/hotel-management/src/components/Nav.tsx
+++ b/hotel-management/src/components/Nav/styled.ts
@@ -1,11 +1,6 @@
import { NavLink } from 'react-router-dom';
import styled from 'styled-components';
-// Components
-import { MdSpaceDashboard } from 'react-icons/md';
-import { HiUsers } from 'react-icons/hi2';
-import { BsHouseDoorFill } from 'react-icons/bs';
-
const StyledNav = styled.nav`
margin-top: 70px;
display: flex;
@@ -38,23 +33,4 @@ const StyledNavLink = styled(NavLink)`
}
`;
-const Nav = () => {
- return (
-
-
-
- Dashboard
-
-
-
- User
-
-
-
- Room
-
-
- );
-};
-
-export default Nav;
+export { StyledNav, StyledNavLink };
diff --git a/hotel-management/src/components/OrderBy.tsx b/hotel-management/src/components/OrderBy/index.tsx
similarity index 57%
rename from hotel-management/src/components/OrderBy.tsx
rename to hotel-management/src/components/OrderBy/index.tsx
index 57fda8d..e8f0716 100644
--- a/hotel-management/src/components/OrderBy.tsx
+++ b/hotel-management/src/components/OrderBy/index.tsx
@@ -1,39 +1,8 @@
import { memo } from 'react';
import { useSearchParams } from 'react-router-dom';
-import styled, { css } from 'styled-components';
-const StyledOrder = styled.div`
- border: 1px solid var(--border-color);
- border-radius: var(--radius-sm);
- padding: 5px;
- display: flex;
- gap: 10px;
-`;
-
-interface IOrderBtn {
- active: boolean;
-}
-
-const OrderButton = styled.button`
- border: none;
-
- ${(props) =>
- props.active &&
- css`
- background-color: var(--primary-color);
- color: var(--light-text);
- `}
-
- border-radius: var(--radius-sm);
- font-weight: 500;
- font-size: var(--fs-sm-x);
- padding: 5px 10px;
- transition: all 0.3s;
-
- &:hover:not(:disabled) {
- background-color: var(--hover-dark-background-color);
- }
-`;
+// Styled
+import { OrderButton, StyledOrder } from './styled';
interface IOrderProps {
options: {
diff --git a/hotel-management/src/components/OrderBy/styled.ts b/hotel-management/src/components/OrderBy/styled.ts
new file mode 100644
index 0000000..ea3325b
--- /dev/null
+++ b/hotel-management/src/components/OrderBy/styled.ts
@@ -0,0 +1,38 @@
+import styled, { css } from 'styled-components';
+
+const StyledOrder = styled.div`
+ border: 1px solid var(--border-color);
+ border-radius: var(--radius-sm);
+ padding: 5px;
+ display: flex;
+ gap: 10px;
+`;
+
+interface IOrderBtn {
+ active: boolean;
+}
+
+const OrderButton = styled.button`
+ border: none;
+ cursor: pointer;
+
+ ${(props) =>
+ props.active &&
+ css`
+ background-color: var(--primary-color);
+ color: var(--light-text);
+ cursor: no-drop;
+ `}
+
+ border-radius: var(--radius-sm);
+ font-weight: 500;
+ font-size: var(--fs-sm-x);
+ padding: 5px 10px;
+ transition: all 0.3s;
+
+ &:hover:not(:disabled) {
+ background-color: var(--hover-dark-background-color);
+ }
+`;
+
+export { StyledOrder, OrderButton };
diff --git a/hotel-management/src/components/Search.tsx b/hotel-management/src/components/Search/index.tsx
similarity index 74%
rename from hotel-management/src/components/Search.tsx
rename to hotel-management/src/components/Search/index.tsx
index 03b839d..544a832 100644
--- a/hotel-management/src/components/Search.tsx
+++ b/hotel-management/src/components/Search/index.tsx
@@ -1,12 +1,5 @@
import { memo, useEffect, useState } from 'react';
-import styled from 'styled-components';
-
-const StyledSearch = styled.input`
- border-radius: var(--radius-sm);
- border: 1px solid var(--border-color);
- font-size: var(--fs-sm-x);
- padding: 5px 10px;
-`;
+import { StyledSearch } from './styled';
interface ISearch {
setPlaceHolder: string;
diff --git a/hotel-management/src/components/Search/styled.ts b/hotel-management/src/components/Search/styled.ts
new file mode 100644
index 0000000..cf468b2
--- /dev/null
+++ b/hotel-management/src/components/Search/styled.ts
@@ -0,0 +1,10 @@
+import styled from 'styled-components';
+
+const StyledSearch = styled.input`
+ border-radius: var(--radius-sm);
+ border: 1px solid var(--border-color);
+ font-size: var(--fs-sm-x);
+ padding: 5px 10px;
+`;
+
+export { StyledSearch };
diff --git a/hotel-management/src/components/Select.tsx b/hotel-management/src/components/Select.tsx
deleted file mode 100644
index ede854c..0000000
--- a/hotel-management/src/components/Select.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import styled from 'styled-components';
-
-interface ISelect {
- options: {
- value: string;
- label: string;
- }[];
- value: string;
- onChange: React.ChangeEventHandler;
-}
-
-const StyledSelect = styled.select`
- font-size: var(--fs-sm-x);
- padding: 5px 10px;
- border: 1px solid var(--border-color);
- border-radius: var(--radius-sm);
- font-weight: 500;
-`;
-
-const Select = ({ options, value, onChange }: ISelect) => {
- return (
-
- {options.map((option) => (
-
- ))}
-
- );
-};
-
-export default Select;
diff --git a/hotel-management/src/components/Select/index.tsx b/hotel-management/src/components/Select/index.tsx
new file mode 100644
index 0000000..448c2be
--- /dev/null
+++ b/hotel-management/src/components/Select/index.tsx
@@ -0,0 +1,30 @@
+import { ISelectOptions } from '../../globals/interfaces';
+import { StyledSelect } from './styled';
+
+interface ISelect {
+ options: ISelectOptions[];
+ value: string;
+ onChange: React.ChangeEventHandler;
+ name?: string;
+}
+
+const Select = ({ options, value, onChange, name }: ISelect) => {
+ if (!options) return;
+
+ return (
+
+ {options.map((option) => (
+
+ ))}
+
+ );
+};
+
+export default Select;
diff --git a/hotel-management/src/components/Select/styled.ts b/hotel-management/src/components/Select/styled.ts
new file mode 100644
index 0000000..93b089c
--- /dev/null
+++ b/hotel-management/src/components/Select/styled.ts
@@ -0,0 +1,11 @@
+import styled from 'styled-components';
+
+const StyledSelect = styled.select`
+ font-size: var(--fs-sm-x);
+ padding: 5px 10px;
+ border: 1px solid var(--border-color);
+ border-radius: var(--radius-sm);
+ font-weight: 500;
+`;
+
+export { StyledSelect };
diff --git a/hotel-management/src/components/Sidebar/index.tsx b/hotel-management/src/components/Sidebar/index.tsx
new file mode 100644
index 0000000..3b0c4d2
--- /dev/null
+++ b/hotel-management/src/components/Sidebar/index.tsx
@@ -0,0 +1,16 @@
+// Components
+import Nav from '../Nav';
+
+// Styled
+import { Heading, StyledSidebar } from './styled';
+
+const Sidebar = () => {
+ return (
+
+ Hotel Management
+
+
+ );
+};
+
+export default Sidebar;
diff --git a/hotel-management/src/components/Sidebar.tsx b/hotel-management/src/components/Sidebar/styled.ts
similarity index 59%
rename from hotel-management/src/components/Sidebar.tsx
rename to hotel-management/src/components/Sidebar/styled.ts
index 028dbc4..23053b5 100644
--- a/hotel-management/src/components/Sidebar.tsx
+++ b/hotel-management/src/components/Sidebar/styled.ts
@@ -1,8 +1,5 @@
import styled from 'styled-components';
-// Components
-import Nav from './Nav';
-
const StyledSidebar = styled.aside`
padding: 50px 20px;
@@ -17,13 +14,4 @@ const Heading = styled.h1`
color: var(--primary-color);
`;
-const Sidebar = () => {
- return (
-
- Hotel Management
-
-
- );
-};
-
-export default Sidebar;
+export { StyledSidebar, Heading };
diff --git a/hotel-management/src/components/SortBy.tsx b/hotel-management/src/components/SortBy/index.tsx
similarity index 95%
rename from hotel-management/src/components/SortBy.tsx
rename to hotel-management/src/components/SortBy/index.tsx
index f5f7cd4..ea70323 100644
--- a/hotel-management/src/components/SortBy.tsx
+++ b/hotel-management/src/components/SortBy/index.tsx
@@ -1,7 +1,7 @@
import { useSearchParams } from 'react-router-dom';
// Components
-import Select from './Select';
+import Select from '../Select';
import { memo } from 'react';
interface ISortByProps {
diff --git a/hotel-management/src/components/Toast.tsx b/hotel-management/src/components/Toast/index.tsx
similarity index 100%
rename from hotel-management/src/components/Toast.tsx
rename to hotel-management/src/components/Toast/index.tsx
diff --git a/hotel-management/src/constants/messages.ts b/hotel-management/src/constants/messages.ts
index 0b9531e..6e14730 100644
--- a/hotel-management/src/constants/messages.ts
+++ b/hotel-management/src/constants/messages.ts
@@ -11,6 +11,8 @@ const EDIT_SUCCESS = 'Edit success';
const CONFIRM_DELETE = 'Are you sure to delete it?';
const DELETE_SUCCESS = 'Delete success';
const REQUIRED_FIELD_ERROR = 'This is required field';
+const DISCOUNT_FIELD_ERROR =
+ 'Discount should be greater than 0 and less than 100';
export {
invalidFormatMsg,
@@ -20,4 +22,5 @@ export {
CONFIRM_DELETE,
DELETE_SUCCESS,
REQUIRED_FIELD_ERROR,
+ DISCOUNT_FIELD_ERROR,
};
diff --git a/hotel-management/src/constants/path.ts b/hotel-management/src/constants/path.ts
index 2f54b15..75a9f38 100644
--- a/hotel-management/src/constants/path.ts
+++ b/hotel-management/src/constants/path.ts
@@ -2,6 +2,6 @@ export const DASHBOARD: string = '/dashboard';
export const USER: string = '/user';
export const ROOM: string = '/room';
export const OTHER_PATH: string = '*';
-export const BASE_URL: string = 'https://hotel-management-api.loiphan.com/';
+export const BASE_URL: string = 'http://localhost:3000/';
export const USER_PATH = 'users';
export const ROOM_PATH = 'rooms';
diff --git a/hotel-management/src/globals/interfaces.ts b/hotel-management/src/globals/interfaces.ts
index 2d0726c..c9b42aa 100644
--- a/hotel-management/src/globals/interfaces.ts
+++ b/hotel-management/src/globals/interfaces.ts
@@ -20,6 +20,11 @@ interface ITableBody {
render?: (value: T) => JSX.Element;
}
+interface ISelectOptions {
+ value: string;
+ label: string;
+}
+
interface IDialogProps {
title?: string;
children?: JSX.Element[] | JSX.Element;
@@ -31,4 +36,11 @@ interface IDialogProps {
isAdd?: boolean;
}
-export type { IMenusContext, IButton, ITable, ITableBody, IDialogProps };
+export type {
+ IMenusContext,
+ IButton,
+ ITable,
+ ITableBody,
+ IDialogProps,
+ ISelectOptions,
+};
diff --git a/hotel-management/src/helpers/utils.ts b/hotel-management/src/helpers/utils.ts
index f5ed704..631d64f 100644
--- a/hotel-management/src/helpers/utils.ts
+++ b/hotel-management/src/helpers/utils.ts
@@ -56,7 +56,8 @@ const getPropValues = (stateSchema: TStateSchema, prop?: TPropValues) => {
type TValidator = {
validatorFunc: (value: string) => boolean;
- prop: string;
+ prop?: string;
+ customErrorMsg?: string;
required?: boolean;
};
@@ -65,12 +66,20 @@ type TValidator = {
* @param param0 Pass TValidator object
* @returns An object contains condition validator
*/
-const addValidator = ({ validatorFunc, prop, required = true }: TValidator) => {
+const addValidator = ({
+ validatorFunc,
+ prop = '',
+ customErrorMsg = '',
+ required = true,
+}: TValidator) => {
return {
required,
validator: {
func: validatorFunc,
- error: invalidFormatMsg(prop),
+ // prettier-ignore
+ error: customErrorMsg
+ ? customErrorMsg
+ : invalidFormatMsg(prop),
},
};
};
diff --git a/hotel-management/src/helpers/validators.ts b/hotel-management/src/helpers/validators.ts
index 08f1f1f..a060a42 100644
--- a/hotel-management/src/helpers/validators.ts
+++ b/hotel-management/src/helpers/validators.ts
@@ -7,6 +7,16 @@ const isValidNumber = (value: string): boolean => {
return /^[0-9]*$/.test(value);
};
+/**
+ * Check value is valid discount or not
+ * @param value Value need to be checked
+ * @returns A boolean indicating whether or not the argument has valid
+ */
+const isValidDiscount = (value: string): boolean => {
+ console.log(Boolean(+value >= 0 && +value <= 100));
+ return +value >= 0 && +value <= 100;
+};
+
/**
* Check value is valid phone number or not
* @param value Value need to be checked
@@ -31,4 +41,10 @@ const isValidString = (value: string): boolean => {
*/
const skipCheck = () => true;
-export { isValidNumber, isValidPhoneNumber, isValidString, skipCheck };
+export {
+ isValidNumber,
+ isValidPhoneNumber,
+ isValidString,
+ skipCheck,
+ isValidDiscount,
+};
diff --git a/hotel-management/src/hooks/useFetch.ts b/hotel-management/src/hooks/useFetch.ts
index 59647c5..fdbc1b2 100644
--- a/hotel-management/src/hooks/useFetch.ts
+++ b/hotel-management/src/hooks/useFetch.ts
@@ -19,15 +19,15 @@ import { searchQuery } from '../helpers/utils';
*/
const useFetch = (
path: string,
- columnSearch: string,
- keyWord: string,
- tempSortBy: string,
- tempOrderBy: string,
+ columnSearch: string = '',
+ keyWord: string = '',
+ tempSortBy?: string,
+ tempOrderBy?: string,
reload?: boolean,
) => {
const [data, setData] = useState(null);
const [isPending, setIsPending] = useState(false);
- const [errorMsg, setErrorMsg] = useState(null);
+ const [errorFetchMsg, setErrorFetchMsg] = useState(null);
useEffect(() => {
// Clear data
@@ -61,16 +61,16 @@ const useFetch = (
setIsPending(false);
setData(json);
- setErrorMsg(null);
+ setErrorFetchMsg(null);
} catch (error) {
- setErrorMsg(`Could not fetch data.\n ${error}`);
+ setErrorFetchMsg(`Could not fetch data.\n ${error}`);
setIsPending(false);
}
};
fetchData();
}, [path, reload, columnSearch, keyWord, tempOrderBy, tempSortBy]);
- return { data, isPending, errorMsg };
+ return { data, isPending, errorFetchMsg };
};
export { useFetch };
diff --git a/hotel-management/src/hooks/useForm.ts b/hotel-management/src/hooks/useForm.ts
index 362aaee..1573138 100644
--- a/hotel-management/src/hooks/useForm.ts
+++ b/hotel-management/src/hooks/useForm.ts
@@ -110,7 +110,11 @@ const useForm = (
// Event handler for handling changes in input.
const handleOnChange = useCallback(
- (event: ChangeEvent) => {
+ (
+ event: ChangeEvent<
+ HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement
+ >,
+ ) => {
setIsDirty(true);
let error = '';
diff --git a/hotel-management/src/pages/Room/Form.tsx b/hotel-management/src/pages/Room/Form.tsx
index ab1e710..12318c2 100644
--- a/hotel-management/src/pages/Room/Form.tsx
+++ b/hotel-management/src/pages/Room/Form.tsx
@@ -24,6 +24,7 @@ import useForm from '../../hooks/useForm.ts';
// Utils
import {
+ isValidDiscount,
isValidNumber,
isValidString,
skipCheck,
@@ -35,6 +36,7 @@ import { sendRequest } from '../../helpers/sendRequest.ts';
import { STATUS_CODE } from '../../constants/statusCode.ts';
import {
ADD_SUCCESS,
+ DISCOUNT_FIELD_ERROR,
EDIT_SUCCESS,
errorMsg,
} from '../../constants/messages.ts';
@@ -46,6 +48,7 @@ const FormBtn = styled(Button)`
&:disabled,
&[disabled] {
background-color: var(--disabled-btn-color);
+ cursor: no-drop;
}
`;
@@ -134,8 +137,8 @@ const RoomForm = ({
prop: 'price',
}),
discount: addValidator({
- validatorFunc: isValidNumber,
- prop: 'discount'
+ validatorFunc: isValidDiscount,
+ customErrorMsg: DISCOUNT_FIELD_ERROR
}),
status: addValidator({
validatorFunc: skipCheck,
@@ -305,8 +308,8 @@ const RoomForm = ({
label="Discount"
error={
// prettier-ignore
- errors.roomId && dirty.roomId
- ? (errors.roomId as string)
+ errors.discount && dirty.discount
+ ? (errors.discount as string)
: ''
}
>
@@ -350,7 +353,7 @@ const RoomForm = ({
// prettier-ignore
isAdd
? 'Add'
- : 'Edit'
+ : 'Save'
}
diff --git a/hotel-management/src/pages/Room/Table.tsx b/hotel-management/src/pages/Room/Table.tsx
index 496f4cd..3edbd70 100644
--- a/hotel-management/src/pages/Room/Table.tsx
+++ b/hotel-management/src/pages/Room/Table.tsx
@@ -125,7 +125,7 @@ const RoomTable = ({
? searchParams.get('orderBy')!
: '';
- const { data, isPending, errorMsg } = useFetch(
+ const { data, isPending, errorFetchMsg } = useFetch(
'rooms',
'name',
nameSearch,
@@ -141,10 +141,10 @@ const RoomTable = ({
setRooms([]);
}
- if (errorMsg) {
- console.error(errorMsg);
+ if (errorFetchMsg) {
+ console.error(errorFetchMsg);
}
- }, [data, errorMsg]);
+ }, [data, errorFetchMsg]);
return (
<>
diff --git a/hotel-management/src/pages/User/Form.tsx b/hotel-management/src/pages/User/Form.tsx
index 74bffad..3592ecb 100644
--- a/hotel-management/src/pages/User/Form.tsx
+++ b/hotel-management/src/pages/User/Form.tsx
@@ -39,6 +39,11 @@ import {
errorMsg,
} from '../../constants/messages.ts';
import { USER_PATH } from '../../constants/path.ts';
+import Select from '../../components/Select/index.tsx';
+import { useFetch } from '../../hooks/useFetch.ts';
+
+// Interfaces
+import { ISelectOptions } from '../../globals/interfaces.ts';
const FormBtn = styled(Button)`
width: 100%;
@@ -46,6 +51,7 @@ const FormBtn = styled(Button)`
&:disabled,
&[disabled] {
background-color: var(--disabled-btn-color);
+ cursor: no-drop;
}
`;
@@ -65,6 +71,27 @@ const UserForm = ({
isAdd,
}: IUserFormProp) => {
const [reset, setReset] = useState(true);
+ const [options, setOptions] = useState();
+ const { data, errorFetchMsg } = useFetch('rooms');
+
+ useEffect(() => {
+ if (data) {
+ const tempData = data as TKeyValue[];
+ const tempOptions: ISelectOptions[] = [];
+ tempData.forEach((item) => {
+ tempOptions.push({
+ label: item.name! as string,
+ value: item.id! as string,
+ });
+ });
+
+ setOptions(tempOptions);
+ }
+
+ if (errorFetchMsg) {
+ toast.error(errorFetchMsg);
+ }
+ }, [data, errorFetchMsg]);
if (isAdd) {
// If this is add form, reset value
@@ -294,11 +321,17 @@ const UserForm = ({
: ''
}
>
- */}
+
@@ -325,7 +358,7 @@ const UserForm = ({
// prettier-ignore
isAdd
? 'Add'
- : 'Edit'
+ : 'Save'
}
diff --git a/hotel-management/src/pages/User/Table.tsx b/hotel-management/src/pages/User/Table.tsx
index 86cadc5..eb1bb5f 100644
--- a/hotel-management/src/pages/User/Table.tsx
+++ b/hotel-management/src/pages/User/Table.tsx
@@ -22,13 +22,13 @@ import { useFetch } from '../../hooks/useFetch';
import { USER_PATH } from '../../constants/path';
import { STATUS_CODE } from '../../constants/statusCode';
import { CONFIRM_DELETE, DELETE_SUCCESS } from '../../constants/messages';
+import { USER_PAGE } from '../../constants/variables';
// Styled
import Spinner from '../../commons/styles/Spinner';
// Utils
import { sendRequest } from '../../helpers/sendRequest';
-import { USER_PAGE } from '../../constants/variables';
interface IUserRow {
user: TUser;
@@ -119,7 +119,7 @@ const UserTable = ({
? searchParams.get('orderBy')!
: '';
- const { data, isPending, errorMsg } = useFetch(
+ const { data, isPending, errorFetchMsg } = useFetch(
'users',
'phone',
phoneSearch,
@@ -135,10 +135,10 @@ const UserTable = ({
setUsers([]);
}
- if (errorMsg) {
- console.error(errorMsg);
+ if (errorFetchMsg) {
+ console.error(errorFetchMsg);
}
- }, [data, errorMsg]);
+ }, [data, errorFetchMsg]);
return (
<>
@@ -163,7 +163,7 @@ const UserTable = ({
Name
Identified Code
Phone
- Room
+ Room Id
data={users}