diff --git a/package.json b/package.json index d7408a2..5472a5e 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ }, "dependencies": { "@apollo/server": "^4.9.5", + "@atawi/react-datatable": "^1.0.0", "@atawi/react-popover": "^1.0.4", "@fullcalendar/core": "^6.1.5", "@fullcalendar/daygrid": "^6.1.4", diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx deleted file mode 100644 index afdd2ce..0000000 --- a/src/components/Table/Table.tsx +++ /dev/null @@ -1,123 +0,0 @@ -import { useMemo, useState } from 'react' -import TableHead, { type TableHeader } from './TableHead' -import TableBody from './TableBody' -import { styled } from 'styled-components' - -export type TableConfig = { - headers: TableHeader[] -} - -export type SortConfig = { - key: keyof T | null - direction: 'asc' | 'desc' -} - -interface Props { - data: T[] - searchable?: boolean - selectedRow?: T - searchText?: string - config?: TableConfig - onSelect?: (row: T) => void - onSearch?: (text: string) => void -} - -export function Table({ - data, - searchable = false, - selectedRow, - searchText, - config, - onSelect, - onSearch, -}: Props) { - const [sortConfig, setSortConfig] = useState>({ - key: null, - direction: 'asc', - }) - - const keys = Object.keys(Object.assign({}, ...data)) - - const filteredData = useMemo(() => { - return searchText - ? data.filter((value) => - keys.some((k) => - //@ts-expect-error ignore for now - value[k].toString().toLowerCase().includes(searchText), - ), - ) - : data - }, [searchText, data]) - - const handleSort = (key: keyof T) => { - setSortConfig({ - key, - direction: - sortConfig.key === key && sortConfig.direction === 'asc' - ? 'desc' - : 'asc', - }) - } - - const sortedData = useMemo(() => { - return sortConfig.key !== null - ? filteredData.slice().sort((a, b) => { - //@ts-expect-error ignore for now - if (a[sortConfig.key] < b[sortConfig.key]) { - return sortConfig.direction === 'asc' ? -1 : 1 - } - //@ts-expect-error ignore for now - if (a[sortConfig.key] > b[sortConfig.key]) { - return sortConfig.direction === 'asc' ? 1 : -1 - } - return 0 - }) - : filteredData - }, [filteredData, sortConfig]) - - return ( -
- {searchable && ( - - onSearch?.(e.target.value)} - /> - - )} - - - - - -
- ) -} - -const Search = styled.div` - margin-top: 0.6rem; - margin-bottom: 2rem; -` - -const StyledTable = styled.table` - tr { - cursor: pointer; - } - - thead { - white-space: nowrap; - } -` diff --git a/src/components/Table/TableBody.tsx b/src/components/Table/TableBody.tsx deleted file mode 100644 index b06b7c5..0000000 --- a/src/components/Table/TableBody.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import type { TableConfig } from './Table' - -interface Props { - data: T[] - columns: string[] - selectedRow?: T - config?: TableConfig - onSelect?: (row: T) => void -} - -function TableBody({ - data, - columns, - config, - selectedRow, - onSelect, -}: Props) { - return ( - - {data.map((value, i) => { - const id = value['id' as keyof T] as string - const selectedRowId = selectedRow?.['id' as keyof T] as string - - return ( - onSelect?.(value)} - className={id === selectedRowId ? 'table-active' : ''} - > - {config - ? config.headers.map((h) => ( - //@ts-expect-error ignore for now - {value[h.key]} - )) - : columns.map((k) => ( - //@ts-expect-error ignore for now - {value[k]} - ))} - - ) - })} - - ) -} - -export default TableBody diff --git a/src/components/Table/TableHead.tsx b/src/components/Table/TableHead.tsx deleted file mode 100644 index 382ccdf..0000000 --- a/src/components/Table/TableHead.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import type { SortConfig, TableConfig } from './Table' -import { PiSortAscendingLight, PiSortDescendingLight } from 'react-icons/pi' - -export type TableHeader = { - key: keyof T - label: string -} - -interface Props { - columns: string[] - config?: TableConfig - sortConfig?: SortConfig - onClick?: (header: keyof T) => void -} - -function TableHead({ columns, config, sortConfig, onClick }: Props) { - const getSortIcon = (key: keyof T) => { - if (!sortConfig?.key) return - const dir = sortConfig.key === key ? sortConfig.direction : null - return dir === 'asc' ? ( - - ) : dir === 'desc' ? ( - - ) : null - } - - return ( - - - {config - ? config.headers.map((h) => ( - onClick?.(h.key)}> - {h.label} {getSortIcon(h.key)} - - )) - : columns.map((k) => ( - onClick?.(k as keyof T)}> - {k} {getSortIcon(k as keyof T)} - - ))} - - - ) -} - -export default TableHead diff --git a/src/main.tsx b/src/main.tsx index 7d73fc8..71b0a12 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -10,6 +10,8 @@ import 'jquery/dist/jquery.min.js' import 'bootstrap/dist/css/bootstrap.css' import 'bootstrap/dist/js/bootstrap.bundle.min.js' +import '@atawi/react-datatable/style.css' + ReactDOM.createRoot(document.getElementById('root')!).render( diff --git a/src/pages/user/MyAccount/MyEvents/MyEvents.tsx b/src/pages/user/MyAccount/MyEvents/MyEvents.tsx index 7272b65..dfc108c 100644 --- a/src/pages/user/MyAccount/MyEvents/MyEvents.tsx +++ b/src/pages/user/MyAccount/MyEvents/MyEvents.tsx @@ -1,24 +1,33 @@ -import { useCallback, useState } from 'react' import { useParams } from 'react-router' import Alert from '@/components/ui/Alert/Alert' -import Spinner from '@/components/ui/Spinner/Spinner' import TitledCard from '@/components/ui/TitledCard/TitledCard' -import Pagination from '@/components/Pagination/Pagination' import { useGetUserEventsQuery } from '@/generated/graphql' -import { Table } from '@/components/Table/Table' -import type { TableHeader } from '@/components/Table/TableHead' import { useNavigateToHome } from '@/hooks/useNavigateToHome' -import { debounce } from 'lodash' +// import { debounce } from 'lodash' + +import { DataTable, type Column } from '@atawi/react-datatable' + +type Event = { + id: string + title: string + description: string + start: string + end: string + isPrivate: string + url: string | JSX.Element + createdAt: string + updatedAt: string +} const ITEMS_PER_PAGE = 20 const MyEvents = () => { const { id } = useParams() - const [selectedRow, setSelectedRow] = useState() - const [searchText, setSearchText] = useState('') - const [searchTextDelayed, setSearchTextDelayed] = useState('') - const [pageNumber, setPageNumber] = useState(1) + // const [selectedRow, setSelectedRow] = useState() + // const [searchText, setSearchText] = useState('') + // const [searchTextDelayed, setSearchTextDelayed] = useState('') + // const [pageNumber, setPageNumber] = useState(1) useNavigateToHome() @@ -26,25 +35,30 @@ const MyEvents = () => { fetchPolicy: 'cache-and-network', variables: { id: id ?? '', + // filter: { + // searchText: searchTextDelayed, + // pageNumber, + // pageSize: ITEMS_PER_PAGE, + // }, filter: { - searchText: searchTextDelayed, - pageNumber, + searchText: '', + pageNumber: 1, pageSize: ITEMS_PER_PAGE, }, }, }) - const handleSearch = debounce((text: string) => { - setPageNumber(1) - setSearchTextDelayed(text) - }) + // const handleSearch = debounce((text: string) => { + // setPageNumber(1) + // setSearchTextDelayed(text) + // }) - const debounceSearch = useCallback(debounce(handleSearch, 500), []) + // const debounceSearch = useCallback(debounce(handleSearch, 500), []) - const handleSearchChange = (text: string) => { - setSearchText(text) - debounceSearch(text) - } + // const handleSearchChange = (text: string) => { + // setSearchText(text) + // debounceSearch(text) + // } if (error) { return @@ -59,7 +73,7 @@ const MyEvents = () => { isPrivate, description, url, - createdBy, + // createdBy, createdAt, updatedAt, } = event @@ -70,85 +84,88 @@ const MyEvents = () => { description, start: new Date(start).toLocaleString(), end: new Date(end).toLocaleString(), - createdBy: createdBy?.username, + // createdBy: createdBy?.username, isPrivate: isPrivate ? 'Yes' : 'No', - url: url ? Link : '', + url: url, createdAt: createdAt ? new Date(createdAt).toLocaleString() : '', updatedAt: updatedAt ? new Date(updatedAt).toLocaleString() : '', } - }) + }) as Event[] - const headers = [ + const columns: Column[] = [ { key: 'title', - label: 'Title', + header: 'Title', + sortable: true, + searchable: true, }, { key: 'start', - label: 'Start', + header: 'Start', + sortable: true, + searchable: true, + width: '10%', }, { key: 'end', - label: 'End', + header: 'End', + sortable: true, + searchable: true, + width: '10%', }, { key: 'description', - label: 'Description', + header: 'Description', + sortable: true, + searchable: true, }, { key: 'isPrivate', - label: 'Private', + header: 'Private', + sortable: true, + searchable: true, + width: '10%', }, { key: 'url', - label: 'Link', - }, - { - key: 'createdBy', - label: 'Posted by', + header: 'Link', + sortable: true, + searchable: true, + width: '10%', + render: (value) => Link, }, { key: 'createdAt', - label: 'Posted on', + header: 'Posted on', + sortable: true, + searchable: true, }, { key: 'updatedAt', - label: 'Updated on', + header: 'Updated on', + sortable: true, + searchable: true, }, - ] as TableHeader[] + ] - console.log(selectedRow) + const handleSelectionChange = (selectedItems: Event[]) => { + console.log('Selected:', selectedItems) + } return ( - {loading ? ( - - ) : ( - !updatedEvents?.length && ( - - ) - )} - -
- setPageNumber(page)} - /> -
) } diff --git a/yarn.lock b/yarn.lock index 4603387..908362f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -210,6 +210,17 @@ dependencies: node-fetch "^2.6.1" +"@atawi/react-datatable@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@atawi/react-datatable/-/react-datatable-1.0.0.tgz#d6d58a110634883be929b91bd31496d025d1380f" + integrity sha512-wYQj2ewObrcj0j/kx0VOxMvPcg5Wo5LhIjRc9nKiqGFNpcZxx5KOPqSiiwe0jgFPQ3t6rCqBOa6oRJMxBJvCag== + dependencies: + lodash "^4.17.21" + react-virtualized-auto-sizer "^1.0.20" + react-window "^1.8.10" + sass "^1.71.1" + xlsx "^0.18.5" + "@atawi/react-popover@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@atawi/react-popover/-/react-popover-1.0.4.tgz#3146f620bd9b38a1226cb0b16af85dce7c236e31" @@ -1881,6 +1892,95 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@parcel/watcher-android-arm64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz#e32d3dda6647791ee930556aee206fcd5ea0fb7a" + integrity sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ== + +"@parcel/watcher-darwin-arm64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz#0d9e680b7e9ec1c8f54944f1b945aa8755afb12f" + integrity sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw== + +"@parcel/watcher-darwin-x64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz#f9f1d5ce9d5878d344f14ef1856b7a830c59d1bb" + integrity sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA== + +"@parcel/watcher-freebsd-x64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz#2b77f0c82d19e84ff4c21de6da7f7d096b1a7e82" + integrity sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw== + +"@parcel/watcher-linux-arm-glibc@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz#92ed322c56dbafa3d2545dcf2803334aee131e42" + integrity sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA== + +"@parcel/watcher-linux-arm-musl@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz#cd48e9bfde0cdbbd2ecd9accfc52967e22f849a4" + integrity sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA== + +"@parcel/watcher-linux-arm64-glibc@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz#7b81f6d5a442bb89fbabaf6c13573e94a46feb03" + integrity sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA== + +"@parcel/watcher-linux-arm64-musl@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz#dcb8ff01077cdf59a18d9e0a4dff7a0cfe5fd732" + integrity sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q== + +"@parcel/watcher-linux-x64-glibc@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz#2e254600fda4e32d83942384d1106e1eed84494d" + integrity sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw== + +"@parcel/watcher-linux-x64-musl@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz#01fcea60fedbb3225af808d3f0a7b11229792eef" + integrity sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA== + +"@parcel/watcher-win32-arm64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz#87cdb16e0783e770197e52fb1dc027bb0c847154" + integrity sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig== + +"@parcel/watcher-win32-ia32@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz#778c39b56da33e045ba21c678c31a9f9d7c6b220" + integrity sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA== + +"@parcel/watcher-win32-x64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz#33873876d0bbc588aacce38e90d1d7480ce81cb7" + integrity sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw== + +"@parcel/watcher@^2.4.1": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.0.tgz#5c88818b12b8de4307a9d3e6dc3e28eba0dfbd10" + integrity sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ== + dependencies: + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.5.0" + "@parcel/watcher-darwin-arm64" "2.5.0" + "@parcel/watcher-darwin-x64" "2.5.0" + "@parcel/watcher-freebsd-x64" "2.5.0" + "@parcel/watcher-linux-arm-glibc" "2.5.0" + "@parcel/watcher-linux-arm-musl" "2.5.0" + "@parcel/watcher-linux-arm64-glibc" "2.5.0" + "@parcel/watcher-linux-arm64-musl" "2.5.0" + "@parcel/watcher-linux-x64-glibc" "2.5.0" + "@parcel/watcher-linux-x64-musl" "2.5.0" + "@parcel/watcher-win32-arm64" "2.5.0" + "@parcel/watcher-win32-ia32" "2.5.0" + "@parcel/watcher-win32-x64" "2.5.0" + "@pkgr/core@^0.1.0": version "0.1.1" resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" @@ -2783,6 +2883,11 @@ acorn@^8.1.0, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.4.1, acorn@^8.8.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== +adler-32@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/adler-32/-/adler-32-1.3.1.tgz#1dbf0b36dda0012189a32b3679061932df1821e2" + integrity sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A== + agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -3333,6 +3438,14 @@ capital-case@^1.0.4: tslib "^2.0.3" upper-case-first "^2.0.2" +cfb@~1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cfb/-/cfb-1.2.2.tgz#94e687628c700e5155436dac05f74e08df23bc44" + integrity sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA== + dependencies: + adler-32 "~1.3.0" + crc-32 "~1.2.0" + chalk@5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" @@ -3438,6 +3551,13 @@ chokidar@^3.5.1: optionalDependencies: fsevents "~2.3.2" +chokidar@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + ci-info@^3.2.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" @@ -3526,6 +3646,11 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== +codepage@~1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/codepage/-/codepage-1.15.0.tgz#2e00519024b39424ec66eeb3ec07227e692618ab" + integrity sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA== + collect-v8-coverage@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" @@ -3689,6 +3814,11 @@ cosmiconfig@^8.1.0, cosmiconfig@^8.1.3: parse-json "^5.2.0" path-type "^4.0.0" +crc-32@~1.2.0, crc-32@~1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + create-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" @@ -3943,6 +4073,11 @@ detect-indent@^6.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -4681,6 +4816,11 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +frac@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b" + integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA== + fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -5068,6 +5208,11 @@ ignore@^5.2.0, ignore@^5.3.0, ignore@^5.3.1: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== +immutable@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.0.3.tgz#aa037e2313ea7b5d400cd9298fa14e404c933db1" + integrity sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw== + immutable@~3.7.6: version "3.7.6" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" @@ -6350,6 +6495,11 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== +"memoize-one@>=3.1.1 <6": + version "5.2.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + memory-pager@^1.0.2: version "1.5.0" resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" @@ -6574,6 +6724,11 @@ node-abort-controller@^3.1.1: resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -7302,6 +7457,19 @@ react-transition-group@^4.4.5: loose-envify "^1.4.0" prop-types "^15.6.2" +react-virtualized-auto-sizer@^1.0.20: + version "1.0.25" + resolved "https://registry.yarnpkg.com/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.25.tgz#b13cbc528ac200be2bd1ffa40c8bb19bcc60ac3f" + integrity sha512-YHsksEGDfsHbHuaBVDYwJmcktblcHGafz4ZVuYPQYuSHMUGjpwmUCrAOcvMSGMwwk1eFWj1M/1GwYpNPuyhaBg== + +react-window@^1.8.10: + version "1.8.11" + resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.11.tgz#a857b48fa85bd77042d59cc460964ff2e0648525" + integrity sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ== + dependencies: + "@babel/runtime" "^7.0.0" + memoize-one ">=3.1.1 <6" + react@^18.3.1: version "18.3.1" resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" @@ -7327,6 +7495,11 @@ readable-stream@^3.4.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdirp@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" + integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -7572,6 +7745,17 @@ safe-regex-test@^1.0.3: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sass@^1.71.1: + version "1.83.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.83.0.tgz#e36842c0b88a94ed336fd16249b878a0541d536f" + integrity sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw== + dependencies: + chokidar "^4.0.0" + immutable "^5.0.2" + source-map-js ">=0.6.2 <2.0.0" + optionalDependencies: + "@parcel/watcher" "^2.4.1" + saxes@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" @@ -7792,7 +7976,7 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" -source-map-js@^1.2.0, source-map-js@^1.2.1: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== @@ -7868,6 +8052,13 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +ssf@~0.11.2: + version "0.11.2" + resolved "https://registry.yarnpkg.com/ssf/-/ssf-0.11.2.tgz#0b99698b237548d088fc43cdf2b70c1a7512c06c" + integrity sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g== + dependencies: + frac "~1.1.2" + stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -8803,11 +8994,21 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +wmf@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da" + integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw== + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== +word@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/word/-/word-0.3.0.tgz#8542157e4f8e849f4a363a288992d47612db9961" + integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA== + wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -8853,6 +9054,19 @@ ws@^8.11.0, ws@^8.17.1: resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== +xlsx@^0.18.5: + version "0.18.5" + resolved "https://registry.yarnpkg.com/xlsx/-/xlsx-0.18.5.tgz#16711b9113c848076b8a177022799ad356eba7d0" + integrity sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ== + dependencies: + adler-32 "~1.3.0" + cfb "~1.2.1" + codepage "~1.15.0" + crc-32 "~1.2.1" + ssf "~0.11.2" + wmf "~1.0.1" + word "~0.3.0" + xml-name-validator@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835"