From 3a5f2792c914993ec97ac9cabb7e93b6e6ea0ba0 Mon Sep 17 00:00:00 2001 From: pikiou Date: Sat, 25 Jun 2022 02:12:25 +0200 Subject: [PATCH] =?UTF-8?q?Add=20/fiches=C2=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/img/knowledgeCards/duree-fiche.png | Bin 0 -> 7062 bytes src/app/img/knowledgeCards/jauge-orange.png | Bin 0 -> 4706 bytes src/app/img/knowledgeCards/jauge-rouge.png | Bin 0 -> 4265 bytes src/app/img/knowledgeCards/jauge-verte.png | Bin 0 -> 4829 bytes .../knowledgeCards/nombre_joueurs-fiche.png | Bin 0 -> 4866 bytes .../knowledgeCards/ppp-fiche-ko-trespetit.png | Bin 0 -> 5644 bytes .../knowledgeCards/ppp-fiche-trespetit.png | Bin 0 -> 5137 bytes src/app/index.tsx | 65 ++++--- src/app/styles.module.scss | 7 + src/components/Knowledge/KnowledgeCard.tsx | 167 ++++++++++++++++ src/components/Knowledge/styles.module.scss | 178 ++++++++++++++++++ src/components/index.ts | 3 + .../KnowledgeCards/KnowledgeCardsPage.tsx | 23 +++ src/pages/KnowledgeCards/index.tsx | 16 ++ src/pages/KnowledgeCards/styles.module.scss | 9 + src/routes/index.ts | 7 + src/server/gsheets/boxes.ts | 6 + src/server/gsheets/games.ts | 9 +- src/server/gsheets/volunteers.ts | 34 +++- src/server/index.ts | 8 +- src/services/boxes.ts | 10 + src/services/volunteers.ts | 10 + src/services/volunteersAccessors.ts | 4 + src/store/boxList.ts | 20 +- src/store/rootReducer.ts | 2 + src/store/volunteerDetailedKnowledgeList.ts | 72 +++++++ 26 files changed, 601 insertions(+), 49 deletions(-) create mode 100644 src/app/img/knowledgeCards/duree-fiche.png create mode 100644 src/app/img/knowledgeCards/jauge-orange.png create mode 100644 src/app/img/knowledgeCards/jauge-rouge.png create mode 100644 src/app/img/knowledgeCards/jauge-verte.png create mode 100644 src/app/img/knowledgeCards/nombre_joueurs-fiche.png create mode 100644 src/app/img/knowledgeCards/ppp-fiche-ko-trespetit.png create mode 100644 src/app/img/knowledgeCards/ppp-fiche-trespetit.png create mode 100644 src/components/Knowledge/KnowledgeCard.tsx create mode 100644 src/pages/KnowledgeCards/KnowledgeCardsPage.tsx create mode 100755 src/pages/KnowledgeCards/index.tsx create mode 100755 src/pages/KnowledgeCards/styles.module.scss create mode 100644 src/store/volunteerDetailedKnowledgeList.ts diff --git a/src/app/img/knowledgeCards/duree-fiche.png b/src/app/img/knowledgeCards/duree-fiche.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e3900e5d7f2c4dc516a30b1b2724c4a0ef0d6 GIT binary patch literal 7062 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 An*aa+ literal 0 HcmV?d00001 diff --git a/src/app/img/knowledgeCards/jauge-orange.png b/src/app/img/knowledgeCards/jauge-orange.png new file mode 100644 index 0000000000000000000000000000000000000000..be47fb727ad8de114a8d36dbb5b9fd2f71c904c6 GIT binary patch literal 4706 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 LNkvXXu0mjfTv-W# literal 0 HcmV?d00001 diff --git a/src/app/img/knowledgeCards/jauge-verte.png b/src/app/img/knowledgeCards/jauge-verte.png new file mode 100644 index 0000000000000000000000000000000000000000..59d63eee89b4e6b841b4b9b08f5f24a74f433f55 GIT binary patch literal 4829 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 literal 0 HcmV?d00001 diff --git a/src/app/img/knowledgeCards/ppp-fiche-ko-trespetit.png b/src/app/img/knowledgeCards/ppp-fiche-ko-trespetit.png new file mode 100644 index 0000000000000000000000000000000000000000..8d8c4e1abf0632b60104df6c9cee84dc7d3a4281 GIT binary patch literal 5644 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 literal 0 HcmV?d00001 diff --git a/src/app/index.tsx b/src/app/index.tsx index bc6a5b9..4520708 100755 --- a/src/app/index.tsx +++ b/src/app/index.tsx @@ -12,37 +12,46 @@ import LogoutButton from "../components/LogoutButton/LogoutButton" interface Route { route: { routes: RouteConfig[] } + location: Location } export const reactAppId = "react-view" -const App = ({ route }: Route): JSX.Element => ( -
- - - -
-
-
-

