codeforlife 2.8.2 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Countdown-DFI1RljW.js +28 -0
- package/dist/Countdown-DFI1RljW.js.map +1 -0
- package/dist/Countdown-zY3nMzmi.cjs +2 -0
- package/dist/Countdown-zY3nMzmi.cjs.map +1 -0
- package/dist/Image-D5jC9UoX.js +21 -0
- package/dist/Image-D5jC9UoX.js.map +1 -0
- package/dist/Image-mgT45r_B.cjs +2 -0
- package/dist/Image-mgT45r_B.cjs.map +1 -0
- package/dist/LinkButton-BYFkvL_O.cjs +2 -0
- package/dist/LinkButton-BYFkvL_O.cjs.map +1 -0
- package/dist/LinkButton-oK0RThqn.js +12 -0
- package/dist/LinkButton-oK0RThqn.js.map +1 -0
- package/dist/Navigate-Dq47aqC8.js +25 -0
- package/dist/Navigate-Dq47aqC8.js.map +1 -0
- package/dist/Navigate-dQocLhzN.cjs +2 -0
- package/dist/Navigate-dQocLhzN.cjs.map +1 -0
- package/dist/api/endpoints/index.cjs.js +2 -0
- package/dist/api/endpoints/index.cjs.js.map +1 -0
- package/dist/api/endpoints/index.d.ts +81 -0
- package/dist/api/endpoints/index.es.js +78 -0
- package/dist/api/endpoints/index.es.js.map +1 -0
- package/dist/api/index.cjs.js +4 -0
- package/dist/api/index.cjs.js.map +1 -0
- package/dist/api/index.d.ts +77 -0
- package/dist/api/index.es.js +541 -0
- package/dist/api/index.es.js.map +1 -0
- package/dist/api-Cbyt3rw0.js +92 -0
- package/dist/api-Cbyt3rw0.js.map +1 -0
- package/dist/api-CnMfjRk3.cjs +2 -0
- package/dist/api-CnMfjRk3.cjs.map +1 -0
- package/dist/api-Cs4Y-WeI.js +20 -0
- package/dist/api-Cs4Y-WeI.js.map +1 -0
- package/dist/api-DIgp_6Vr.cjs +2 -0
- package/dist/api-DIgp_6Vr.cjs.map +1 -0
- package/dist/api.d.ts +123 -0
- package/dist/auth-BPfUPjmM.js +237 -0
- package/dist/auth-BPfUPjmM.js.map +1 -0
- package/dist/auth-Vf1MgMci.cjs +2 -0
- package/dist/auth-Vf1MgMci.cjs.map +1 -0
- package/dist/auth.d.ts +40 -0
- package/dist/components/form/index.cjs.js +2 -0
- package/dist/components/form/index.cjs.js.map +1 -0
- package/dist/components/form/index.d.ts +86 -0
- package/dist/components/form/index.es.js +18 -0
- package/dist/components/form/index.es.js.map +1 -0
- package/dist/components/index.cjs.js +11 -0
- package/dist/components/index.cjs.js.map +1 -0
- package/dist/components/index.d.ts +90 -0
- package/dist/components/index.es.js +383 -0
- package/dist/components/index.es.js.map +1 -0
- package/dist/components/page/index.cjs.js +2 -0
- package/dist/components/page/index.cjs.js.map +1 -0
- package/dist/components/page/index.d.ts +77 -0
- package/dist/components/page/index.es.js +9 -0
- package/dist/components/page/index.es.js.map +1 -0
- package/dist/components/router/index.cjs.js +2 -0
- package/dist/components/router/index.cjs.js.map +1 -0
- package/dist/components/router/index.d.ts +78 -0
- package/dist/components/router/index.es.js +11 -0
- package/dist/components/router/index.es.js.map +1 -0
- package/dist/components/table/index.cjs.js +2 -0
- package/dist/components/table/index.cjs.js.map +1 -0
- package/dist/components/table/index.d.ts +75 -0
- package/dist/components/table/index.es.js +9 -0
- package/dist/components/table/index.es.js.map +1 -0
- package/dist/en-gb-B_rK7Jx1.js +20 -0
- package/dist/en-gb-B_rK7Jx1.js.map +1 -0
- package/dist/en-gb-CpyEkKq3.cjs +2 -0
- package/dist/en-gb-CpyEkKq3.cjs.map +1 -0
- package/dist/features/index.cjs.js +2 -0
- package/dist/features/index.cjs.js.map +1 -0
- package/dist/features/index.d.ts +76 -0
- package/dist/features/index.es.js +47 -0
- package/dist/features/index.es.js.map +1 -0
- package/dist/form.d.ts +40 -0
- package/dist/general-BPbbmkeX.cjs +2 -0
- package/dist/general-BPbbmkeX.cjs.map +1 -0
- package/dist/general-CtTJPCJn.js +58 -0
- package/dist/general-CtTJPCJn.js.map +1 -0
- package/dist/general.d.ts +53 -0
- package/dist/hooks/index.cjs.js +2 -0
- package/dist/hooks/index.cjs.js.map +1 -0
- package/dist/hooks/index.d.ts +77 -0
- package/dist/hooks/index.es.js +25 -0
- package/dist/hooks/index.es.js.map +1 -0
- package/dist/index-2W--_sNE.js +30 -0
- package/dist/index-2W--_sNE.js.map +1 -0
- package/dist/index-BUMdUVBH.cjs +5 -0
- package/dist/index-BUMdUVBH.cjs.map +1 -0
- package/dist/index-B_Zy_zwA.cjs +2 -0
- package/dist/index-B_Zy_zwA.cjs.map +1 -0
- package/dist/index-BgsynEGX.cjs +2 -0
- package/dist/index-BgsynEGX.cjs.map +1 -0
- package/dist/index-CA-ugBSa.cjs +2 -0
- package/dist/index-CA-ugBSa.cjs.map +1 -0
- package/dist/index-CNtOlJ49.js +572 -0
- package/dist/index-CNtOlJ49.js.map +1 -0
- package/dist/index-DkM_cG3a.js +237 -0
- package/dist/index-DkM_cG3a.js.map +1 -0
- package/dist/index-Dqp7dpn3.js +1111 -0
- package/dist/index-Dqp7dpn3.js.map +1 -0
- package/dist/index.cjs.js +2 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.es.js +7 -0
- package/dist/index.es.js.map +1 -0
- package/dist/jsx-runtime-CeSfJrVB.cjs +31 -0
- package/dist/jsx-runtime-CeSfJrVB.cjs.map +1 -0
- package/dist/jsx-runtime-Dpn_P65e.js +634 -0
- package/dist/jsx-runtime-Dpn_P65e.js.map +1 -0
- package/dist/middlewares/index.cjs.js +2 -0
- package/dist/middlewares/index.cjs.js.map +1 -0
- package/dist/middlewares/index.d.ts +73 -0
- package/dist/middlewares/index.es.js +10 -0
- package/dist/middlewares/index.es.js.map +1 -0
- package/dist/palette-CE2mKYse.cjs +2 -0
- package/dist/palette-CE2mKYse.cjs.map +1 -0
- package/dist/palette-C_L0akN_.js +43 -0
- package/dist/palette-C_L0akN_.js.map +1 -0
- package/dist/router.d.ts +48 -0
- package/dist/rtk-query.modern-CjetfYPg.js +3038 -0
- package/dist/rtk-query.modern-CjetfYPg.js.map +1 -0
- package/dist/rtk-query.modern-PBCErCqb.cjs +15 -0
- package/dist/rtk-query.modern-PBCErCqb.cjs.map +1 -0
- package/dist/schema.d.ts +89 -0
- package/dist/schemas-BZbJpkD5.cjs +2 -0
- package/dist/schemas-BZbJpkD5.cjs.map +1 -0
- package/dist/schemas-DlOtf2vf.js +162 -0
- package/dist/schemas-DlOtf2vf.js.map +1 -0
- package/dist/server.cjs.js +6 -0
- package/dist/server.cjs.js.map +1 -0
- package/dist/server.d.ts +129 -0
- package/dist/server.es.js +127 -0
- package/dist/server.es.js.map +1 -0
- package/dist/session-CE2U7oL1.cjs +2 -0
- package/dist/session-CE2U7oL1.cjs.map +1 -0
- package/dist/session-CacrgFSv.cjs +2 -0
- package/dist/session-CacrgFSv.cjs.map +1 -0
- package/dist/session-D312kYKk.js +32 -0
- package/dist/session-D312kYKk.js.map +1 -0
- package/dist/session-oI-Ht2C8.js +30 -0
- package/dist/session-oI-Ht2C8.js.map +1 -0
- package/dist/settings/index.cjs.js +2 -0
- package/dist/settings/index.cjs.js.map +1 -0
- package/dist/settings/index.d.ts +76 -0
- package/dist/settings/index.es.js +17 -0
- package/dist/settings/index.es.js.map +1 -0
- package/dist/slices/index.cjs.js +2 -0
- package/dist/slices/index.cjs.js.map +1 -0
- package/dist/slices/index.d.ts +74 -0
- package/dist/slices/index.es.js +6 -0
- package/dist/slices/index.es.js.map +1 -0
- package/dist/store.d.ts +17 -0
- package/dist/style.css +1 -0
- package/dist/test.d.ts +75 -0
- package/dist/theme/components/index.cjs.js +2 -0
- package/dist/theme/components/index.cjs.js.map +1 -0
- package/dist/theme/components/index.d.ts +75 -0
- package/dist/theme/components/index.es.js +6 -0
- package/dist/theme/components/index.es.js.map +1 -0
- package/dist/theme/index.cjs.js +2 -0
- package/dist/theme/index.cjs.js.map +1 -0
- package/dist/theme/index.d.ts +79 -0
- package/dist/theme/index.es.js +222 -0
- package/dist/theme/index.es.js.map +1 -0
- package/dist/theme.d.ts +19 -0
- package/dist/urls-DtHr1d3H.js +14 -0
- package/dist/urls-DtHr1d3H.js.map +1 -0
- package/dist/urls-MaVXL_C2.cjs +2 -0
- package/dist/urls-MaVXL_C2.cjs.map +1 -0
- package/dist/utils/api.cjs.js +2 -0
- package/dist/utils/api.cjs.js.map +1 -0
- package/dist/utils/api.d.ts +144 -0
- package/dist/utils/api.es.js +16 -0
- package/dist/utils/api.es.js.map +1 -0
- package/dist/utils/auth.cjs.js +2 -0
- package/dist/utils/auth.cjs.js.map +1 -0
- package/dist/utils/auth.d.ts +100 -0
- package/dist/utils/auth.es.js +117 -0
- package/dist/utils/auth.es.js.map +1 -0
- package/dist/utils/form.cjs.js +2 -0
- package/dist/utils/form.cjs.js.map +1 -0
- package/dist/utils/form.d.ts +97 -0
- package/dist/utils/form.es.js +76 -0
- package/dist/utils/form.es.js.map +1 -0
- package/dist/utils/general.cjs.js +2 -0
- package/dist/utils/general.cjs.js.map +1 -0
- package/dist/utils/general.d.ts +102 -0
- package/{src/utils/general.ts → dist/utils/general.es.js} +87 -165
- package/dist/utils/general.es.js.map +1 -0
- package/dist/utils/router.cjs.js +2 -0
- package/dist/utils/router.cjs.js.map +1 -0
- package/dist/utils/router.d.ts +91 -0
- package/dist/utils/router.es.js +33 -0
- package/dist/utils/router.es.js.map +1 -0
- package/dist/utils/schema.cjs.js +2 -0
- package/dist/utils/schema.cjs.js.map +1 -0
- package/dist/utils/schema.d.ts +115 -0
- package/dist/utils/schema.es.js +123 -0
- package/dist/utils/schema.es.js.map +1 -0
- package/dist/utils/store.cjs.js +2 -0
- package/dist/utils/store.cjs.js.map +1 -0
- package/dist/utils/store.d.ts +82 -0
- package/dist/utils/store.es.js +20 -0
- package/dist/utils/store.es.js.map +1 -0
- package/dist/utils/test.cjs.js +2 -0
- package/dist/utils/test.cjs.js.map +1 -0
- package/dist/utils/test.d.ts +125 -0
- package/dist/utils/test.es.js +60 -0
- package/dist/utils/test.es.js.map +1 -0
- package/dist/utils/theme.cjs.js +2 -0
- package/dist/utils/theme.cjs.js.map +1 -0
- package/dist/utils/theme.d.ts +83 -0
- package/dist/utils/theme.es.js +12 -0
- package/dist/utils/theme.es.js.map +1 -0
- package/dist/utils/window.cjs.js +2 -0
- package/dist/utils/window.cjs.js.map +1 -0
- package/dist/utils/window.d.ts +74 -0
- package/dist/utils/window.es.js +11 -0
- package/dist/utils/window.es.js.map +1 -0
- package/dist/window.d.ts +5 -0
- package/package.json +142 -37
- package/.github/workflows/main.yml +0 -55
- package/.prettierignore +0 -1
- package/CHANGELOG.md +0 -2020
- package/CONTRIBUTING.md +0 -3
- package/eslint.config.js +0 -17
- package/src/api/createApi.ts +0 -91
- package/src/api/endpoints/authFactor.ts +0 -31
- package/src/api/endpoints/index.ts +0 -9
- package/src/api/endpoints/klass.ts +0 -87
- package/src/api/endpoints/school.ts +0 -34
- package/src/api/endpoints/session.ts +0 -47
- package/src/api/endpoints/user.ts +0 -70
- package/src/api/index.ts +0 -5
- package/src/api/models.ts +0 -145
- package/src/api/schemas.ts +0 -243
- package/src/api/tagTypes.ts +0 -12
- package/src/api/urls.ts +0 -13
- package/src/components/App.css +0 -38
- package/src/components/App.tsx +0 -152
- package/src/components/ClickableTooltip.tsx +0 -43
- package/src/components/CopyIconButton.test.tsx +0 -16
- package/src/components/CopyIconButton.tsx +0 -27
- package/src/components/Countdown.tsx +0 -42
- package/src/components/DownloadFileButton.tsx +0 -55
- package/src/components/ElevatedAppBar.tsx +0 -41
- package/src/components/Image.tsx +0 -41
- package/src/components/InputFileButton.tsx +0 -27
- package/src/components/ItemizedList.tsx +0 -61
- package/src/components/OrderedGrid.tsx +0 -92
- package/src/components/ScrollIntoViewLink.tsx +0 -22
- package/src/components/SyncError.tsx +0 -14
- package/src/components/TablePagination.tsx +0 -142
- package/src/components/YouTubeVideo.tsx +0 -26
- package/src/components/form/ApiAutocompleteField.tsx +0 -187
- package/src/components/form/AutocompleteField.tsx +0 -135
- package/src/components/form/CheckboxField.tsx +0 -86
- package/src/components/form/CountryField.tsx +0 -75
- package/src/components/form/DatePickerField.tsx +0 -126
- package/src/components/form/EmailField.tsx +0 -38
- package/src/components/form/FirstNameField.tsx +0 -40
- package/src/components/form/Form.tsx +0 -165
- package/src/components/form/OtpField.tsx +0 -28
- package/src/components/form/PasswordField.tsx +0 -71
- package/src/components/form/RepeatField.tsx +0 -123
- package/src/components/form/SubmitButton.tsx +0 -57
- package/src/components/form/TextField.tsx +0 -150
- package/src/components/form/UkCountyField.tsx +0 -68
- package/src/components/form/index.tsx +0 -35
- package/src/components/index.ts +0 -28
- package/src/components/page/Banner.tsx +0 -95
- package/src/components/page/Notification.tsx +0 -71
- package/src/components/page/Page.tsx +0 -73
- package/src/components/page/Section.tsx +0 -21
- package/src/components/page/TabBar.tsx +0 -131
- package/src/components/page/index.ts +0 -10
- package/src/components/router/Link.tsx +0 -23
- package/src/components/router/LinkButton.tsx +0 -22
- package/src/components/router/LinkIconButton.tsx +0 -22
- package/src/components/router/LinkListItem.tsx +0 -22
- package/src/components/router/LinkTab.tsx +0 -22
- package/src/components/router/Navigate.tsx +0 -33
- package/src/components/router/index.tsx +0 -9
- package/src/components/table/CellStack.tsx +0 -19
- package/src/components/table/Table.tsx +0 -55
- package/src/components/table/index.tsx +0 -8
- package/src/features/InactiveDialog.tsx +0 -40
- package/src/features/ScreenTimeDialog.tsx +0 -30
- package/src/features/index.ts +0 -4
- package/src/fonts/ttf/Inter-VariableFont_slnt,wght.ttf +0 -0
- package/src/fonts/ttf/SpaceGrotesk-VariableFont_wght.ttf +0 -0
- package/src/hooks/api.tsx +0 -39
- package/src/hooks/auth.tsx +0 -397
- package/src/hooks/form.tsx +0 -11
- package/src/hooks/general.tsx +0 -110
- package/src/hooks/index.ts +0 -5
- package/src/hooks/router.tsx +0 -168
- package/src/images/svg/brain.svg +0 -1
- package/src/index.ts +0 -2
- package/src/middlewares/index.ts +0 -1
- package/src/middlewares/session.ts +0 -21
- package/src/scripts/freshDesk.js +0 -473
- package/src/scripts/index.ts +0 -1
- package/src/server.js +0 -187
- package/src/settings/custom.ts +0 -22
- package/src/settings/index.ts +0 -7
- package/src/settings/vite.ts +0 -26
- package/src/setupTests.ts +0 -2
- package/src/slices/createSlice.ts +0 -8
- package/src/slices/index.ts +0 -2
- package/src/slices/session.ts +0 -32
- package/src/theme/ThemedBox.tsx +0 -265
- package/src/theme/colors.ts +0 -57
- package/src/theme/components/MuiAccordion.tsx +0 -13
- package/src/theme/components/MuiAutocomplete.tsx +0 -11
- package/src/theme/components/MuiButton.ts +0 -70
- package/src/theme/components/MuiCardActions.tsx +0 -12
- package/src/theme/components/MuiCheckbox.ts +0 -12
- package/src/theme/components/MuiContainer.ts +0 -19
- package/src/theme/components/MuiDialog.tsx +0 -16
- package/src/theme/components/MuiFormControlLabel.ts +0 -18
- package/src/theme/components/MuiFormHelperText.ts +0 -12
- package/src/theme/components/MuiGrid2.ts +0 -16
- package/src/theme/components/MuiInputBase.ts +0 -14
- package/src/theme/components/MuiLink.ts +0 -41
- package/src/theme/components/MuiList.ts +0 -12
- package/src/theme/components/MuiListItemText.ts +0 -18
- package/src/theme/components/MuiMenu.ts +0 -14
- package/src/theme/components/MuiMenuItem.ts +0 -15
- package/src/theme/components/MuiSelect.ts +0 -16
- package/src/theme/components/MuiTab.ts +0 -29
- package/src/theme/components/MuiTable.ts +0 -29
- package/src/theme/components/MuiTableBody.ts +0 -15
- package/src/theme/components/MuiTableHead.ts +0 -26
- package/src/theme/components/MuiTabs.ts +0 -26
- package/src/theme/components/MuiTextField.ts +0 -86
- package/src/theme/components/MuiToolbar.ts +0 -11
- package/src/theme/components/MuiTypography.ts +0 -12
- package/src/theme/components/_components.ts +0 -95
- package/src/theme/components/index.ts +0 -57
- package/src/theme/index.ts +0 -25
- package/src/theme/palette.ts +0 -98
- package/src/theme/spacing.ts +0 -8
- package/src/theme/typography.ts +0 -101
- package/src/utils/api.test.ts +0 -19
- package/src/utils/api.tsx +0 -339
- package/src/utils/auth.ts +0 -78
- package/src/utils/form.test.ts +0 -50
- package/src/utils/form.ts +0 -193
- package/src/utils/general.test.ts +0 -55
- package/src/utils/router.test.ts +0 -156
- package/src/utils/router.ts +0 -67
- package/src/utils/schema.ts +0 -290
- package/src/utils/store.ts +0 -31
- package/src/utils/test.tsx +0 -82
- package/src/utils/theme.tsx +0 -83
- package/src/utils/window.ts +0 -11
- package/src/vite-env.d.ts +0 -1
- package/tsconfig.app.json +0 -4
- package/tsconfig.json +0 -7
- package/tsconfig.node.json +0 -4
- package/types/fixes.d.ts +0 -18
- package/vite.config.ts +0 -23
package/src/components/Image.tsx
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { Box, type BoxProps } from "@mui/material"
|
|
2
|
-
import { type FC } from "react"
|
|
3
|
-
|
|
4
|
-
import { openInNewTab } from "../utils/general"
|
|
5
|
-
|
|
6
|
-
export interface ImageProps extends Omit<BoxProps, "component"> {
|
|
7
|
-
alt: string
|
|
8
|
-
src: string
|
|
9
|
-
href?: string
|
|
10
|
-
hrefInNewTab?: boolean
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const Image: FC<ImageProps> = ({ href, hrefInNewTab = false, ...props }) => {
|
|
14
|
-
let {
|
|
15
|
-
onClick,
|
|
16
|
-
style = {},
|
|
17
|
-
...otherProps // eslint-disable-line prefer-const
|
|
18
|
-
} = props
|
|
19
|
-
|
|
20
|
-
if (style.width === undefined) {
|
|
21
|
-
style.width = "100%"
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// Override onClick if href provided.
|
|
25
|
-
if (href !== undefined) {
|
|
26
|
-
style = { ...style, cursor: "pointer" }
|
|
27
|
-
if (hrefInNewTab) {
|
|
28
|
-
onClick = () => {
|
|
29
|
-
openInNewTab(href)
|
|
30
|
-
}
|
|
31
|
-
} else {
|
|
32
|
-
onClick = () => {
|
|
33
|
-
window.location.replace(href)
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return <Box component="img" onClick={onClick} style={style} {...otherProps} />
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export default Image
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Button, type ButtonProps } from "@mui/material"
|
|
2
|
-
import {
|
|
3
|
-
type DetailedHTMLProps,
|
|
4
|
-
type FC,
|
|
5
|
-
type InputHTMLAttributes,
|
|
6
|
-
} from "react"
|
|
7
|
-
|
|
8
|
-
export interface InputFileButtonProps
|
|
9
|
-
extends Omit<ButtonProps<"label">, "component"> {
|
|
10
|
-
inputProps?: Omit<
|
|
11
|
-
DetailedHTMLProps<InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>,
|
|
12
|
-
"type" | "hidden"
|
|
13
|
-
>
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const InputFileButton: FC<InputFileButtonProps> = ({
|
|
17
|
-
children,
|
|
18
|
-
inputProps,
|
|
19
|
-
...otherButtonProps
|
|
20
|
-
}) => (
|
|
21
|
-
<Button component="label" {...otherButtonProps}>
|
|
22
|
-
{children}
|
|
23
|
-
<input type="file" hidden {...inputProps} />
|
|
24
|
-
</Button>
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
export default InputFileButton
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { type FC, type ReactElement } from "react"
|
|
2
|
-
import {
|
|
3
|
-
List,
|
|
4
|
-
type ListItem,
|
|
5
|
-
type ListItemText,
|
|
6
|
-
type ListProps,
|
|
7
|
-
} from "@mui/material"
|
|
8
|
-
|
|
9
|
-
type ListItemElement = ReactElement<typeof ListItem | typeof ListItemText>
|
|
10
|
-
|
|
11
|
-
export interface ItemizedListProps {
|
|
12
|
-
styleType:
|
|
13
|
-
| "unset"
|
|
14
|
-
| "initial"
|
|
15
|
-
| "inherit"
|
|
16
|
-
| "upper-roman"
|
|
17
|
-
| "upper-latin"
|
|
18
|
-
| "upper-alpha"
|
|
19
|
-
| "square"
|
|
20
|
-
| "none"
|
|
21
|
-
| "lower-roman"
|
|
22
|
-
| "lower-latin"
|
|
23
|
-
| "lower-greek"
|
|
24
|
-
| "lower-alpha"
|
|
25
|
-
| "georgian"
|
|
26
|
-
| "disc"
|
|
27
|
-
| "decimal-leading-zero"
|
|
28
|
-
| "decimal"
|
|
29
|
-
| "armenian"
|
|
30
|
-
| "circle"
|
|
31
|
-
listProps?: ListProps
|
|
32
|
-
pl?: number
|
|
33
|
-
children: ListItemElement | ListItemElement[]
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const ItemizedList: FC<ItemizedListProps> = ({
|
|
37
|
-
styleType,
|
|
38
|
-
listProps = {},
|
|
39
|
-
pl = 4,
|
|
40
|
-
children,
|
|
41
|
-
}) => {
|
|
42
|
-
const { sx, ...otherProps } = listProps
|
|
43
|
-
const listItemProps = { display: "list-item" }
|
|
44
|
-
|
|
45
|
-
return (
|
|
46
|
-
<List
|
|
47
|
-
sx={{
|
|
48
|
-
listStyleType: styleType,
|
|
49
|
-
pl,
|
|
50
|
-
".MuiListItem-root": listItemProps,
|
|
51
|
-
".MuiListItemText-root": listItemProps,
|
|
52
|
-
...sx,
|
|
53
|
-
}}
|
|
54
|
-
{...otherProps}
|
|
55
|
-
>
|
|
56
|
-
{children}
|
|
57
|
-
</List>
|
|
58
|
-
)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export default ItemizedList
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { type FC, type ReactElement } from "react"
|
|
2
|
-
import { Unstable_Grid2 as Grid, type Grid2Props } from "@mui/material"
|
|
3
|
-
|
|
4
|
-
interface ItemProps
|
|
5
|
-
extends Omit<
|
|
6
|
-
Grid2Props,
|
|
7
|
-
| "key"
|
|
8
|
-
| "order"
|
|
9
|
-
| "xs"
|
|
10
|
-
| "sm"
|
|
11
|
-
| "md"
|
|
12
|
-
| "lg"
|
|
13
|
-
| "xl"
|
|
14
|
-
| "xsOffset"
|
|
15
|
-
| "smOffset"
|
|
16
|
-
| "mdOffset"
|
|
17
|
-
| "lgOffset"
|
|
18
|
-
| "xlOffset"
|
|
19
|
-
> {}
|
|
20
|
-
|
|
21
|
-
interface GlobalItemProps extends ItemProps {
|
|
22
|
-
xs: number
|
|
23
|
-
sm: number
|
|
24
|
-
md: number
|
|
25
|
-
lg: number
|
|
26
|
-
xl: number
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export interface OrderedGridProps {
|
|
30
|
-
rows: Array<
|
|
31
|
-
Array<{
|
|
32
|
-
element: ReactElement
|
|
33
|
-
itemProps?: ItemProps
|
|
34
|
-
}>
|
|
35
|
-
>
|
|
36
|
-
containerProps?: Omit<Grid2Props, "container">
|
|
37
|
-
globalItemProps: GlobalItemProps
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const OrderedGrid: FC<OrderedGridProps> = ({
|
|
41
|
-
rows,
|
|
42
|
-
containerProps = {},
|
|
43
|
-
globalItemProps,
|
|
44
|
-
}) => {
|
|
45
|
-
const columns = Number(containerProps.columns ?? 12)
|
|
46
|
-
|
|
47
|
-
const getItemsPerRow = (size: number): number => Math.floor(columns / size)
|
|
48
|
-
|
|
49
|
-
const getOrder = (
|
|
50
|
-
rowIndex: number,
|
|
51
|
-
itemIndex: number,
|
|
52
|
-
size: number,
|
|
53
|
-
): number =>
|
|
54
|
-
Math.floor(itemIndex / getItemsPerRow(size)) * rows.length + rowIndex
|
|
55
|
-
|
|
56
|
-
const getOffset = (itemIndex: number, size: number): number => {
|
|
57
|
-
const itemsOnLastRow = rows[0].length % getItemsPerRow(size)
|
|
58
|
-
return itemsOnLastRow !== 0 && itemIndex === rows[0].length - 1
|
|
59
|
-
? (columns - itemsOnLastRow * size) / 2
|
|
60
|
-
: 0
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return (
|
|
64
|
-
<Grid container {...containerProps}>
|
|
65
|
-
{rows.map((row, rowIndex) =>
|
|
66
|
-
row.map(({ element, itemProps = {} }, itemIndex) => (
|
|
67
|
-
<Grid
|
|
68
|
-
key={`${rowIndex}-${itemIndex}`}
|
|
69
|
-
order={{
|
|
70
|
-
xs: getOrder(rowIndex, itemIndex, globalItemProps.xs),
|
|
71
|
-
sm: getOrder(rowIndex, itemIndex, globalItemProps.sm),
|
|
72
|
-
md: getOrder(rowIndex, itemIndex, globalItemProps.md),
|
|
73
|
-
lg: getOrder(rowIndex, itemIndex, globalItemProps.lg),
|
|
74
|
-
xl: getOrder(rowIndex, itemIndex, globalItemProps.xl),
|
|
75
|
-
}}
|
|
76
|
-
xsOffset={getOffset(itemIndex, globalItemProps.xs)}
|
|
77
|
-
smOffset={getOffset(itemIndex, globalItemProps.sm)}
|
|
78
|
-
mdOffset={getOffset(itemIndex, globalItemProps.md)}
|
|
79
|
-
lgOffset={getOffset(itemIndex, globalItemProps.lg)}
|
|
80
|
-
xlOffset={getOffset(itemIndex, globalItemProps.xl)}
|
|
81
|
-
{...globalItemProps}
|
|
82
|
-
{...itemProps}
|
|
83
|
-
>
|
|
84
|
-
{element}
|
|
85
|
-
</Grid>
|
|
86
|
-
)),
|
|
87
|
-
)}
|
|
88
|
-
</Grid>
|
|
89
|
-
)
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
export default OrderedGrid
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { Link, type LinkProps } from "@mui/material"
|
|
2
|
-
import { type FC } from "react"
|
|
3
|
-
export interface ScrollIntoViewLinkProps extends Omit<LinkProps, "onClick"> {
|
|
4
|
-
elementId: string
|
|
5
|
-
options?: ScrollIntoViewOptions
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
const ScrollIntoViewLink: FC<ScrollIntoViewLinkProps> = ({
|
|
9
|
-
elementId,
|
|
10
|
-
options,
|
|
11
|
-
...linkProps
|
|
12
|
-
}) => (
|
|
13
|
-
<Link
|
|
14
|
-
{...linkProps}
|
|
15
|
-
onClick={() => {
|
|
16
|
-
const element = document.getElementById(elementId)
|
|
17
|
-
element?.scrollIntoView(options)
|
|
18
|
-
}}
|
|
19
|
-
/>
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
export default ScrollIntoViewLink
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { Stack, Typography } from "@mui/material"
|
|
2
|
-
import { type FC } from "react"
|
|
3
|
-
import { SyncProblem as SyncProblemIcon } from "@mui/icons-material"
|
|
4
|
-
|
|
5
|
-
export interface SyncErrorProps {}
|
|
6
|
-
|
|
7
|
-
const SyncError: FC<SyncErrorProps> = () => (
|
|
8
|
-
<Stack alignItems="center" alignContent="center">
|
|
9
|
-
<SyncProblemIcon color="error" />
|
|
10
|
-
<Typography color="error.main">Failed to sync data</Typography>
|
|
11
|
-
</Stack>
|
|
12
|
-
)
|
|
13
|
-
|
|
14
|
-
export default SyncError
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type ElementType,
|
|
3
|
-
type JSX,
|
|
4
|
-
type JSXElementConstructor,
|
|
5
|
-
type ReactNode,
|
|
6
|
-
useEffect,
|
|
7
|
-
} from "react"
|
|
8
|
-
import {
|
|
9
|
-
TablePagination as MuiTablePagination,
|
|
10
|
-
type TablePaginationProps as MuiTablePaginationProps,
|
|
11
|
-
Stack,
|
|
12
|
-
type StackProps,
|
|
13
|
-
type TablePaginationBaseProps,
|
|
14
|
-
} from "@mui/material"
|
|
15
|
-
import type { TypedUseLazyQuery } from "@reduxjs/toolkit/query/react"
|
|
16
|
-
|
|
17
|
-
import { type ListArg, type ListResult, handleResultState } from "../utils/api"
|
|
18
|
-
import { type Pagination, usePagination } from "../hooks/api"
|
|
19
|
-
|
|
20
|
-
export type TablePaginationProps<
|
|
21
|
-
QueryArg extends ListArg,
|
|
22
|
-
ResultType extends ListResult<any>,
|
|
23
|
-
RootComponent extends
|
|
24
|
-
ElementType = JSXElementConstructor<TablePaginationBaseProps>,
|
|
25
|
-
AdditionalProps = {},
|
|
26
|
-
> = Omit<
|
|
27
|
-
MuiTablePaginationProps<RootComponent, AdditionalProps>,
|
|
28
|
-
| "component"
|
|
29
|
-
| "count"
|
|
30
|
-
| "rowsPerPage"
|
|
31
|
-
| "onRowsPerPageChange"
|
|
32
|
-
| "rowsPerPageOptions"
|
|
33
|
-
| "page"
|
|
34
|
-
| "onPageChange"
|
|
35
|
-
> &
|
|
36
|
-
Partial<
|
|
37
|
-
Pick<
|
|
38
|
-
MuiTablePaginationProps<RootComponent, AdditionalProps>,
|
|
39
|
-
"onRowsPerPageChange" | "onPageChange"
|
|
40
|
-
>
|
|
41
|
-
> & {
|
|
42
|
-
children: (
|
|
43
|
-
data: ResultType["data"],
|
|
44
|
-
pagination: Pagination & { count?: number; maxLimit?: number },
|
|
45
|
-
) => ReactNode
|
|
46
|
-
useLazyListQuery: TypedUseLazyQuery<ResultType, QueryArg, any>
|
|
47
|
-
preferCacheValue?: boolean
|
|
48
|
-
filters?: Omit<QueryArg, "limit" | "offset">
|
|
49
|
-
rowsPerPageOptions?: number[]
|
|
50
|
-
stackProps?: StackProps
|
|
51
|
-
page?: number
|
|
52
|
-
rowsPerPage?: number
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const TablePagination = <
|
|
56
|
-
QueryArg extends ListArg,
|
|
57
|
-
ResultType extends ListResult<any>,
|
|
58
|
-
RootComponent extends
|
|
59
|
-
ElementType = JSXElementConstructor<TablePaginationBaseProps>,
|
|
60
|
-
AdditionalProps = {},
|
|
61
|
-
>({
|
|
62
|
-
children,
|
|
63
|
-
useLazyListQuery,
|
|
64
|
-
preferCacheValue,
|
|
65
|
-
filters,
|
|
66
|
-
page: initialPage = 0,
|
|
67
|
-
rowsPerPage: initialLimit = 50,
|
|
68
|
-
rowsPerPageOptions = [50, 100, 150],
|
|
69
|
-
stackProps,
|
|
70
|
-
onRowsPerPageChange,
|
|
71
|
-
onPageChange,
|
|
72
|
-
...tablePaginationProps
|
|
73
|
-
}: TablePaginationProps<
|
|
74
|
-
QueryArg,
|
|
75
|
-
ResultType,
|
|
76
|
-
RootComponent,
|
|
77
|
-
AdditionalProps
|
|
78
|
-
>): JSX.Element => {
|
|
79
|
-
const [trigger, result] = useLazyListQuery()
|
|
80
|
-
const [{ limit, page, offset }, setPagination] = usePagination({
|
|
81
|
-
page: initialPage,
|
|
82
|
-
limit: initialLimit,
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
useEffect(
|
|
86
|
-
() => {
|
|
87
|
-
void trigger({ limit, offset, ...filters } as QueryArg, preferCacheValue)
|
|
88
|
-
},
|
|
89
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
90
|
-
[
|
|
91
|
-
trigger,
|
|
92
|
-
limit,
|
|
93
|
-
offset,
|
|
94
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps,@typescript-eslint/no-unsafe-assignment
|
|
95
|
-
...Object.values(filters || {}),
|
|
96
|
-
preferCacheValue,
|
|
97
|
-
],
|
|
98
|
-
)
|
|
99
|
-
|
|
100
|
-
const { count, max_limit } = result.data || {}
|
|
101
|
-
|
|
102
|
-
if (max_limit) {
|
|
103
|
-
rowsPerPageOptions = rowsPerPageOptions.filter(
|
|
104
|
-
option => option <= max_limit,
|
|
105
|
-
)
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
return (
|
|
109
|
-
<Stack {...stackProps}>
|
|
110
|
-
{handleResultState(result, ({ data }) =>
|
|
111
|
-
children(data, {
|
|
112
|
-
limit,
|
|
113
|
-
page,
|
|
114
|
-
offset,
|
|
115
|
-
count,
|
|
116
|
-
maxLimit: max_limit,
|
|
117
|
-
}),
|
|
118
|
-
)}
|
|
119
|
-
<MuiTablePagination
|
|
120
|
-
component="div"
|
|
121
|
-
count={count ?? 0}
|
|
122
|
-
rowsPerPage={limit}
|
|
123
|
-
onRowsPerPageChange={event => {
|
|
124
|
-
setPagination({ limit: parseInt(event.target.value), page: 0 })
|
|
125
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
126
|
-
if (onRowsPerPageChange) onRowsPerPageChange(event)
|
|
127
|
-
}}
|
|
128
|
-
page={page}
|
|
129
|
-
onPageChange={(event, page) => {
|
|
130
|
-
setPagination(({ limit }) => ({ limit, page }))
|
|
131
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
132
|
-
if (onPageChange) onPageChange(event, page)
|
|
133
|
-
}}
|
|
134
|
-
// ascending order
|
|
135
|
-
rowsPerPageOptions={rowsPerPageOptions.sort((a, b) => a - b)}
|
|
136
|
-
{...tablePaginationProps}
|
|
137
|
-
/>
|
|
138
|
-
</Stack>
|
|
139
|
-
)
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
export default TablePagination
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { Box, type BoxProps } from "@mui/material"
|
|
2
|
-
import { type FC } from "react"
|
|
3
|
-
|
|
4
|
-
export interface YouTubeVideoProps extends Omit<BoxProps, "component"> {
|
|
5
|
-
src: string
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
const YouTubeVideo: FC<YouTubeVideoProps> = ({
|
|
9
|
-
src,
|
|
10
|
-
style = {},
|
|
11
|
-
...otherProps
|
|
12
|
-
}) => {
|
|
13
|
-
return (
|
|
14
|
-
<Box
|
|
15
|
-
component="iframe"
|
|
16
|
-
width="100%"
|
|
17
|
-
src={src}
|
|
18
|
-
title="YouTube video player"
|
|
19
|
-
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen"
|
|
20
|
-
style={{ border: "0px", aspectRatio: "16 / 9", ...style }}
|
|
21
|
-
{...otherProps}
|
|
22
|
-
/>
|
|
23
|
-
)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export default YouTubeVideo
|
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
import { Button, type ChipTypeMap, CircularProgress } from "@mui/material"
|
|
2
|
-
import {
|
|
3
|
-
Children,
|
|
4
|
-
type ElementType,
|
|
5
|
-
type ForwardRefRenderFunction,
|
|
6
|
-
type HTMLAttributes,
|
|
7
|
-
type JSX,
|
|
8
|
-
forwardRef,
|
|
9
|
-
useEffect,
|
|
10
|
-
useState,
|
|
11
|
-
} from "react"
|
|
12
|
-
import type { TypedUseLazyQuery } from "@reduxjs/toolkit/query/react"
|
|
13
|
-
|
|
14
|
-
import {
|
|
15
|
-
AutocompleteField,
|
|
16
|
-
type AutocompleteFieldProps,
|
|
17
|
-
} from "../../components/form"
|
|
18
|
-
import type { ListArg, ListResult, ModelId } from "../../utils/api"
|
|
19
|
-
import SyncError from "../SyncError"
|
|
20
|
-
import { usePagination } from "../../hooks/api"
|
|
21
|
-
|
|
22
|
-
export interface ApiAutocompleteFieldProps<
|
|
23
|
-
SearchKey extends keyof Omit<QueryArg, "limit" | "offset">,
|
|
24
|
-
// api type args
|
|
25
|
-
QueryArg extends ListArg,
|
|
26
|
-
ResultType extends ListResult<any>,
|
|
27
|
-
// autocomplete type args
|
|
28
|
-
Multiple extends boolean | undefined = false,
|
|
29
|
-
DisableClearable extends boolean | undefined = false,
|
|
30
|
-
FreeSolo extends boolean | undefined = false,
|
|
31
|
-
ChipComponent extends ElementType = ChipTypeMap["defaultComponent"],
|
|
32
|
-
> extends Omit<
|
|
33
|
-
AutocompleteFieldProps<
|
|
34
|
-
ModelId,
|
|
35
|
-
Multiple,
|
|
36
|
-
DisableClearable,
|
|
37
|
-
FreeSolo,
|
|
38
|
-
ChipComponent
|
|
39
|
-
>,
|
|
40
|
-
| "options"
|
|
41
|
-
| "ListboxComponent"
|
|
42
|
-
| "filterOptions"
|
|
43
|
-
| "getOptionLabel"
|
|
44
|
-
| "getOptionKey"
|
|
45
|
-
| "onInputChange"
|
|
46
|
-
> {
|
|
47
|
-
useLazyListQuery: TypedUseLazyQuery<ResultType, QueryArg, any>
|
|
48
|
-
filterOptions?: Omit<QueryArg, "limit" | "offset" | SearchKey>
|
|
49
|
-
getOptionLabel: (result: ResultType["data"][number]) => string
|
|
50
|
-
getOptionKey?: (result: ResultType["data"][number]) => ModelId
|
|
51
|
-
searchKey: SearchKey
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const ApiAutocompleteField = <
|
|
55
|
-
SearchKey extends keyof Omit<QueryArg, "limit" | "offset">,
|
|
56
|
-
// api type args
|
|
57
|
-
QueryArg extends ListArg,
|
|
58
|
-
ResultType extends ListResult<any>,
|
|
59
|
-
// autocomplete type args
|
|
60
|
-
Multiple extends boolean | undefined = false,
|
|
61
|
-
DisableClearable extends boolean | undefined = false,
|
|
62
|
-
FreeSolo extends boolean | undefined = false,
|
|
63
|
-
ChipComponent extends ElementType = ChipTypeMap["defaultComponent"],
|
|
64
|
-
>({
|
|
65
|
-
useLazyListQuery,
|
|
66
|
-
filterOptions,
|
|
67
|
-
getOptionLabel,
|
|
68
|
-
getOptionKey = result => result.id as ModelId,
|
|
69
|
-
searchKey,
|
|
70
|
-
...otherAutocompleteFieldProps
|
|
71
|
-
}: ApiAutocompleteFieldProps<
|
|
72
|
-
SearchKey,
|
|
73
|
-
// api type args
|
|
74
|
-
QueryArg,
|
|
75
|
-
ResultType,
|
|
76
|
-
// autocomplete type args
|
|
77
|
-
Multiple,
|
|
78
|
-
DisableClearable,
|
|
79
|
-
FreeSolo,
|
|
80
|
-
ChipComponent
|
|
81
|
-
>): JSX.Element => {
|
|
82
|
-
const [search, setSearch] = useState("")
|
|
83
|
-
const [trigger, { isLoading, isError }] = useLazyListQuery()
|
|
84
|
-
const [{ limit, offset }, setPagination] = usePagination()
|
|
85
|
-
const [{ options, hasMore }, setState] = useState<{
|
|
86
|
-
options: Record<ModelId, ResultType["data"][number]>
|
|
87
|
-
hasMore: boolean
|
|
88
|
-
}>({ options: {}, hasMore: true })
|
|
89
|
-
|
|
90
|
-
// Call api
|
|
91
|
-
useEffect(
|
|
92
|
-
() => {
|
|
93
|
-
const arg = { limit, offset, ...filterOptions } as QueryArg
|
|
94
|
-
// @ts-expect-error search key can index arg
|
|
95
|
-
if (search) arg[searchKey] = search
|
|
96
|
-
|
|
97
|
-
trigger(arg, true)
|
|
98
|
-
.unwrap()
|
|
99
|
-
.then(({ data, offset, limit, count }) => {
|
|
100
|
-
setState(({ options: previousOptions }) => {
|
|
101
|
-
const options = { ...previousOptions }
|
|
102
|
-
data.forEach(result => {
|
|
103
|
-
options[getOptionKey(result)] = result
|
|
104
|
-
})
|
|
105
|
-
return { options, hasMore: offset + limit < count }
|
|
106
|
-
})
|
|
107
|
-
})
|
|
108
|
-
.catch(error => {
|
|
109
|
-
if (error) console.error(error)
|
|
110
|
-
// TODO: gracefully handle error
|
|
111
|
-
})
|
|
112
|
-
},
|
|
113
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
114
|
-
[
|
|
115
|
-
trigger,
|
|
116
|
-
limit,
|
|
117
|
-
offset,
|
|
118
|
-
searchKey,
|
|
119
|
-
search,
|
|
120
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
121
|
-
...Object.values(filterOptions || {}),
|
|
122
|
-
],
|
|
123
|
-
)
|
|
124
|
-
|
|
125
|
-
// Get options keys
|
|
126
|
-
let optionKeys: ModelId[] = Object.keys(options)
|
|
127
|
-
if (!optionKeys.length) return <></>
|
|
128
|
-
if (typeof getOptionKey(Object.values(options)[0]) === "number") {
|
|
129
|
-
optionKeys = optionKeys.map(Number)
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function loadNextPage() {
|
|
133
|
-
setPagination(({ page, limit }) => ({ page: page + 1, limit }))
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
const ListboxComponent: ForwardRefRenderFunction<
|
|
137
|
-
unknown,
|
|
138
|
-
HTMLAttributes<HTMLElement>
|
|
139
|
-
> = ({ children, ...props }, ref) => {
|
|
140
|
-
const listItems = Children.toArray(children)
|
|
141
|
-
if (isLoading) listItems.push(<CircularProgress key="is-loading" />)
|
|
142
|
-
else {
|
|
143
|
-
if (isError) listItems.push(<SyncError key="is-error" />)
|
|
144
|
-
if (hasMore) {
|
|
145
|
-
listItems.push(
|
|
146
|
-
<Button key="load-more" onClick={loadNextPage}>
|
|
147
|
-
Load more
|
|
148
|
-
</Button>,
|
|
149
|
-
)
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
return (
|
|
154
|
-
<ul
|
|
155
|
-
{...props}
|
|
156
|
-
// @ts-expect-error ref is assignable
|
|
157
|
-
ref={ref}
|
|
158
|
-
onScroll={event => {
|
|
159
|
-
// If not already loading and scrolled to bottom
|
|
160
|
-
if (
|
|
161
|
-
!isLoading &&
|
|
162
|
-
event.currentTarget.clientHeight + event.currentTarget.scrollTop >=
|
|
163
|
-
event.currentTarget.scrollHeight
|
|
164
|
-
) {
|
|
165
|
-
loadNextPage()
|
|
166
|
-
}
|
|
167
|
-
}}
|
|
168
|
-
>
|
|
169
|
-
{listItems}
|
|
170
|
-
</ul>
|
|
171
|
-
)
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
return (
|
|
175
|
-
<AutocompleteField
|
|
176
|
-
options={optionKeys}
|
|
177
|
-
getOptionLabel={id => getOptionLabel(options[id])}
|
|
178
|
-
onInputChange={(_, value, reason) => {
|
|
179
|
-
setSearch(reason === "input" ? value : "")
|
|
180
|
-
}}
|
|
181
|
-
ListboxComponent={forwardRef(ListboxComponent)}
|
|
182
|
-
{...otherAutocompleteFieldProps}
|
|
183
|
-
/>
|
|
184
|
-
)
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
export default ApiAutocompleteField
|