From ac841ba8e0017e86abe8b9d3c9465af41172ae5c Mon Sep 17 00:00:00 2001 From: Sam Liu Date: Wed, 3 Jul 2024 08:58:10 +0000 Subject: [PATCH] [FWA-5] Update Home List Function --- backend/db/init_db.py | 2 + backend/repos/repository_houses.py | 6 +- backend/repos/seeder/__init__.py | 1 + backend/repos/seeder/init_house.py | 26 +++++ backend/repos/seeder/init_users.py | 10 +- backend/routes/house/house.py | 2 +- backend/services/house/house_service.py | 2 +- frontend/src/api/house.js | 4 +- frontend/src/components/AreaAdd/AreaAdd.jsx | 16 ++- .../common/ConfirmPopup/ConfirmPopup.jsx | 31 +++++- .../common/Pagination/Pagination.jsx | 5 + frontend/src/hooks/usePagination.js | 2 +- frontend/src/lang/en.json | 64 +++++++++++- frontend/src/lang/vi.json | 4 +- frontend/src/pages/House/House.jsx | 99 +++++++++---------- 15 files changed, 197 insertions(+), 77 deletions(-) create mode 100644 backend/repos/seeder/init_house.py diff --git a/backend/db/init_db.py b/backend/db/init_db.py index 67697b6..cd9eba8 100644 --- a/backend/db/init_db.py +++ b/backend/db/init_db.py @@ -12,6 +12,7 @@ from backend.core.config import get_app_settings from backend.db.db_setup import session_context from backend.repos.repository_users import RepositoryUsers from backend.repos.seeder import default_users_init +from backend.repos.seeder.init_house import default_house_init PROJECT_DIR = Path(__file__).parent.parent.parent @@ -20,6 +21,7 @@ logger = root_logger.get_logger() def init_db(db) -> None: logger.info("Initializing user data...") default_users_init(db) + default_house_init(db) def db_is_at_head(alembic_cfg: config.Config) -> bool: settings = get_app_settings() diff --git a/backend/repos/repository_houses.py b/backend/repos/repository_houses.py index 1381304..4225e7c 100644 --- a/backend/repos/repository_houses.py +++ b/backend/repos/repository_houses.py @@ -9,13 +9,13 @@ class RepositoryHouses: self.areas = Areas() def get_all(self, skip: int = 0, limit: int = 100): - return self.houses.query.filter_by(deleted_at=None).offset(skip).limit(limit).all() + return self.houses.query.filter_by(deleted_at=None).offset(skip*limit).limit(limit).all() def get_all_areas(self, house_id: str, skip: int = 0, limit: int = 100): return self.areas.query.filter_by(deleted_at=None, house_id=house_id).offset(skip).limit(limit).all() - def get_count_all(self, skip: int = 0, limit: int = 100): - return self.houses.query.filter_by(deleted_at=None).offset(skip).limit(limit).count() + def get_count_all(self): + return self.houses.query.filter_by(deleted_at=None).count() def get_by_id(self, house_id: str): return self.houses.query.filter_by(id=house_id).one() diff --git a/backend/repos/seeder/__init__.py b/backend/repos/seeder/__init__.py index 28251c6..17f8770 100644 --- a/backend/repos/seeder/__init__.py +++ b/backend/repos/seeder/__init__.py @@ -1 +1,2 @@ from .init_users import default_users_init +from .init_house import default_house_init diff --git a/backend/repos/seeder/init_house.py b/backend/repos/seeder/init_house.py new file mode 100644 index 0000000..f22701e --- /dev/null +++ b/backend/repos/seeder/init_house.py @@ -0,0 +1,26 @@ +from backend.core.config import get_app_settings +from backend.core.root_logger import get_logger +from backend.repos.repository_houses import RepositoryHouses +from sqlalchemy.orm import Session + +from backend.schemas.house.house import HouseCreate + + +logger = get_logger("init_house") +settings = get_app_settings() + +def dev_houses() -> list[dict]: + list = [] + for x in range(20): + list.append({ + "icon": "IconAccessible", + "name": f"Home{x+1}", + "address": f"Address{x+1}", + "areas": [{"name": f"Area{x+1}", "desc": "Description"}], + }) + return list + +def default_house_init(session: Session): + houses = RepositoryHouses() + for house in dev_houses(): + houses.create(session, HouseCreate(**house)) diff --git a/backend/repos/seeder/init_users.py b/backend/repos/seeder/init_users.py index b21f6c6..cbea105 100644 --- a/backend/repos/seeder/init_users.py +++ b/backend/repos/seeder/init_users.py @@ -12,19 +12,13 @@ settings = get_app_settings() def dev_users() -> list[dict]: return [ { - "username": "sam", + "username": "admin", "password": "admin", "name": "Sam", "is_admin": True, }, { - "username": "duy", - "password": "admin", - "name": "Duy", - "is_admin": True, - }, - { - "username": "sam1", + "username": "admin1", "password": "admin", "name": "Sam1", "is_admin": False, diff --git a/backend/routes/house/house.py b/backend/routes/house/house.py index 102f844..88163ef 100644 --- a/backend/routes/house/house.py +++ b/backend/routes/house/house.py @@ -28,6 +28,6 @@ def create_house(house: HouseCreate, db: db_dependency, current_user: current_us @public_router.get("/all", response_model=ReturnValue[HousesListResponse]) async def get_all_house(page: int, pageSize: int, current_user: current_user_token) -> ReturnValue[HousesListResponse]: - housesCount = house_service.get_all_count(skip=page-1, limit=pageSize) + housesCount = house_service.get_all_count() houses = house_service.get_all(skip=page-1, limit=pageSize) return ReturnValue(status=200, data={'total': housesCount, 'list': list(houses)}) diff --git a/backend/services/house/house_service.py b/backend/services/house/house_service.py index c5d4c13..4f2a6c8 100644 --- a/backend/services/house/house_service.py +++ b/backend/services/house/house_service.py @@ -14,4 +14,4 @@ class HouseService(BaseService): return self.repos.get_all(skip=skip, limit=limit) def get_all_count(self, skip: int = 0, limit: int = 100): - return self.repos.get_count_all(skip=skip, limit=limit) + return self.repos.get_count_all() diff --git a/frontend/src/api/house.js b/frontend/src/api/house.js index 4318421..8bcf2f7 100644 --- a/frontend/src/api/house.js +++ b/frontend/src/api/house.js @@ -8,8 +8,8 @@ export const postCreateHouse = (payload) => { export const getAllHouse = ({ page, pageSize }) => { return protocol.get( GET_HOUSES_LIST({ - page: page(), - pageSize: pageSize(), + page, + pageSize, }), {}, ) diff --git a/frontend/src/components/AreaAdd/AreaAdd.jsx b/frontend/src/components/AreaAdd/AreaAdd.jsx index 50ab582..161225a 100644 --- a/frontend/src/components/AreaAdd/AreaAdd.jsx +++ b/frontend/src/components/AreaAdd/AreaAdd.jsx @@ -1,3 +1,4 @@ +import ConfirmPopup from '@components/common/ConfirmPopup' import Popup from '@components/common/Popup' import TextInput from '@components/common/TextInput' import Textarea from '@components/common/Textarea' @@ -11,7 +12,7 @@ import { IconInfoCircle, IconVector, } from '@tabler/icons-solidjs' -import { For, Show, createSignal } from 'solid-js' +import { For, Show, createComponent, createSignal } from 'solid-js' import * as yup from 'yup' import AreaItem from './AreaItem' @@ -48,10 +49,19 @@ export default function AreaAdd(props) { setOpenModal(true) } - const onDeleteAreaItem = (index) => { + const onConfirmDelete = (index) => { setData((prev) => [...prev.slice(0, index), ...prev.slice(index + 1)]) } + const onClickDeleteItem = (index) => { + createComponent(ConfirmPopup, { + title: language?.message['CONFIRM_DELETE'], + children: language?.message['CONFIRM_DELETE_NOTE'], + deleteId: index, + onConfirm: onConfirmDelete, + }) + } + return (
@@ -93,7 +103,7 @@ export default function AreaAdd(props) { {...item} formName={props.name} key={index()} - onDelete={onDeleteAreaItem} + onDelete={onClickDeleteItem} /> )} diff --git a/frontend/src/components/common/ConfirmPopup/ConfirmPopup.jsx b/frontend/src/components/common/ConfirmPopup/ConfirmPopup.jsx index 78ed15f..0c954c2 100644 --- a/frontend/src/components/common/ConfirmPopup/ConfirmPopup.jsx +++ b/frontend/src/components/common/ConfirmPopup/ConfirmPopup.jsx @@ -1,21 +1,44 @@ -import { IconCirclePlus } from '@tabler/icons-solidjs' +import useLanguage from '@hooks/useLanguage' +import { IconAlertTriangle } from '@tabler/icons-solidjs' import { Show, createSignal } from 'solid-js' import Popup from '../Popup' export default function ConfirmPopup(props) { const [openModal, setOpenModal] = createSignal(true) + const { language } = useLanguage() + + const onConfirm = () => { + props.onConfirm(props.deleteId) + setOpenModal(false) + } return ( } - title="abc" - titleClass="text-lg" + icon={} + title={props.title} + titleClass="text-md" openModal={openModal()} onModalClose={() => setOpenModal(false)} class="!w-4/12 !max-w-4xl" > + ) diff --git a/frontend/src/components/common/Pagination/Pagination.jsx b/frontend/src/components/common/Pagination/Pagination.jsx index ce090d2..472bdc4 100644 --- a/frontend/src/components/common/Pagination/Pagination.jsx +++ b/frontend/src/components/common/Pagination/Pagination.jsx @@ -23,6 +23,7 @@ export default function Pagination(props) { -
-
1
-
- -
-
Nhà 1
-
Data 4
-
- - -
-
-
-
2
-
- -
-
Nhà 2
-
Data 4
-
- - -
-
+ + {(item, idx) => ( +
+
+ {pageSize() * currentPage() - (pageSize() - idx() - 1)} +
+
+ +
+
{item?.name}
+
{item?.address}
+
+ + +
+
+ )} +
- {language.ui.showing}: 1 - 10 / 100 + + {language.ui.showing}:{' '} + {getPaginationText(totalRecord(), pageSize(), currentPage())} +