diff --git a/apps/backend/src/libs/enums/enums.ts b/apps/backend/src/libs/enums/enums.ts index d2783b5bc..3715b486c 100644 --- a/apps/backend/src/libs/enums/enums.ts +++ b/apps/backend/src/libs/enums/enums.ts @@ -1,3 +1,4 @@ +export { SortType } from "@git-fit/shared"; export { APIPath, AppEnvironment, diff --git a/apps/backend/src/modules/projects/project.repository.ts b/apps/backend/src/modules/projects/project.repository.ts index 3bd525726..e6aafc9bc 100644 --- a/apps/backend/src/modules/projects/project.repository.ts +++ b/apps/backend/src/modules/projects/project.repository.ts @@ -1,3 +1,4 @@ +import { SortType } from "~/libs/enums/enums.js"; import { type Repository } from "~/libs/types/types.js"; import { ProjectEntity } from "./project.entity.js"; @@ -36,7 +37,10 @@ class ProjectRepository implements Repository { } public async findAll(): Promise { - const projects = await this.projectModel.query().execute(); + const projects = await this.projectModel + .query() + .orderBy("created_at", SortType.DESCENDING) + .execute(); return projects.map((project) => ProjectEntity.initialize(project)); } diff --git a/apps/frontend/src/assets/css/variables.css b/apps/frontend/src/assets/css/variables.css index da9ddc1b4..e4f169378 100644 --- a/apps/frontend/src/assets/css/variables.css +++ b/apps/frontend/src/assets/css/variables.css @@ -19,6 +19,7 @@ --color-success: #0d9c00; --color-warning: #d3bf06; --color-danger: #ca4925; + --color-danger-hover: #b83b19; /* Shadow */ --box-shadow: 0px 0px 25px 0px #00000080; diff --git a/apps/frontend/src/libs/components/button/button.tsx b/apps/frontend/src/libs/components/button/button.tsx index bd78260d8..020419bcc 100644 --- a/apps/frontend/src/libs/components/button/button.tsx +++ b/apps/frontend/src/libs/components/button/button.tsx @@ -1,4 +1,5 @@ import { NavLink } from "~/libs/components/components.js"; +import { getValidClassNames } from "~/libs/helpers/helpers.js"; import styles from "./styles.module.css"; @@ -6,25 +7,39 @@ type Properties = { href?: string | undefined; isDisabled?: boolean; label: string; + onClick?: () => void; type?: "button" | "submit"; + variant?: "danger" | "default" | "outlined"; }; const Button = ({ href, - isDisabled = false, + isDisabled, label, + onClick, type = "button", + variant = "default", }: Properties): JSX.Element => { + const buttonClassName = getValidClassNames( + styles["button"], + styles[`button-${variant}`], + ); + if (href) { return ( - + {label} ); } return ( - ); diff --git a/apps/frontend/src/libs/components/button/styles.module.css b/apps/frontend/src/libs/components/button/styles.module.css index 95f2ae424..9aa7efa8f 100644 --- a/apps/frontend/src/libs/components/button/styles.module.css +++ b/apps/frontend/src/libs/components/button/styles.module.css @@ -1,4 +1,5 @@ .button { + min-height: 44px; padding: 10px 16px; font-family: Inter, sans-serif; font-size: 16px; @@ -21,3 +22,20 @@ .button:hover:not(:disabled) { background-color: var(--color-brand-primary-hover); } + +.button-danger { + background-color: var(--color-danger); +} + +.button-danger:hover:not(:disabled) { + background-color: var(--color-danger-hover); +} + +.button-outlined { + background-color: transparent; + border: 1px solid var(--color-brand-primary); +} + +.button-outlined:hover:not(:disabled) { + background-color: var(--color-background-hover); +} diff --git a/apps/frontend/src/libs/components/input/input.tsx b/apps/frontend/src/libs/components/input/input.tsx index af41313cd..fdabf53f0 100644 --- a/apps/frontend/src/libs/components/input/input.tsx +++ b/apps/frontend/src/libs/components/input/input.tsx @@ -20,6 +20,7 @@ type Properties = { name: FieldPath; placeholder?: string; rightIcon?: JSX.Element; + rowsCount?: number; type?: "email" | "password" | "text"; }; @@ -33,6 +34,7 @@ const Input = ({ name, placeholder = "", rightIcon, + rowsCount, type = "text", }: Properties): JSX.Element => { const { field } = useFormController({ control, name }); @@ -41,11 +43,7 @@ const Input = ({ const hasError = Boolean(error); const hasLeftIcon = Boolean(leftIcon); const hasRightIcon = Boolean(rightIcon); - const inputClassNames = getValidClassNames( - styles["input-field"], - hasLeftIcon && styles["with-left-icon"], - hasRightIcon && styles["with-right-icon"], - ); + const isTextArea = Boolean(rowsCount); return (