@strapi/admin 5.42.1 → 5.43.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/admin/admin/src/components/Form.js +11 -10
- package/dist/admin/admin/src/components/Form.js.map +1 -1
- package/dist/admin/admin/src/components/Form.mjs +11 -10
- package/dist/admin/admin/src/components/Form.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Date.js +2 -2
- package/dist/admin/admin/src/components/FormInputs/Date.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Date.mjs +2 -2
- package/dist/admin/admin/src/components/FormInputs/Date.mjs.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Context.js +3 -2
- package/dist/admin/admin/src/components/GuidedTour/Context.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Context.mjs +3 -2
- package/dist/admin/admin/src/components/GuidedTour/Context.mjs.map +1 -1
- package/dist/admin/admin/src/components/PageHelpers.js +1 -1
- package/dist/admin/admin/src/components/PageHelpers.js.map +1 -1
- package/dist/admin/admin/src/components/PageHelpers.mjs +1 -1
- package/dist/admin/admin/src/components/PageHelpers.mjs.map +1 -1
- package/dist/admin/admin/src/components/Table.js +28 -15
- package/dist/admin/admin/src/components/Table.js.map +1 -1
- package/dist/admin/admin/src/components/Table.mjs +29 -16
- package/dist/admin/admin/src/components/Table.mjs.map +1 -1
- package/dist/admin/admin/src/core/store/configure.js +3 -1
- package/dist/admin/admin/src/core/store/configure.js.map +1 -1
- package/dist/admin/admin/src/core/store/configure.mjs +3 -1
- package/dist/admin/admin/src/core/store/configure.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/usePersistentState.js +9 -4
- package/dist/admin/admin/src/hooks/usePersistentState.js.map +1 -1
- package/dist/admin/admin/src/hooks/usePersistentState.mjs +10 -6
- package/dist/admin/admin/src/hooks/usePersistentState.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js +4 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.mjs +4 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.mjs.map +1 -1
- package/dist/admin/admin/src/render.js +2 -0
- package/dist/admin/admin/src/render.js.map +1 -1
- package/dist/admin/admin/src/render.mjs +2 -0
- package/dist/admin/admin/src/render.mjs.map +1 -1
- package/dist/admin/admin/src/services/api.js +2 -2
- package/dist/admin/admin/src/services/api.js.map +1 -1
- package/dist/admin/admin/src/services/api.mjs +2 -2
- package/dist/admin/admin/src/services/api.mjs.map +1 -1
- package/dist/admin/admin/src/translations/nl.json.js +394 -89
- package/dist/admin/admin/src/translations/nl.json.js.map +1 -1
- package/dist/admin/admin/src/translations/nl.json.mjs +393 -90
- package/dist/admin/admin/src/translations/nl.json.mjs.map +1 -1
- package/dist/admin/ee/admin/src/hooks/useAIUsageWarning.js +1 -1
- package/dist/admin/ee/admin/src/hooks/useAIUsageWarning.js.map +1 -1
- package/dist/admin/ee/admin/src/hooks/useAIUsageWarning.mjs +2 -2
- package/dist/admin/ee/admin/src/hooks/useAIUsageWarning.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs +2 -2
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs.map +1 -1
- package/dist/admin/ee/admin/src/services/ai.js +7 -7
- package/dist/admin/ee/admin/src/services/ai.js.map +1 -1
- package/dist/admin/ee/admin/src/services/ai.mjs +6 -6
- package/dist/admin/ee/admin/src/services/ai.mjs.map +1 -1
- package/dist/admin/ee.js +2 -2
- package/dist/admin/ee.mjs +1 -1
- package/dist/admin/index.js +1 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/admin/src/core/store/configure.d.ts +2 -2
- package/dist/admin/src/core/store/hooks.d.ts +2 -2
- package/dist/admin/src/ee.d.ts +1 -1
- package/dist/admin/src/hooks/useAdminRoles.d.ts +1 -1
- package/dist/admin/src/hooks/usePersistentState.d.ts +2 -1
- package/dist/admin/src/index.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +4 -4
- package/dist/admin/src/selectors.d.ts +2 -2
- package/dist/admin/src/services/admin.d.ts +6 -6
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/apiTokens.d.ts +1 -1
- package/dist/admin/src/services/auth.d.ts +11 -11
- package/dist/admin/src/services/contentApi.d.ts +1 -1
- package/dist/admin/src/services/contentManager.d.ts +1 -1
- package/dist/admin/src/services/homepage.d.ts +3 -3
- package/dist/admin/src/services/transferTokens.d.ts +1 -1
- package/dist/admin/src/services/users.d.ts +8 -8
- package/dist/admin/src/services/webhooks.d.ts +2 -2
- package/dist/admin/tests/utils.d.ts +1 -1
- package/dist/ee/admin/src/services/ai.d.ts +6 -6
- package/dist/ee/admin/src/services/auditLogs.d.ts +1 -1
- package/dist/ee/server/src/index.d.ts +0 -16
- package/dist/ee/server/src/index.d.ts.map +1 -1
- package/dist/server/ee/server/src/index.js +0 -16
- package/dist/server/ee/server/src/index.js.map +1 -1
- package/dist/server/ee/server/src/index.mjs +0 -16
- package/dist/server/ee/server/src/index.mjs.map +1 -1
- package/dist/server/server/src/ai/controllers/ai.js +52 -0
- package/dist/server/server/src/ai/controllers/ai.js.map +1 -0
- package/dist/server/server/src/ai/controllers/ai.mjs +50 -0
- package/dist/server/server/src/ai/controllers/ai.mjs.map +1 -0
- package/dist/server/{ee/server → server}/src/ai/routes/ai.js +1 -2
- package/dist/server/server/src/ai/routes/ai.js.map +1 -0
- package/dist/server/{ee/server → server}/src/ai/routes/ai.mjs +1 -2
- package/dist/server/server/src/ai/routes/ai.mjs.map +1 -0
- package/dist/server/{ee/server/src/ai/containers → server/src/ai/services}/ai.js +107 -32
- package/dist/server/server/src/ai/services/ai.js.map +1 -0
- package/dist/server/{ee/server/src/ai/containers → server/src/ai/services}/ai.mjs +107 -32
- package/dist/server/server/src/ai/services/ai.mjs.map +1 -0
- package/dist/server/server/src/controllers/index.js +3 -1
- package/dist/server/server/src/controllers/index.js.map +1 -1
- package/dist/server/server/src/controllers/index.mjs +3 -1
- package/dist/server/server/src/controllers/index.mjs.map +1 -1
- package/dist/server/server/src/register.js +4 -0
- package/dist/server/server/src/register.js.map +1 -1
- package/dist/server/server/src/register.mjs +4 -0
- package/dist/server/server/src/register.mjs.map +1 -1
- package/dist/server/server/src/routes/index.js +3 -1
- package/dist/server/server/src/routes/index.js.map +1 -1
- package/dist/server/server/src/routes/index.mjs +3 -1
- package/dist/server/server/src/routes/index.mjs.map +1 -1
- package/dist/{ee/server → server}/src/ai/controllers/ai.d.ts +1 -1
- package/dist/server/src/ai/controllers/ai.d.ts.map +1 -0
- package/dist/server/src/ai/routes/ai.d.ts.map +1 -0
- package/dist/server/src/ai/services/ai.d.ts +30 -0
- package/dist/server/src/ai/services/ai.d.ts.map +1 -0
- package/dist/server/src/controllers/index.d.ts +5 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +5 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/routes/index.d.ts.map +1 -1
- package/dist/shared/contracts/ai.d.ts +3 -3
- package/package.json +8 -8
- package/dist/ee/server/src/ai/containers/ai.d.ts +0 -15
- package/dist/ee/server/src/ai/containers/ai.d.ts.map +0 -1
- package/dist/ee/server/src/ai/controllers/ai.d.ts.map +0 -1
- package/dist/ee/server/src/ai/routes/ai.d.ts.map +0 -1
- package/dist/server/ee/server/src/ai/containers/ai.js.map +0 -1
- package/dist/server/ee/server/src/ai/containers/ai.mjs.map +0 -1
- package/dist/server/ee/server/src/ai/controllers/ai.js +0 -121
- package/dist/server/ee/server/src/ai/controllers/ai.js.map +0 -1
- package/dist/server/ee/server/src/ai/controllers/ai.mjs +0 -119
- package/dist/server/ee/server/src/ai/controllers/ai.mjs.map +0 -1
- package/dist/server/ee/server/src/ai/routes/ai.js.map +0 -1
- package/dist/server/ee/server/src/ai/routes/ai.mjs.map +0 -1
- /package/dist/{ee/server → server}/src/ai/routes/ai.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.js","sources":["../../../../../admin/src/components/Table.tsx"],"sourcesContent":["/**\n * TODO: honestly, half of this stuff should come straight from\n * the design-system and then we can just wrap round the bits for\n * the i18n & router interactions.\n *\n * So we'll do that in v2 of the DS.\n */\n\nimport * as React from 'react';\n\nimport {\n Flex,\n Typography,\n Th,\n Tbody,\n Td,\n Tooltip,\n IconButton,\n Thead,\n Tr,\n RawTrProps,\n Checkbox,\n Loader,\n Table as DSTable,\n EmptyStateLayout,\n EmptyStateLayoutProps,\n TableProps,\n RawTdProps,\n} from '@strapi/design-system';\nimport { CaretDown } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useControllableState } from '../hooks/useControllableState';\nimport { useQueryParams } from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface BaseRow {\n id: string | number;\n [key: string]: any;\n}\n\ninterface TableHeader<TData = object, THeader = object> {\n /**\n * Typically used by plugins to render a custom cell\n */\n cellFormatter?: (data: TData, header: Omit<THeader, 'cellFormatter'>) => React.ReactNode;\n label: string;\n name: string;\n searchable?: boolean;\n sortable?: boolean;\n}\n\ninterface TableContextValue<TRow extends BaseRow, THeader extends TableHeader<TRow, THeader>>\n extends Pick<TableProps, 'footer'> {\n colCount: number;\n hasHeaderCheckbox: boolean;\n headers: THeader[];\n isLoading: boolean;\n rowCount: number;\n rows: TRow[];\n setHasHeaderCheckbox: (value: boolean) => void;\n selectedRows: TRow[];\n selectRow: (row: TRow | TRow[]) => void;\n}\n\nconst [TableProvider, useTable] = createContext<TableContextValue<any, any>>('Table');\n\ninterface RootProps<TRow extends BaseRow, THeader extends TableHeader<TRow, THeader>>\n extends Partial<\n Pick<\n TableContextValue<TRow, THeader>,\n 'footer' | 'headers' | 'isLoading' | 'rows' | 'selectedRows'\n >\n > {\n children?: React.ReactNode;\n defaultSelectedRows?: TRow[];\n onSelectedRowsChange?: (selectedRows: TRow[]) => void;\n}\n\nconst Root = <TRow extends BaseRow, THeader extends TableHeader<TRow, THeader>>({\n children,\n defaultSelectedRows,\n footer,\n headers = [],\n isLoading = false,\n onSelectedRowsChange,\n rows = [],\n selectedRows: selectedRowsProps,\n}: RootProps<TRow, THeader>) => {\n const [selectedRows = [], setSelectedRows] = useControllableState({\n prop: selectedRowsProps,\n defaultProp: defaultSelectedRows,\n onChange: onSelectedRowsChange,\n });\n const [hasHeaderCheckbox, setHasHeaderCheckbox] = React.useState(false);\n\n const rowCount = rows.length + 1;\n const colCount = hasHeaderCheckbox ? headers.length + 1 : headers.length;\n\n const selectRow: TableContextValue<TRow, THeader>['selectRow'] = (row) => {\n if (Array.isArray(row)) {\n setSelectedRows(row);\n } else {\n setSelectedRows((prev = []) => {\n const currentRowIndex = prev.findIndex((r) => r.id === row.id);\n if (currentRowIndex > -1) {\n return prev.toSpliced(currentRowIndex, 1);\n }\n\n return [...prev, row];\n });\n }\n };\n\n return (\n <TableProvider\n colCount={colCount}\n hasHeaderCheckbox={hasHeaderCheckbox}\n setHasHeaderCheckbox={setHasHeaderCheckbox}\n footer={footer}\n headers={headers}\n isLoading={isLoading}\n rowCount={rowCount}\n rows={rows}\n selectedRows={selectedRows}\n selectRow={selectRow}\n >\n {children}\n </TableProvider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Content\n * -----------------------------------------------------------------------------------------------*/\n\nconst Content = ({ children }: Table.ContentProps) => {\n const rowCount = useTable('Content', (state) => state.rowCount);\n const colCount = useTable('Content', (state) => state.colCount);\n const footer = useTable('Content', (state) => state.footer);\n\n return (\n <DSTable rowCount={rowCount} colCount={colCount} footer={footer}>\n {children}\n </DSTable>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Head\n * -----------------------------------------------------------------------------------------------*/\n\nconst Head = ({ children }: Table.HeadProps) => {\n return (\n <Thead>\n <Tr>{children}</Tr>\n </Thead>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderCell\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @description A header cell in your table, internally will set the query params for sorting to\n * be passed to your data-fetching function.\n */\nconst HeaderCell = <TData, THead>({ name, label, sortable }: TableHeader<TData, THead>) => {\n const [{ query }, setQuery] = useQueryParams<{ sort?: `${string}:${'ASC' | 'DESC'}` }>();\n const sort = query?.sort ?? '';\n const [sortBy, sortOrder] = sort.split(':');\n const { formatMessage } = useIntl();\n const isSorted = sortBy === name;\n\n const sortLabel = formatMessage(\n { id: 'components.TableHeader.sort', defaultMessage: 'Sort on {label}' },\n { label }\n );\n\n const handleClickSort = () => {\n if (sortable) {\n setQuery(\n {\n sort: `${name}:${isSorted && sortOrder === 'ASC' ? 'DESC' : 'ASC'}`,\n },\n 'push',\n true\n );\n }\n };\n\n return (\n <Th\n action={\n isSorted &&\n sortable && (\n <IconButton label={sortLabel} onClick={handleClickSort} variant=\"ghost\">\n <SortIcon $isUp={sortOrder === 'ASC'} />\n </IconButton>\n )\n }\n >\n <Tooltip label={sortable ? sortLabel : label}>\n <Typography\n textColor=\"neutral600\"\n tag={!isSorted && sortable ? 'button' : 'span'}\n onClick={handleClickSort}\n variant=\"sigma\"\n >\n {label}\n </Typography>\n </Tooltip>\n </Th>\n );\n};\n\nconst SortIcon = styled(CaretDown)<{\n $isUp: boolean;\n}>`\n transform: ${({ $isUp }) => `rotate(${$isUp ? '180' : '0'}deg)`};\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * ActionBar\n * -----------------------------------------------------------------------------------------------*/\n\nconst ActionBar = ({ children }: Table.ActionBarProps) => {\n const { formatMessage } = useIntl();\n const selectedRows = useTable('ActionBar', (state) => state.selectedRows);\n\n if (selectedRows.length === 0) return null;\n\n return (\n <Flex gap={2}>\n <Typography variant=\"omega\" textColor=\"neutral500\">\n {formatMessage(\n {\n id: 'content-manager.components.TableDelete.label',\n defaultMessage: '{number, plural, one {# row} other {# rows}} selected',\n },\n { number: selectedRows.length }\n )}\n </Typography>\n {children}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderCheckboxCell\n * -----------------------------------------------------------------------------------------------*/\n\nconst HeaderCheckboxCell = () => {\n const rows = useTable('HeaderCheckboxCell', (state) => state.rows);\n const selectedRows = useTable('HeaderCheckboxCell', (state) => state.selectedRows);\n const selectRow = useTable('HeaderCheckboxCell', (state) => state.selectRow);\n const setHasHeaderCheckbox = useTable(\n 'HeaderCheckboxCell',\n (state) => state.setHasHeaderCheckbox\n );\n\n const { formatMessage } = useIntl();\n\n const areAllEntriesSelected = selectedRows.length === rows.length && rows.length > 0;\n const isIndeterminate = !areAllEntriesSelected && selectedRows.length > 0;\n\n React.useEffect(() => {\n setHasHeaderCheckbox(true);\n\n return () => setHasHeaderCheckbox(false);\n }, [setHasHeaderCheckbox]);\n\n const handleSelectAll = () => {\n if (!areAllEntriesSelected) {\n selectRow(rows);\n } else {\n selectRow([]);\n }\n };\n\n return (\n <Th>\n <Checkbox\n aria-label={formatMessage({\n id: 'global.select-all-entries',\n defaultMessage: 'Select all entries',\n })}\n disabled={rows.length === 0}\n checked={isIndeterminate ? 'indeterminate' : areAllEntriesSelected}\n onCheckedChange={handleSelectAll}\n />\n </Th>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Empty\n * -----------------------------------------------------------------------------------------------*/\n\nconst Empty = (props: Table.EmptyProps) => {\n const { formatMessage } = useIntl();\n\n const rows = useTable('Empty', (state) => state.rows);\n const isLoading = useTable('Empty', (state) => state.isLoading);\n const colCount = useTable('Empty', (state) => state.colCount);\n\n /**\n * If we're loading or we have some data, we don't show the empty state.\n */\n if (rows.length > 0 || isLoading) {\n return null;\n }\n\n return (\n <Tbody>\n <Tr>\n <Td colSpan={colCount}>\n <EmptyStateLayout\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n hasRadius\n icon={<EmptyDocuments width=\"16rem\" />}\n {...props}\n />\n </Td>\n </Tr>\n </Tbody>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LoadingBody\n * -----------------------------------------------------------------------------------------------*/\n\nconst Loading = ({ children = 'Loading content' }: Table.LoadingProps) => {\n const isLoading = useTable('Loading', (state) => state.isLoading);\n const colCount = useTable('Loading', (state) => state.colCount);\n\n if (!isLoading) {\n return null;\n }\n\n return (\n <Tbody>\n <Tr>\n <Td colSpan={colCount}>\n <Flex justifyContent=\"center\" padding={11} background=\"neutral0\">\n <Loader>{children}</Loader>\n </Flex>\n </Td>\n </Tr>\n </Tbody>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Body\n * -----------------------------------------------------------------------------------------------*/\n\nconst Body = ({ children }: Table.BodyProps) => {\n const isLoading = useTable('Body', (state) => state.isLoading);\n const rows = useTable('Body', (state) => state.rows);\n\n if (isLoading || rows.length === 0) {\n return null;\n }\n\n return <Tbody>{children}</Tbody>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Row\n * -----------------------------------------------------------------------------------------------*/\nconst Row = (props: Table.RowProps) => {\n return <Tr {...props} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Cell\n * -----------------------------------------------------------------------------------------------*/\nconst Cell = (props: Table.CellProps) => {\n return <Td {...props} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Row\n * -----------------------------------------------------------------------------------------------*/\nconst CheckboxCell = ({ id, ...props }: Table.CheckboxCellProps) => {\n const rows = useTable('CheckboxCell', (state) => state.rows);\n const selectedRows = useTable('CheckboxCell', (state) => state.selectedRows);\n const selectRow = useTable('CheckboxCell', (state) => state.selectRow);\n\n const { formatMessage } = useIntl();\n\n const handleSelectRow = () => {\n selectRow(rows.find((row) => row.id === id));\n };\n\n const isChecked = selectedRows.findIndex((row) => row.id === id) > -1;\n\n return (\n <Cell {...props} onClick={(e) => e.stopPropagation()}>\n <Checkbox\n aria-label={formatMessage(\n {\n id: 'app.component.table.select.one-entry',\n defaultMessage: `Select {target}`,\n },\n { target: id }\n )}\n disabled={rows.length === 0}\n checked={isChecked}\n onCheckedChange={handleSelectRow}\n />\n </Cell>\n );\n};\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha we may move this component to the design-system.\n * @public\n * @description A generic table component composition. Internally handles the state of the table\n * such as selected rows, loading state, and more assuming the correct pieces are put togther.\n * @example\n * ```tsx\n * interace Data {\n * id: string;\n * name: string;\n * email: string;\n * }\n *\n * const ListView = () => {\n * const { data, isLoading } = useGetData<Data>();\n *\n * const headers: Table.Header<Data>[] = [\n * {\n * label: 'Name',\n * name: 'name',\n * sortable: true,\n * },\n * {\n * label: 'Email',\n * name: 'email',\n * sortable: true,\n * },\n * ];\n *\n * return (\n * <Table.Root rows={data} headers={headers} isLoading={isLoading}>\n * <Table.Content>\n * <Table.Head>\n * {headers.map((head) => (\n * <Table.HeaderCell key={head.name} {...head} />\n * ))}\n * </Table.Head>\n * <Table.Body>\n * <Table.Loading />\n * <Table.Empty />\n * {data.map((row) => (\n * <Table.Row key={row.id}>\n * <Table.Cell>{row.name}</Table.Cell>\n * <Table.Cell>{row.email}</Table.Cell>\n * </Table.Row>\n * ))}\n * </Table.Body>\n * </Table.Content>\n * </Table.Root>\n * );\n * };\n * ```\n */\nconst Table = {\n Root,\n Content,\n ActionBar,\n Head,\n HeaderCell,\n HeaderCheckboxCell,\n Body,\n CheckboxCell,\n Cell,\n Row,\n Loading,\n Empty,\n};\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Table {\n export type Props<\n TData extends BaseRow,\n THeader extends TableHeader<TData, THeader> = TableHeader<TData, TableHeader>,\n > = RootProps<TData, THeader>;\n export interface ActionBarProps {\n children?: React.ReactNode;\n }\n\n export interface ContentProps {\n children: React.ReactNode;\n }\n\n export type Header<TData, THeader> = TableHeader<TData, THeader>;\n\n export interface HeadProps {\n children: React.ReactNode;\n }\n\n export interface EmptyProps extends Partial<EmptyStateLayoutProps> {}\n\n export interface LoadingProps {\n children?: React.ReactNode;\n }\n\n export interface BodyProps {\n children: React.ReactNode;\n }\n\n export interface RowProps extends RawTrProps {}\n\n export interface CellProps extends RawTdProps {}\n\n export interface CheckboxCellProps extends Pick<BaseRow, 'id'>, Omit<RawTdProps, 'id'> {}\n}\n\nexport { Table, useTable };\n"],"names":["TableProvider","useTable","createContext","Root","children","defaultSelectedRows","footer","headers","isLoading","onSelectedRowsChange","rows","selectedRows","selectedRowsProps","setSelectedRows","useControllableState","prop","defaultProp","onChange","hasHeaderCheckbox","setHasHeaderCheckbox","React","useState","rowCount","length","colCount","selectRow","row","Array","isArray","prev","currentRowIndex","findIndex","r","id","toSpliced","_jsx","Content","state","DSTable","Head","Thead","Tr","HeaderCell","name","label","sortable","query","setQuery","useQueryParams","sort","sortBy","sortOrder","split","formatMessage","useIntl","isSorted","sortLabel","defaultMessage","handleClickSort","Th","action","IconButton","onClick","variant","SortIcon","$isUp","Tooltip","Typography","textColor","tag","styled","CaretDown","ActionBar","_jsxs","Flex","gap","number","HeaderCheckboxCell","areAllEntriesSelected","isIndeterminate","useEffect","handleSelectAll","Checkbox","aria-label","disabled","checked","onCheckedChange","Empty","props","Tbody","Td","colSpan","EmptyStateLayout","content","hasRadius","icon","EmptyDocuments","width","Loading","justifyContent","padding","background","Loader","Body","Row","Cell","CheckboxCell","handleSelectRow","find","isChecked","e","stopPropagation","target","Table"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Table.js","sources":["../../../../../admin/src/components/Table.tsx"],"sourcesContent":["/**\n * TODO: honestly, half of this stuff should come straight from\n * the design-system and then we can just wrap round the bits for\n * the i18n & router interactions.\n *\n * So we'll do that in v2 of the DS.\n */\n\nimport * as React from 'react';\n\nimport {\n Flex,\n Typography,\n Th,\n Tbody,\n Td,\n Tooltip,\n IconButton,\n Thead,\n Tr,\n RawTrProps,\n Checkbox,\n Loader,\n Table as DSTable,\n EmptyStateLayout,\n EmptyStateLayoutProps,\n TableProps,\n RawTdProps,\n} from '@strapi/design-system';\nimport { CaretDown } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useControllableState } from '../hooks/useControllableState';\nimport { useQueryParams } from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface BaseRow {\n id: string | number;\n [key: string]: any;\n}\n\ninterface TableHeader<TData = object, THeader = object> {\n /**\n * Typically used by plugins to render a custom cell\n */\n cellFormatter?: (data: TData, header: Omit<THeader, 'cellFormatter'>) => React.ReactNode;\n label: string;\n name: string;\n searchable?: boolean;\n sortable?: boolean;\n}\n\ninterface TableContextValue<TRow extends BaseRow, THeader extends TableHeader<TRow, THeader>>\n extends Pick<TableProps, 'footer'> {\n colCount: number;\n hasHeaderCheckbox: boolean;\n headers: THeader[];\n isLoading: boolean;\n rowCount: number;\n rows: TRow[];\n setHasHeaderCheckbox: (value: boolean) => void;\n selectedRows: TRow[];\n selectRow: (row: TRow | TRow[]) => void;\n}\n\nconst [TableProvider, useTable] = createContext<TableContextValue<any, any>>('Table');\n\ninterface RootProps<TRow extends BaseRow, THeader extends TableHeader<TRow, THeader>>\n extends Partial<\n Pick<\n TableContextValue<TRow, THeader>,\n 'footer' | 'headers' | 'isLoading' | 'rows' | 'selectedRows'\n >\n > {\n children?: React.ReactNode;\n defaultSelectedRows?: TRow[];\n onSelectedRowsChange?: (selectedRows: TRow[]) => void;\n}\n\nconst Root = <TRow extends BaseRow, THeader extends TableHeader<TRow, THeader>>({\n children,\n defaultSelectedRows,\n footer,\n headers = [],\n isLoading = false,\n onSelectedRowsChange,\n rows = [],\n selectedRows: selectedRowsProps,\n}: RootProps<TRow, THeader>) => {\n const [selectedRows = [], setSelectedRows] = useControllableState({\n prop: selectedRowsProps,\n defaultProp: defaultSelectedRows,\n onChange: onSelectedRowsChange,\n });\n const [hasHeaderCheckbox, setHasHeaderCheckbox] = React.useState(false);\n\n const rowCount = rows.length + 1;\n const colCount = hasHeaderCheckbox ? headers.length + 1 : headers.length;\n\n const selectRow: TableContextValue<TRow, THeader>['selectRow'] = (row) => {\n if (Array.isArray(row)) {\n setSelectedRows(row);\n } else {\n setSelectedRows((prev = []) => {\n const currentRowIndex = prev.findIndex((r) => r.id === row.id);\n if (currentRowIndex > -1) {\n return prev.toSpliced(currentRowIndex, 1);\n }\n\n return [...prev, row];\n });\n }\n };\n\n return (\n <TableProvider\n colCount={colCount}\n hasHeaderCheckbox={hasHeaderCheckbox}\n setHasHeaderCheckbox={setHasHeaderCheckbox}\n footer={footer}\n headers={headers}\n isLoading={isLoading}\n rowCount={rowCount}\n rows={rows}\n selectedRows={selectedRows}\n selectRow={selectRow}\n >\n {children}\n </TableProvider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Content\n * -----------------------------------------------------------------------------------------------*/\n\nconst Content = ({ children }: Table.ContentProps) => {\n const rowCount = useTable('Content', (state) => state.rowCount);\n const colCount = useTable('Content', (state) => state.colCount);\n const footer = useTable('Content', (state) => state.footer);\n\n return (\n <DSTable rowCount={rowCount} colCount={colCount} footer={footer}>\n {children}\n </DSTable>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Head\n * -----------------------------------------------------------------------------------------------*/\n\nconst Head = ({ children }: Table.HeadProps) => {\n return (\n <Thead>\n <Tr>{children}</Tr>\n </Thead>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderCell\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @description A header cell in your table, internally will set the query params for sorting to\n * be passed to your data-fetching function.\n */\nconst HeaderCell = <TData, THead>({ name, label, sortable }: TableHeader<TData, THead>) => {\n const [{ query }, setQuery] = useQueryParams<{ sort?: `${string}:${'ASC' | 'DESC'}` }>();\n const sort = query?.sort ?? '';\n const [sortBy, sortOrder] = sort.split(':');\n const { formatMessage } = useIntl();\n const isSorted = sortBy === name;\n\n const sortLabel = formatMessage(\n { id: 'components.TableHeader.sort', defaultMessage: 'Sort on {label}' },\n { label }\n );\n\n const handleClickSort = () => {\n if (sortable) {\n setQuery(\n {\n sort: `${name}:${isSorted && sortOrder === 'ASC' ? 'DESC' : 'ASC'}`,\n },\n 'push',\n true\n );\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (sortable && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n handleClickSort();\n }\n };\n\n return (\n <SortableTh\n onClick={sortable ? handleClickSort : undefined}\n onKeyDown={sortable ? handleKeyDown : undefined}\n tabIndex={sortable ? 0 : undefined}\n aria-sort={isSorted ? (sortOrder === 'ASC' ? 'ascending' : 'descending') : undefined}\n $sortable={!!sortable}\n >\n <Tooltip label={sortable ? sortLabel : label}>\n <Flex gap={1}>\n <Typography textColor=\"neutral600\" tag=\"span\" variant=\"sigma\">\n {label}\n </Typography>\n {isSorted && sortable && <SortIcon $isUp={sortOrder === 'ASC'} />}\n </Flex>\n </Tooltip>\n </SortableTh>\n );\n};\n\nconst SortableTh = styled(Th)<{ $sortable: boolean }>`\n cursor: ${({ $sortable }) => ($sortable ? 'pointer' : 'default')};\n`;\n\nconst SortIcon = styled(CaretDown)<{\n $isUp: boolean;\n}>`\n transform: ${({ $isUp }) => `rotate(${$isUp ? '180' : '0'}deg)`};\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * ActionBar\n * -----------------------------------------------------------------------------------------------*/\n\nconst ActionBar = ({ children }: Table.ActionBarProps) => {\n const { formatMessage } = useIntl();\n const selectedRows = useTable('ActionBar', (state) => state.selectedRows);\n\n if (selectedRows.length === 0) return null;\n\n return (\n <Flex gap={2}>\n <Typography variant=\"omega\" textColor=\"neutral500\">\n {formatMessage(\n {\n id: 'content-manager.components.TableDelete.label',\n defaultMessage: '{number, plural, one {# row} other {# rows}} selected',\n },\n { number: selectedRows.length }\n )}\n </Typography>\n {children}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderCheckboxCell\n * -----------------------------------------------------------------------------------------------*/\n\nconst HeaderCheckboxCell = () => {\n const rows = useTable('HeaderCheckboxCell', (state) => state.rows);\n const selectedRows = useTable('HeaderCheckboxCell', (state) => state.selectedRows);\n const selectRow = useTable('HeaderCheckboxCell', (state) => state.selectRow);\n const setHasHeaderCheckbox = useTable(\n 'HeaderCheckboxCell',\n (state) => state.setHasHeaderCheckbox\n );\n\n const { formatMessage } = useIntl();\n\n const areAllEntriesSelected = selectedRows.length === rows.length && rows.length > 0;\n const isIndeterminate = !areAllEntriesSelected && selectedRows.length > 0;\n\n React.useEffect(() => {\n setHasHeaderCheckbox(true);\n\n return () => setHasHeaderCheckbox(false);\n }, [setHasHeaderCheckbox]);\n\n const handleSelectAll = () => {\n if (!areAllEntriesSelected) {\n selectRow(rows);\n } else {\n selectRow([]);\n }\n };\n\n return (\n <Th>\n <Checkbox\n aria-label={formatMessage({\n id: 'global.select-all-entries',\n defaultMessage: 'Select all entries',\n })}\n disabled={rows.length === 0}\n checked={isIndeterminate ? 'indeterminate' : areAllEntriesSelected}\n onCheckedChange={handleSelectAll}\n />\n </Th>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Empty\n * -----------------------------------------------------------------------------------------------*/\n\nconst Empty = (props: Table.EmptyProps) => {\n const { formatMessage } = useIntl();\n\n const rows = useTable('Empty', (state) => state.rows);\n const isLoading = useTable('Empty', (state) => state.isLoading);\n const colCount = useTable('Empty', (state) => state.colCount);\n\n /**\n * If we're loading or we have some data, we don't show the empty state.\n */\n if (rows.length > 0 || isLoading) {\n return null;\n }\n\n return (\n <Tbody>\n <Tr>\n <Td colSpan={colCount}>\n <EmptyStateLayout\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n hasRadius\n icon={<EmptyDocuments width=\"16rem\" />}\n {...props}\n />\n </Td>\n </Tr>\n </Tbody>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LoadingBody\n * -----------------------------------------------------------------------------------------------*/\n\nconst Loading = ({ children = 'Loading content' }: Table.LoadingProps) => {\n const isLoading = useTable('Loading', (state) => state.isLoading);\n const colCount = useTable('Loading', (state) => state.colCount);\n\n if (!isLoading) {\n return null;\n }\n\n return (\n <Tbody>\n <Tr>\n <Td colSpan={colCount}>\n <Flex justifyContent=\"center\" padding={11} background=\"neutral0\">\n <Loader>{children}</Loader>\n </Flex>\n </Td>\n </Tr>\n </Tbody>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Body\n * -----------------------------------------------------------------------------------------------*/\n\nconst Body = ({ children }: Table.BodyProps) => {\n const isLoading = useTable('Body', (state) => state.isLoading);\n const rows = useTable('Body', (state) => state.rows);\n\n if (isLoading || rows.length === 0) {\n return null;\n }\n\n return <Tbody>{children}</Tbody>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Row\n * -----------------------------------------------------------------------------------------------*/\nconst Row = (props: Table.RowProps) => {\n return <Tr {...props} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Cell\n * -----------------------------------------------------------------------------------------------*/\nconst Cell = (props: Table.CellProps) => {\n return <Td {...props} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Row\n * -----------------------------------------------------------------------------------------------*/\nconst CheckboxCell = ({ id, ...props }: Table.CheckboxCellProps) => {\n const rows = useTable('CheckboxCell', (state) => state.rows);\n const selectedRows = useTable('CheckboxCell', (state) => state.selectedRows);\n const selectRow = useTable('CheckboxCell', (state) => state.selectRow);\n\n const { formatMessage } = useIntl();\n\n const handleSelectRow = () => {\n selectRow(rows.find((row) => row.id === id));\n };\n\n const isChecked = selectedRows.findIndex((row) => row.id === id) > -1;\n\n return (\n <Cell {...props} onClick={(e) => e.stopPropagation()}>\n <Checkbox\n aria-label={formatMessage(\n {\n id: 'app.component.table.select.one-entry',\n defaultMessage: `Select {target}`,\n },\n { target: id }\n )}\n disabled={rows.length === 0}\n checked={isChecked}\n onCheckedChange={handleSelectRow}\n />\n </Cell>\n );\n};\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha we may move this component to the design-system.\n * @public\n * @description A generic table component composition. Internally handles the state of the table\n * such as selected rows, loading state, and more assuming the correct pieces are put togther.\n * @example\n * ```tsx\n * interace Data {\n * id: string;\n * name: string;\n * email: string;\n * }\n *\n * const ListView = () => {\n * const { data, isLoading } = useGetData<Data>();\n *\n * const headers: Table.Header<Data>[] = [\n * {\n * label: 'Name',\n * name: 'name',\n * sortable: true,\n * },\n * {\n * label: 'Email',\n * name: 'email',\n * sortable: true,\n * },\n * ];\n *\n * return (\n * <Table.Root rows={data} headers={headers} isLoading={isLoading}>\n * <Table.Content>\n * <Table.Head>\n * {headers.map((head) => (\n * <Table.HeaderCell key={head.name} {...head} />\n * ))}\n * </Table.Head>\n * <Table.Body>\n * <Table.Loading />\n * <Table.Empty />\n * {data.map((row) => (\n * <Table.Row key={row.id}>\n * <Table.Cell>{row.name}</Table.Cell>\n * <Table.Cell>{row.email}</Table.Cell>\n * </Table.Row>\n * ))}\n * </Table.Body>\n * </Table.Content>\n * </Table.Root>\n * );\n * };\n * ```\n */\nconst Table = {\n Root,\n Content,\n ActionBar,\n Head,\n HeaderCell,\n HeaderCheckboxCell,\n Body,\n CheckboxCell,\n Cell,\n Row,\n Loading,\n Empty,\n};\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Table {\n export type Props<\n TData extends BaseRow,\n THeader extends TableHeader<TData, THeader> = TableHeader<TData, TableHeader>,\n > = RootProps<TData, THeader>;\n export interface ActionBarProps {\n children?: React.ReactNode;\n }\n\n export interface ContentProps {\n children: React.ReactNode;\n }\n\n export type Header<TData, THeader> = TableHeader<TData, THeader>;\n\n export interface HeadProps {\n children: React.ReactNode;\n }\n\n export interface EmptyProps extends Partial<EmptyStateLayoutProps> {}\n\n export interface LoadingProps {\n children?: React.ReactNode;\n }\n\n export interface BodyProps {\n children: React.ReactNode;\n }\n\n export interface RowProps extends RawTrProps {}\n\n export interface CellProps extends RawTdProps {}\n\n export interface CheckboxCellProps extends Pick<BaseRow, 'id'>, Omit<RawTdProps, 'id'> {}\n}\n\nexport { Table, useTable };\n"],"names":["TableProvider","useTable","createContext","Root","children","defaultSelectedRows","footer","headers","isLoading","onSelectedRowsChange","rows","selectedRows","selectedRowsProps","setSelectedRows","useControllableState","prop","defaultProp","onChange","hasHeaderCheckbox","setHasHeaderCheckbox","React","useState","rowCount","length","colCount","selectRow","row","Array","isArray","prev","currentRowIndex","findIndex","r","id","toSpliced","_jsx","Content","state","DSTable","Head","Thead","Tr","HeaderCell","name","label","sortable","query","setQuery","useQueryParams","sort","sortBy","sortOrder","split","formatMessage","useIntl","isSorted","sortLabel","defaultMessage","handleClickSort","handleKeyDown","e","key","preventDefault","SortableTh","onClick","undefined","onKeyDown","tabIndex","aria-sort","$sortable","Tooltip","_jsxs","Flex","gap","Typography","textColor","tag","variant","SortIcon","$isUp","styled","Th","CaretDown","ActionBar","number","HeaderCheckboxCell","areAllEntriesSelected","isIndeterminate","useEffect","handleSelectAll","Checkbox","aria-label","disabled","checked","onCheckedChange","Empty","props","Tbody","Td","colSpan","EmptyStateLayout","content","hasRadius","icon","EmptyDocuments","width","Loading","justifyContent","padding","background","Loader","Body","Row","Cell","CheckboxCell","handleSelectRow","find","isChecked","stopPropagation","target","Table"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import { Tbody, Tr, Td, EmptyStateLayout, Flex, Loader, Checkbox,
|
|
3
|
+
import { Th, Tbody, Tr, Td, EmptyStateLayout, Flex, Loader, Checkbox, Tooltip, Typography, Thead, Table as Table$1 } from '@strapi/design-system';
|
|
4
4
|
import { CaretDown } from '@strapi/icons';
|
|
5
5
|
import { EmptyDocuments } from '@strapi/icons/symbols';
|
|
6
6
|
import { useIntl } from 'react-intl';
|
|
@@ -95,27 +95,40 @@ const Root = ({ children, defaultSelectedRows, footer, headers = [], isLoading =
|
|
|
95
95
|
}, 'push', true);
|
|
96
96
|
}
|
|
97
97
|
};
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
98
|
+
const handleKeyDown = (e)=>{
|
|
99
|
+
if (sortable && (e.key === 'Enter' || e.key === ' ')) {
|
|
100
|
+
e.preventDefault();
|
|
101
|
+
handleClickSort();
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
return /*#__PURE__*/ jsx(SortableTh, {
|
|
105
|
+
onClick: sortable ? handleClickSort : undefined,
|
|
106
|
+
onKeyDown: sortable ? handleKeyDown : undefined,
|
|
107
|
+
tabIndex: sortable ? 0 : undefined,
|
|
108
|
+
"aria-sort": isSorted ? sortOrder === 'ASC' ? 'ascending' : 'descending' : undefined,
|
|
109
|
+
$sortable: !!sortable,
|
|
107
110
|
children: /*#__PURE__*/ jsx(Tooltip, {
|
|
108
111
|
label: sortable ? sortLabel : label,
|
|
109
|
-
children: /*#__PURE__*/
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
112
|
+
children: /*#__PURE__*/ jsxs(Flex, {
|
|
113
|
+
gap: 1,
|
|
114
|
+
children: [
|
|
115
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
116
|
+
textColor: "neutral600",
|
|
117
|
+
tag: "span",
|
|
118
|
+
variant: "sigma",
|
|
119
|
+
children: label
|
|
120
|
+
}),
|
|
121
|
+
isSorted && sortable && /*#__PURE__*/ jsx(SortIcon, {
|
|
122
|
+
$isUp: sortOrder === 'ASC'
|
|
123
|
+
})
|
|
124
|
+
]
|
|
115
125
|
})
|
|
116
126
|
})
|
|
117
127
|
});
|
|
118
128
|
};
|
|
129
|
+
const SortableTh = styled(Th)`
|
|
130
|
+
cursor: ${({ $sortable })=>$sortable ? 'pointer' : 'default'};
|
|
131
|
+
`;
|
|
119
132
|
const SortIcon = styled(CaretDown)`
|
|
120
133
|
transform: ${({ $isUp })=>`rotate(${$isUp ? '180' : '0'}deg)`};
|
|
121
134
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.mjs","sources":["../../../../../admin/src/components/Table.tsx"],"sourcesContent":["/**\n * TODO: honestly, half of this stuff should come straight from\n * the design-system and then we can just wrap round the bits for\n * the i18n & router interactions.\n *\n * So we'll do that in v2 of the DS.\n */\n\nimport * as React from 'react';\n\nimport {\n Flex,\n Typography,\n Th,\n Tbody,\n Td,\n Tooltip,\n IconButton,\n Thead,\n Tr,\n RawTrProps,\n Checkbox,\n Loader,\n Table as DSTable,\n EmptyStateLayout,\n EmptyStateLayoutProps,\n TableProps,\n RawTdProps,\n} from '@strapi/design-system';\nimport { CaretDown } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useControllableState } from '../hooks/useControllableState';\nimport { useQueryParams } from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface BaseRow {\n id: string | number;\n [key: string]: any;\n}\n\ninterface TableHeader<TData = object, THeader = object> {\n /**\n * Typically used by plugins to render a custom cell\n */\n cellFormatter?: (data: TData, header: Omit<THeader, 'cellFormatter'>) => React.ReactNode;\n label: string;\n name: string;\n searchable?: boolean;\n sortable?: boolean;\n}\n\ninterface TableContextValue<TRow extends BaseRow, THeader extends TableHeader<TRow, THeader>>\n extends Pick<TableProps, 'footer'> {\n colCount: number;\n hasHeaderCheckbox: boolean;\n headers: THeader[];\n isLoading: boolean;\n rowCount: number;\n rows: TRow[];\n setHasHeaderCheckbox: (value: boolean) => void;\n selectedRows: TRow[];\n selectRow: (row: TRow | TRow[]) => void;\n}\n\nconst [TableProvider, useTable] = createContext<TableContextValue<any, any>>('Table');\n\ninterface RootProps<TRow extends BaseRow, THeader extends TableHeader<TRow, THeader>>\n extends Partial<\n Pick<\n TableContextValue<TRow, THeader>,\n 'footer' | 'headers' | 'isLoading' | 'rows' | 'selectedRows'\n >\n > {\n children?: React.ReactNode;\n defaultSelectedRows?: TRow[];\n onSelectedRowsChange?: (selectedRows: TRow[]) => void;\n}\n\nconst Root = <TRow extends BaseRow, THeader extends TableHeader<TRow, THeader>>({\n children,\n defaultSelectedRows,\n footer,\n headers = [],\n isLoading = false,\n onSelectedRowsChange,\n rows = [],\n selectedRows: selectedRowsProps,\n}: RootProps<TRow, THeader>) => {\n const [selectedRows = [], setSelectedRows] = useControllableState({\n prop: selectedRowsProps,\n defaultProp: defaultSelectedRows,\n onChange: onSelectedRowsChange,\n });\n const [hasHeaderCheckbox, setHasHeaderCheckbox] = React.useState(false);\n\n const rowCount = rows.length + 1;\n const colCount = hasHeaderCheckbox ? headers.length + 1 : headers.length;\n\n const selectRow: TableContextValue<TRow, THeader>['selectRow'] = (row) => {\n if (Array.isArray(row)) {\n setSelectedRows(row);\n } else {\n setSelectedRows((prev = []) => {\n const currentRowIndex = prev.findIndex((r) => r.id === row.id);\n if (currentRowIndex > -1) {\n return prev.toSpliced(currentRowIndex, 1);\n }\n\n return [...prev, row];\n });\n }\n };\n\n return (\n <TableProvider\n colCount={colCount}\n hasHeaderCheckbox={hasHeaderCheckbox}\n setHasHeaderCheckbox={setHasHeaderCheckbox}\n footer={footer}\n headers={headers}\n isLoading={isLoading}\n rowCount={rowCount}\n rows={rows}\n selectedRows={selectedRows}\n selectRow={selectRow}\n >\n {children}\n </TableProvider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Content\n * -----------------------------------------------------------------------------------------------*/\n\nconst Content = ({ children }: Table.ContentProps) => {\n const rowCount = useTable('Content', (state) => state.rowCount);\n const colCount = useTable('Content', (state) => state.colCount);\n const footer = useTable('Content', (state) => state.footer);\n\n return (\n <DSTable rowCount={rowCount} colCount={colCount} footer={footer}>\n {children}\n </DSTable>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Head\n * -----------------------------------------------------------------------------------------------*/\n\nconst Head = ({ children }: Table.HeadProps) => {\n return (\n <Thead>\n <Tr>{children}</Tr>\n </Thead>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderCell\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @description A header cell in your table, internally will set the query params for sorting to\n * be passed to your data-fetching function.\n */\nconst HeaderCell = <TData, THead>({ name, label, sortable }: TableHeader<TData, THead>) => {\n const [{ query }, setQuery] = useQueryParams<{ sort?: `${string}:${'ASC' | 'DESC'}` }>();\n const sort = query?.sort ?? '';\n const [sortBy, sortOrder] = sort.split(':');\n const { formatMessage } = useIntl();\n const isSorted = sortBy === name;\n\n const sortLabel = formatMessage(\n { id: 'components.TableHeader.sort', defaultMessage: 'Sort on {label}' },\n { label }\n );\n\n const handleClickSort = () => {\n if (sortable) {\n setQuery(\n {\n sort: `${name}:${isSorted && sortOrder === 'ASC' ? 'DESC' : 'ASC'}`,\n },\n 'push',\n true\n );\n }\n };\n\n return (\n <Th\n action={\n isSorted &&\n sortable && (\n <IconButton label={sortLabel} onClick={handleClickSort} variant=\"ghost\">\n <SortIcon $isUp={sortOrder === 'ASC'} />\n </IconButton>\n )\n }\n >\n <Tooltip label={sortable ? sortLabel : label}>\n <Typography\n textColor=\"neutral600\"\n tag={!isSorted && sortable ? 'button' : 'span'}\n onClick={handleClickSort}\n variant=\"sigma\"\n >\n {label}\n </Typography>\n </Tooltip>\n </Th>\n );\n};\n\nconst SortIcon = styled(CaretDown)<{\n $isUp: boolean;\n}>`\n transform: ${({ $isUp }) => `rotate(${$isUp ? '180' : '0'}deg)`};\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * ActionBar\n * -----------------------------------------------------------------------------------------------*/\n\nconst ActionBar = ({ children }: Table.ActionBarProps) => {\n const { formatMessage } = useIntl();\n const selectedRows = useTable('ActionBar', (state) => state.selectedRows);\n\n if (selectedRows.length === 0) return null;\n\n return (\n <Flex gap={2}>\n <Typography variant=\"omega\" textColor=\"neutral500\">\n {formatMessage(\n {\n id: 'content-manager.components.TableDelete.label',\n defaultMessage: '{number, plural, one {# row} other {# rows}} selected',\n },\n { number: selectedRows.length }\n )}\n </Typography>\n {children}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderCheckboxCell\n * -----------------------------------------------------------------------------------------------*/\n\nconst HeaderCheckboxCell = () => {\n const rows = useTable('HeaderCheckboxCell', (state) => state.rows);\n const selectedRows = useTable('HeaderCheckboxCell', (state) => state.selectedRows);\n const selectRow = useTable('HeaderCheckboxCell', (state) => state.selectRow);\n const setHasHeaderCheckbox = useTable(\n 'HeaderCheckboxCell',\n (state) => state.setHasHeaderCheckbox\n );\n\n const { formatMessage } = useIntl();\n\n const areAllEntriesSelected = selectedRows.length === rows.length && rows.length > 0;\n const isIndeterminate = !areAllEntriesSelected && selectedRows.length > 0;\n\n React.useEffect(() => {\n setHasHeaderCheckbox(true);\n\n return () => setHasHeaderCheckbox(false);\n }, [setHasHeaderCheckbox]);\n\n const handleSelectAll = () => {\n if (!areAllEntriesSelected) {\n selectRow(rows);\n } else {\n selectRow([]);\n }\n };\n\n return (\n <Th>\n <Checkbox\n aria-label={formatMessage({\n id: 'global.select-all-entries',\n defaultMessage: 'Select all entries',\n })}\n disabled={rows.length === 0}\n checked={isIndeterminate ? 'indeterminate' : areAllEntriesSelected}\n onCheckedChange={handleSelectAll}\n />\n </Th>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Empty\n * -----------------------------------------------------------------------------------------------*/\n\nconst Empty = (props: Table.EmptyProps) => {\n const { formatMessage } = useIntl();\n\n const rows = useTable('Empty', (state) => state.rows);\n const isLoading = useTable('Empty', (state) => state.isLoading);\n const colCount = useTable('Empty', (state) => state.colCount);\n\n /**\n * If we're loading or we have some data, we don't show the empty state.\n */\n if (rows.length > 0 || isLoading) {\n return null;\n }\n\n return (\n <Tbody>\n <Tr>\n <Td colSpan={colCount}>\n <EmptyStateLayout\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n hasRadius\n icon={<EmptyDocuments width=\"16rem\" />}\n {...props}\n />\n </Td>\n </Tr>\n </Tbody>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LoadingBody\n * -----------------------------------------------------------------------------------------------*/\n\nconst Loading = ({ children = 'Loading content' }: Table.LoadingProps) => {\n const isLoading = useTable('Loading', (state) => state.isLoading);\n const colCount = useTable('Loading', (state) => state.colCount);\n\n if (!isLoading) {\n return null;\n }\n\n return (\n <Tbody>\n <Tr>\n <Td colSpan={colCount}>\n <Flex justifyContent=\"center\" padding={11} background=\"neutral0\">\n <Loader>{children}</Loader>\n </Flex>\n </Td>\n </Tr>\n </Tbody>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Body\n * -----------------------------------------------------------------------------------------------*/\n\nconst Body = ({ children }: Table.BodyProps) => {\n const isLoading = useTable('Body', (state) => state.isLoading);\n const rows = useTable('Body', (state) => state.rows);\n\n if (isLoading || rows.length === 0) {\n return null;\n }\n\n return <Tbody>{children}</Tbody>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Row\n * -----------------------------------------------------------------------------------------------*/\nconst Row = (props: Table.RowProps) => {\n return <Tr {...props} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Cell\n * -----------------------------------------------------------------------------------------------*/\nconst Cell = (props: Table.CellProps) => {\n return <Td {...props} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Row\n * -----------------------------------------------------------------------------------------------*/\nconst CheckboxCell = ({ id, ...props }: Table.CheckboxCellProps) => {\n const rows = useTable('CheckboxCell', (state) => state.rows);\n const selectedRows = useTable('CheckboxCell', (state) => state.selectedRows);\n const selectRow = useTable('CheckboxCell', (state) => state.selectRow);\n\n const { formatMessage } = useIntl();\n\n const handleSelectRow = () => {\n selectRow(rows.find((row) => row.id === id));\n };\n\n const isChecked = selectedRows.findIndex((row) => row.id === id) > -1;\n\n return (\n <Cell {...props} onClick={(e) => e.stopPropagation()}>\n <Checkbox\n aria-label={formatMessage(\n {\n id: 'app.component.table.select.one-entry',\n defaultMessage: `Select {target}`,\n },\n { target: id }\n )}\n disabled={rows.length === 0}\n checked={isChecked}\n onCheckedChange={handleSelectRow}\n />\n </Cell>\n );\n};\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha we may move this component to the design-system.\n * @public\n * @description A generic table component composition. Internally handles the state of the table\n * such as selected rows, loading state, and more assuming the correct pieces are put togther.\n * @example\n * ```tsx\n * interace Data {\n * id: string;\n * name: string;\n * email: string;\n * }\n *\n * const ListView = () => {\n * const { data, isLoading } = useGetData<Data>();\n *\n * const headers: Table.Header<Data>[] = [\n * {\n * label: 'Name',\n * name: 'name',\n * sortable: true,\n * },\n * {\n * label: 'Email',\n * name: 'email',\n * sortable: true,\n * },\n * ];\n *\n * return (\n * <Table.Root rows={data} headers={headers} isLoading={isLoading}>\n * <Table.Content>\n * <Table.Head>\n * {headers.map((head) => (\n * <Table.HeaderCell key={head.name} {...head} />\n * ))}\n * </Table.Head>\n * <Table.Body>\n * <Table.Loading />\n * <Table.Empty />\n * {data.map((row) => (\n * <Table.Row key={row.id}>\n * <Table.Cell>{row.name}</Table.Cell>\n * <Table.Cell>{row.email}</Table.Cell>\n * </Table.Row>\n * ))}\n * </Table.Body>\n * </Table.Content>\n * </Table.Root>\n * );\n * };\n * ```\n */\nconst Table = {\n Root,\n Content,\n ActionBar,\n Head,\n HeaderCell,\n HeaderCheckboxCell,\n Body,\n CheckboxCell,\n Cell,\n Row,\n Loading,\n Empty,\n};\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Table {\n export type Props<\n TData extends BaseRow,\n THeader extends TableHeader<TData, THeader> = TableHeader<TData, TableHeader>,\n > = RootProps<TData, THeader>;\n export interface ActionBarProps {\n children?: React.ReactNode;\n }\n\n export interface ContentProps {\n children: React.ReactNode;\n }\n\n export type Header<TData, THeader> = TableHeader<TData, THeader>;\n\n export interface HeadProps {\n children: React.ReactNode;\n }\n\n export interface EmptyProps extends Partial<EmptyStateLayoutProps> {}\n\n export interface LoadingProps {\n children?: React.ReactNode;\n }\n\n export interface BodyProps {\n children: React.ReactNode;\n }\n\n export interface RowProps extends RawTrProps {}\n\n export interface CellProps extends RawTdProps {}\n\n export interface CheckboxCellProps extends Pick<BaseRow, 'id'>, Omit<RawTdProps, 'id'> {}\n}\n\nexport { Table, useTable };\n"],"names":["TableProvider","useTable","createContext","Root","children","defaultSelectedRows","footer","headers","isLoading","onSelectedRowsChange","rows","selectedRows","selectedRowsProps","setSelectedRows","useControllableState","prop","defaultProp","onChange","hasHeaderCheckbox","setHasHeaderCheckbox","React","useState","rowCount","length","colCount","selectRow","row","Array","isArray","prev","currentRowIndex","findIndex","r","id","toSpliced","_jsx","Content","state","DSTable","Head","Thead","Tr","HeaderCell","name","label","sortable","query","setQuery","useQueryParams","sort","sortBy","sortOrder","split","formatMessage","useIntl","isSorted","sortLabel","defaultMessage","handleClickSort","Th","action","IconButton","onClick","variant","SortIcon","$isUp","Tooltip","Typography","textColor","tag","styled","CaretDown","ActionBar","_jsxs","Flex","gap","number","HeaderCheckboxCell","areAllEntriesSelected","isIndeterminate","useEffect","handleSelectAll","Checkbox","aria-label","disabled","checked","onCheckedChange","Empty","props","Tbody","Td","colSpan","EmptyStateLayout","content","hasRadius","icon","EmptyDocuments","width","Loading","justifyContent","padding","background","Loader","Body","Row","Cell","CheckboxCell","handleSelectRow","find","isChecked","e","stopPropagation","target","Table"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Table.mjs","sources":["../../../../../admin/src/components/Table.tsx"],"sourcesContent":["/**\n * TODO: honestly, half of this stuff should come straight from\n * the design-system and then we can just wrap round the bits for\n * the i18n & router interactions.\n *\n * So we'll do that in v2 of the DS.\n */\n\nimport * as React from 'react';\n\nimport {\n Flex,\n Typography,\n Th,\n Tbody,\n Td,\n Tooltip,\n IconButton,\n Thead,\n Tr,\n RawTrProps,\n Checkbox,\n Loader,\n Table as DSTable,\n EmptyStateLayout,\n EmptyStateLayoutProps,\n TableProps,\n RawTdProps,\n} from '@strapi/design-system';\nimport { CaretDown } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useControllableState } from '../hooks/useControllableState';\nimport { useQueryParams } from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface BaseRow {\n id: string | number;\n [key: string]: any;\n}\n\ninterface TableHeader<TData = object, THeader = object> {\n /**\n * Typically used by plugins to render a custom cell\n */\n cellFormatter?: (data: TData, header: Omit<THeader, 'cellFormatter'>) => React.ReactNode;\n label: string;\n name: string;\n searchable?: boolean;\n sortable?: boolean;\n}\n\ninterface TableContextValue<TRow extends BaseRow, THeader extends TableHeader<TRow, THeader>>\n extends Pick<TableProps, 'footer'> {\n colCount: number;\n hasHeaderCheckbox: boolean;\n headers: THeader[];\n isLoading: boolean;\n rowCount: number;\n rows: TRow[];\n setHasHeaderCheckbox: (value: boolean) => void;\n selectedRows: TRow[];\n selectRow: (row: TRow | TRow[]) => void;\n}\n\nconst [TableProvider, useTable] = createContext<TableContextValue<any, any>>('Table');\n\ninterface RootProps<TRow extends BaseRow, THeader extends TableHeader<TRow, THeader>>\n extends Partial<\n Pick<\n TableContextValue<TRow, THeader>,\n 'footer' | 'headers' | 'isLoading' | 'rows' | 'selectedRows'\n >\n > {\n children?: React.ReactNode;\n defaultSelectedRows?: TRow[];\n onSelectedRowsChange?: (selectedRows: TRow[]) => void;\n}\n\nconst Root = <TRow extends BaseRow, THeader extends TableHeader<TRow, THeader>>({\n children,\n defaultSelectedRows,\n footer,\n headers = [],\n isLoading = false,\n onSelectedRowsChange,\n rows = [],\n selectedRows: selectedRowsProps,\n}: RootProps<TRow, THeader>) => {\n const [selectedRows = [], setSelectedRows] = useControllableState({\n prop: selectedRowsProps,\n defaultProp: defaultSelectedRows,\n onChange: onSelectedRowsChange,\n });\n const [hasHeaderCheckbox, setHasHeaderCheckbox] = React.useState(false);\n\n const rowCount = rows.length + 1;\n const colCount = hasHeaderCheckbox ? headers.length + 1 : headers.length;\n\n const selectRow: TableContextValue<TRow, THeader>['selectRow'] = (row) => {\n if (Array.isArray(row)) {\n setSelectedRows(row);\n } else {\n setSelectedRows((prev = []) => {\n const currentRowIndex = prev.findIndex((r) => r.id === row.id);\n if (currentRowIndex > -1) {\n return prev.toSpliced(currentRowIndex, 1);\n }\n\n return [...prev, row];\n });\n }\n };\n\n return (\n <TableProvider\n colCount={colCount}\n hasHeaderCheckbox={hasHeaderCheckbox}\n setHasHeaderCheckbox={setHasHeaderCheckbox}\n footer={footer}\n headers={headers}\n isLoading={isLoading}\n rowCount={rowCount}\n rows={rows}\n selectedRows={selectedRows}\n selectRow={selectRow}\n >\n {children}\n </TableProvider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Content\n * -----------------------------------------------------------------------------------------------*/\n\nconst Content = ({ children }: Table.ContentProps) => {\n const rowCount = useTable('Content', (state) => state.rowCount);\n const colCount = useTable('Content', (state) => state.colCount);\n const footer = useTable('Content', (state) => state.footer);\n\n return (\n <DSTable rowCount={rowCount} colCount={colCount} footer={footer}>\n {children}\n </DSTable>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Head\n * -----------------------------------------------------------------------------------------------*/\n\nconst Head = ({ children }: Table.HeadProps) => {\n return (\n <Thead>\n <Tr>{children}</Tr>\n </Thead>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderCell\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @description A header cell in your table, internally will set the query params for sorting to\n * be passed to your data-fetching function.\n */\nconst HeaderCell = <TData, THead>({ name, label, sortable }: TableHeader<TData, THead>) => {\n const [{ query }, setQuery] = useQueryParams<{ sort?: `${string}:${'ASC' | 'DESC'}` }>();\n const sort = query?.sort ?? '';\n const [sortBy, sortOrder] = sort.split(':');\n const { formatMessage } = useIntl();\n const isSorted = sortBy === name;\n\n const sortLabel = formatMessage(\n { id: 'components.TableHeader.sort', defaultMessage: 'Sort on {label}' },\n { label }\n );\n\n const handleClickSort = () => {\n if (sortable) {\n setQuery(\n {\n sort: `${name}:${isSorted && sortOrder === 'ASC' ? 'DESC' : 'ASC'}`,\n },\n 'push',\n true\n );\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (sortable && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n handleClickSort();\n }\n };\n\n return (\n <SortableTh\n onClick={sortable ? handleClickSort : undefined}\n onKeyDown={sortable ? handleKeyDown : undefined}\n tabIndex={sortable ? 0 : undefined}\n aria-sort={isSorted ? (sortOrder === 'ASC' ? 'ascending' : 'descending') : undefined}\n $sortable={!!sortable}\n >\n <Tooltip label={sortable ? sortLabel : label}>\n <Flex gap={1}>\n <Typography textColor=\"neutral600\" tag=\"span\" variant=\"sigma\">\n {label}\n </Typography>\n {isSorted && sortable && <SortIcon $isUp={sortOrder === 'ASC'} />}\n </Flex>\n </Tooltip>\n </SortableTh>\n );\n};\n\nconst SortableTh = styled(Th)<{ $sortable: boolean }>`\n cursor: ${({ $sortable }) => ($sortable ? 'pointer' : 'default')};\n`;\n\nconst SortIcon = styled(CaretDown)<{\n $isUp: boolean;\n}>`\n transform: ${({ $isUp }) => `rotate(${$isUp ? '180' : '0'}deg)`};\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * ActionBar\n * -----------------------------------------------------------------------------------------------*/\n\nconst ActionBar = ({ children }: Table.ActionBarProps) => {\n const { formatMessage } = useIntl();\n const selectedRows = useTable('ActionBar', (state) => state.selectedRows);\n\n if (selectedRows.length === 0) return null;\n\n return (\n <Flex gap={2}>\n <Typography variant=\"omega\" textColor=\"neutral500\">\n {formatMessage(\n {\n id: 'content-manager.components.TableDelete.label',\n defaultMessage: '{number, plural, one {# row} other {# rows}} selected',\n },\n { number: selectedRows.length }\n )}\n </Typography>\n {children}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderCheckboxCell\n * -----------------------------------------------------------------------------------------------*/\n\nconst HeaderCheckboxCell = () => {\n const rows = useTable('HeaderCheckboxCell', (state) => state.rows);\n const selectedRows = useTable('HeaderCheckboxCell', (state) => state.selectedRows);\n const selectRow = useTable('HeaderCheckboxCell', (state) => state.selectRow);\n const setHasHeaderCheckbox = useTable(\n 'HeaderCheckboxCell',\n (state) => state.setHasHeaderCheckbox\n );\n\n const { formatMessage } = useIntl();\n\n const areAllEntriesSelected = selectedRows.length === rows.length && rows.length > 0;\n const isIndeterminate = !areAllEntriesSelected && selectedRows.length > 0;\n\n React.useEffect(() => {\n setHasHeaderCheckbox(true);\n\n return () => setHasHeaderCheckbox(false);\n }, [setHasHeaderCheckbox]);\n\n const handleSelectAll = () => {\n if (!areAllEntriesSelected) {\n selectRow(rows);\n } else {\n selectRow([]);\n }\n };\n\n return (\n <Th>\n <Checkbox\n aria-label={formatMessage({\n id: 'global.select-all-entries',\n defaultMessage: 'Select all entries',\n })}\n disabled={rows.length === 0}\n checked={isIndeterminate ? 'indeterminate' : areAllEntriesSelected}\n onCheckedChange={handleSelectAll}\n />\n </Th>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Empty\n * -----------------------------------------------------------------------------------------------*/\n\nconst Empty = (props: Table.EmptyProps) => {\n const { formatMessage } = useIntl();\n\n const rows = useTable('Empty', (state) => state.rows);\n const isLoading = useTable('Empty', (state) => state.isLoading);\n const colCount = useTable('Empty', (state) => state.colCount);\n\n /**\n * If we're loading or we have some data, we don't show the empty state.\n */\n if (rows.length > 0 || isLoading) {\n return null;\n }\n\n return (\n <Tbody>\n <Tr>\n <Td colSpan={colCount}>\n <EmptyStateLayout\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n hasRadius\n icon={<EmptyDocuments width=\"16rem\" />}\n {...props}\n />\n </Td>\n </Tr>\n </Tbody>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LoadingBody\n * -----------------------------------------------------------------------------------------------*/\n\nconst Loading = ({ children = 'Loading content' }: Table.LoadingProps) => {\n const isLoading = useTable('Loading', (state) => state.isLoading);\n const colCount = useTable('Loading', (state) => state.colCount);\n\n if (!isLoading) {\n return null;\n }\n\n return (\n <Tbody>\n <Tr>\n <Td colSpan={colCount}>\n <Flex justifyContent=\"center\" padding={11} background=\"neutral0\">\n <Loader>{children}</Loader>\n </Flex>\n </Td>\n </Tr>\n </Tbody>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Body\n * -----------------------------------------------------------------------------------------------*/\n\nconst Body = ({ children }: Table.BodyProps) => {\n const isLoading = useTable('Body', (state) => state.isLoading);\n const rows = useTable('Body', (state) => state.rows);\n\n if (isLoading || rows.length === 0) {\n return null;\n }\n\n return <Tbody>{children}</Tbody>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Row\n * -----------------------------------------------------------------------------------------------*/\nconst Row = (props: Table.RowProps) => {\n return <Tr {...props} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Cell\n * -----------------------------------------------------------------------------------------------*/\nconst Cell = (props: Table.CellProps) => {\n return <Td {...props} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Row\n * -----------------------------------------------------------------------------------------------*/\nconst CheckboxCell = ({ id, ...props }: Table.CheckboxCellProps) => {\n const rows = useTable('CheckboxCell', (state) => state.rows);\n const selectedRows = useTable('CheckboxCell', (state) => state.selectedRows);\n const selectRow = useTable('CheckboxCell', (state) => state.selectRow);\n\n const { formatMessage } = useIntl();\n\n const handleSelectRow = () => {\n selectRow(rows.find((row) => row.id === id));\n };\n\n const isChecked = selectedRows.findIndex((row) => row.id === id) > -1;\n\n return (\n <Cell {...props} onClick={(e) => e.stopPropagation()}>\n <Checkbox\n aria-label={formatMessage(\n {\n id: 'app.component.table.select.one-entry',\n defaultMessage: `Select {target}`,\n },\n { target: id }\n )}\n disabled={rows.length === 0}\n checked={isChecked}\n onCheckedChange={handleSelectRow}\n />\n </Cell>\n );\n};\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha we may move this component to the design-system.\n * @public\n * @description A generic table component composition. Internally handles the state of the table\n * such as selected rows, loading state, and more assuming the correct pieces are put togther.\n * @example\n * ```tsx\n * interace Data {\n * id: string;\n * name: string;\n * email: string;\n * }\n *\n * const ListView = () => {\n * const { data, isLoading } = useGetData<Data>();\n *\n * const headers: Table.Header<Data>[] = [\n * {\n * label: 'Name',\n * name: 'name',\n * sortable: true,\n * },\n * {\n * label: 'Email',\n * name: 'email',\n * sortable: true,\n * },\n * ];\n *\n * return (\n * <Table.Root rows={data} headers={headers} isLoading={isLoading}>\n * <Table.Content>\n * <Table.Head>\n * {headers.map((head) => (\n * <Table.HeaderCell key={head.name} {...head} />\n * ))}\n * </Table.Head>\n * <Table.Body>\n * <Table.Loading />\n * <Table.Empty />\n * {data.map((row) => (\n * <Table.Row key={row.id}>\n * <Table.Cell>{row.name}</Table.Cell>\n * <Table.Cell>{row.email}</Table.Cell>\n * </Table.Row>\n * ))}\n * </Table.Body>\n * </Table.Content>\n * </Table.Root>\n * );\n * };\n * ```\n */\nconst Table = {\n Root,\n Content,\n ActionBar,\n Head,\n HeaderCell,\n HeaderCheckboxCell,\n Body,\n CheckboxCell,\n Cell,\n Row,\n Loading,\n Empty,\n};\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Table {\n export type Props<\n TData extends BaseRow,\n THeader extends TableHeader<TData, THeader> = TableHeader<TData, TableHeader>,\n > = RootProps<TData, THeader>;\n export interface ActionBarProps {\n children?: React.ReactNode;\n }\n\n export interface ContentProps {\n children: React.ReactNode;\n }\n\n export type Header<TData, THeader> = TableHeader<TData, THeader>;\n\n export interface HeadProps {\n children: React.ReactNode;\n }\n\n export interface EmptyProps extends Partial<EmptyStateLayoutProps> {}\n\n export interface LoadingProps {\n children?: React.ReactNode;\n }\n\n export interface BodyProps {\n children: React.ReactNode;\n }\n\n export interface RowProps extends RawTrProps {}\n\n export interface CellProps extends RawTdProps {}\n\n export interface CheckboxCellProps extends Pick<BaseRow, 'id'>, Omit<RawTdProps, 'id'> {}\n}\n\nexport { Table, useTable };\n"],"names":["TableProvider","useTable","createContext","Root","children","defaultSelectedRows","footer","headers","isLoading","onSelectedRowsChange","rows","selectedRows","selectedRowsProps","setSelectedRows","useControllableState","prop","defaultProp","onChange","hasHeaderCheckbox","setHasHeaderCheckbox","React","useState","rowCount","length","colCount","selectRow","row","Array","isArray","prev","currentRowIndex","findIndex","r","id","toSpliced","_jsx","Content","state","DSTable","Head","Thead","Tr","HeaderCell","name","label","sortable","query","setQuery","useQueryParams","sort","sortBy","sortOrder","split","formatMessage","useIntl","isSorted","sortLabel","defaultMessage","handleClickSort","handleKeyDown","e","key","preventDefault","SortableTh","onClick","undefined","onKeyDown","tabIndex","aria-sort","$sortable","Tooltip","_jsxs","Flex","gap","Typography","textColor","tag","variant","SortIcon","$isUp","styled","Th","CaretDown","ActionBar","number","HeaderCheckboxCell","areAllEntriesSelected","isIndeterminate","useEffect","handleSelectAll","Checkbox","aria-label","disabled","checked","onCheckedChange","Empty","props","Tbody","Td","colSpan","EmptyStateLayout","content","hasRadius","icon","EmptyDocuments","width","Loading","justifyContent","padding","background","Loader","Body","Row","Cell","CheckboxCell","handleSelectRow","find","isChecked","stopPropagation","target","Table"],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
var toolkit = require('@reduxjs/toolkit');
|
|
4
4
|
var reducer = require('../../reducer.js');
|
|
5
5
|
var api = require('../../services/api.js');
|
|
6
|
+
var basename = require('../utils/basename.js');
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* @description Static reducers are ones we know, they live in the admin package.
|
|
@@ -63,7 +64,8 @@ const rtkQueryUnauthorizedMiddleware = ({ dispatch })=>(next)=>(action)=>{
|
|
|
63
64
|
// isRejectedWithValue Or isRejected
|
|
64
65
|
if (toolkit.isRejected(action) && action.payload?.status === 401) {
|
|
65
66
|
dispatch(reducer.logout());
|
|
66
|
-
|
|
67
|
+
const basename$1 = basename.getBasename();
|
|
68
|
+
window.location.href = `${basename$1}/auth/login`;
|
|
67
69
|
return;
|
|
68
70
|
}
|
|
69
71
|
return next(action);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure.js","sources":["../../../../../../admin/src/core/store/configure.ts"],"sourcesContent":["import {\n configureStore,\n StoreEnhancer,\n Middleware,\n Reducer,\n combineReducers,\n MiddlewareAPI,\n isRejected,\n} from '@reduxjs/toolkit';\n\nimport { reducer as appReducer, AppState, logout } from '../../reducer';\nimport { adminApi } from '../../services/api';\n\n/**\n * @description Static reducers are ones we know, they live in the admin package.\n */\nconst staticReducers = {\n [adminApi.reducerPath]: adminApi.reducer,\n admin_app: appReducer,\n} as const;\n\nconst injectReducerStoreEnhancer: (appReducers: Record<string, Reducer>) => StoreEnhancer =\n (appReducers) =>\n (next) =>\n (...args) => {\n const store = next(...args);\n\n const asyncReducers: Record<string, Reducer> = {};\n\n return {\n ...store,\n asyncReducers,\n injectReducer: (key: string, asyncReducer: Reducer) => {\n asyncReducers[key] = asyncReducer;\n store.replaceReducer(\n // @ts-expect-error we dynamically add reducers which makes the types uncomfortable.\n combineReducers({\n ...appReducers,\n ...asyncReducers,\n })\n );\n },\n };\n };\n\ntype PreloadState = Partial<{\n admin_app: AppState;\n}>;\n\n/**\n * @description This is the main store configuration function, injected Reducers use our legacy app.addReducer API,\n * which we're trying to phase out. App Middlewares could potentially be improved...?\n */\nconst configureStoreImpl = (\n preloadedState: PreloadState = {},\n appMiddlewares: Array<() => Middleware> = [],\n injectedReducers: Record<string, Reducer> = {}\n) => {\n const coreReducers = { ...staticReducers, ...injectedReducers } as const;\n\n const defaultMiddlewareOptions = {} as any;\n\n // These are already disabled in 'production' env but we also need to disable it in test environments\n // However, we want to leave them on for development so any issues can still be caught\n if (process.env.NODE_ENV === 'test') {\n defaultMiddlewareOptions.serializableCheck = false;\n defaultMiddlewareOptions.immutableCheck = false;\n }\n\n const store = configureStore({\n preloadedState: {\n admin_app: preloadedState.admin_app,\n },\n reducer: coreReducers,\n devTools: process.env.NODE_ENV !== 'production',\n middleware: (getDefaultMiddleware) => [\n ...getDefaultMiddleware(defaultMiddlewareOptions),\n rtkQueryUnauthorizedMiddleware,\n adminApi.middleware,\n ...appMiddlewares.map((m) => m()),\n ],\n enhancers: [injectReducerStoreEnhancer(coreReducers)],\n });\n\n return store;\n};\n\nconst rtkQueryUnauthorizedMiddleware: Middleware =\n ({ dispatch }: MiddlewareAPI) =>\n (next) =>\n (action) => {\n // isRejectedWithValue Or isRejected\n if (isRejected(action) && action.payload?.status === 401) {\n dispatch(logout());\n window.location.href =
|
|
1
|
+
{"version":3,"file":"configure.js","sources":["../../../../../../admin/src/core/store/configure.ts"],"sourcesContent":["import {\n configureStore,\n StoreEnhancer,\n Middleware,\n Reducer,\n combineReducers,\n MiddlewareAPI,\n isRejected,\n} from '@reduxjs/toolkit';\n\nimport { reducer as appReducer, AppState, logout } from '../../reducer';\nimport { adminApi } from '../../services/api';\nimport { getBasename } from '../utils/basename';\n\n/**\n * @description Static reducers are ones we know, they live in the admin package.\n */\nconst staticReducers = {\n [adminApi.reducerPath]: adminApi.reducer,\n admin_app: appReducer,\n} as const;\n\nconst injectReducerStoreEnhancer: (appReducers: Record<string, Reducer>) => StoreEnhancer =\n (appReducers) =>\n (next) =>\n (...args) => {\n const store = next(...args);\n\n const asyncReducers: Record<string, Reducer> = {};\n\n return {\n ...store,\n asyncReducers,\n injectReducer: (key: string, asyncReducer: Reducer) => {\n asyncReducers[key] = asyncReducer;\n store.replaceReducer(\n // @ts-expect-error we dynamically add reducers which makes the types uncomfortable.\n combineReducers({\n ...appReducers,\n ...asyncReducers,\n })\n );\n },\n };\n };\n\ntype PreloadState = Partial<{\n admin_app: AppState;\n}>;\n\n/**\n * @description This is the main store configuration function, injected Reducers use our legacy app.addReducer API,\n * which we're trying to phase out. App Middlewares could potentially be improved...?\n */\nconst configureStoreImpl = (\n preloadedState: PreloadState = {},\n appMiddlewares: Array<() => Middleware> = [],\n injectedReducers: Record<string, Reducer> = {}\n) => {\n const coreReducers = { ...staticReducers, ...injectedReducers } as const;\n\n const defaultMiddlewareOptions = {} as any;\n\n // These are already disabled in 'production' env but we also need to disable it in test environments\n // However, we want to leave them on for development so any issues can still be caught\n if (process.env.NODE_ENV === 'test') {\n defaultMiddlewareOptions.serializableCheck = false;\n defaultMiddlewareOptions.immutableCheck = false;\n }\n\n const store = configureStore({\n preloadedState: {\n admin_app: preloadedState.admin_app,\n },\n reducer: coreReducers,\n devTools: process.env.NODE_ENV !== 'production',\n middleware: (getDefaultMiddleware) => [\n ...getDefaultMiddleware(defaultMiddlewareOptions),\n rtkQueryUnauthorizedMiddleware,\n adminApi.middleware,\n ...appMiddlewares.map((m) => m()),\n ],\n enhancers: [injectReducerStoreEnhancer(coreReducers)],\n });\n\n return store;\n};\n\nconst rtkQueryUnauthorizedMiddleware: Middleware =\n ({ dispatch }: MiddlewareAPI) =>\n (next) =>\n (action) => {\n // isRejectedWithValue Or isRejected\n if (isRejected(action) && action.payload?.status === 401) {\n dispatch(logout());\n const basename = getBasename();\n window.location.href = `${basename}/auth/login`;\n return;\n }\n\n return next(action);\n };\n\ntype Store = ReturnType<typeof configureStoreImpl> & {\n asyncReducers: Record<string, Reducer>;\n injectReducer: (key: string, asyncReducer: Reducer) => void;\n};\n\ntype RootState = ReturnType<Store['getState']>;\n\ntype Dispatch = Store['dispatch'];\n\nexport { configureStoreImpl as configureStore };\nexport type { RootState, Dispatch, AppState, Store, PreloadState };\n"],"names":["staticReducers","adminApi","reducerPath","reducer","admin_app","appReducer","injectReducerStoreEnhancer","appReducers","next","args","store","asyncReducers","injectReducer","key","asyncReducer","replaceReducer","combineReducers","configureStoreImpl","preloadedState","appMiddlewares","injectedReducers","coreReducers","defaultMiddlewareOptions","process","env","NODE_ENV","serializableCheck","immutableCheck","configureStore","devTools","middleware","getDefaultMiddleware","rtkQueryUnauthorizedMiddleware","map","m","enhancers","dispatch","action","isRejected","payload","status","logout","basename","getBasename","window","location","href"],"mappings":";;;;;;;AAcA;;AAEC,IACD,MAAMA,cAAAA,GAAiB;AACrB,IAAA,CAACC,YAAAA,CAASC,WAAW,GAAGD,aAASE,OAAO;IACxCC,SAAAA,EAAWC;AACb,CAAA;AAEA,MAAMC,6BACJ,CAACC,WAAAA,GACD,CAACC,IAAAA,GACD,CAAC,GAAGC,IAAAA,GAAAA;AACF,YAAA,MAAMC,QAAQF,IAAAA,CAAAA,GAAQC,IAAAA,CAAAA;AAEtB,YAAA,MAAME,gBAAyC,EAAC;YAEhD,OAAO;AACL,gBAAA,GAAGD,KAAK;AACRC,gBAAAA,aAAAA;AACAC,gBAAAA,aAAAA,EAAe,CAACC,GAAAA,EAAaC,YAAAA,GAAAA;oBAC3BH,aAAa,CAACE,IAAI,GAAGC,YAAAA;oBACrBJ,KAAAA,CAAMK,cAAc;oBAElBC,uBAAAA,CAAgB;AACd,wBAAA,GAAGT,WAAW;AACd,wBAAA,GAAGI;AACL,qBAAA,CAAA,CAAA;AAEJ,gBAAA;AACF,aAAA;AACF,QAAA,CAAA;AAMF;;;AAGC,IACD,MAAMM,kBAAAA,GAAqB,CACzBC,cAAAA,GAA+B,EAAE,EACjCC,cAAAA,GAA0C,EAAE,EAC5CC,gBAAAA,GAA4C,EAAE,GAAA;AAE9C,IAAA,MAAMC,YAAAA,GAAe;AAAE,QAAA,GAAGrB,cAAc;AAAE,QAAA,GAAGoB;AAAiB,KAAA;AAE9D,IAAA,MAAME,2BAA2B,EAAC;;;AAIlC,IAAA,IAAIC,OAAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,MAAA,EAAQ;AACnCH,QAAAA,wBAAAA,CAAyBI,iBAAiB,GAAG,KAAA;AAC7CJ,QAAAA,wBAAAA,CAAyBK,cAAc,GAAG,KAAA;AAC5C,IAAA;AAEA,IAAA,MAAMjB,QAAQkB,sBAAAA,CAAe;QAC3BV,cAAAA,EAAgB;AACdd,YAAAA,SAAAA,EAAWc,eAAed;AAC5B,SAAA;QACAD,OAAAA,EAASkB,YAAAA;AACTQ,QAAAA,QAAAA,EAAUN,OAAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,YAAA;AACnCK,QAAAA,UAAAA,EAAY,CAACC,oBAAAA,GAAyB;mBACjCA,oBAAAA,CAAqBT,wBAAAA,CAAAA;AACxBU,gBAAAA,8BAAAA;AACA/B,gBAAAA,YAAAA,CAAS6B,UAAU;mBAChBX,cAAAA,CAAec,GAAG,CAAC,CAACC,CAAAA,GAAMA,CAAAA,EAAAA;AAC9B,aAAA;QACDC,SAAAA,EAAW;YAAC7B,0BAAAA,CAA2Be,YAAAA;AAAc;AACvD,KAAA,CAAA;IAEA,OAAOX,KAAAA;AACT;AAEA,MAAMsB,8BAAAA,GACJ,CAAC,EAAEI,QAAQ,EAAiB,GAC5B,CAAC5B,OACD,CAAC6B,MAAAA,GAAAA;;AAEC,YAAA,IAAIC,mBAAWD,MAAAA,CAAAA,IAAWA,MAAAA,CAAOE,OAAO,EAAEC,WAAW,GAAA,EAAK;gBACxDJ,QAAAA,CAASK,cAAAA,EAAAA,CAAAA;AACT,gBAAA,MAAMC,UAAAA,GAAWC,oBAAAA,EAAAA;AACjBC,gBAAAA,MAAAA,CAAOC,QAAQ,CAACC,IAAI,GAAG,CAAA,EAAGJ,UAAAA,CAAS,WAAW,CAAC;AAC/C,gBAAA;AACF,YAAA;AAEA,YAAA,OAAOlC,IAAAA,CAAK6B,MAAAA,CAAAA;AACd,QAAA,CAAA;;;;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { configureStore, isRejected, combineReducers } from '@reduxjs/toolkit';
|
|
2
2
|
import { reducer, logout } from '../../reducer.mjs';
|
|
3
3
|
import { adminApi } from '../../services/api.mjs';
|
|
4
|
+
import { getBasename } from '../utils/basename.mjs';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* @description Static reducers are ones we know, they live in the admin package.
|
|
@@ -61,7 +62,8 @@ const rtkQueryUnauthorizedMiddleware = ({ dispatch })=>(next)=>(action)=>{
|
|
|
61
62
|
// isRejectedWithValue Or isRejected
|
|
62
63
|
if (isRejected(action) && action.payload?.status === 401) {
|
|
63
64
|
dispatch(logout());
|
|
64
|
-
|
|
65
|
+
const basename = getBasename();
|
|
66
|
+
window.location.href = `${basename}/auth/login`;
|
|
65
67
|
return;
|
|
66
68
|
}
|
|
67
69
|
return next(action);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure.mjs","sources":["../../../../../../admin/src/core/store/configure.ts"],"sourcesContent":["import {\n configureStore,\n StoreEnhancer,\n Middleware,\n Reducer,\n combineReducers,\n MiddlewareAPI,\n isRejected,\n} from '@reduxjs/toolkit';\n\nimport { reducer as appReducer, AppState, logout } from '../../reducer';\nimport { adminApi } from '../../services/api';\n\n/**\n * @description Static reducers are ones we know, they live in the admin package.\n */\nconst staticReducers = {\n [adminApi.reducerPath]: adminApi.reducer,\n admin_app: appReducer,\n} as const;\n\nconst injectReducerStoreEnhancer: (appReducers: Record<string, Reducer>) => StoreEnhancer =\n (appReducers) =>\n (next) =>\n (...args) => {\n const store = next(...args);\n\n const asyncReducers: Record<string, Reducer> = {};\n\n return {\n ...store,\n asyncReducers,\n injectReducer: (key: string, asyncReducer: Reducer) => {\n asyncReducers[key] = asyncReducer;\n store.replaceReducer(\n // @ts-expect-error we dynamically add reducers which makes the types uncomfortable.\n combineReducers({\n ...appReducers,\n ...asyncReducers,\n })\n );\n },\n };\n };\n\ntype PreloadState = Partial<{\n admin_app: AppState;\n}>;\n\n/**\n * @description This is the main store configuration function, injected Reducers use our legacy app.addReducer API,\n * which we're trying to phase out. App Middlewares could potentially be improved...?\n */\nconst configureStoreImpl = (\n preloadedState: PreloadState = {},\n appMiddlewares: Array<() => Middleware> = [],\n injectedReducers: Record<string, Reducer> = {}\n) => {\n const coreReducers = { ...staticReducers, ...injectedReducers } as const;\n\n const defaultMiddlewareOptions = {} as any;\n\n // These are already disabled in 'production' env but we also need to disable it in test environments\n // However, we want to leave them on for development so any issues can still be caught\n if (process.env.NODE_ENV === 'test') {\n defaultMiddlewareOptions.serializableCheck = false;\n defaultMiddlewareOptions.immutableCheck = false;\n }\n\n const store = configureStore({\n preloadedState: {\n admin_app: preloadedState.admin_app,\n },\n reducer: coreReducers,\n devTools: process.env.NODE_ENV !== 'production',\n middleware: (getDefaultMiddleware) => [\n ...getDefaultMiddleware(defaultMiddlewareOptions),\n rtkQueryUnauthorizedMiddleware,\n adminApi.middleware,\n ...appMiddlewares.map((m) => m()),\n ],\n enhancers: [injectReducerStoreEnhancer(coreReducers)],\n });\n\n return store;\n};\n\nconst rtkQueryUnauthorizedMiddleware: Middleware =\n ({ dispatch }: MiddlewareAPI) =>\n (next) =>\n (action) => {\n // isRejectedWithValue Or isRejected\n if (isRejected(action) && action.payload?.status === 401) {\n dispatch(logout());\n window.location.href =
|
|
1
|
+
{"version":3,"file":"configure.mjs","sources":["../../../../../../admin/src/core/store/configure.ts"],"sourcesContent":["import {\n configureStore,\n StoreEnhancer,\n Middleware,\n Reducer,\n combineReducers,\n MiddlewareAPI,\n isRejected,\n} from '@reduxjs/toolkit';\n\nimport { reducer as appReducer, AppState, logout } from '../../reducer';\nimport { adminApi } from '../../services/api';\nimport { getBasename } from '../utils/basename';\n\n/**\n * @description Static reducers are ones we know, they live in the admin package.\n */\nconst staticReducers = {\n [adminApi.reducerPath]: adminApi.reducer,\n admin_app: appReducer,\n} as const;\n\nconst injectReducerStoreEnhancer: (appReducers: Record<string, Reducer>) => StoreEnhancer =\n (appReducers) =>\n (next) =>\n (...args) => {\n const store = next(...args);\n\n const asyncReducers: Record<string, Reducer> = {};\n\n return {\n ...store,\n asyncReducers,\n injectReducer: (key: string, asyncReducer: Reducer) => {\n asyncReducers[key] = asyncReducer;\n store.replaceReducer(\n // @ts-expect-error we dynamically add reducers which makes the types uncomfortable.\n combineReducers({\n ...appReducers,\n ...asyncReducers,\n })\n );\n },\n };\n };\n\ntype PreloadState = Partial<{\n admin_app: AppState;\n}>;\n\n/**\n * @description This is the main store configuration function, injected Reducers use our legacy app.addReducer API,\n * which we're trying to phase out. App Middlewares could potentially be improved...?\n */\nconst configureStoreImpl = (\n preloadedState: PreloadState = {},\n appMiddlewares: Array<() => Middleware> = [],\n injectedReducers: Record<string, Reducer> = {}\n) => {\n const coreReducers = { ...staticReducers, ...injectedReducers } as const;\n\n const defaultMiddlewareOptions = {} as any;\n\n // These are already disabled in 'production' env but we also need to disable it in test environments\n // However, we want to leave them on for development so any issues can still be caught\n if (process.env.NODE_ENV === 'test') {\n defaultMiddlewareOptions.serializableCheck = false;\n defaultMiddlewareOptions.immutableCheck = false;\n }\n\n const store = configureStore({\n preloadedState: {\n admin_app: preloadedState.admin_app,\n },\n reducer: coreReducers,\n devTools: process.env.NODE_ENV !== 'production',\n middleware: (getDefaultMiddleware) => [\n ...getDefaultMiddleware(defaultMiddlewareOptions),\n rtkQueryUnauthorizedMiddleware,\n adminApi.middleware,\n ...appMiddlewares.map((m) => m()),\n ],\n enhancers: [injectReducerStoreEnhancer(coreReducers)],\n });\n\n return store;\n};\n\nconst rtkQueryUnauthorizedMiddleware: Middleware =\n ({ dispatch }: MiddlewareAPI) =>\n (next) =>\n (action) => {\n // isRejectedWithValue Or isRejected\n if (isRejected(action) && action.payload?.status === 401) {\n dispatch(logout());\n const basename = getBasename();\n window.location.href = `${basename}/auth/login`;\n return;\n }\n\n return next(action);\n };\n\ntype Store = ReturnType<typeof configureStoreImpl> & {\n asyncReducers: Record<string, Reducer>;\n injectReducer: (key: string, asyncReducer: Reducer) => void;\n};\n\ntype RootState = ReturnType<Store['getState']>;\n\ntype Dispatch = Store['dispatch'];\n\nexport { configureStoreImpl as configureStore };\nexport type { RootState, Dispatch, AppState, Store, PreloadState };\n"],"names":["staticReducers","adminApi","reducerPath","reducer","admin_app","appReducer","injectReducerStoreEnhancer","appReducers","next","args","store","asyncReducers","injectReducer","key","asyncReducer","replaceReducer","combineReducers","configureStoreImpl","preloadedState","appMiddlewares","injectedReducers","coreReducers","defaultMiddlewareOptions","process","env","NODE_ENV","serializableCheck","immutableCheck","configureStore","devTools","middleware","getDefaultMiddleware","rtkQueryUnauthorizedMiddleware","map","m","enhancers","dispatch","action","isRejected","payload","status","logout","basename","getBasename","window","location","href"],"mappings":";;;;;AAcA;;AAEC,IACD,MAAMA,cAAAA,GAAiB;AACrB,IAAA,CAACC,QAAAA,CAASC,WAAW,GAAGD,SAASE,OAAO;IACxCC,SAAAA,EAAWC;AACb,CAAA;AAEA,MAAMC,6BACJ,CAACC,WAAAA,GACD,CAACC,IAAAA,GACD,CAAC,GAAGC,IAAAA,GAAAA;AACF,YAAA,MAAMC,QAAQF,IAAAA,CAAAA,GAAQC,IAAAA,CAAAA;AAEtB,YAAA,MAAME,gBAAyC,EAAC;YAEhD,OAAO;AACL,gBAAA,GAAGD,KAAK;AACRC,gBAAAA,aAAAA;AACAC,gBAAAA,aAAAA,EAAe,CAACC,GAAAA,EAAaC,YAAAA,GAAAA;oBAC3BH,aAAa,CAACE,IAAI,GAAGC,YAAAA;oBACrBJ,KAAAA,CAAMK,cAAc;oBAElBC,eAAAA,CAAgB;AACd,wBAAA,GAAGT,WAAW;AACd,wBAAA,GAAGI;AACL,qBAAA,CAAA,CAAA;AAEJ,gBAAA;AACF,aAAA;AACF,QAAA,CAAA;AAMF;;;AAGC,IACD,MAAMM,kBAAAA,GAAqB,CACzBC,cAAAA,GAA+B,EAAE,EACjCC,cAAAA,GAA0C,EAAE,EAC5CC,gBAAAA,GAA4C,EAAE,GAAA;AAE9C,IAAA,MAAMC,YAAAA,GAAe;AAAE,QAAA,GAAGrB,cAAc;AAAE,QAAA,GAAGoB;AAAiB,KAAA;AAE9D,IAAA,MAAME,2BAA2B,EAAC;;;AAIlC,IAAA,IAAIC,OAAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,MAAA,EAAQ;AACnCH,QAAAA,wBAAAA,CAAyBI,iBAAiB,GAAG,KAAA;AAC7CJ,QAAAA,wBAAAA,CAAyBK,cAAc,GAAG,KAAA;AAC5C,IAAA;AAEA,IAAA,MAAMjB,QAAQkB,cAAAA,CAAe;QAC3BV,cAAAA,EAAgB;AACdd,YAAAA,SAAAA,EAAWc,eAAed;AAC5B,SAAA;QACAD,OAAAA,EAASkB,YAAAA;AACTQ,QAAAA,QAAAA,EAAUN,OAAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,YAAA;AACnCK,QAAAA,UAAAA,EAAY,CAACC,oBAAAA,GAAyB;mBACjCA,oBAAAA,CAAqBT,wBAAAA,CAAAA;AACxBU,gBAAAA,8BAAAA;AACA/B,gBAAAA,QAAAA,CAAS6B,UAAU;mBAChBX,cAAAA,CAAec,GAAG,CAAC,CAACC,CAAAA,GAAMA,CAAAA,EAAAA;AAC9B,aAAA;QACDC,SAAAA,EAAW;YAAC7B,0BAAAA,CAA2Be,YAAAA;AAAc;AACvD,KAAA,CAAA;IAEA,OAAOX,KAAAA;AACT;AAEA,MAAMsB,8BAAAA,GACJ,CAAC,EAAEI,QAAQ,EAAiB,GAC5B,CAAC5B,OACD,CAAC6B,MAAAA,GAAAA;;AAEC,YAAA,IAAIC,WAAWD,MAAAA,CAAAA,IAAWA,MAAAA,CAAOE,OAAO,EAAEC,WAAW,GAAA,EAAK;gBACxDJ,QAAAA,CAASK,MAAAA,EAAAA,CAAAA;AACT,gBAAA,MAAMC,QAAAA,GAAWC,WAAAA,EAAAA;AACjBC,gBAAAA,MAAAA,CAAOC,QAAQ,CAACC,IAAI,GAAG,CAAA,EAAGJ,QAAAA,CAAS,WAAW,CAAC;AAC/C,gBAAA;AACF,YAAA;AAEA,YAAA,OAAOlC,IAAAA,CAAK6B,MAAAA,CAAAA;AACd,QAAA,CAAA;;;;"}
|
|
@@ -27,8 +27,9 @@ const usePersistentState = (key, defaultValue)=>{
|
|
|
27
27
|
key,
|
|
28
28
|
defaultValue
|
|
29
29
|
]);
|
|
30
|
-
//
|
|
31
|
-
|
|
30
|
+
// Persist synchronously after commit so values survive same-tab navigation (e.g. external
|
|
31
|
+
// links) before the next paint — useEffect can run after unload and skip writing.
|
|
32
|
+
React.useLayoutEffect(()=>{
|
|
32
33
|
if (currentKeyRef.current !== key) return; // safety guard
|
|
33
34
|
window.localStorage.setItem(key, JSON.stringify(value));
|
|
34
35
|
}, [
|
|
@@ -40,15 +41,19 @@ const usePersistentState = (key, defaultValue)=>{
|
|
|
40
41
|
setValue
|
|
41
42
|
];
|
|
42
43
|
};
|
|
44
|
+
const usePersistentStateScope = ()=>{
|
|
45
|
+
const { data: initData } = admin.useInitQuery();
|
|
46
|
+
return initData?.uuid;
|
|
47
|
+
};
|
|
43
48
|
// Same as usePersistentState, but scoped to the current instance of Strapi
|
|
44
49
|
// useful for storing state that should not be shared across different instances of Strapi running on localhost
|
|
45
50
|
const useScopedPersistentState = (key, defaultValue)=>{
|
|
46
|
-
const
|
|
47
|
-
const { uuid } = initData ?? {};
|
|
51
|
+
const uuid = usePersistentStateScope();
|
|
48
52
|
const namespacedKey = `${key}:${uuid}`;
|
|
49
53
|
return usePersistentState(namespacedKey, defaultValue);
|
|
50
54
|
};
|
|
51
55
|
|
|
52
56
|
exports.usePersistentState = usePersistentState;
|
|
57
|
+
exports.usePersistentStateScope = usePersistentStateScope;
|
|
53
58
|
exports.useScopedPersistentState = useScopedPersistentState;
|
|
54
59
|
//# sourceMappingURL=usePersistentState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePersistentState.js","sources":["../../../../../admin/src/hooks/usePersistentState.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport { useInitQuery } from '../services/admin';\n\nfunction readFromStorage<T>(key: string, fallback: T): T {\n const raw = window.localStorage.getItem(key);\n if (raw === null) return fallback;\n try {\n return JSON.parse(raw);\n } catch {\n // if primitive was stored\n return raw as unknown as T;\n }\n}\n\nconst usePersistentState = <T>(key: string, defaultValue: T) => {\n const [value, setValue] = useState<T>(() => readFromStorage(key, defaultValue));\n\n const currentKeyRef = useRef(key);\n\n // when the key changes, re-hydrate from the new key\n useEffect(() => {\n if (currentKeyRef.current !== key) {\n currentKeyRef.current = key;\n setValue(readFromStorage(key, defaultValue));\n }\n // include defaultValue in case it changes across models\n }, [key, defaultValue]);\n\n //
|
|
1
|
+
{"version":3,"file":"usePersistentState.js","sources":["../../../../../admin/src/hooks/usePersistentState.ts"],"sourcesContent":["import { useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nimport { useInitQuery } from '../services/admin';\n\nfunction readFromStorage<T>(key: string, fallback: T): T {\n const raw = window.localStorage.getItem(key);\n if (raw === null) return fallback;\n try {\n return JSON.parse(raw);\n } catch {\n // if primitive was stored\n return raw as unknown as T;\n }\n}\n\nconst usePersistentState = <T>(key: string, defaultValue: T) => {\n const [value, setValue] = useState<T>(() => readFromStorage(key, defaultValue));\n\n const currentKeyRef = useRef(key);\n\n // when the key changes, re-hydrate from the new key\n useEffect(() => {\n if (currentKeyRef.current !== key) {\n currentKeyRef.current = key;\n setValue(readFromStorage(key, defaultValue));\n }\n // include defaultValue in case it changes across models\n }, [key, defaultValue]);\n\n // Persist synchronously after commit so values survive same-tab navigation (e.g. external\n // links) before the next paint — useEffect can run after unload and skip writing.\n useLayoutEffect(() => {\n if (currentKeyRef.current !== key) return; // safety guard\n\n window.localStorage.setItem(key, JSON.stringify(value));\n }, [key, value]);\n\n return [value, setValue] as const;\n};\n\nconst usePersistentStateScope = () => {\n const { data: initData } = useInitQuery();\n\n return initData?.uuid;\n};\n\n// Same as usePersistentState, but scoped to the current instance of Strapi\n// useful for storing state that should not be shared across different instances of Strapi running on localhost\nconst useScopedPersistentState = <T>(key: string, defaultValue: T) => {\n const uuid = usePersistentStateScope();\n\n const namespacedKey = `${key}:${uuid}`;\n return usePersistentState<T>(namespacedKey, defaultValue);\n};\n\nexport { usePersistentState, useScopedPersistentState, usePersistentStateScope };\n"],"names":["readFromStorage","key","fallback","raw","window","localStorage","getItem","JSON","parse","usePersistentState","defaultValue","value","setValue","useState","currentKeyRef","useRef","useEffect","current","useLayoutEffect","setItem","stringify","usePersistentStateScope","data","initData","useInitQuery","uuid","useScopedPersistentState","namespacedKey"],"mappings":";;;;;AAIA,SAASA,eAAAA,CAAmBC,GAAW,EAAEC,QAAW,EAAA;AAClD,IAAA,MAAMC,GAAAA,GAAMC,MAAAA,CAAOC,YAAY,CAACC,OAAO,CAACL,GAAAA,CAAAA;IACxC,IAAIE,GAAAA,KAAQ,MAAM,OAAOD,QAAAA;IACzB,IAAI;QACF,OAAOK,IAAAA,CAAKC,KAAK,CAACL,GAAAA,CAAAA;AACpB,IAAA,CAAA,CAAE,OAAM;;QAEN,OAAOA,GAAAA;AACT,IAAA;AACF;AAEA,MAAMM,kBAAAA,GAAqB,CAAIR,GAAAA,EAAaS,YAAAA,GAAAA;AAC1C,IAAA,MAAM,CAACC,KAAAA,EAAOC,QAAAA,CAAS,GAAGC,cAAAA,CAAY,IAAMb,gBAAgBC,GAAAA,EAAKS,YAAAA,CAAAA,CAAAA;AAEjE,IAAA,MAAMI,gBAAgBC,YAAAA,CAAOd,GAAAA,CAAAA;;IAG7Be,eAAAA,CAAU,IAAA;QACR,IAAIF,aAAAA,CAAcG,OAAO,KAAKhB,GAAAA,EAAK;AACjCa,YAAAA,aAAAA,CAAcG,OAAO,GAAGhB,GAAAA;AACxBW,YAAAA,QAAAA,CAASZ,gBAAgBC,GAAAA,EAAKS,YAAAA,CAAAA,CAAAA;AAChC,QAAA;;IAEF,CAAA,EAAG;AAACT,QAAAA,GAAAA;AAAKS,QAAAA;AAAa,KAAA,CAAA;;;IAItBQ,qBAAAA,CAAgB,IAAA;AACd,QAAA,IAAIJ,aAAAA,CAAcG,OAAO,KAAKhB,GAAAA,EAAK;AAEnCG,QAAAA,MAAAA,CAAOC,YAAY,CAACc,OAAO,CAAClB,GAAAA,EAAKM,IAAAA,CAAKa,SAAS,CAACT,KAAAA,CAAAA,CAAAA;IAClD,CAAA,EAAG;AAACV,QAAAA,GAAAA;AAAKU,QAAAA;AAAM,KAAA,CAAA;IAEf,OAAO;AAACA,QAAAA,KAAAA;AAAOC,QAAAA;AAAS,KAAA;AAC1B;AAEA,MAAMS,uBAAAA,GAA0B,IAAA;AAC9B,IAAA,MAAM,EAAEC,IAAAA,EAAMC,QAAQ,EAAE,GAAGC,kBAAAA,EAAAA;AAE3B,IAAA,OAAOD,QAAAA,EAAUE,IAAAA;AACnB;AAEA;AACA;AACA,MAAMC,wBAAAA,GAA2B,CAAIzB,GAAAA,EAAaS,YAAAA,GAAAA;AAChD,IAAA,MAAMe,IAAAA,GAAOJ,uBAAAA,EAAAA;AAEb,IAAA,MAAMM,aAAAA,GAAgB,CAAA,EAAG1B,GAAAA,CAAI,CAAC,EAAEwB,IAAAA,CAAAA,CAAM;AACtC,IAAA,OAAOhB,mBAAsBkB,aAAAA,EAAejB,YAAAA,CAAAA;AAC9C;;;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useState, useRef, useEffect } from 'react';
|
|
1
|
+
import { useState, useRef, useEffect, useLayoutEffect } from 'react';
|
|
2
2
|
import { useInitQuery } from '../services/admin.mjs';
|
|
3
3
|
|
|
4
4
|
function readFromStorage(key, fallback) {
|
|
@@ -25,8 +25,9 @@ const usePersistentState = (key, defaultValue)=>{
|
|
|
25
25
|
key,
|
|
26
26
|
defaultValue
|
|
27
27
|
]);
|
|
28
|
-
//
|
|
29
|
-
useEffect
|
|
28
|
+
// Persist synchronously after commit so values survive same-tab navigation (e.g. external
|
|
29
|
+
// links) before the next paint — useEffect can run after unload and skip writing.
|
|
30
|
+
useLayoutEffect(()=>{
|
|
30
31
|
if (currentKeyRef.current !== key) return; // safety guard
|
|
31
32
|
window.localStorage.setItem(key, JSON.stringify(value));
|
|
32
33
|
}, [
|
|
@@ -38,14 +39,17 @@ const usePersistentState = (key, defaultValue)=>{
|
|
|
38
39
|
setValue
|
|
39
40
|
];
|
|
40
41
|
};
|
|
42
|
+
const usePersistentStateScope = ()=>{
|
|
43
|
+
const { data: initData } = useInitQuery();
|
|
44
|
+
return initData?.uuid;
|
|
45
|
+
};
|
|
41
46
|
// Same as usePersistentState, but scoped to the current instance of Strapi
|
|
42
47
|
// useful for storing state that should not be shared across different instances of Strapi running on localhost
|
|
43
48
|
const useScopedPersistentState = (key, defaultValue)=>{
|
|
44
|
-
const
|
|
45
|
-
const { uuid } = initData ?? {};
|
|
49
|
+
const uuid = usePersistentStateScope();
|
|
46
50
|
const namespacedKey = `${key}:${uuid}`;
|
|
47
51
|
return usePersistentState(namespacedKey, defaultValue);
|
|
48
52
|
};
|
|
49
53
|
|
|
50
|
-
export { usePersistentState, useScopedPersistentState };
|
|
54
|
+
export { usePersistentState, usePersistentStateScope, useScopedPersistentState };
|
|
51
55
|
//# sourceMappingURL=usePersistentState.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePersistentState.mjs","sources":["../../../../../admin/src/hooks/usePersistentState.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport { useInitQuery } from '../services/admin';\n\nfunction readFromStorage<T>(key: string, fallback: T): T {\n const raw = window.localStorage.getItem(key);\n if (raw === null) return fallback;\n try {\n return JSON.parse(raw);\n } catch {\n // if primitive was stored\n return raw as unknown as T;\n }\n}\n\nconst usePersistentState = <T>(key: string, defaultValue: T) => {\n const [value, setValue] = useState<T>(() => readFromStorage(key, defaultValue));\n\n const currentKeyRef = useRef(key);\n\n // when the key changes, re-hydrate from the new key\n useEffect(() => {\n if (currentKeyRef.current !== key) {\n currentKeyRef.current = key;\n setValue(readFromStorage(key, defaultValue));\n }\n // include defaultValue in case it changes across models\n }, [key, defaultValue]);\n\n //
|
|
1
|
+
{"version":3,"file":"usePersistentState.mjs","sources":["../../../../../admin/src/hooks/usePersistentState.ts"],"sourcesContent":["import { useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nimport { useInitQuery } from '../services/admin';\n\nfunction readFromStorage<T>(key: string, fallback: T): T {\n const raw = window.localStorage.getItem(key);\n if (raw === null) return fallback;\n try {\n return JSON.parse(raw);\n } catch {\n // if primitive was stored\n return raw as unknown as T;\n }\n}\n\nconst usePersistentState = <T>(key: string, defaultValue: T) => {\n const [value, setValue] = useState<T>(() => readFromStorage(key, defaultValue));\n\n const currentKeyRef = useRef(key);\n\n // when the key changes, re-hydrate from the new key\n useEffect(() => {\n if (currentKeyRef.current !== key) {\n currentKeyRef.current = key;\n setValue(readFromStorage(key, defaultValue));\n }\n // include defaultValue in case it changes across models\n }, [key, defaultValue]);\n\n // Persist synchronously after commit so values survive same-tab navigation (e.g. external\n // links) before the next paint — useEffect can run after unload and skip writing.\n useLayoutEffect(() => {\n if (currentKeyRef.current !== key) return; // safety guard\n\n window.localStorage.setItem(key, JSON.stringify(value));\n }, [key, value]);\n\n return [value, setValue] as const;\n};\n\nconst usePersistentStateScope = () => {\n const { data: initData } = useInitQuery();\n\n return initData?.uuid;\n};\n\n// Same as usePersistentState, but scoped to the current instance of Strapi\n// useful for storing state that should not be shared across different instances of Strapi running on localhost\nconst useScopedPersistentState = <T>(key: string, defaultValue: T) => {\n const uuid = usePersistentStateScope();\n\n const namespacedKey = `${key}:${uuid}`;\n return usePersistentState<T>(namespacedKey, defaultValue);\n};\n\nexport { usePersistentState, useScopedPersistentState, usePersistentStateScope };\n"],"names":["readFromStorage","key","fallback","raw","window","localStorage","getItem","JSON","parse","usePersistentState","defaultValue","value","setValue","useState","currentKeyRef","useRef","useEffect","current","useLayoutEffect","setItem","stringify","usePersistentStateScope","data","initData","useInitQuery","uuid","useScopedPersistentState","namespacedKey"],"mappings":";;;AAIA,SAASA,eAAAA,CAAmBC,GAAW,EAAEC,QAAW,EAAA;AAClD,IAAA,MAAMC,GAAAA,GAAMC,MAAAA,CAAOC,YAAY,CAACC,OAAO,CAACL,GAAAA,CAAAA;IACxC,IAAIE,GAAAA,KAAQ,MAAM,OAAOD,QAAAA;IACzB,IAAI;QACF,OAAOK,IAAAA,CAAKC,KAAK,CAACL,GAAAA,CAAAA;AACpB,IAAA,CAAA,CAAE,OAAM;;QAEN,OAAOA,GAAAA;AACT,IAAA;AACF;AAEA,MAAMM,kBAAAA,GAAqB,CAAIR,GAAAA,EAAaS,YAAAA,GAAAA;AAC1C,IAAA,MAAM,CAACC,KAAAA,EAAOC,QAAAA,CAAS,GAAGC,QAAAA,CAAY,IAAMb,gBAAgBC,GAAAA,EAAKS,YAAAA,CAAAA,CAAAA;AAEjE,IAAA,MAAMI,gBAAgBC,MAAAA,CAAOd,GAAAA,CAAAA;;IAG7Be,SAAAA,CAAU,IAAA;QACR,IAAIF,aAAAA,CAAcG,OAAO,KAAKhB,GAAAA,EAAK;AACjCa,YAAAA,aAAAA,CAAcG,OAAO,GAAGhB,GAAAA;AACxBW,YAAAA,QAAAA,CAASZ,gBAAgBC,GAAAA,EAAKS,YAAAA,CAAAA,CAAAA;AAChC,QAAA;;IAEF,CAAA,EAAG;AAACT,QAAAA,GAAAA;AAAKS,QAAAA;AAAa,KAAA,CAAA;;;IAItBQ,eAAAA,CAAgB,IAAA;AACd,QAAA,IAAIJ,aAAAA,CAAcG,OAAO,KAAKhB,GAAAA,EAAK;AAEnCG,QAAAA,MAAAA,CAAOC,YAAY,CAACc,OAAO,CAAClB,GAAAA,EAAKM,IAAAA,CAAKa,SAAS,CAACT,KAAAA,CAAAA,CAAAA;IAClD,CAAA,EAAG;AAACV,QAAAA,GAAAA;AAAKU,QAAAA;AAAM,KAAA,CAAA;IAEf,OAAO;AAACA,QAAAA,KAAAA;AAAOC,QAAAA;AAAS,KAAA;AAC1B;AAEA,MAAMS,uBAAAA,GAA0B,IAAA;AAC9B,IAAA,MAAM,EAAEC,IAAAA,EAAMC,QAAQ,EAAE,GAAGC,YAAAA,EAAAA;AAE3B,IAAA,OAAOD,QAAAA,EAAUE,IAAAA;AACnB;AAEA;AACA;AACA,MAAMC,wBAAAA,GAA2B,CAAIzB,GAAAA,EAAaS,YAAAA,GAAAA;AAChD,IAAA,MAAMe,IAAAA,GAAOJ,uBAAAA,EAAAA;AAEb,IAAA,MAAMM,aAAAA,GAAgB,CAAA,EAAG1B,GAAAA,CAAI,CAAC,EAAEwB,IAAAA,CAAAA,CAAM;AACtC,IAAA,OAAOhB,mBAAsBkB,aAAAA,EAAejB,YAAAA,CAAAA;AAC9C;;;;"}
|
|
@@ -193,10 +193,13 @@ const LogoInput = ({ canUpdate, customLogo, defaultLogo, hint, label, onChangeLo
|
|
|
193
193
|
responseType: 'blob',
|
|
194
194
|
timeout: 8000
|
|
195
195
|
});
|
|
196
|
+
// Axios types Content-Type as AxiosHeaderValue (string | array | null | …); File#type only accepts string | undefined.
|
|
197
|
+
const contentType = res.headers['content-type'];
|
|
198
|
+
const mimeType = typeof contentType === 'string' ? contentType : Array.isArray(contentType) ? contentType[0] : contentType != null && typeof contentType !== 'object' ? String(contentType) : undefined;
|
|
196
199
|
const file = new File([
|
|
197
200
|
res.data
|
|
198
201
|
], res.config.url ?? '', {
|
|
199
|
-
type:
|
|
202
|
+
type: mimeType
|
|
200
203
|
});
|
|
201
204
|
const asset = await files.parseFileMetadatas(file);
|
|
202
205
|
setLocalImage(asset);
|