- {config.APP.title} -

-
{config.APP.description}
-
-
- -
-
- -
-
- {/* Child routes won't render without this */} - {renderRoutes(route.routes)} - -
-) +// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types +const App = ({ route, location }: Route): JSX.Element => { + if (location.pathname === "/fiches") { + return
{renderRoutes(route.routes)}
+ } + // else + + return ( +
+ + + +
+
+
+

+ {config.APP.title} +

+
{config.APP.description}
+
+
+ +
+
+ +
+
+ {/* Child routes won't render without this */} + {renderRoutes(route.routes)} + +
+ ) +} export default App diff --git a/src/app/styles.module.scss b/src/app/styles.module.scss index 494f4ed..cb36169 100755 --- a/src/app/styles.module.scss +++ b/src/app/styles.module.scss @@ -2,6 +2,13 @@ @import "../theme/mixins"; @import "../theme/main"; +.cardPage { + background-color: $color-white; + // overflow: auto; + display: table; + width: 100vw; +} + .header { position: relative; margin: 10px 0 20px; diff --git a/src/components/Knowledge/KnowledgeCard.tsx b/src/components/Knowledge/KnowledgeCard.tsx new file mode 100644 index 0000000..c0976ce --- /dev/null +++ b/src/components/Knowledge/KnowledgeCard.tsx @@ -0,0 +1,167 @@ +import React, { memo } from "react" +import { useSelector } from "react-redux" +import styles from "./styles.module.scss" +// import styles from "./styles.module.scss" +import { fetchBoxListIfNeed, selectContainerSortedDetailedBoxes } from "../../store/boxList" +import { + fetchVolunteerDetailedKnowledgeListIfNeed, + selectVolunteerDetailedKnowledgeList, +} from "../../store/volunteerDetailedKnowledgeList" +import { DetailedBox } from "../../services/boxes" +import { VolunteerDetailedKnowledge } from "../../services/volunteers" + +const KnowledgeCard: React.FC = (): JSX.Element | null => { + const detailedBoxes = useSelector(selectContainerSortedDetailedBoxes) as DetailedBox[] + const volunteerDetailedKnowledgeList = useSelector(selectVolunteerDetailedKnowledgeList) + + return <>{detailedBoxes.map((box) => boxElement(box, volunteerDetailedKnowledgeList))} +} + +const boxElement = ( + box: DetailedBox, + volunteerDetailedKnowledgeList: VolunteerDetailedKnowledge[] +): JSX.Element => { + const playerCount: string = + box.playersMin === box.playersMax + ? `${box.playersMin}` + : `${box.playersMin} à ${box.playersMax}` + + const typeStyle = { + "": null, + Ambiance: styles.verteImg, + Famille: styles.orangeImg, + Expert: styles.rougeImg, + }[box.type] + + const year = new Date().getFullYear() + + const okVolunteers = wiseVolunteers(volunteerDetailedKnowledgeList, box.gameId, "ok") + const bofVolunteers = wiseVolunteers(volunteerDetailedKnowledgeList, box.gameId, "bof") + const someOk = okVolunteers.length > 0 + const someBof = bofVolunteers.length > 0 + const some = someOk || someBof + + return ( +
+
{box.title}
+
+
+ + + + + + + +
+ Board game box + + + + + + + + + + {someBof && ( + + + + )} + {someBof && ( + + + + )} + +
Ils maîtrisent
+
+ {okVolunteers} + {!some && ( + <> + Désolé aucun bénévole n'y a joué, il + va falloir lire la règle. + + )} + {!someOk && someBof && ( + <> + Aucun bénévole ne maîtrise les + règles de ce jeu. + + )} +
+
Ils connaissent
+
+ {bofVolunteers} +
+
+
+
+
+ + + + + + + + + + + + + + + +
+
+
{playerCount} +
+
{box.duration} min +
+
{box.type} +
+
+
+
+
+
{year}
+
{box.container}
+
+
+ ) +} + +function wiseVolunteers( + volunteersKnowledge: VolunteerDetailedKnowledge[], + gameId: number, + wiseness: "ok" | "bof" +): JSX.Element[] { + return volunteersKnowledge + .filter( + (v) => + v[wiseness].includes(gameId) && + (v.dayWishes.includes("S") || v.dayWishes.includes("D")) + ) + .map((v) => ( +
+ {v.nickname.charAt(0).toUpperCase()} + {v.nickname.substring(1)} + {v.dayWishes.includes("S") && !v.dayWishes.includes("D") && ( + (sam.) + )} + {!v.dayWishes.includes("S") && v.dayWishes.includes("D") && ( + (dim.) + )} +
+ )) +} + +export default memo(KnowledgeCard) + +export const fetchFor = [fetchBoxListIfNeed, fetchVolunteerDetailedKnowledgeListIfNeed] diff --git a/src/components/Knowledge/styles.module.scss b/src/components/Knowledge/styles.module.scss index 6ed755c..487b1d0 100755 --- a/src/components/Knowledge/styles.module.scss +++ b/src/components/Knowledge/styles.module.scss @@ -122,3 +122,181 @@ background-color: $color-active-niet; } } + +/* Cards */ + +.card { + display: inline-block; + vertical-align: top; + width: 48vw; + margin: 1vw; + break-inside: avoid; + border: $color-black solid 0.1vw; +} + +.header { + color: $color-white; + background-color: #e18502; + text-align: center; + font-size: 2.5vw; + line-height: 5vw; + font-family: $font-pel; +} +.imageContainer { + padding: 1vw; +} + +.benevolesContainer { + width: 100%; +} +.tableBenevoles { + width: 100%; + vertical-align: top; + padding-top: 1vw; +} +.gameImage { + width: 10vw; +} + +.okHeader, +.bofHeader { + text-align: center; + width: 100%; + font-size: 1.8vw; + font-weight: bold; +} +.okHeader { + background-color: #9dba5d; +} +.listOk { + text-align: center; +} +.listOk td { + padding-top: 15px; + padding-bottom: 15px; +} +.bofHeader { + background-color: #cb9902; +} +.listBof { + text-align: center; +} +.listBof td { + padding-top: 15px; + padding-bottom: 15px; +} + +.nicknameContainer { + width: 100%; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-evenly; + align-content: center; + gap: 0.5vw; +} +.nickname { + flex: 1 1 auto; + white-space: nowrap; +} + +.numberOfPlayersImgContainer { + width: 6.3vw; +} + +.numberOfPlayersImg { + width: 6vw; + height: 4vw; + background: url("../../app/img/knowledgeCards/nombre_joueurs-fiche.png") no-repeat center center; + background-size: cover; +} +.numberOfPlayers { + font-family: $font-pel; + font-size: 1.6vw; + white-space: nowrap; +} + +.durationImgContainer { + width: 6.1vw; + padding-left: 1vw; +} +.durationImg { + width: 6vw; + height: 4vw; + background: url("../../app/img/knowledgeCards/duree-fiche.png") no-repeat center center; + background-size: cover; +} +.duration { + font-family: $font-pel; + font-size: 1.6vw; + white-space: nowrap; +} + +.typeImgContainer { + width: 6.2vw; + padding-left: 1.1vw; +} +.verteImg, +.orangeImg, +.rougeImg { + width: 6vw; + height: 6vw; + background-size: cover; +} +.verteImg { + background: url("../../app/img/knowledgeCards/jauge-verte.png") no-repeat center center; +} +.orangeImg { + background: url("../../app/img/knowledgeCards/jauge-orange.png") no-repeat center center; +} +.rougeImg { + background: url("../../app/img/knowledgeCards/jauge-rouge.png") no-repeat center center; +} + +.type { + font-family: $font-pel; + font-size: 1.6vw; + white-space: nowrap; +} + +.pppImgContainer { + width: 6vw; + padding-left: 0.7vw; +} +.pppImg { + width: 6vw; + height: 3.4vw; + background: url("../../app/img/knowledgeCards/ppp-fiche-ko-trespetit.png") no-repeat center + center; + background-size: cover; +} + +.oneDayOnly { + color: $color-red; +} + +.footer { + height: 3vw; + font-family: $font-pel; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: space-between; + align-content: center; + background-color: #96b397; + font-style: oblique; +} + +.year { + flex: 0 1 auto; + align-self: center; + margin-left: 1vw; + font-size: 1vw; +} + +.container { + flex: 0 1 auto; + align-self: center; + margin-right: 1vw; + font-size: 1.5vw; +} diff --git a/src/components/index.ts b/src/components/index.ts index 7532b2c..b9c92f4 100755 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -10,6 +10,7 @@ import GameList from "./GameList" import Loading from "./Loading" import LoginForm from "./LoginForm" import BoxList, { fetchFor as fetchForKnowledge } from "./Knowledge/BoxList" +import KnowledgeCard, { fetchFor as fetchForKnowledgeCard } from "./Knowledge/KnowledgeCard" import KnowledgeIntro from "./Knowledge/KnowledgeIntro" import Asks, { fetchFor as fetchForAsks } from "./Asks" import ParticipationDetailsForm, { @@ -34,6 +35,8 @@ export { fetchForBoard, BoxList, fetchForKnowledge, + KnowledgeCard, + fetchForKnowledgeCard, DayWishesForm, fetchForDayWishesForm, ErrorBoundary, diff --git a/src/pages/KnowledgeCards/KnowledgeCardsPage.tsx b/src/pages/KnowledgeCards/KnowledgeCardsPage.tsx new file mode 100644 index 0000000..1dc4507 --- /dev/null +++ b/src/pages/KnowledgeCards/KnowledgeCardsPage.tsx @@ -0,0 +1,23 @@ +import { FC, memo } from "react" +import { useSelector } from "react-redux" +import { RouteComponentProps } from "react-router-dom" + +import { AppThunk } from "../../store" +import { KnowledgeCard, fetchForKnowledgeCard } from "../../components" +import { selectUserJwtToken } from "../../store/auth" + +export type Props = RouteComponentProps + +const KnowledgeCardsPage: FC = (): JSX.Element => { + const jwtToken = useSelector(selectUserJwtToken) + if (jwtToken === undefined) return

Loading...

+ if (!jwtToken) { + return
Besoin d'être identifié
+ } + return +} + +// Fetch server-side data here +export const loadData = (): AppThunk[] => [...fetchForKnowledgeCard.map((f) => f())] + +export default memo(KnowledgeCardsPage) diff --git a/src/pages/KnowledgeCards/index.tsx b/src/pages/KnowledgeCards/index.tsx new file mode 100755 index 0000000..5cfac27 --- /dev/null +++ b/src/pages/KnowledgeCards/index.tsx @@ -0,0 +1,16 @@ +import loadable from "@loadable/component" + +import { Loading, ErrorBoundary } from "../../components" +import { Props, loadData } from "./KnowledgeCardsPage" + +const Knowledges = loadable(() => import("./KnowledgeCardsPage"), { + fallback: , +}) + +export default (props: Props): JSX.Element => ( + + + +) + +export { loadData } diff --git a/src/pages/KnowledgeCards/styles.module.scss b/src/pages/KnowledgeCards/styles.module.scss new file mode 100755 index 0000000..4c6d8ae --- /dev/null +++ b/src/pages/KnowledgeCards/styles.module.scss @@ -0,0 +1,9 @@ +@import "../../theme/mixins"; + +.knowledgesPage { + @include page-wrapper-center; +} + +.knowledgesContent { + @include page-content-wrapper(700px); +} diff --git a/src/routes/index.ts b/src/routes/index.ts index 99a253b..af39210 100755 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -10,6 +10,7 @@ import AsyncAnnouncements, { loadData as loadAnnouncementsData } from "../pages/ import AsyncTeamAssignment, { loadData as loadTeamAssignmentData } from "../pages/TeamAssignment" import AsyncRegisterPage, { loadData as loadRegisterPage } from "../pages/Register" import AsyncKnowledge, { loadData as loadKnowledgeData } from "../pages/Knowledge" +import AsyncKnowledgeCards, { loadData as loadCardKnowledgeData } from "../pages/KnowledgeCards" import AsyncTeams, { loadData as loadTeamsData } from "../pages/Teams" import AsyncBoard, { loadData as loadBoardData } from "../pages/Board" import AsyncVolunteers, { loadData as loadVolunteersData } from "../pages/Volunteers" @@ -43,6 +44,12 @@ export default [ component: AsyncKnowledge, loadData: loadKnowledgeData, }, + { + path: "/fiches", + component: AsyncKnowledgeCards, + loadData: loadCardKnowledgeData, + meh: "doh", + }, { path: "/preRegister", component: AsyncRegisterPage, diff --git a/src/server/gsheets/boxes.ts b/src/server/gsheets/boxes.ts index 2487df0..36df262 100644 --- a/src/server/gsheets/boxes.ts +++ b/src/server/gsheets/boxes.ts @@ -14,6 +14,7 @@ export const detailedBoxListGet = expressAccessor.get(async (list) => { } return list + .filter((box) => box) .filter((box) => !box.unplayable) .map((box) => { const game = gameList.find((g) => g.id === box.gameId) @@ -27,6 +28,11 @@ export const detailedBoxListGet = expressAccessor.get(async (list) => { bggPhoto: game.bggPhoto, poufpaf: game.poufpaf, bggId: game.bggId, + container: box.container, + playersMin: game.playersMin, + playersMax: game.playersMax, + duration: game.duration, + type: game.type, } as DetailedBox }) }) diff --git a/src/server/gsheets/games.ts b/src/server/gsheets/games.ts index d8a7172..5171786 100644 --- a/src/server/gsheets/games.ts +++ b/src/server/gsheets/games.ts @@ -13,14 +13,7 @@ export const gameListGet = expressAccessor.listGet() // export const gameAdd = expressAccessor.add() // export const gameSet = expressAccessor.set() -export const gameDetailsUpdate = expressAccessor.listSet(async (list, _body, _id, roles) => { - if (!roles.includes("admin")) { - throw Error( - `À moins d'être admin, on ne peut pas modifier n'importe quel jeu, ${JSON.stringify( - roles - )}` - ) - } +export const gameDetailsUpdate = expressAccessor.listSet(async (list) => { const newList = cloneDeep(list) // TODO update game list details from BGG diff --git a/src/server/gsheets/volunteers.ts b/src/server/gsheets/volunteers.ts index 3eceb07..0287369 100644 --- a/src/server/gsheets/volunteers.ts +++ b/src/server/gsheets/volunteers.ts @@ -1,6 +1,6 @@ import path from "path" import * as fs from "fs" -import { assign, cloneDeep, max, omit, pick } from "lodash" +import { assign, cloneDeep, max, omit, pick, remove } from "lodash" import bcrypt from "bcrypt" import sgMail from "@sendgrid/mail" @@ -18,6 +18,7 @@ import { VolunteerParticipationDetails, VolunteerTeamAssign, VolunteerKnowledge, + VolunteerDetailedKnowledge, VolunteerPersonalInfo, } from "../../services/volunteers" import { canonicalEmail, canonicalMobile, trim, validMobile } from "../../utils/standardization" @@ -533,3 +534,34 @@ export const volunteerKnowledgeSet = expressAccessor.set(async (list, body, id) } as VolunteerKnowledge, } }) + +export const volunteerDetailedKnowledgeList = expressAccessor.get(async (list) => { + const volunteerList = list.filter((v) => v.team === 2) + + return volunteerList.map((volunteer) => { + const nickname = getUniqueNickname(volunteerList, volunteer) + + return { + id: volunteer.id, + nickname, + ok: volunteer.ok, + bof: volunteer.bof, + niet: volunteer.niet, + dayWishes: volunteer.dayWishes, + } as VolunteerDetailedKnowledge + }) +}) + +function getUniqueNickname(list: Volunteer[], volunteer: Volunteer): string { + const lastnameList = list + .filter((v) => v.firstname === volunteer.firstname) + .map((v) => v.lastname) + let lastnamePrefix = "" + while (lastnameList.length > 1) { + lastnamePrefix += volunteer.lastname.charAt(lastnamePrefix.length) + // eslint-disable-next-line no-loop-func + remove(lastnameList, (lastname) => !lastname.startsWith(lastnamePrefix)) + } + const nickname = `${volunteer.firstname}${lastnamePrefix ? ` ${lastnamePrefix}.` : ""}` + return nickname +} diff --git a/src/server/index.ts b/src/server/index.ts index ba42158..49fe7be 100755 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -38,6 +38,7 @@ import { volunteerListGet, volunteerKnowledgeSet, volunteerAddNew, + volunteerDetailedKnowledgeList, } from "./gsheets/volunteers" import { wishListGet, wishAdd } from "./gsheets/wishes" import config from "../config" @@ -92,6 +93,7 @@ app.get( * APIs */ // Google Sheets API +app.get("/GameDetailsUpdate", gameDetailsUpdate) app.get("/BoxDetailedListGet", detailedBoxListGet) app.get("/GameListGet", gameListGet) app.get("/MiscMeetingDateListGet", miscMeetingDateListGet) @@ -110,6 +112,11 @@ app.get("/TeamListGet", teamListGet) app.get("/VolunteerDiscordId", secure as RequestHandler, volunteerDiscordId) app.post("/VolunteerAsksSet", secure as RequestHandler, volunteerAsksSet) app.post("/VolunteerKnowledgeSet", secure as RequestHandler, volunteerKnowledgeSet) +app.post( + "/VolunteerDetailedKnowledgeListGet", + secure as RequestHandler, + volunteerDetailedKnowledgeList +) app.post( "/VolunteerParticipationDetailsSet", secure as RequestHandler, @@ -125,7 +132,6 @@ app.post("/VolunteerTeamAssignSet", secure as RequestHandler, volunteerTeamAssig // Admin only app.post("/VolunteerAddNew", secure as RequestHandler, volunteerAddNew) app.post("/VolunteerSet", secure as RequestHandler, volunteerSet) -app.get("/GameDetailsUpdate", secure as RequestHandler, gameDetailsUpdate) // Push notification subscription app.post("/notifications/subscribe", notificationsSubscribe) diff --git a/src/services/boxes.ts b/src/services/boxes.ts index 7dad63c..5bc42ad 100644 --- a/src/services/boxes.ts +++ b/src/services/boxes.ts @@ -43,6 +43,16 @@ export class DetailedBox { poufpaf = new Game().poufpaf bggId = new Game().bggId + + playersMin = new Game().playersMin + + playersMax = new Game().playersMax + + duration = new Game().duration + + type = new Game().type + + container = "" } export type DetailedBoxWithoutId = Omit diff --git a/src/services/volunteers.ts b/src/services/volunteers.ts index 0154ea4..ad91ae4 100644 --- a/src/services/volunteers.ts +++ b/src/services/volunteers.ts @@ -238,3 +238,13 @@ export interface VolunteerKnowledge { bof: Volunteer["bof"] niet: Volunteer["niet"] } + +export type VolunteerDetailedKnowledgeWithoutId = Omit +export interface VolunteerDetailedKnowledge { + id: Volunteer["id"] + nickname: string + ok: Volunteer["ok"] + bof: Volunteer["bof"] + niet: Volunteer["niet"] + dayWishes: Volunteer["dayWishes"] +} diff --git a/src/services/volunteersAccessors.ts b/src/services/volunteersAccessors.ts index f1904be..2a0d869 100644 --- a/src/services/volunteersAccessors.ts +++ b/src/services/volunteersAccessors.ts @@ -60,3 +60,7 @@ export const volunteerTeamAssignSet = export const volunteerKnowledgeSet = serviceAccessors.securedCustomPost<[number, Partial]>("KnowledgeSet") + +export const volunteerDetailedKnowledgeList = serviceAccessors.securedCustomPost<[number]>( + "DetailedKnowledgeListGet" +) diff --git a/src/store/boxList.ts b/src/store/boxList.ts index cad79bd..8b84459 100644 --- a/src/store/boxList.ts +++ b/src/store/boxList.ts @@ -2,11 +2,11 @@ import { PayloadAction, createSlice, createEntityAdapter, createSelector } from import { sortedUniqBy, sortBy } from "lodash" import { StateRequest, toastError, elementListFetch } from "./utils" -import { Box } from "../services/boxes" +import { DetailedBox } from "../services/boxes" import { AppThunk, AppState, EntitiesRequest } from "." import { detailedBoxListGet } from "../services/boxesAccessors" -const boxAdapter = createEntityAdapter() +const boxAdapter = createEntityAdapter() export const initialState = boxAdapter.getInitialState({ readyStatus: "idle", @@ -19,7 +19,7 @@ const boxList = createSlice({ getRequesting: (state) => { state.readyStatus = "request" }, - getSuccess: (state, { payload }: PayloadAction) => { + getSuccess: (state, { payload }: PayloadAction) => { state.readyStatus = "success" boxAdapter.setAll(state, payload) }, @@ -49,7 +49,7 @@ export const fetchBoxListIfNeed = (): AppThunk => (dispatch, getState) => { return null } -export const selectBoxListState = (state: AppState): EntitiesRequest => state.boxList +export const selectBoxListState = (state: AppState): EntitiesRequest => state.boxList export const selectBoxList = createSelector( selectBoxListState, @@ -60,11 +60,9 @@ export const selectBoxList = createSelector( ) export const selectSortedUniqueDetailedBoxes = createSelector(selectBoxList, (boxes) => - sortedUniqBy( - sortBy( - boxes.filter((box) => box && !box.unplayable), - "title" - ), - "title" - ) + sortedUniqBy(sortBy(boxes, "title"), "title") +) + +export const selectContainerSortedDetailedBoxes = createSelector(selectBoxList, (boxes) => + sortBy(boxes, "container") ) diff --git a/src/store/rootReducer.ts b/src/store/rootReducer.ts index 79f0fe4..485c284 100644 --- a/src/store/rootReducer.ts +++ b/src/store/rootReducer.ts @@ -21,6 +21,7 @@ import volunteerMealsSet from "./volunteerMealsSet" import volunteerList from "./volunteerList" import volunteerLogin from "./volunteerLogin" import volunteerKnowledgeSet from "./volunteerKnowledgeSet" +import volunteerDetailedKnowledgeList from "./volunteerDetailedKnowledgeList" import volunteerParticipationDetailsSet from "./volunteerParticipationDetailsSet" import volunteerPersonalInfoSet from "./volunteerPersonalInfoSet" import volunteerSet from "./volunteerSet" @@ -52,6 +53,7 @@ export default (history: History) => ({ volunteerList, volunteerLogin, volunteerKnowledgeSet, + volunteerDetailedKnowledgeList, volunteerParticipationDetailsSet, volunteerPersonalInfoSet, volunteerSet, diff --git a/src/store/volunteerDetailedKnowledgeList.ts b/src/store/volunteerDetailedKnowledgeList.ts new file mode 100644 index 0000000..36db999 --- /dev/null +++ b/src/store/volunteerDetailedKnowledgeList.ts @@ -0,0 +1,72 @@ +import { PayloadAction, createSlice, createSelector, createEntityAdapter } from "@reduxjs/toolkit" +import { StateRequest, toastError, elementListFetch } from "./utils" +import { VolunteerDetailedKnowledge } from "../services/volunteers" +import { AppThunk, AppState, EntitiesRequest } from "." +import { volunteerDetailedKnowledgeList } from "../services/volunteersAccessors" + +const knowledgeAdapter = createEntityAdapter() + +export const initialState = knowledgeAdapter.getInitialState({ + readyStatus: "idle", +} as StateRequest) + +const volunteerDetailedKnowledgeListSlice = createSlice({ + name: "volunteerDetailedKnowledgeList", + initialState, + reducers: { + getRequesting: (state) => { + state.readyStatus = "request" + }, + getSuccess: (state, { payload }: PayloadAction) => { + state.readyStatus = "success" + knowledgeAdapter.setAll(state, payload) + }, + getFailure: (state, { payload }: PayloadAction) => { + state.readyStatus = "failure" + state.error = payload + }, + }, +}) + +export default volunteerDetailedKnowledgeListSlice.reducer +export const { getRequesting, getSuccess, getFailure } = volunteerDetailedKnowledgeListSlice.actions + +export const fetchVolunteerDetailedKnowledgeList = elementListFetch( + volunteerDetailedKnowledgeList, + getRequesting, + getSuccess, + getFailure, + (error: Error) => + toastError( + `Erreur lors du chargement de la liste de connaissances détaillée: ${error.message}` + ) +) + +const shouldFetchVolunteerDetailedKnowledgeList = (state: AppState) => + state.volunteerDetailedKnowledgeList?.readyStatus !== "success" + +export const fetchVolunteerDetailedKnowledgeListIfNeed = + (id = 0): AppThunk => + (dispatch, getState) => { + let jwt = "" + + if (!id) { + ;({ jwt, id } = getState().auth) + } + if (shouldFetchVolunteerDetailedKnowledgeList(getState())) + return dispatch(fetchVolunteerDetailedKnowledgeList(jwt, id)) + + return null + } + +export const selectVolunteerDetailedKnowledgeListState = ( + state: AppState +): EntitiesRequest => state.volunteerDetailedKnowledgeList + +export const selectVolunteerDetailedKnowledgeList = createSelector( + selectVolunteerDetailedKnowledgeListState, + ({ ids, entities, readyStatus }) => { + if (readyStatus !== "success") return [] + return ids.map((id) => entities[id]) as VolunteerDetailedKnowledge[] + } +)