From 9d7ae9e6dc044e44bcd9dc5ee3d9ef7b65f58a33 Mon Sep 17 00:00:00 2001 From: Grzegorz Pokorski Date: Mon, 23 Jan 2023 00:36:24 +0100 Subject: [PATCH 1/8] feat: add ability to sort questions by update / edit date --- apps/api/modules/questions/questions.routes.ts | 2 ++ apps/api/modules/questions/questions.schemas.ts | 2 ++ apps/app/src/lib/order.ts | 4 +++- packages/openapi-types/types.ts | 12 ++++++++++-- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/apps/api/modules/questions/questions.routes.ts b/apps/api/modules/questions/questions.routes.ts index 1afc0180..fc6bc035 100644 --- a/apps/api/modules/questions/questions.routes.ts +++ b/apps/api/modules/questions/questions.routes.ts @@ -49,6 +49,7 @@ const questionsPlugin: FastifyPluginAsync = async (fastify) => { levelId: true, statusId: true, acceptedAt: true, + updatedAt: true, _count: { select: { QuestionVote: true, @@ -66,6 +67,7 @@ const questionsPlugin: FastifyPluginAsync = async (fastify) => { _levelId: q.levelId, _statusId: q.statusId, acceptedAt: q.acceptedAt?.toISOString(), + updatedAt: q.updatedAt?.toISOString(), votesCount: q._count.QuestionVote, }; }); diff --git a/apps/api/modules/questions/questions.schemas.ts b/apps/api/modules/questions/questions.schemas.ts index 369e7454..89ffe882 100644 --- a/apps/api/modules/questions/questions.schemas.ts +++ b/apps/api/modules/questions/questions.schemas.ts @@ -26,6 +26,7 @@ const generateGetQuestionsQuerySchema = < Type.Literal("acceptedAt"), Type.Literal("level"), Type.Literal("votesCount"), + Type.Literal("updatedAt"), ]), order: Type.Union([Type.Literal("asc"), Type.Literal("desc")]), userId: Type.Integer(), @@ -51,6 +52,7 @@ const generateQuestionShape = < _levelId: Type.Union(args.levels.map((val) => Type.Literal(val))), _statusId: Type.Union(args.statuses.map((val) => Type.Literal(val))), acceptedAt: Type.Optional(Type.String({ format: "date-time" })), + updatedAt: Type.Optional(Type.String({ format: "date-time" })), } as const; }; diff --git a/apps/app/src/lib/order.ts b/apps/app/src/lib/order.ts index b622ad27..3fa0a005 100644 --- a/apps/app/src/lib/order.ts +++ b/apps/app/src/lib/order.ts @@ -1,6 +1,6 @@ import { QueryParam } from "../types"; -const ordersBy = ["acceptedAt", "level", "votesCount"] as const; +const ordersBy = ["acceptedAt", "level", "votesCount", "updatedAt"] as const; const orders = ["asc", "desc"] as const; export const DEFAULT_SORT_BY_QUERY = "acceptedAt*desc"; @@ -11,6 +11,8 @@ export const sortByLabels: Record<`${OrderBy}*${Order}`, string> = { "level*desc": "od najtrudniejszych", "votesCount*asc": "od najmniej popularnych", "votesCount*desc": "od najpopularniejszych", + "updatedAt*desc": "daty edycji (najnowsze)", + "updatedAt*asc": "daty edycji (najstarsze)", }; type OrderBy = typeof ordersBy[number]; diff --git a/packages/openapi-types/types.ts b/packages/openapi-types/types.ts index 3bd75e52..9033a4eb 100644 --- a/packages/openapi-types/types.ts +++ b/packages/openapi-types/types.ts @@ -79,7 +79,7 @@ export interface paths { level?: string; limit?: number; offset?: number; - orderBy?: "acceptedAt" | "level" | "votesCount"; + orderBy?: "acceptedAt" | "level" | "votesCount" | "updatedAt"; order?: "asc" | "desc"; userId?: number; }; @@ -97,6 +97,8 @@ export interface paths { _statusId: "pending" | "accepted"; /** Format: date-time */ acceptedAt?: string; + /** Format: date-time */ + updatedAt?: string; votesCount: number; }[]; meta: { @@ -130,6 +132,8 @@ export interface paths { _statusId: "pending" | "accepted"; /** Format: date-time */ acceptedAt?: string; + /** Format: date-time */ + updatedAt?: string; votesCount: number; }; }; @@ -147,7 +151,7 @@ export interface paths { level?: string; limit?: number; offset?: number; - orderBy?: "acceptedAt" | "level" | "votesCount"; + orderBy?: "acceptedAt" | "level" | "votesCount" | "updatedAt"; order?: "asc" | "desc"; userId?: number; }; @@ -246,6 +250,8 @@ export interface paths { _statusId: "pending" | "accepted"; /** Format: date-time */ acceptedAt?: string; + /** Format: date-time */ + updatedAt?: string; votesCount: number; }; }; @@ -293,6 +299,8 @@ export interface paths { _statusId: "pending" | "accepted"; /** Format: date-time */ acceptedAt?: string; + /** Format: date-time */ + updatedAt?: string; votesCount: number; }; }; From 51ee25c62c5ac0589d2f2db6cf4d9334fcb3eaf1 Mon Sep 17 00:00:00 2001 From: Grzegorz Pokorski Date: Mon, 23 Jan 2023 02:28:57 +0100 Subject: [PATCH 2/8] feat: add ability to sort questions in user and admin dashboard --- .../admin/[status]/[page]/page.tsx | 13 ++++++++++-- .../user/questions/[page]/page.tsx | 12 +++++++++-- .../src/components/AdminPanel/AdminPanel.tsx | 16 ++++++++++++-- .../FilterableQuestionsList.tsx | 3 +++ .../FilterableQuestionsListHeader.tsx | 21 +++++++++++++++++++ .../UserQuestions/UserQuestions.tsx | 9 ++++++-- apps/app/src/hooks/useGetAllQuestions.ts | 9 +++++++- apps/app/src/lib/order.ts | 4 ++-- 8 files changed, 76 insertions(+), 11 deletions(-) diff --git a/apps/app/src/app/(main-layout)/admin/[status]/[page]/page.tsx b/apps/app/src/app/(main-layout)/admin/[status]/[page]/page.tsx index fe9584c1..c71aa4d2 100644 --- a/apps/app/src/app/(main-layout)/admin/[status]/[page]/page.tsx +++ b/apps/app/src/app/(main-layout)/admin/[status]/[page]/page.tsx @@ -5,6 +5,7 @@ import { parseQueryLevels } from "../../../../../lib/level"; import { statuses } from "../../../../../lib/question"; import { parseTechnologyQuery } from "../../../../../lib/technologies"; import { Params, SearchParams } from "../../../../../types"; +import { DEFAULT_SORT_BY_QUERY, parseQuerySortBy } from "../../../../../lib/order"; const AdminPanel = dynamic( () => @@ -19,11 +20,12 @@ export default function AdminPage({ searchParams, }: { params: Params<"status" | "page">; - searchParams?: SearchParams<"technology" | "level">; + searchParams?: SearchParams<"technology" | "level" | "sortBy">; }) { const page = Number.parseInt(params.page); const technology = parseTechnologyQuery(searchParams?.technology); const levels = parseQueryLevels(searchParams?.level); + const sortBy = parseQuerySortBy(searchParams?.sortBy || DEFAULT_SORT_BY_QUERY); if (Number.isNaN(page) || !statuses.includes(params.status)) { return redirect("/admin"); @@ -31,7 +33,14 @@ export default function AdminPage({ return ( - + ); } diff --git a/apps/app/src/app/(main-layout)/user/questions/[page]/page.tsx b/apps/app/src/app/(main-layout)/user/questions/[page]/page.tsx index 90e2d674..9fb363b8 100644 --- a/apps/app/src/app/(main-layout)/user/questions/[page]/page.tsx +++ b/apps/app/src/app/(main-layout)/user/questions/[page]/page.tsx @@ -2,6 +2,7 @@ import { redirect } from "next/navigation"; import { PrivateRoute } from "../../../../../components/PrivateRoute"; import { UserQuestions } from "../../../../../components/UserQuestions/UserQuestions"; import { parseQueryLevels } from "../../../../../lib/level"; +import { DEFAULT_SORT_BY_QUERY, parseQuerySortBy } from "../../../../../lib/order"; import { parseTechnologyQuery } from "../../../../../lib/technologies"; import { Params, SearchParams } from "../../../../../types"; @@ -10,11 +11,12 @@ export default function UserQuestionsPage({ searchParams, }: { params: Params<"page">; - searchParams?: SearchParams<"technology" | "level">; + searchParams?: SearchParams<"technology" | "level" | "sortBy">; }) { const page = Number.parseInt(params.page); const technology = parseTechnologyQuery(searchParams?.technology); const levels = parseQueryLevels(searchParams?.level); + const sortBy = parseQuerySortBy(searchParams?.sortBy || DEFAULT_SORT_BY_QUERY); if (Number.isNaN(page)) { return redirect("/user/questions"); @@ -22,7 +24,13 @@ export default function UserQuestionsPage({ return ( - + ); } diff --git a/apps/app/src/components/AdminPanel/AdminPanel.tsx b/apps/app/src/components/AdminPanel/AdminPanel.tsx index a0d1eaee..b6bec132 100644 --- a/apps/app/src/components/AdminPanel/AdminPanel.tsx +++ b/apps/app/src/components/AdminPanel/AdminPanel.tsx @@ -3,6 +3,7 @@ import { Suspense, useCallback } from "react"; import { useGetAllQuestions } from "../../hooks/useGetAllQuestions"; import { Level } from "../../lib/level"; +import { Order, OrderBy } from "../../lib/order"; import { QuestionStatus } from "../../lib/question"; import { Technology } from "../../lib/technologies"; import { FilterableQuestionsList } from "../FilterableQuestionsList/FilterableQuestionsList"; @@ -13,14 +14,25 @@ type AdminPanelProps = Readonly<{ technology: Technology | null; levels: Level[] | null; status: QuestionStatus; + order?: Order; + orderBy?: OrderBy; }>; -export const AdminPanel = ({ page, technology, levels, status }: AdminPanelProps) => { +export const AdminPanel = ({ + page, + technology, + levels, + status, + order, + orderBy, +}: AdminPanelProps) => { const { isSuccess, data, refetch } = useGetAllQuestions({ page, status, technology, levels, + order, + orderBy, }); const refetchQuestions = useCallback(() => { @@ -32,7 +44,7 @@ export const AdminPanel = ({ page, technology, levels, status }: AdminPanelProps page={page} total={data?.data.meta.total || 0} getHref={(page) => `/admin/${status}/${page}`} - data={{ status, technology, levels }} + data={{ status, technology, levels, order, orderBy }} > {isSuccess && data.data.data.length > 0 ? ( diff --git a/apps/app/src/components/FilterableQuestionsList/FilterableQuestionsList.tsx b/apps/app/src/components/FilterableQuestionsList/FilterableQuestionsList.tsx index 5c2a7f6c..650e379c 100644 --- a/apps/app/src/components/FilterableQuestionsList/FilterableQuestionsList.tsx +++ b/apps/app/src/components/FilterableQuestionsList/FilterableQuestionsList.tsx @@ -1,4 +1,5 @@ import { ComponentProps, ReactNode } from "react"; +import { Order, OrderBy } from "../../lib/order"; import { QuestionStatus } from "../../lib/question"; import { Technology } from "../../lib/technologies"; import { Level } from "../QuestionItem/QuestionLevel"; @@ -11,6 +12,8 @@ type FilterableQuestionsListProps = Readonly<{ status?: QuestionStatus; technology?: Technology | null; levels?: Level[] | null; + order?: Order; + orderBy?: OrderBy; }; children: ReactNode; }> & diff --git a/apps/app/src/components/FilterableQuestionsList/FilterableQuestionsListHeader.tsx b/apps/app/src/components/FilterableQuestionsList/FilterableQuestionsListHeader.tsx index 69f2d20b..1cd65a88 100644 --- a/apps/app/src/components/FilterableQuestionsList/FilterableQuestionsListHeader.tsx +++ b/apps/app/src/components/FilterableQuestionsList/FilterableQuestionsListHeader.tsx @@ -2,6 +2,7 @@ import { useRouter } from "next/navigation"; import { ChangeEvent, ReactNode } from "react"; import { useDevFAQRouter } from "../../hooks/useDevFAQRouter"; import { levels } from "../../lib/level"; +import { Order, OrderBy, sortByLabels } from "../../lib/order"; import { QuestionStatus, statuses } from "../../lib/question"; import { technologies, technologiesLabels, Technology } from "../../lib/technologies"; import { Level } from "../QuestionItem/QuestionLevel"; @@ -11,6 +12,8 @@ type FilterableQuestionsListHeaderProps = Readonly<{ status?: QuestionStatus; technology?: Technology | null; levels?: Level[] | null; + order?: Order; + orderBy?: OrderBy; }>; const SelectLabel = ({ children }: { readonly children: ReactNode }) => ( @@ -21,6 +24,8 @@ export const FilterableQuestionsListHeader = ({ status, technology, levels: selectedLevels, + order, + orderBy, }: FilterableQuestionsListHeaderProps) => { const { mergeQueryParams } = useDevFAQRouter(); const router = useRouter(); @@ -66,6 +71,22 @@ export const FilterableQuestionsListHeader = ({ )} + {order && orderBy && ( + + Sortuj według: + + + )} {status !== undefined && ( Status: diff --git a/apps/app/src/components/UserQuestions/UserQuestions.tsx b/apps/app/src/components/UserQuestions/UserQuestions.tsx index b2b665cf..508112f3 100644 --- a/apps/app/src/components/UserQuestions/UserQuestions.tsx +++ b/apps/app/src/components/UserQuestions/UserQuestions.tsx @@ -3,6 +3,7 @@ import { Suspense } from "react"; import { useGetAllQuestions } from "../../hooks/useGetAllQuestions"; import { useUser } from "../../hooks/useUser"; +import { Order, OrderBy } from "../../lib/order"; import { Technology } from "../../lib/technologies"; import { FilterableQuestionsList } from "../FilterableQuestionsList/FilterableQuestionsList"; import { Level } from "../QuestionItem/QuestionLevel"; @@ -12,15 +13,19 @@ type UserQuestionsProps = Readonly<{ page: number; technology: Technology | null; levels: Level[] | null; + order?: Order; + orderBy?: OrderBy; }>; -export const UserQuestions = ({ page, technology, levels }: UserQuestionsProps) => { +export const UserQuestions = ({ page, technology, levels, order, orderBy }: UserQuestionsProps) => { const { userData } = useUser(); const { isSuccess, data } = useGetAllQuestions({ page, technology, levels, userId: userData?._user.id, + order, + orderBy, }); return ( @@ -28,7 +33,7 @@ export const UserQuestions = ({ page, technology, levels }: UserQuestionsProps) page={page} total={data?.data.meta.total || 0} getHref={(page) => `/user/questions/${page}`} - data={{ technology, levels }} + data={{ technology, levels, order, orderBy }} > {isSuccess && data.data.data.length > 0 ? ( diff --git a/apps/app/src/hooks/useGetAllQuestions.ts b/apps/app/src/hooks/useGetAllQuestions.ts index 372cd5dc..f7d2c3f3 100644 --- a/apps/app/src/hooks/useGetAllQuestions.ts +++ b/apps/app/src/hooks/useGetAllQuestions.ts @@ -1,6 +1,7 @@ import { useQuery } from "@tanstack/react-query"; import { PAGE_SIZE } from "../lib/constants"; import { Level } from "../lib/level"; +import { Order, OrderBy, sortByLabels } from "../lib/order"; import { QuestionStatus } from "../lib/question"; import { Technology } from "../lib/technologies"; import { getAllQuestions } from "../services/questions.service"; @@ -11,15 +12,19 @@ export const useGetAllQuestions = ({ levels, status, userId, + order, + orderBy, }: { page: number; technology: Technology | null; levels: Level[] | null; status?: QuestionStatus; userId?: number; + order?: Order; + orderBy?: OrderBy; }) => { const query = useQuery({ - queryKey: ["questions", { page, technology, levels, status, userId }], + queryKey: ["questions", { page, technology, levels, status, userId, order, orderBy }], queryFn: () => getAllQuestions({ limit: PAGE_SIZE, @@ -28,6 +33,8 @@ export const useGetAllQuestions = ({ ...(levels && { level: levels.join(",") }), status, userId, + order: order, + orderBy: orderBy, }), keepPreviousData: true, }); diff --git a/apps/app/src/lib/order.ts b/apps/app/src/lib/order.ts index 3fa0a005..c0e256f0 100644 --- a/apps/app/src/lib/order.ts +++ b/apps/app/src/lib/order.ts @@ -15,8 +15,8 @@ export const sortByLabels: Record<`${OrderBy}*${Order}`, string> = { "updatedAt*asc": "daty edycji (najstarsze)", }; -type OrderBy = typeof ordersBy[number]; -type Order = typeof orders[number]; +export type OrderBy = typeof ordersBy[number]; +export type Order = typeof orders[number]; export const parseQuerySortBy = (query: QueryParam) => { if (typeof query !== "string") { From 57c9b9f974bd7f543a3b198cc29c19f6de748803 Mon Sep 17 00:00:00 2001 From: Grzegorz Pokorski Date: Mon, 23 Jan 2023 17:35:22 +0100 Subject: [PATCH 3/8] Update apps/app/src/hooks/useGetAllQuestions.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michał Miszczyszyn --- apps/app/src/hooks/useGetAllQuestions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/app/src/hooks/useGetAllQuestions.ts b/apps/app/src/hooks/useGetAllQuestions.ts index f7d2c3f3..fdb49607 100644 --- a/apps/app/src/hooks/useGetAllQuestions.ts +++ b/apps/app/src/hooks/useGetAllQuestions.ts @@ -33,8 +33,8 @@ export const useGetAllQuestions = ({ ...(levels && { level: levels.join(",") }), status, userId, - order: order, - orderBy: orderBy, + order, + orderBy, }), keepPreviousData: true, }); From b3b68cad46ded3349795742c53cb9327854301d2 Mon Sep 17 00:00:00 2001 From: Grzegorz Pokorski Date: Mon, 23 Jan 2023 18:51:18 +0100 Subject: [PATCH 4/8] add "SelectLabel" component --- apps/app/src/components/SelectLabel.tsx | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 apps/app/src/components/SelectLabel.tsx diff --git a/apps/app/src/components/SelectLabel.tsx b/apps/app/src/components/SelectLabel.tsx new file mode 100644 index 00000000..ff0c95ec --- /dev/null +++ b/apps/app/src/components/SelectLabel.tsx @@ -0,0 +1,5 @@ +import { ReactNode } from "react"; + +export const SelectLabel = ({ children }: { readonly children: ReactNode }) => ( + +); From 764b5c63dfbc1e60ea9dca4c452372bb7c0027e5 Mon Sep 17 00:00:00 2001 From: Grzegorz Pokorski Date: Mon, 23 Jan 2023 18:52:07 +0100 Subject: [PATCH 5/8] add "SortBySelect" component --- apps/app/src/components/SortBySelect.tsx | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 apps/app/src/components/SortBySelect.tsx diff --git a/apps/app/src/components/SortBySelect.tsx b/apps/app/src/components/SortBySelect.tsx new file mode 100644 index 00000000..d8d8f952 --- /dev/null +++ b/apps/app/src/components/SortBySelect.tsx @@ -0,0 +1,23 @@ +import { ChangeEvent } from "react"; +import { Order, OrderBy, sortByLabels } from "../lib/order"; +import { Select } from "./Select/Select"; +import { SelectLabel } from "./SelectLabel"; + +type SortBySelectProps = { + order: Order; + orderBy: OrderBy; + onChange: (event: ChangeEvent) => void; +}; + +export const SortBySelect = ({ order, orderBy, onChange }: SortBySelectProps) => ( + + Sortowanie: + + +); From 89c1b67f7e6eb514fcb2b12daa6e227961f55551 Mon Sep 17 00:00:00 2001 From: Grzegorz Pokorski Date: Mon, 23 Jan 2023 18:53:12 +0100 Subject: [PATCH 6/8] implement newly created components --- .../FilterableQuestionsListHeader.tsx | 23 ++++--------------- apps/app/src/components/QuestionsHeader.tsx | 18 +++++---------- 2 files changed, 10 insertions(+), 31 deletions(-) diff --git a/apps/app/src/components/FilterableQuestionsList/FilterableQuestionsListHeader.tsx b/apps/app/src/components/FilterableQuestionsList/FilterableQuestionsListHeader.tsx index 1cd65a88..7fd15e77 100644 --- a/apps/app/src/components/FilterableQuestionsList/FilterableQuestionsListHeader.tsx +++ b/apps/app/src/components/FilterableQuestionsList/FilterableQuestionsListHeader.tsx @@ -2,11 +2,13 @@ import { useRouter } from "next/navigation"; import { ChangeEvent, ReactNode } from "react"; import { useDevFAQRouter } from "../../hooks/useDevFAQRouter"; import { levels } from "../../lib/level"; -import { Order, OrderBy, sortByLabels } from "../../lib/order"; +import { Order, OrderBy } from "../../lib/order"; import { QuestionStatus, statuses } from "../../lib/question"; import { technologies, technologiesLabels, Technology } from "../../lib/technologies"; import { Level } from "../QuestionItem/QuestionLevel"; import { Select } from "../Select/Select"; +import { SelectLabel } from "../SelectLabel"; +import { SortBySelect } from "../SortBySelect"; type FilterableQuestionsListHeaderProps = Readonly<{ status?: QuestionStatus; @@ -16,10 +18,6 @@ type FilterableQuestionsListHeaderProps = Readonly<{ orderBy?: OrderBy; }>; -const SelectLabel = ({ children }: { readonly children: ReactNode }) => ( - -); - export const FilterableQuestionsListHeader = ({ status, technology, @@ -72,20 +70,7 @@ export const FilterableQuestionsListHeader = ({ )} {order && orderBy && ( - - Sortuj według: - - + )} {status !== undefined && ( diff --git a/apps/app/src/components/QuestionsHeader.tsx b/apps/app/src/components/QuestionsHeader.tsx index 2f62e123..2b8f0ca0 100644 --- a/apps/app/src/components/QuestionsHeader.tsx +++ b/apps/app/src/components/QuestionsHeader.tsx @@ -4,8 +4,8 @@ import { ChangeEvent } from "react"; import { technologiesLabels, Technology } from "../lib/technologies"; import { pluralize } from "../utils/intl"; import { useQuestionsOrderBy } from "../hooks/useQuestionsOrderBy"; -import { sortByLabels } from "../lib/order"; -import { Select } from "./Select/Select"; +import { parseQuerySortBy } from "../lib/order"; +import { SortBySelect } from "./SortBySelect"; const questionsPluralize = pluralize("pytanie", "pytania", "pytań"); @@ -16,6 +16,7 @@ type QuestionsHeaderProps = Readonly<{ export const QuestionsHeader = ({ technology, total }: QuestionsHeaderProps) => { const { sortBy, setSortByFromString } = useQuestionsOrderBy(); + const sort = parseQuerySortBy(sortBy); const handleSelectChange = (event: ChangeEvent) => { event.preventDefault(); @@ -28,16 +29,9 @@ export const QuestionsHeader = ({ technology, total }: QuestionsHeaderProps) => {technologiesLabels[technology]}: {total} {questionsPluralize(total)} - + {sort?.order && sort?.orderBy && ( + + )} ); }; From a18b4907521e681dac81f4d65d45886ad9f3bbed Mon Sep 17 00:00:00 2001 From: Grzegorz Pokorski Date: Mon, 23 Jan 2023 18:54:09 +0100 Subject: [PATCH 7/8] rename sortByLabels --- apps/app/src/lib/order.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/app/src/lib/order.ts b/apps/app/src/lib/order.ts index c0e256f0..47599b3b 100644 --- a/apps/app/src/lib/order.ts +++ b/apps/app/src/lib/order.ts @@ -5,14 +5,14 @@ const orders = ["asc", "desc"] as const; export const DEFAULT_SORT_BY_QUERY = "acceptedAt*desc"; export const sortByLabels: Record<`${OrderBy}*${Order}`, string> = { - "acceptedAt*asc": "od najstarszych", - "acceptedAt*desc": "od najnowszych", - "level*asc": "od najprostszych", - "level*desc": "od najtrudniejszych", - "votesCount*asc": "od najmniej popularnych", - "votesCount*desc": "od najpopularniejszych", - "updatedAt*desc": "daty edycji (najnowsze)", - "updatedAt*asc": "daty edycji (najstarsze)", + "acceptedAt*asc": "data dodania: najstarsze", + "acceptedAt*desc": "data dodania: najnowsze", + "level*asc": "trudność: od najtrudniejszych", + "level*desc": "trudność: od najprostszych", + "votesCount*asc": "popularność: najmniejsza", + "votesCount*desc": "popularność: największa", + "updatedAt*asc": "data edycji: najstarsze", + "updatedAt*desc": "data edycji: najnowsze", }; export type OrderBy = typeof ordersBy[number]; From 3ef42b0d21487e3983bc1465a5d23a82a01f5f0d Mon Sep 17 00:00:00 2001 From: Grzegorz Pokorski Date: Mon, 23 Jan 2023 22:35:36 +0100 Subject: [PATCH 8/8] Fix 'sortByLabels' labels --- apps/app/src/lib/order.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/app/src/lib/order.ts b/apps/app/src/lib/order.ts index 47599b3b..bcdbb922 100644 --- a/apps/app/src/lib/order.ts +++ b/apps/app/src/lib/order.ts @@ -7,8 +7,8 @@ export const DEFAULT_SORT_BY_QUERY = "acceptedAt*desc"; export const sortByLabels: Record<`${OrderBy}*${Order}`, string> = { "acceptedAt*asc": "data dodania: najstarsze", "acceptedAt*desc": "data dodania: najnowsze", - "level*asc": "trudność: od najtrudniejszych", - "level*desc": "trudność: od najprostszych", + "level*asc": "trudność: od najłatwiejszych", + "level*desc": "trudność: od najtrudniejszych", "votesCount*asc": "popularność: najmniejsza", "votesCount*desc": "popularność: największa", "updatedAt*asc": "data edycji: najstarsze",