@strapi/admin 5.51.2 → 5.52.1

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.
Files changed (27) hide show
  1. package/dist/admin/admin/src/App.js +1 -1
  2. package/dist/admin/admin/src/App.js.map +1 -1
  3. package/dist/admin/admin/src/App.mjs +1 -1
  4. package/dist/admin/admin/src/App.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/Filters.js +19 -34
  6. package/dist/admin/admin/src/components/Filters.js.map +1 -1
  7. package/dist/admin/admin/src/components/Filters.mjs +19 -34
  8. package/dist/admin/admin/src/components/Filters.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/MainNav/NavUser.js.map +1 -1
  10. package/dist/admin/admin/src/components/MainNav/NavUser.mjs.map +1 -1
  11. package/dist/admin/admin/src/components/PageHelpers.js +7 -5
  12. package/dist/admin/admin/src/components/PageHelpers.js.map +1 -1
  13. package/dist/admin/admin/src/components/PageHelpers.mjs +7 -5
  14. package/dist/admin/admin/src/components/PageHelpers.mjs.map +1 -1
  15. package/dist/admin/admin/src/components/Widgets.js.map +1 -1
  16. package/dist/admin/admin/src/components/Widgets.mjs.map +1 -1
  17. package/dist/admin/admin/src/translations/id.json.js +105 -1
  18. package/dist/admin/admin/src/translations/id.json.js.map +1 -1
  19. package/dist/admin/admin/src/translations/id.json.mjs +105 -1
  20. package/dist/admin/admin/src/translations/id.json.mjs.map +1 -1
  21. package/dist/admin/src/components/Filters.d.ts +9 -2
  22. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
  23. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +9 -3
  24. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
  25. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +9 -3
  26. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
  27. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"Filters.mjs","sources":["../../../../../admin/src/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Popover, Tag } from '@strapi/design-system';\nimport { Plus, Filter as FilterIcon, Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport {\n BASE_FILTERS,\n CONTAINS_FILTERS,\n FilterOption,\n IS_SENSITIVE_FILTERS,\n NUMERIC_FILTERS,\n STRING_PARSE_FILTERS,\n FILTERS_WITH_NO_VALUE,\n} from '../constants/filters';\nimport { useControllableState } from '../hooks/useControllableState';\nimport { useQueryParams } from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\nimport { Form, InputProps } from './Form';\nimport { InputRenderer } from './FormInputs/Renderer';\n\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FilterFormData {\n name: string;\n filter: string;\n value?: string;\n}\n\ninterface FitlersContextValue {\n disabled: boolean;\n onChange: (data: FilterFormData) => void;\n options: Filters.Filter[];\n setOpen: (open: boolean) => void;\n editingFilter: FilterFormData | null;\n setEditingFilter: (filter: FilterFormData | null) => void;\n}\n\nconst [FiltersProvider, useFilters] = createContext<FitlersContextValue>('Filters');\n\nconst getFilterDetails = (\n filterEntry: Record<string, unknown>,\n options: Filters.Filter[]\n): { name: string; operator: string; value: unknown } | null => {\n const [name] = Object.keys(filterEntry);\n const option = options.find((o) => o.name === name);\n if (!option) {\n return null;\n }\n\n const operatorObj =\n option.type === 'relation'\n ? (filterEntry[name] as Record<string, unknown>)?.[option.mainField?.name ?? 'id']\n : filterEntry[name];\n\n if (typeof operatorObj !== 'object' || operatorObj === null) {\n return null;\n }\n\n const [operator] = Object.keys(operatorObj as Record<string, unknown>);\n if (!operator) {\n return null;\n }\n\n return { name, operator, value: (operatorObj as Record<string, unknown>)[operator] };\n};\n\nconst isFilterMatch = (\n filterEntry: Record<string, unknown>,\n options: Filters.Filter[],\n target: FilterFormData\n): boolean => {\n const details = getFilterDetails(filterEntry, options);\n if (!details || details.name !== target.name || details.operator !== target.filter) {\n return false;\n }\n if (FILTERS_WITH_NO_VALUE.includes(target.filter)) {\n return true;\n }\n\n const decoded =\n typeof details.value === 'string' ? decodeURIComponent(details.value) : details.value;\n return decoded === target.value;\n};\n\ninterface RootProps\n extends Partial<Pick<FitlersContextValue, 'disabled' | 'onChange' | 'options'>>,\n Popover.Props {\n children: React.ReactNode;\n}\n\nconst Root = ({\n children,\n disabled = false,\n onChange,\n options = [],\n onOpenChange,\n open: openProp,\n defaultOpen,\n ...restProps\n}: RootProps) => {\n const [editingFilter, setEditingFilter] = React.useState<FilterFormData | null>(null);\n\n const handleChange = (data: FilterFormData) => {\n if (onChange) {\n onChange(data);\n }\n };\n\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n React.useEffect(() => {\n if (!open) {\n setEditingFilter(null);\n }\n }, [open]);\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen} {...restProps}>\n <FiltersProvider\n setOpen={setOpen}\n disabled={disabled}\n onChange={handleChange}\n options={options}\n editingFilter={editingFilter}\n setEditingFilter={setEditingFilter}\n >\n {children}\n </FiltersProvider>\n </Popover.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Trigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst Trigger = React.forwardRef<HTMLButtonElement, Filters.TriggerProps>(\n ({ label }, forwardedRef) => {\n const { formatMessage } = useIntl();\n const disabled = useFilters('Trigger', ({ disabled }) => disabled);\n\n return (\n <Popover.Trigger>\n <Button\n variant=\"tertiary\"\n ref={forwardedRef}\n startIcon={<FilterIcon />}\n size=\"S\"\n disabled={disabled}\n >\n {label || formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Popover\n * -----------------------------------------------------------------------------------------------*/\n/**\n * The zIndex property is used to override the zIndex of the Portal element of the Popover.\n * This is needed to ensure that the DatePicker is rendered above the Popover when opened.\n * The issue was that both the DatePicker and the Popover are rendered in a Portal and have the same zIndex.\n * On init, since the DatePicker is rendered before the Popover in the DOM,\n * it's causing the issue of appearing behind the Popover.\n */\nconst PopoverImpl = ({ zIndex }: { zIndex?: number }) => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n const { formatMessage } = useIntl();\n const options = useFilters('Popover', ({ options }) => options);\n const onChange = useFilters('Popover', ({ onChange }) => onChange);\n const setOpen = useFilters('Popover', ({ setOpen }) => setOpen);\n const editingFilter = useFilters('Popover', ({ editingFilter }) => editingFilter);\n const setEditingFilter = useFilters('Popover', ({ setEditingFilter }) => setEditingFilter);\n\n const initialValues = React.useMemo(() => {\n return editingFilter ?? { name: options[0]?.name, filter: BASE_FILTERS[0].value };\n }, [editingFilter, options]);\n\n if (options.length === 0) {\n return null;\n }\n\n const handleSubmit = (data: FilterFormData) => {\n const value = FILTERS_WITH_NO_VALUE.includes(data.filter)\n ? 'true'\n : encodeURIComponent(data.value ?? '');\n\n if (!value) {\n return;\n }\n\n if (onChange) {\n onChange(data);\n }\n\n /**\n * There will ALWAYS be an option because we use the options to create the form data.\n */\n const fieldOptions = options.find((filter) => filter.name === data.name)!;\n\n /**\n * If the filter is a relation, we need to nest the filter object,\n * we filter based on the mainField of the relation, if there is no mainField, we use the id.\n * At the end, we pass the operator & value. This value _could_ look like:\n * ```json\n * {\n * \"$eq\": \"1\",\n * }\n * ```\n */\n const operatorValuePairing = {\n [data.filter]: value,\n };\n\n const newFilterEntry = {\n [data.name]:\n fieldOptions.type === 'relation'\n ? {\n [fieldOptions.mainField?.name ?? 'id']: operatorValuePairing,\n }\n : operatorValuePairing,\n };\n\n const existingFilters = query.filters?.$and ?? [];\n\n const newFilterQuery = editingFilter\n ? {\n ...query.filters,\n $and: existingFilters.map((filter) =>\n isFilterMatch(filter, options, editingFilter) ? newFilterEntry : filter\n ),\n }\n : {\n ...query.filters,\n $and: [...existingFilters, newFilterEntry],\n };\n\n setQuery({ filters: newFilterQuery, page: 1 }, 'push', true);\n setOpen(false);\n setEditingFilter(null);\n };\n\n return (\n <Popover.Content style={{ zIndex }}>\n <Box padding={3}>\n <Form\n method=\"POST\"\n initialValues={initialValues}\n onSubmit={handleSubmit}\n key={\n editingFilter\n ? `edit-${editingFilter.name}-${editingFilter.filter}-${editingFilter.value ?? 'empty'}`\n : 'create'\n }\n >\n {({ values: formValues, modified, isSubmitting }) => {\n const filter = options.find((filter) => filter.name === formValues.name);\n const Input = filter?.input || InputRenderer;\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2} style={{ minWidth: 184 }}>\n {[\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n name: 'name',\n options: options.map((filter) => ({\n label: filter.label,\n value: filter.name,\n })),\n placholder: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n type: 'enumeration' as const,\n },\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n name: 'filter',\n options:\n filter?.operators ||\n getFilterList(filter).map((opt) => ({\n label: formatMessage(opt.label),\n value: opt.value,\n })),\n placeholder: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n type: 'enumeration' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n {filter &&\n formValues.filter &&\n !FILTERS_WITH_NO_VALUE.includes(formValues.filter) ? (\n <Input\n {...filter}\n label={null}\n aria-label={filter.label}\n name=\"value\"\n // @ts-expect-error – if type is `custom` then `Input` will be a custom component.\n type={filter.mainField?.type ?? filter.type}\n />\n ) : null}\n <Button\n disabled={!modified || isSubmitting}\n size=\"L\"\n variant=\"secondary\"\n startIcon={<Plus />}\n type=\"submit\"\n fullWidth\n >\n {editingFilter\n ? formatMessage({\n id: 'app.utils.update-filter',\n defaultMessage: 'Update filter',\n })\n : formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Flex>\n );\n }}\n </Form>\n </Box>\n </Popover.Content>\n );\n};\n\n/**\n * Depending on the selected field find the possible filters to apply\n */\nconst getFilterList = (filter?: Filters.Filter): FilterOption[] => {\n if (!filter) {\n return [];\n }\n\n const type = filter.mainField?.type ? filter.mainField.type : filter.type;\n\n switch (type) {\n case 'email':\n case 'text':\n case 'string': {\n return [\n ...BASE_FILTERS,\n ...IS_SENSITIVE_FILTERS,\n ...CONTAINS_FILTERS,\n ...STRING_PARSE_FILTERS,\n ];\n }\n\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n case 'time':\n case 'date': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS, ...CONTAINS_FILTERS];\n }\n\n case 'datetime': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n\n case 'enumeration': {\n return BASE_FILTERS;\n }\n\n default:\n return [...BASE_FILTERS, ...IS_SENSITIVE_FILTERS];\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * List\n * -----------------------------------------------------------------------------------------------*/\n\nconst List = () => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n\n const options = useFilters('List', ({ options }) => options);\n\n const handleClick = (data: FilterFormData) => {\n /**\n * Check the name, operator and value to see if it already exists in the query\n * if it does, remove it.\n */\n const nextFilters = (query?.filters?.$and ?? []).filter((filter) => {\n const details = getFilterDetails(filter, options);\n if (!details) {\n return true;\n }\n\n return !(\n details.name === data.name &&\n details.operator === data.filter &&\n details.value === data.value\n );\n });\n\n setQuery({ filters: { $and: nextFilters }, page: 1 });\n };\n\n if (!query?.filters?.$and?.length) {\n return null;\n }\n\n return (\n <>\n {query?.filters?.$and?.map((queryFilter) => {\n const details = getFilterDetails(queryFilter, options);\n if (!details || typeof details.value === 'object') {\n return null;\n }\n\n const filter = options.find(({ name }) => name === details.name);\n if (!filter) {\n return null;\n }\n return (\n <AttributeTag\n key={`${details.name}-${details.operator}-${details.value}`}\n {...filter}\n onRemove={handleClick}\n operator={details.operator}\n value={String(details.value)}\n />\n );\n })}\n </>\n );\n};\n\ninterface AttributeTagProps extends Filters.Filter {\n onRemove: (data: FilterFormData) => void;\n operator: string;\n value: string;\n}\n\nconst AttributeTag = ({\n input,\n label,\n mainField,\n name,\n onRemove,\n operator,\n options,\n value,\n ...filter\n}: AttributeTagProps) => {\n const { formatMessage, formatDate, formatTime, formatNumber } = useIntl();\n const setOpen = useFilters('AttributeTag', ({ setOpen }) => setOpen);\n const setEditingFilter = useFilters('AttributeTag', ({ setEditingFilter }) => setEditingFilter);\n\n const handleEdit = () => {\n setEditingFilter({\n name,\n filter: operator,\n value: FILTERS_WITH_NO_VALUE.includes(operator) ? undefined : decodeURIComponent(value),\n });\n setOpen(true);\n };\n\n const handleRemove = () => {\n onRemove({ name, value, filter: operator });\n };\n\n const type = mainField?.type ? mainField.type : filter.type;\n\n let formattedValue: string = value;\n\n switch (type) {\n case 'date':\n formattedValue = formatDate(value, { dateStyle: 'full' });\n break;\n case 'datetime':\n formattedValue = formatDate(value, { dateStyle: 'full', timeStyle: 'short' });\n break;\n case 'time':\n const [hour, minute] = value.split(':');\n const date = new Date();\n date.setHours(Number(hour));\n date.setMinutes(Number(minute));\n\n formattedValue = formatTime(date, {\n hour: 'numeric',\n minute: 'numeric',\n });\n break;\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal':\n formattedValue = formatNumber(Number(value));\n break;\n }\n\n // Handle custom input\n if (input && options) {\n // If the custom input has an options array, find the option with a customValue matching the query value\n const selectedOption = options.find((option) => {\n return (typeof option === 'string' ? option : option.value) === value;\n });\n\n formattedValue = selectedOption\n ? typeof selectedOption === 'string'\n ? selectedOption\n : (selectedOption.label ?? selectedOption.value)\n : value;\n }\n\n const operatorLabel = formatMessage({\n id: `components.FilterOptions.FILTER_TYPES.${operator}`,\n defaultMessage: operator,\n });\n\n const content = FILTERS_WITH_NO_VALUE.includes(operator)\n ? `${label} ${operatorLabel}`\n : `${label} ${operatorLabel} ${formattedValue}`;\n\n return (\n <Tag padding={1} onClick={handleRemove} icon={<Cross />} label={content}>\n <Box tag=\"span\" cursor=\"pointer\" onClick={handleEdit}>\n {content}\n </Box>\n </Tag>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EXPORTS\n * -----------------------------------------------------------------------------------------------*/\n\nconst Filters = {\n List,\n Popover: PopoverImpl,\n Root,\n Trigger,\n};\n\ninterface MainField {\n name: string;\n type: Schema.Attribute.Kind | 'custom';\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Filters {\n export interface Filter {\n input?: React.ComponentType<ValueInputProps>;\n label: string;\n /**\n * the name of the attribute we use to display the actual name e.g. relations\n * are just ids, so we use the mainField to display something meaninginful by\n * looking at the target's schema\n */\n mainField?: MainField;\n name: string;\n operators?: Array<{\n label: string;\n value: string;\n }>;\n options?: Array<{ label?: string; value: string }> | string[];\n type: InputProps['type'] | 'relation' | 'custom';\n }\n\n export interface ValueInputProps extends Omit<Filter, 'label'> {\n ['aria-label']: string;\n }\n\n export type Props = RootProps;\n\n export interface TriggerProps {\n label?: string;\n }\n\n export interface Query {\n filters?: {\n /**\n * Typically, a filter will be:\n * ```ts\n * {\n * [attributeName]: {\n * [operator]: value\n * }\n * }\n * ```\n * However, for relation items it becomes more nested.\n * ```ts\n * {\n * [attributeName]: {\n * [relationTargetAttribute]: {\n * [operator]: value\n * }\n * }\n * }\n * ```\n */\n $and?: Array<Record<string, Record<string, string | Record<string, string>>>>;\n };\n page?: number;\n }\n}\n\nexport { Filters };\n"],"names":["FiltersProvider","useFilters","createContext","getFilterDetails","filterEntry","options","name","Object","keys","option","find","o","operatorObj","type","mainField","operator","value","isFilterMatch","target","details","filter","FILTERS_WITH_NO_VALUE","includes","decoded","decodeURIComponent","Root","children","disabled","onChange","onOpenChange","open","openProp","defaultOpen","restProps","editingFilter","setEditingFilter","React","useState","handleChange","data","setOpen","useControllableState","prop","defaultProp","useEffect","_jsx","Popover","Trigger","forwardRef","label","forwardedRef","formatMessage","useIntl","Button","variant","ref","startIcon","FilterIcon","size","id","defaultMessage","PopoverImpl","zIndex","query","setQuery","useQueryParams","initialValues","useMemo","BASE_FILTERS","length","handleSubmit","encodeURIComponent","fieldOptions","operatorValuePairing","newFilterEntry","existingFilters","filters","$and","newFilterQuery","map","page","Content","style","Box","padding","Form","method","onSubmit","values","formValues","modified","isSubmitting","Input","input","InputRenderer","_jsxs","Flex","direction","alignItems","gap","minWidth","placholder","operators","getFilterList","opt","placeholder","field","aria-label","Plus","fullWidth","IS_SENSITIVE_FILTERS","CONTAINS_FILTERS","STRING_PARSE_FILTERS","NUMERIC_FILTERS","List","handleClick","nextFilters","_Fragment","queryFilter","AttributeTag","onRemove","String","formatDate","formatTime","formatNumber","handleEdit","undefined","handleRemove","formattedValue","dateStyle","timeStyle","hour","minute","split","date","Date","setHours","Number","setMinutes","selectedOption","operatorLabel","content","Tag","onClick","icon","Cross","tag","cursor","Filters"],"mappings":"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"}
1
+ {"version":3,"file":"Filters.mjs","sources":["../../../../../admin/src/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Popover, Tag } from '@strapi/design-system';\nimport { Plus, Filter as FilterIcon, Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport {\n BASE_FILTERS,\n CONTAINS_FILTERS,\n FilterOption,\n IS_SENSITIVE_FILTERS,\n NUMERIC_FILTERS,\n STRING_PARSE_FILTERS,\n FILTERS_WITH_NO_VALUE,\n} from '../constants/filters';\nimport { useControllableState } from '../hooks/useControllableState';\nimport { useQueryParams } from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\nimport { Form, InputProps } from './Form';\nimport { InputRenderer } from './FormInputs/Renderer';\n\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FilterFormData {\n name: string;\n filter: string;\n value?: string;\n}\n\n/**\n * Carries the position in the `$and` array so we replace that exact entry, not every entry\n * sharing the same `(name, operator, value)`.\n */\ninterface EditingFilter extends FilterFormData {\n index: number;\n}\n\ninterface FitlersContextValue {\n disabled: boolean;\n onChange: (data: FilterFormData) => void;\n options: Filters.Filter[];\n setOpen: (open: boolean) => void;\n editingFilter: EditingFilter | null;\n setEditingFilter: (filter: EditingFilter | null) => void;\n}\n\nconst [FiltersProvider, useFilters] = createContext<FitlersContextValue>('Filters');\n\nconst getFilterDetails = (\n filterEntry: Record<string, unknown>,\n options: Filters.Filter[]\n): { name: string; operator: string; value: unknown } | null => {\n const [name] = Object.keys(filterEntry);\n const option = options.find((o) => o.name === name);\n if (!option) {\n return null;\n }\n\n const operatorObj =\n option.type === 'relation'\n ? (filterEntry[name] as Record<string, unknown>)?.[option.mainField?.name ?? 'id']\n : filterEntry[name];\n\n if (typeof operatorObj !== 'object' || operatorObj === null) {\n return null;\n }\n\n const [operator] = Object.keys(operatorObj as Record<string, unknown>);\n if (!operator) {\n return null;\n }\n\n return { name, operator, value: (operatorObj as Record<string, unknown>)[operator] };\n};\n\ninterface RootProps\n extends Partial<Pick<FitlersContextValue, 'disabled' | 'onChange' | 'options'>>,\n Popover.Props {\n children: React.ReactNode;\n}\n\nconst Root = ({\n children,\n disabled = false,\n onChange,\n options = [],\n onOpenChange,\n open: openProp,\n defaultOpen,\n ...restProps\n}: RootProps) => {\n const [editingFilter, setEditingFilter] = React.useState<EditingFilter | null>(null);\n\n const handleChange = (data: FilterFormData) => {\n if (onChange) {\n onChange(data);\n }\n };\n\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n React.useEffect(() => {\n if (!open) {\n setEditingFilter(null);\n }\n }, [open]);\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen} {...restProps}>\n <FiltersProvider\n setOpen={setOpen}\n disabled={disabled}\n onChange={handleChange}\n options={options}\n editingFilter={editingFilter}\n setEditingFilter={setEditingFilter}\n >\n {children}\n </FiltersProvider>\n </Popover.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Trigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst Trigger = React.forwardRef<HTMLButtonElement, Filters.TriggerProps>(\n ({ label }, forwardedRef) => {\n const { formatMessage } = useIntl();\n const disabled = useFilters('Trigger', ({ disabled }) => disabled);\n\n return (\n <Popover.Trigger>\n <Button\n variant=\"tertiary\"\n ref={forwardedRef}\n startIcon={<FilterIcon />}\n size=\"S\"\n disabled={disabled}\n >\n {label || formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Popover\n * -----------------------------------------------------------------------------------------------*/\n/**\n * The zIndex property is used to override the zIndex of the Portal element of the Popover.\n * This is needed to ensure that the DatePicker is rendered above the Popover when opened.\n * The issue was that both the DatePicker and the Popover are rendered in a Portal and have the same zIndex.\n * On init, since the DatePicker is rendered before the Popover in the DOM,\n * it's causing the issue of appearing behind the Popover.\n */\nconst PopoverImpl = ({ zIndex }: { zIndex?: number }) => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n const { formatMessage } = useIntl();\n const options = useFilters('Popover', ({ options }) => options);\n const onChange = useFilters('Popover', ({ onChange }) => onChange);\n const setOpen = useFilters('Popover', ({ setOpen }) => setOpen);\n const editingFilter = useFilters('Popover', ({ editingFilter }) => editingFilter);\n const setEditingFilter = useFilters('Popover', ({ setEditingFilter }) => setEditingFilter);\n\n const initialValues = React.useMemo(() => {\n return editingFilter ?? { name: options[0]?.name, filter: BASE_FILTERS[0].value };\n }, [editingFilter, options]);\n\n if (options.length === 0) {\n return null;\n }\n\n const handleSubmit = (data: FilterFormData) => {\n const value = FILTERS_WITH_NO_VALUE.includes(data.filter)\n ? 'true'\n : encodeURIComponent(data.value ?? '');\n\n if (!value) {\n return;\n }\n\n if (onChange) {\n onChange(data);\n }\n\n /**\n * There will ALWAYS be an option because we use the options to create the form data.\n */\n const fieldOptions = options.find((filter) => filter.name === data.name)!;\n\n /**\n * If the filter is a relation, we need to nest the filter object,\n * we filter based on the mainField of the relation, if there is no mainField, we use the id.\n * At the end, we pass the operator & value. This value _could_ look like:\n * ```json\n * {\n * \"$eq\": \"1\",\n * }\n * ```\n */\n const operatorValuePairing = {\n [data.filter]: value,\n };\n\n const newFilterEntry = {\n [data.name]:\n fieldOptions.type === 'relation'\n ? {\n [fieldOptions.mainField?.name ?? 'id']: operatorValuePairing,\n }\n : operatorValuePairing,\n };\n\n const existingFilters = query.filters?.$and ?? [];\n\n const newFilterQuery = editingFilter\n ? {\n ...query.filters,\n $and: existingFilters.map((filter, i) =>\n i === editingFilter.index ? newFilterEntry : filter\n ),\n }\n : {\n ...query.filters,\n $and: [...existingFilters, newFilterEntry],\n };\n\n setQuery({ filters: newFilterQuery, page: 1 }, 'push', true);\n setOpen(false);\n setEditingFilter(null);\n };\n\n return (\n <Popover.Content style={{ zIndex }}>\n <Box padding={3}>\n <Form\n method=\"POST\"\n initialValues={initialValues}\n onSubmit={handleSubmit}\n key={\n editingFilter\n ? `edit-${editingFilter.index}-${editingFilter.name}-${editingFilter.filter}-${editingFilter.value ?? 'empty'}`\n : 'create'\n }\n >\n {({ values: formValues, modified, isSubmitting }) => {\n const filter = options.find((filter) => filter.name === formValues.name);\n const Input = filter?.input || InputRenderer;\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2} style={{ minWidth: 184 }}>\n {[\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n name: 'name',\n options: options.map((filter) => ({\n label: filter.label,\n value: filter.name,\n })),\n placholder: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n type: 'enumeration' as const,\n },\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n name: 'filter',\n options:\n filter?.operators ||\n getFilterList(filter).map((opt) => ({\n label: formatMessage(opt.label),\n value: opt.value,\n })),\n placeholder: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n type: 'enumeration' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n {filter &&\n formValues.filter &&\n !FILTERS_WITH_NO_VALUE.includes(formValues.filter) ? (\n <Input\n {...filter}\n label={null}\n aria-label={filter.label}\n name=\"value\"\n // @ts-expect-error – if type is `custom` then `Input` will be a custom component.\n type={filter.mainField?.type ?? filter.type}\n />\n ) : null}\n <Button\n disabled={!modified || isSubmitting}\n size=\"L\"\n variant=\"secondary\"\n startIcon={<Plus />}\n type=\"submit\"\n fullWidth\n >\n {editingFilter\n ? formatMessage({\n id: 'app.utils.update-filter',\n defaultMessage: 'Update filter',\n })\n : formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Flex>\n );\n }}\n </Form>\n </Box>\n </Popover.Content>\n );\n};\n\n/**\n * Depending on the selected field find the possible filters to apply\n */\nconst getFilterList = (filter?: Filters.Filter): FilterOption[] => {\n if (!filter) {\n return [];\n }\n\n const type = filter.mainField?.type ? filter.mainField.type : filter.type;\n\n switch (type) {\n case 'email':\n case 'text':\n case 'string': {\n return [\n ...BASE_FILTERS,\n ...IS_SENSITIVE_FILTERS,\n ...CONTAINS_FILTERS,\n ...STRING_PARSE_FILTERS,\n ];\n }\n\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n case 'time':\n case 'date': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS, ...CONTAINS_FILTERS];\n }\n\n case 'datetime': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n\n case 'enumeration': {\n return BASE_FILTERS;\n }\n\n default:\n return [...BASE_FILTERS, ...IS_SENSITIVE_FILTERS];\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * List\n * -----------------------------------------------------------------------------------------------*/\n\nconst List = () => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n\n const options = useFilters('List', ({ options }) => options);\n\n /**\n * Removed by position: identical filters are a legal query, so matching on\n * `(name, operator, value)` would drop every copy at once.\n */\n const handleRemove = (index: number) => {\n const nextFilters = (query?.filters?.$and ?? []).filter((_, i) => i !== index);\n\n setQuery({ filters: { $and: nextFilters }, page: 1 });\n };\n\n if (!query?.filters?.$and?.length) {\n return null;\n }\n\n return (\n <>\n {query?.filters?.$and?.map((queryFilter, index) => {\n const details = getFilterDetails(queryFilter, options);\n if (!details || typeof details.value === 'object') {\n return null;\n }\n\n const filter = options.find(({ name }) => name === details.name);\n if (!filter) {\n return null;\n }\n /**\n * `index` is the position in the raw `$and` array — entries skipped above still count.\n * Never cache it: `qs` re-indexes on removal, so dropping entry 0 of [0, 1, 2]\n * leaves [0, 1] and any held index goes stale.\n */\n return (\n <AttributeTag\n key={`${index}-${details.name}-${details.operator}-${details.value}`}\n {...filter}\n index={index}\n onRemove={handleRemove}\n operator={details.operator}\n value={String(details.value)}\n />\n );\n })}\n </>\n );\n};\n\ninterface AttributeTagProps extends Filters.Filter {\n /**\n * Position in the `$and` array. An explicit prop rather than a closure bound at the call\n * site, so it stays part of the props comparison if this ever gets memoised.\n */\n index: number;\n onRemove: (index: number) => void;\n operator: string;\n value: string;\n}\n\nconst AttributeTag = ({\n index,\n input,\n label,\n mainField,\n name,\n onRemove,\n operator,\n options,\n value,\n ...filter\n}: AttributeTagProps) => {\n const { formatMessage, formatDate, formatTime, formatNumber } = useIntl();\n const setOpen = useFilters('AttributeTag', ({ setOpen }) => setOpen);\n const setEditingFilter = useFilters('AttributeTag', ({ setEditingFilter }) => setEditingFilter);\n\n const handleEdit = () => {\n setEditingFilter({\n name,\n filter: operator,\n index,\n value: FILTERS_WITH_NO_VALUE.includes(operator) ? undefined : decodeURIComponent(value),\n });\n setOpen(true);\n };\n\n const handleRemove = () => {\n onRemove(index);\n };\n\n const type = mainField?.type ? mainField.type : filter.type;\n\n let formattedValue: string = value;\n\n switch (type) {\n case 'date':\n formattedValue = formatDate(value, { dateStyle: 'full' });\n break;\n case 'datetime':\n formattedValue = formatDate(value, { dateStyle: 'full', timeStyle: 'short' });\n break;\n case 'time':\n const [hour, minute] = value.split(':');\n const date = new Date();\n date.setHours(Number(hour));\n date.setMinutes(Number(minute));\n\n formattedValue = formatTime(date, {\n hour: 'numeric',\n minute: 'numeric',\n });\n break;\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal':\n formattedValue = formatNumber(Number(value));\n break;\n }\n\n // Handle custom input\n if (input && options) {\n // If the custom input has an options array, find the option with a customValue matching the query value\n const selectedOption = options.find((option) => {\n return (typeof option === 'string' ? option : option.value) === value;\n });\n\n formattedValue = selectedOption\n ? typeof selectedOption === 'string'\n ? selectedOption\n : (selectedOption.label ?? selectedOption.value)\n : value;\n }\n\n const operatorLabel = formatMessage({\n id: `components.FilterOptions.FILTER_TYPES.${operator}`,\n defaultMessage: operator,\n });\n\n const content = FILTERS_WITH_NO_VALUE.includes(operator)\n ? `${label} ${operatorLabel}`\n : `${label} ${operatorLabel} ${formattedValue}`;\n\n return (\n <Tag padding={1} onClick={handleRemove} icon={<Cross />} label={content}>\n <Box tag=\"span\" cursor=\"pointer\" onClick={handleEdit}>\n {content}\n </Box>\n </Tag>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EXPORTS\n * -----------------------------------------------------------------------------------------------*/\n\nconst Filters = {\n List,\n Popover: PopoverImpl,\n Root,\n Trigger,\n};\n\ninterface MainField {\n name: string;\n type: Schema.Attribute.Kind | 'custom';\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Filters {\n export interface Filter {\n input?: React.ComponentType<ValueInputProps>;\n label: string;\n /**\n * the name of the attribute we use to display the actual name e.g. relations\n * are just ids, so we use the mainField to display something meaninginful by\n * looking at the target's schema\n */\n mainField?: MainField;\n name: string;\n operators?: Array<{\n label: string;\n value: string;\n }>;\n options?: Array<{ label?: string; value: string }> | string[];\n type: InputProps['type'] | 'relation' | 'custom';\n }\n\n export interface ValueInputProps extends Omit<Filter, 'label'> {\n ['aria-label']: string;\n }\n\n export type Props = RootProps;\n\n export interface TriggerProps {\n label?: string;\n }\n\n export interface Query {\n filters?: {\n /**\n * Typically, a filter will be:\n * ```ts\n * {\n * [attributeName]: {\n * [operator]: value\n * }\n * }\n * ```\n * However, for relation items it becomes more nested.\n * ```ts\n * {\n * [attributeName]: {\n * [relationTargetAttribute]: {\n * [operator]: value\n * }\n * }\n * }\n * ```\n */\n $and?: Array<Record<string, Record<string, string | Record<string, string>>>>;\n };\n page?: number;\n }\n}\n\nexport { Filters };\n"],"names":["FiltersProvider","useFilters","createContext","getFilterDetails","filterEntry","options","name","Object","keys","option","find","o","operatorObj","type","mainField","operator","value","Root","children","disabled","onChange","onOpenChange","open","openProp","defaultOpen","restProps","editingFilter","setEditingFilter","React","useState","handleChange","data","setOpen","useControllableState","prop","defaultProp","useEffect","_jsx","Popover","Trigger","forwardRef","label","forwardedRef","formatMessage","useIntl","Button","variant","ref","startIcon","FilterIcon","size","id","defaultMessage","PopoverImpl","zIndex","query","setQuery","useQueryParams","initialValues","useMemo","filter","BASE_FILTERS","length","handleSubmit","FILTERS_WITH_NO_VALUE","includes","encodeURIComponent","fieldOptions","operatorValuePairing","newFilterEntry","existingFilters","filters","$and","newFilterQuery","map","i","index","page","Content","style","Box","padding","Form","method","onSubmit","values","formValues","modified","isSubmitting","Input","input","InputRenderer","_jsxs","Flex","direction","alignItems","gap","minWidth","placholder","operators","getFilterList","opt","placeholder","field","aria-label","Plus","fullWidth","IS_SENSITIVE_FILTERS","CONTAINS_FILTERS","STRING_PARSE_FILTERS","NUMERIC_FILTERS","List","handleRemove","nextFilters","_","_Fragment","queryFilter","details","AttributeTag","onRemove","String","formatDate","formatTime","formatNumber","handleEdit","undefined","decodeURIComponent","formattedValue","dateStyle","timeStyle","hour","minute","split","date","Date","setHours","Number","setMinutes","selectedOption","operatorLabel","content","Tag","onClick","icon","Cross","tag","cursor","Filters"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"NavUser.js","sources":["../../../../../../admin/src/components/MainNav/NavUser.tsx"],"sourcesContent":["import { Flex, Menu, VisuallyHidden, Avatar, Typography, Badge } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useAuth } from '../../features/Auth';\nimport { getInitials, getDisplayName } from '../../utils/users';\n\nconst MenuTrigger = styled(Menu.Trigger)`\n padding: 0;\n\n ${({ theme }) => theme.breakpoints.large} {\n width: 4rem;\n height: 4rem;\n justify-content: center;\n }\n`;\n\nconst MenuIcon = styled(Flex)`\n height: ${({ theme }) => theme.spaces[7]};\n width: ${({ theme }) => theme.spaces[7]};\n border: none;\n border-radius: 50%;\n padding: 0;\n overflow: hidden;\n`;\n\nconst MenuContent = styled(Menu.Content)`\n max-height: fit-content;\n width: 200px;\n`;\n\nconst UserInfo = styled(Flex)`\n && {\n padding: ${({ theme }) => theme.spaces[3]};\n }\n align-items: flex-start;\n`;\n\nconst BadgeWrapper = styled(Flex)`\n display: flex;\n flex-wrap: wrap;\n gap: ${({ theme }) => theme.spaces[1]};\n\n width: 100%;\n`;\nconst StyledTypography = styled(Typography)`\n word-break: break-word;\n margin-bottom: ${({ theme }) => theme.spaces[3]};\n`;\n\nexport interface NavUserProps {\n initials?: string;\n children?: React.ReactNode;\n showDisplayName?: boolean;\n}\n\nexport const NavUser = ({\n initials,\n showDisplayName = false,\n children,\n ...props\n}: NavUserProps) => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const user = useAuth('User', (state) => state.user);\n const logout = useAuth('Logout', (state) => state.logout);\n const userDisplayName = getDisplayName(user);\n\n const handleProfile = () => {\n const redirection = '/me';\n navigate(redirection);\n };\n\n const handleSessions = () => {\n navigate('/me/sessions');\n };\n\n const handleLogout = () => {\n const redirection = '/auth/login';\n logout();\n navigate(redirection);\n };\n\n return (\n <Flex {...props}>\n <Menu.Root>\n <MenuTrigger endIcon={null} fullWidth justifyContent=\"flex-start\">\n <Flex alignItems=\"center\" gap={3}>\n <MenuIcon justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials || getInitials(user)} />\n </MenuIcon>\n {showDisplayName ? (\n <Typography variant=\"omega\">{children || userDisplayName}</Typography>\n ) : (\n <VisuallyHidden tag=\"span\">{children || userDisplayName}</VisuallyHidden>\n )}\n </Flex>\n </MenuTrigger>\n\n <MenuContent popoverPlacement=\"top-start\" zIndex={3}>\n <UserInfo direction=\"column\" gap={0} alignItems=\"flex-start\">\n <Typography variant=\"omega\" fontWeight=\"bold\" textTransform=\"none\">\n {children || userDisplayName}\n </Typography>\n <StyledTypography variant=\"pi\" textColor=\"neutral600\">\n {user?.email}\n </StyledTypography>\n <BadgeWrapper>\n {user?.roles?.map((role) => <Badge key={role.id}>{role.name}</Badge>)}\n </BadgeWrapper>\n </UserInfo>\n\n <Menu.Separator />\n\n <Menu.Item onSelect={handleProfile}>\n {formatMessage({\n id: 'global.profile.settings',\n defaultMessage: 'Profile settings',\n })}\n </Menu.Item>\n\n <Menu.Item onSelect={handleSessions}>\n {formatMessage({\n id: 'global.sessions.active-devices',\n defaultMessage: 'Active devices',\n })}\n </Menu.Item>\n\n <Menu.Item variant=\"danger\" onSelect={handleLogout} color=\"danger600\">\n {formatMessage({\n id: 'app.components.LeftMenu.logout',\n defaultMessage: 'Log out',\n })}\n </Menu.Item>\n </MenuContent>\n </Menu.Root>\n </Flex>\n );\n};\n"],"names":["MenuTrigger","styled","Menu","Trigger","theme","breakpoints","large","MenuIcon","Flex","spaces","MenuContent","Content","UserInfo","BadgeWrapper","StyledTypography","Typography","NavUser","initials","showDisplayName","children","props","formatMessage","useIntl","navigate","useNavigate","user","useAuth","state","logout","userDisplayName","getDisplayName","handleProfile","redirection","handleSessions","handleLogout","_jsx","_jsxs","Root","endIcon","fullWidth","justifyContent","alignItems","gap","Avatar","Item","delayMs","fallback","getInitials","variant","VisuallyHidden","tag","popoverPlacement","zIndex","direction","fontWeight","textTransform","textColor","email","roles","map","role","Badge","name","id","Separator","onSelect","defaultMessage","color"],"mappings":"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"}
1
+ {"version":3,"file":"NavUser.js","sources":["../../../../../../admin/src/components/MainNav/NavUser.tsx"],"sourcesContent":["import { Flex, Menu, VisuallyHidden, Avatar, Typography, Badge } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useAuth } from '../../features/Auth';\nimport { getInitials, getDisplayName } from '../../utils/users';\n\nconst MenuTrigger = styled(Menu.Trigger)`\n padding: 0;\n\n ${({ theme }) => theme.breakpoints.large} {\n width: 4rem;\n height: 4rem;\n justify-content: center;\n }\n`;\n\nconst MenuIcon = styled(Flex)`\n height: ${({ theme }) => theme.spaces[7]};\n width: ${({ theme }) => theme.spaces[7]};\n border: none;\n border-radius: 50%;\n padding: 0;\n overflow: hidden;\n`;\n\nconst MenuContent = styled(Menu.Content)`\n max-height: fit-content;\n width: 200px;\n`;\n\nconst UserInfo = styled(Flex)`\n && {\n padding: ${({ theme }) => theme.spaces[3]};\n }\n align-items: flex-start;\n`;\n\nconst BadgeWrapper = styled(Flex)`\n display: flex;\n flex-wrap: wrap;\n gap: ${({ theme }) => theme.spaces[1]};\n\n width: 100%;\n`;\nconst StyledTypography = styled(Typography)`\n word-break: break-word;\n margin-bottom: ${({ theme }) => theme.spaces[3]};\n`;\n\nexport interface NavUserProps {\n initials?: string;\n children?: React.ReactNode;\n showDisplayName?: boolean;\n}\n\nexport const NavUser = ({\n initials,\n showDisplayName = false,\n children,\n ...props\n}: NavUserProps) => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const user = useAuth('User', (state) => state.user);\n const logout = useAuth('Logout', (state) => state.logout);\n const userDisplayName = getDisplayName(user);\n\n const handleProfile = () => {\n const redirection = '/me';\n navigate(redirection);\n };\n\n const handleSessions = () => {\n navigate('/me/sessions');\n };\n\n const handleLogout = () => {\n const redirection = '/auth/login';\n logout();\n navigate(redirection);\n };\n\n return (\n <Flex {...props}>\n <Menu.Root>\n <MenuTrigger endIcon={null} fullWidth justifyContent=\"flex-start\">\n <Flex alignItems=\"center\" gap={3}>\n <MenuIcon justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials || getInitials(user)} />\n </MenuIcon>\n {showDisplayName ? (\n <Typography variant=\"omega\">{children || userDisplayName}</Typography>\n ) : (\n <VisuallyHidden tag=\"span\">{children || userDisplayName}</VisuallyHidden>\n )}\n </Flex>\n </MenuTrigger>\n\n <MenuContent popoverPlacement=\"top-start\" zIndex={3}>\n <UserInfo direction=\"column\" gap={0} alignItems=\"flex-start\">\n <Typography variant=\"omega\" fontWeight=\"bold\" textTransform=\"none\">\n {children || userDisplayName}\n </Typography>\n <StyledTypography variant=\"pi\" textColor=\"neutral600\">\n {user?.email}\n </StyledTypography>\n <BadgeWrapper>\n {user?.roles?.map((role) => (\n <Badge key={role.id}>{role.name}</Badge>\n ))}\n </BadgeWrapper>\n </UserInfo>\n\n <Menu.Separator />\n\n <Menu.Item onSelect={handleProfile}>\n {formatMessage({\n id: 'global.profile.settings',\n defaultMessage: 'Profile settings',\n })}\n </Menu.Item>\n\n <Menu.Item onSelect={handleSessions}>\n {formatMessage({\n id: 'global.sessions.active-devices',\n defaultMessage: 'Active devices',\n })}\n </Menu.Item>\n\n <Menu.Item variant=\"danger\" onSelect={handleLogout} color=\"danger600\">\n {formatMessage({\n id: 'app.components.LeftMenu.logout',\n defaultMessage: 'Log out',\n })}\n </Menu.Item>\n </MenuContent>\n </Menu.Root>\n </Flex>\n );\n};\n"],"names":["MenuTrigger","styled","Menu","Trigger","theme","breakpoints","large","MenuIcon","Flex","spaces","MenuContent","Content","UserInfo","BadgeWrapper","StyledTypography","Typography","NavUser","initials","showDisplayName","children","props","formatMessage","useIntl","navigate","useNavigate","user","useAuth","state","logout","userDisplayName","getDisplayName","handleProfile","redirection","handleSessions","handleLogout","_jsx","_jsxs","Root","endIcon","fullWidth","justifyContent","alignItems","gap","Avatar","Item","delayMs","fallback","getInitials","variant","VisuallyHidden","tag","popoverPlacement","zIndex","direction","fontWeight","textTransform","textColor","email","roles","map","role","Badge","name","id","Separator","onSelect","defaultMessage","color"],"mappings":";;;;;;;;;;AAQA,MAAMA,WAAAA,GAAcC,uBAAAA,CAAOC,iBAAAA,CAAKC,OAAO,CAAC;;;EAGtC,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,WAAW,CAACC,KAAK,CAAC;;;;;AAK3C,CAAC;AAED,MAAMC,QAAAA,GAAWN,uBAAAA,CAAOO,iBAAAA,CAAK;UACnB,EAAE,CAAC,EAAEJ,KAAK,EAAE,GAAKA,KAAAA,CAAMK,MAAM,CAAC,CAAA,CAAE,CAAC;SAClC,EAAE,CAAC,EAAEL,KAAK,EAAE,GAAKA,KAAAA,CAAMK,MAAM,CAAC,CAAA,CAAE,CAAC;;;;;AAK1C,CAAC;AAED,MAAMC,WAAAA,GAAcT,uBAAAA,CAAOC,iBAAAA,CAAKS,OAAO,CAAC;;;AAGxC,CAAC;AAED,MAAMC,QAAAA,GAAWX,uBAAAA,CAAOO,iBAAAA,CAAK;;aAEhB,EAAE,CAAC,EAAEJ,KAAK,EAAE,GAAKA,KAAAA,CAAMK,MAAM,CAAC,CAAA,CAAE,CAAC;;;AAG9C,CAAC;AAED,MAAMI,YAAAA,GAAeZ,uBAAAA,CAAOO,iBAAAA,CAAK;;;OAG1B,EAAE,CAAC,EAAEJ,KAAK,EAAE,GAAKA,KAAAA,CAAMK,MAAM,CAAC,CAAA,CAAE,CAAC;;;AAGxC,CAAC;AACD,MAAMK,gBAAAA,GAAmBb,uBAAAA,CAAOc,uBAAAA,CAAW;;iBAE1B,EAAE,CAAC,EAAEX,KAAK,EAAE,GAAKA,KAAAA,CAAMK,MAAM,CAAC,CAAA,CAAE,CAAC;AAClD,CAAC;AAQM,MAAMO,OAAAA,GAAU,CAAC,EACtBC,QAAQ,EACRC,eAAAA,GAAkB,KAAK,EACvBC,QAAQ,EACR,GAAGC,KAAAA,EACU,GAAA;IACb,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,QAAAA,GAAWC,0BAAAA,EAAAA;AACjB,IAAA,MAAMC,OAAOC,YAAAA,CAAQ,MAAA,EAAQ,CAACC,KAAAA,GAAUA,MAAMF,IAAI,CAAA;AAClD,IAAA,MAAMG,SAASF,YAAAA,CAAQ,QAAA,EAAU,CAACC,KAAAA,GAAUA,MAAMC,MAAM,CAAA;AACxD,IAAA,MAAMC,kBAAkBC,oBAAAA,CAAeL,IAAAA,CAAAA;AAEvC,IAAA,MAAMM,aAAAA,GAAgB,IAAA;AACpB,QAAA,MAAMC,WAAAA,GAAc,KAAA;QACpBT,QAAAA,CAASS,WAAAA,CAAAA;AACX,IAAA,CAAA;AAEA,IAAA,MAAMC,cAAAA,GAAiB,IAAA;QACrBV,QAAAA,CAAS,cAAA,CAAA;AACX,IAAA,CAAA;AAEA,IAAA,MAAMW,YAAAA,GAAe,IAAA;AACnB,QAAA,MAAMF,WAAAA,GAAc,aAAA;AACpBJ,QAAAA,MAAAA,EAAAA;QACAL,QAAAA,CAASS,WAAAA,CAAAA;AACX,IAAA,CAAA;AAEA,IAAA,qBACEG,cAAA,CAAC3B,iBAAAA,EAAAA;AAAM,QAAA,GAAGY,KAAK;gCACbgB,eAAA,CAAClC,kBAAKmC,IAAI,EAAA;;8BACRF,cAAA,CAACnC,WAAAA,EAAAA;oBAAYsC,OAAAA,EAAS,IAAA;oBAAMC,SAAS,EAAA,IAAA;oBAACC,cAAAA,EAAe,YAAA;AACnD,oBAAA,QAAA,gBAAAJ,eAAA,CAAC5B,iBAAAA,EAAAA;wBAAKiC,UAAAA,EAAW,QAAA;wBAASC,GAAAA,EAAK,CAAA;;0CAC7BP,cAAA,CAAC5B,QAAAA,EAAAA;gCAASiC,cAAAA,EAAe,QAAA;wDACvBL,cAAA,CAACQ,oBAAOC,IAAI,EAAA;oCAACC,OAAAA,EAAS,CAAA;AAAGC,oCAAAA,QAAAA,EAAU7B,YAAY8B,iBAAAA,CAAYtB,IAAAA;;;AAE5DP,4BAAAA,eAAAA,iBACCiB,cAAA,CAACpB,uBAAAA,EAAAA;gCAAWiC,OAAAA,EAAQ,OAAA;0CAAS7B,QAAAA,IAAYU;+CAEzCM,cAAA,CAACc,2BAAAA,EAAAA;gCAAeC,GAAAA,EAAI,MAAA;0CAAQ/B,QAAAA,IAAYU;;;;;8BAK9CO,eAAA,CAAC1B,WAAAA,EAAAA;oBAAYyC,gBAAAA,EAAiB,WAAA;oBAAYC,MAAAA,EAAQ,CAAA;;sCAChDhB,eAAA,CAACxB,QAAAA,EAAAA;4BAASyC,SAAAA,EAAU,QAAA;4BAASX,GAAAA,EAAK,CAAA;4BAAGD,UAAAA,EAAW,YAAA;;8CAC9CN,cAAA,CAACpB,uBAAAA,EAAAA;oCAAWiC,OAAAA,EAAQ,OAAA;oCAAQM,UAAAA,EAAW,MAAA;oCAAOC,aAAAA,EAAc,MAAA;8CACzDpC,QAAAA,IAAYU;;8CAEfM,cAAA,CAACrB,gBAAAA,EAAAA;oCAAiBkC,OAAAA,EAAQ,IAAA;oCAAKQ,SAAAA,EAAU,YAAA;8CACtC/B,IAAAA,EAAMgC;;8CAETtB,cAAA,CAACtB,YAAAA,EAAAA;AACEY,oCAAAA,QAAAA,EAAAA,IAAAA,EAAMiC,KAAAA,EAAOC,GAAAA,CAAI,CAACC,IAAAA,iBACjBzB,cAAA,CAAC0B,kBAAAA,EAAAA;AAAqBD,4CAAAA,QAAAA,EAAAA,IAAAA,CAAKE;AAAfF,yCAAAA,EAAAA,IAAAA,CAAKG,EAAE,CAAA;;;;AAKzB,sCAAA5B,cAAA,CAACjC,kBAAK8D,SAAS,EAAA,EAAA,CAAA;AAEf,sCAAA7B,cAAA,CAACjC,kBAAK0C,IAAI,EAAA;4BAACqB,QAAAA,EAAUlC,aAAAA;sCAClBV,aAAAA,CAAc;gCACb0C,EAAAA,EAAI,yBAAA;gCACJG,cAAAA,EAAgB;AAClB,6BAAA;;AAGF,sCAAA/B,cAAA,CAACjC,kBAAK0C,IAAI,EAAA;4BAACqB,QAAAA,EAAUhC,cAAAA;sCAClBZ,aAAAA,CAAc;gCACb0C,EAAAA,EAAI,gCAAA;gCACJG,cAAAA,EAAgB;AAClB,6BAAA;;AAGF,sCAAA/B,cAAA,CAACjC,kBAAK0C,IAAI,EAAA;4BAACI,OAAAA,EAAQ,QAAA;4BAASiB,QAAAA,EAAU/B,YAAAA;4BAAciC,KAAAA,EAAM,WAAA;sCACvD9C,aAAAA,CAAc;gCACb0C,EAAAA,EAAI,gCAAA;gCACJG,cAAAA,EAAgB;AAClB,6BAAA;;;;;;;AAMZ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"NavUser.mjs","sources":["../../../../../../admin/src/components/MainNav/NavUser.tsx"],"sourcesContent":["import { Flex, Menu, VisuallyHidden, Avatar, Typography, Badge } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useAuth } from '../../features/Auth';\nimport { getInitials, getDisplayName } from '../../utils/users';\n\nconst MenuTrigger = styled(Menu.Trigger)`\n padding: 0;\n\n ${({ theme }) => theme.breakpoints.large} {\n width: 4rem;\n height: 4rem;\n justify-content: center;\n }\n`;\n\nconst MenuIcon = styled(Flex)`\n height: ${({ theme }) => theme.spaces[7]};\n width: ${({ theme }) => theme.spaces[7]};\n border: none;\n border-radius: 50%;\n padding: 0;\n overflow: hidden;\n`;\n\nconst MenuContent = styled(Menu.Content)`\n max-height: fit-content;\n width: 200px;\n`;\n\nconst UserInfo = styled(Flex)`\n && {\n padding: ${({ theme }) => theme.spaces[3]};\n }\n align-items: flex-start;\n`;\n\nconst BadgeWrapper = styled(Flex)`\n display: flex;\n flex-wrap: wrap;\n gap: ${({ theme }) => theme.spaces[1]};\n\n width: 100%;\n`;\nconst StyledTypography = styled(Typography)`\n word-break: break-word;\n margin-bottom: ${({ theme }) => theme.spaces[3]};\n`;\n\nexport interface NavUserProps {\n initials?: string;\n children?: React.ReactNode;\n showDisplayName?: boolean;\n}\n\nexport const NavUser = ({\n initials,\n showDisplayName = false,\n children,\n ...props\n}: NavUserProps) => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const user = useAuth('User', (state) => state.user);\n const logout = useAuth('Logout', (state) => state.logout);\n const userDisplayName = getDisplayName(user);\n\n const handleProfile = () => {\n const redirection = '/me';\n navigate(redirection);\n };\n\n const handleSessions = () => {\n navigate('/me/sessions');\n };\n\n const handleLogout = () => {\n const redirection = '/auth/login';\n logout();\n navigate(redirection);\n };\n\n return (\n <Flex {...props}>\n <Menu.Root>\n <MenuTrigger endIcon={null} fullWidth justifyContent=\"flex-start\">\n <Flex alignItems=\"center\" gap={3}>\n <MenuIcon justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials || getInitials(user)} />\n </MenuIcon>\n {showDisplayName ? (\n <Typography variant=\"omega\">{children || userDisplayName}</Typography>\n ) : (\n <VisuallyHidden tag=\"span\">{children || userDisplayName}</VisuallyHidden>\n )}\n </Flex>\n </MenuTrigger>\n\n <MenuContent popoverPlacement=\"top-start\" zIndex={3}>\n <UserInfo direction=\"column\" gap={0} alignItems=\"flex-start\">\n <Typography variant=\"omega\" fontWeight=\"bold\" textTransform=\"none\">\n {children || userDisplayName}\n </Typography>\n <StyledTypography variant=\"pi\" textColor=\"neutral600\">\n {user?.email}\n </StyledTypography>\n <BadgeWrapper>\n {user?.roles?.map((role) => <Badge key={role.id}>{role.name}</Badge>)}\n </BadgeWrapper>\n </UserInfo>\n\n <Menu.Separator />\n\n <Menu.Item onSelect={handleProfile}>\n {formatMessage({\n id: 'global.profile.settings',\n defaultMessage: 'Profile settings',\n })}\n </Menu.Item>\n\n <Menu.Item onSelect={handleSessions}>\n {formatMessage({\n id: 'global.sessions.active-devices',\n defaultMessage: 'Active devices',\n })}\n </Menu.Item>\n\n <Menu.Item variant=\"danger\" onSelect={handleLogout} color=\"danger600\">\n {formatMessage({\n id: 'app.components.LeftMenu.logout',\n defaultMessage: 'Log out',\n })}\n </Menu.Item>\n </MenuContent>\n </Menu.Root>\n </Flex>\n );\n};\n"],"names":["MenuTrigger","styled","Menu","Trigger","theme","breakpoints","large","MenuIcon","Flex","spaces","MenuContent","Content","UserInfo","BadgeWrapper","StyledTypography","Typography","NavUser","initials","showDisplayName","children","props","formatMessage","useIntl","navigate","useNavigate","user","useAuth","state","logout","userDisplayName","getDisplayName","handleProfile","redirection","handleSessions","handleLogout","_jsx","_jsxs","Root","endIcon","fullWidth","justifyContent","alignItems","gap","Avatar","Item","delayMs","fallback","getInitials","variant","VisuallyHidden","tag","popoverPlacement","zIndex","direction","fontWeight","textTransform","textColor","email","roles","map","role","Badge","name","id","Separator","onSelect","defaultMessage","color"],"mappings":"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"}
1
+ {"version":3,"file":"NavUser.mjs","sources":["../../../../../../admin/src/components/MainNav/NavUser.tsx"],"sourcesContent":["import { Flex, Menu, VisuallyHidden, Avatar, Typography, Badge } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useAuth } from '../../features/Auth';\nimport { getInitials, getDisplayName } from '../../utils/users';\n\nconst MenuTrigger = styled(Menu.Trigger)`\n padding: 0;\n\n ${({ theme }) => theme.breakpoints.large} {\n width: 4rem;\n height: 4rem;\n justify-content: center;\n }\n`;\n\nconst MenuIcon = styled(Flex)`\n height: ${({ theme }) => theme.spaces[7]};\n width: ${({ theme }) => theme.spaces[7]};\n border: none;\n border-radius: 50%;\n padding: 0;\n overflow: hidden;\n`;\n\nconst MenuContent = styled(Menu.Content)`\n max-height: fit-content;\n width: 200px;\n`;\n\nconst UserInfo = styled(Flex)`\n && {\n padding: ${({ theme }) => theme.spaces[3]};\n }\n align-items: flex-start;\n`;\n\nconst BadgeWrapper = styled(Flex)`\n display: flex;\n flex-wrap: wrap;\n gap: ${({ theme }) => theme.spaces[1]};\n\n width: 100%;\n`;\nconst StyledTypography = styled(Typography)`\n word-break: break-word;\n margin-bottom: ${({ theme }) => theme.spaces[3]};\n`;\n\nexport interface NavUserProps {\n initials?: string;\n children?: React.ReactNode;\n showDisplayName?: boolean;\n}\n\nexport const NavUser = ({\n initials,\n showDisplayName = false,\n children,\n ...props\n}: NavUserProps) => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const user = useAuth('User', (state) => state.user);\n const logout = useAuth('Logout', (state) => state.logout);\n const userDisplayName = getDisplayName(user);\n\n const handleProfile = () => {\n const redirection = '/me';\n navigate(redirection);\n };\n\n const handleSessions = () => {\n navigate('/me/sessions');\n };\n\n const handleLogout = () => {\n const redirection = '/auth/login';\n logout();\n navigate(redirection);\n };\n\n return (\n <Flex {...props}>\n <Menu.Root>\n <MenuTrigger endIcon={null} fullWidth justifyContent=\"flex-start\">\n <Flex alignItems=\"center\" gap={3}>\n <MenuIcon justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials || getInitials(user)} />\n </MenuIcon>\n {showDisplayName ? (\n <Typography variant=\"omega\">{children || userDisplayName}</Typography>\n ) : (\n <VisuallyHidden tag=\"span\">{children || userDisplayName}</VisuallyHidden>\n )}\n </Flex>\n </MenuTrigger>\n\n <MenuContent popoverPlacement=\"top-start\" zIndex={3}>\n <UserInfo direction=\"column\" gap={0} alignItems=\"flex-start\">\n <Typography variant=\"omega\" fontWeight=\"bold\" textTransform=\"none\">\n {children || userDisplayName}\n </Typography>\n <StyledTypography variant=\"pi\" textColor=\"neutral600\">\n {user?.email}\n </StyledTypography>\n <BadgeWrapper>\n {user?.roles?.map((role) => (\n <Badge key={role.id}>{role.name}</Badge>\n ))}\n </BadgeWrapper>\n </UserInfo>\n\n <Menu.Separator />\n\n <Menu.Item onSelect={handleProfile}>\n {formatMessage({\n id: 'global.profile.settings',\n defaultMessage: 'Profile settings',\n })}\n </Menu.Item>\n\n <Menu.Item onSelect={handleSessions}>\n {formatMessage({\n id: 'global.sessions.active-devices',\n defaultMessage: 'Active devices',\n })}\n </Menu.Item>\n\n <Menu.Item variant=\"danger\" onSelect={handleLogout} color=\"danger600\">\n {formatMessage({\n id: 'app.components.LeftMenu.logout',\n defaultMessage: 'Log out',\n })}\n </Menu.Item>\n </MenuContent>\n </Menu.Root>\n </Flex>\n );\n};\n"],"names":["MenuTrigger","styled","Menu","Trigger","theme","breakpoints","large","MenuIcon","Flex","spaces","MenuContent","Content","UserInfo","BadgeWrapper","StyledTypography","Typography","NavUser","initials","showDisplayName","children","props","formatMessage","useIntl","navigate","useNavigate","user","useAuth","state","logout","userDisplayName","getDisplayName","handleProfile","redirection","handleSessions","handleLogout","_jsx","_jsxs","Root","endIcon","fullWidth","justifyContent","alignItems","gap","Avatar","Item","delayMs","fallback","getInitials","variant","VisuallyHidden","tag","popoverPlacement","zIndex","direction","fontWeight","textTransform","textColor","email","roles","map","role","Badge","name","id","Separator","onSelect","defaultMessage","color"],"mappings":"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"}
@@ -149,15 +149,16 @@ const PageMain = ({ children, ...restProps })=>{
149
149
  /**
150
150
  * @public
151
151
  * @description A wrapper component that should be used to protect a page. It will check the permissions
152
- * you pass to it and render the children if the user has the required permissions. If a user does not have ALL
153
- * the required permissions, it will redirect the user to the home page. Whilst these checks happen it will render
154
- * the loading component and should the check fail it will render the error component with a notification.
152
+ * you pass to it and render the children if any of the user's matching permissions grants access. If none do,
153
+ * it renders the NoPermissions component. Whilst these checks happen it will render the loading component
154
+ * and should the check fail it will render the error component with a notification.
155
155
  */ const Protect = ({ permissions = [], children })=>{
156
156
  const userPermissions = Auth.useAuth('Protect', (state)=>state.permissions);
157
157
  const { toggleNotification } = Notifications.useNotification();
158
158
  const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler.useAPIErrorHandler();
159
159
  const matchingPermissions = (userPermissions || []).filter((permission)=>permissions.findIndex((perm)=>perm.action === permission.action && perm.subject === permission.subject) >= 0);
160
- const shouldCheckConditions = matchingPermissions.some((perm)=>Array.isArray(perm.conditions) && perm.conditions.length > 0);
160
+ const hasConditions = (permission)=>Array.isArray(permission.conditions) && permission.conditions.length > 0;
161
+ const shouldCheckConditions = matchingPermissions.some(hasConditions);
161
162
  const { isLoading, error, data } = auth.useCheckPermissionsQuery({
162
163
  permissions: matchingPermissions.map((perm)=>({
163
164
  action: perm.action,
@@ -185,7 +186,8 @@ const PageMain = ({ children, ...restProps })=>{
185
186
  return /*#__PURE__*/ jsxRuntime.jsx(Error, {});
186
187
  }
187
188
  const { data: permissionsData } = data || {};
188
- const canAccess = shouldCheckConditions && permissionsData ? !permissionsData.includes(false) : matchingPermissions.length > 0;
189
+ const hasUnconditionedPermission = matchingPermissions.some((permission)=>!hasConditions(permission));
190
+ const canAccess = hasUnconditionedPermission || (permissionsData ?? []).some((perm)=>perm === true);
189
191
  if (!canAccess) {
190
192
  return /*#__PURE__*/ jsxRuntime.jsx(NoPermissions, {});
191
193
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PageHelpers.js","sources":["../../../../../admin/src/components/PageHelpers.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n EmptyStateLayout,\n type EmptyStateLayoutProps,\n Flex,\n Loader,\n Main,\n MainProps,\n} from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { EmptyPermissions, EmptyDocuments } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { useAuth, Permission } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport { useCheckPermissionsQuery } from '../services/auth';\n\n/* -------------------------------------------------------------------------------------------------\n * Main\n * -----------------------------------------------------------------------------------------------*/\ninterface PageMainProps extends MainProps {\n children: React.ReactNode;\n}\n\nconst PageMain = ({ children, ...restProps }: PageMainProps) => {\n return <Main {...restProps}>{children}</Main>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Loading\n * -----------------------------------------------------------------------------------------------*/\ninterface LoadingProps {\n /**\n * @default 'Loading content.'\n */\n children?: React.ReactNode;\n}\n\n/**\n * @public\n * @description A loading component that should be rendered as the page\n * whilst you load the content for the aforementioned page.\n */\nconst Loading = ({ children = 'Loading content.' }: LoadingProps) => {\n return (\n <PageMain height=\"100dvh\" aria-busy={true}>\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Loader>{children}</Loader>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Error\n * -----------------------------------------------------------------------------------------------*/\ninterface ErrorProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * TODO: should we start passing our errors here so they're persisted on the screen?\n * This could follow something similar to how the global app error works...?\n */\n\n/**\n * @public\n * @description An error component that should be rendered as the page\n * when an error occurs.\n */\nconst Error = (props: ErrorProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <EmptyStateLayout\n icon={<WarningCircle width=\"16rem\" />}\n content={formatMessage({\n id: 'anErrorOccurred',\n defaultMessage: 'Whoops! Something went wrong. Please, try again.',\n })}\n {...props}\n />\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoPermissions\n * -----------------------------------------------------------------------------------------------*/\ninterface NoPermissionsProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when the user does not have the permissions to access the content.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoPermissions = (props: NoPermissionsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyPermissions width=\"16rem\" />}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-permissions',\n defaultMessage: \"You don't have the permissions to access that content\",\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoData\n * -----------------------------------------------------------------------------------------------*/\ninterface NoDataProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when there is no data available to display.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoData = (props: NoDataProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\" background=\"neutral100\">\n <Flex alignItems=\"center\" height=\"100%\" width=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyDocuments width=\"16rem\" />}\n action={props.action}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Protect\n * -----------------------------------------------------------------------------------------------*/\nexport interface ProtectProps {\n /**\n * The children to render if the user has the required permissions.\n * If providing a function, it will be called with an object containing\n * the permissions the user has based on the array you passed to the component.\n */\n children: React.ReactNode | ((args: { permissions: Permission[] }) => React.ReactNode);\n /**\n * The permissions the user needs to have to access the content.\n */\n permissions?: Array<Omit<Partial<Permission>, 'action'> & Pick<Permission, 'action'>>;\n}\n\n/**\n * @public\n * @description A wrapper component that should be used to protect a page. It will check the permissions\n * you pass to it and render the children if the user has the required permissions. If a user does not have ALL\n * the required permissions, it will redirect the user to the home page. Whilst these checks happen it will render\n * the loading component and should the check fail it will render the error component with a notification.\n */\nconst Protect = ({ permissions = [], children }: ProtectProps) => {\n const userPermissions = useAuth('Protect', (state) => state.permissions);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const matchingPermissions = (userPermissions || []).filter(\n (permission) =>\n permissions.findIndex(\n (perm) => perm.action === permission.action && perm.subject === permission.subject\n ) >= 0\n );\n\n const shouldCheckConditions = matchingPermissions.some(\n (perm) => Array.isArray(perm.conditions) && perm.conditions.length > 0\n );\n\n const { isLoading, error, data } = useCheckPermissionsQuery(\n {\n permissions: matchingPermissions.map((perm) => ({\n action: perm.action,\n subject: perm.subject,\n })),\n },\n {\n skip: !shouldCheckConditions,\n }\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n if (isLoading) {\n return <Loading />;\n }\n\n if (error) {\n return <Error />;\n }\n\n const { data: permissionsData } = data || {};\n\n const canAccess =\n shouldCheckConditions && permissionsData\n ? !permissionsData.includes(false)\n : matchingPermissions.length > 0;\n\n if (!canAccess) {\n return <NoPermissions />;\n }\n\n return (\n <>\n {typeof children === 'function' ? children({ permissions: matchingPermissions }) : children}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Title\n * -----------------------------------------------------------------------------------------------*/\nexport interface TitleProps {\n children: string;\n}\n\n/**\n * @public\n * @description This component takes the children (must be a string) and sets\n * it as the title of the html.\n */\nconst Title = ({ children: title }: TitleProps) => {\n React.useEffect(() => {\n document.title = `${title} | Strapi`;\n }, [title]);\n\n return null;\n};\n\nconst Page = {\n Error,\n Loading,\n NoPermissions,\n Protect,\n NoData,\n Main: PageMain,\n Title,\n};\n\nexport { Page };\nexport type { ErrorProps, LoadingProps, NoPermissionsProps, PageMainProps as MainProps };\n"],"names":["PageMain","children","restProps","_jsx","Main","Loading","height","aria-busy","Flex","alignItems","justifyContent","Loader","Error","props","formatMessage","useIntl","EmptyStateLayout","icon","WarningCircle","width","content","id","defaultMessage","NoPermissions","Box","minWidth","EmptyPermissions","NoData","background","EmptyDocuments","action","Protect","permissions","userPermissions","useAuth","state","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","matchingPermissions","filter","permission","findIndex","perm","subject","shouldCheckConditions","some","Array","isArray","conditions","length","isLoading","error","data","useCheckPermissionsQuery","map","skip","React","useEffect","type","message","permissionsData","canAccess","includes","_Fragment","Title","title","document","Page"],"mappings":"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"}
1
+ {"version":3,"file":"PageHelpers.js","sources":["../../../../../admin/src/components/PageHelpers.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n EmptyStateLayout,\n type EmptyStateLayoutProps,\n Flex,\n Loader,\n Main,\n MainProps,\n} from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { EmptyPermissions, EmptyDocuments } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { useAuth, Permission } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport { useCheckPermissionsQuery } from '../services/auth';\n\n/* -------------------------------------------------------------------------------------------------\n * Main\n * -----------------------------------------------------------------------------------------------*/\ninterface PageMainProps extends MainProps {\n children: React.ReactNode;\n}\n\nconst PageMain = ({ children, ...restProps }: PageMainProps) => {\n return <Main {...restProps}>{children}</Main>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Loading\n * -----------------------------------------------------------------------------------------------*/\ninterface LoadingProps {\n /**\n * @default 'Loading content.'\n */\n children?: React.ReactNode;\n}\n\n/**\n * @public\n * @description A loading component that should be rendered as the page\n * whilst you load the content for the aforementioned page.\n */\nconst Loading = ({ children = 'Loading content.' }: LoadingProps) => {\n return (\n <PageMain height=\"100dvh\" aria-busy={true}>\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Loader>{children}</Loader>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Error\n * -----------------------------------------------------------------------------------------------*/\ninterface ErrorProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * TODO: should we start passing our errors here so they're persisted on the screen?\n * This could follow something similar to how the global app error works...?\n */\n\n/**\n * @public\n * @description An error component that should be rendered as the page\n * when an error occurs.\n */\nconst Error = (props: ErrorProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <EmptyStateLayout\n icon={<WarningCircle width=\"16rem\" />}\n content={formatMessage({\n id: 'anErrorOccurred',\n defaultMessage: 'Whoops! Something went wrong. Please, try again.',\n })}\n {...props}\n />\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoPermissions\n * -----------------------------------------------------------------------------------------------*/\ninterface NoPermissionsProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when the user does not have the permissions to access the content.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoPermissions = (props: NoPermissionsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyPermissions width=\"16rem\" />}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-permissions',\n defaultMessage: \"You don't have the permissions to access that content\",\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoData\n * -----------------------------------------------------------------------------------------------*/\ninterface NoDataProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when there is no data available to display.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoData = (props: NoDataProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\" background=\"neutral100\">\n <Flex alignItems=\"center\" height=\"100%\" width=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyDocuments width=\"16rem\" />}\n action={props.action}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Protect\n * -----------------------------------------------------------------------------------------------*/\nexport interface ProtectProps {\n /**\n * The children to render if the user has the required permissions.\n * If providing a function, it will be called with an object containing\n * the permissions the user has based on the array you passed to the component.\n */\n children: React.ReactNode | ((args: { permissions: Permission[] }) => React.ReactNode);\n /**\n * The permissions the user needs to have to access the content.\n */\n permissions?: Array<Omit<Partial<Permission>, 'action'> & Pick<Permission, 'action'>>;\n}\n\n/**\n * @public\n * @description A wrapper component that should be used to protect a page. It will check the permissions\n * you pass to it and render the children if any of the user's matching permissions grants access. If none do,\n * it renders the NoPermissions component. Whilst these checks happen it will render the loading component\n * and should the check fail it will render the error component with a notification.\n */\nconst Protect = ({ permissions = [], children }: ProtectProps) => {\n const userPermissions = useAuth('Protect', (state) => state.permissions);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const matchingPermissions = (userPermissions || []).filter(\n (permission) =>\n permissions.findIndex(\n (perm) => perm.action === permission.action && perm.subject === permission.subject\n ) >= 0\n );\n\n const hasConditions = (permission: Permission) =>\n Array.isArray(permission.conditions) && permission.conditions.length > 0;\n\n const shouldCheckConditions = matchingPermissions.some(hasConditions);\n\n const { isLoading, error, data } = useCheckPermissionsQuery(\n {\n permissions: matchingPermissions.map((perm) => ({\n action: perm.action,\n subject: perm.subject,\n })),\n },\n {\n skip: !shouldCheckConditions,\n }\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n if (isLoading) {\n return <Loading />;\n }\n\n if (error) {\n return <Error />;\n }\n\n const { data: permissionsData } = data || {};\n\n const hasUnconditionedPermission = matchingPermissions.some(\n (permission) => !hasConditions(permission)\n );\n\n const canAccess =\n hasUnconditionedPermission || (permissionsData ?? []).some((perm) => perm === true);\n\n if (!canAccess) {\n return <NoPermissions />;\n }\n\n return (\n <>\n {typeof children === 'function' ? children({ permissions: matchingPermissions }) : children}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Title\n * -----------------------------------------------------------------------------------------------*/\nexport interface TitleProps {\n children: string;\n}\n\n/**\n * @public\n * @description This component takes the children (must be a string) and sets\n * it as the title of the html.\n */\nconst Title = ({ children: title }: TitleProps) => {\n React.useEffect(() => {\n document.title = `${title} | Strapi`;\n }, [title]);\n\n return null;\n};\n\nconst Page = {\n Error,\n Loading,\n NoPermissions,\n Protect,\n NoData,\n Main: PageMain,\n Title,\n};\n\nexport { Page };\nexport type { ErrorProps, LoadingProps, NoPermissionsProps, PageMainProps as MainProps };\n"],"names":["PageMain","children","restProps","_jsx","Main","Loading","height","aria-busy","Flex","alignItems","justifyContent","Loader","Error","props","formatMessage","useIntl","EmptyStateLayout","icon","WarningCircle","width","content","id","defaultMessage","NoPermissions","Box","minWidth","EmptyPermissions","NoData","background","EmptyDocuments","action","Protect","permissions","userPermissions","useAuth","state","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","matchingPermissions","filter","permission","findIndex","perm","subject","hasConditions","Array","isArray","conditions","length","shouldCheckConditions","some","isLoading","error","data","useCheckPermissionsQuery","map","skip","React","useEffect","type","message","permissionsData","hasUnconditionedPermission","canAccess","_Fragment","Title","title","document","Page"],"mappings":"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"}
@@ -127,15 +127,16 @@ const PageMain = ({ children, ...restProps })=>{
127
127
  /**
128
128
  * @public
129
129
  * @description A wrapper component that should be used to protect a page. It will check the permissions
130
- * you pass to it and render the children if the user has the required permissions. If a user does not have ALL
131
- * the required permissions, it will redirect the user to the home page. Whilst these checks happen it will render
132
- * the loading component and should the check fail it will render the error component with a notification.
130
+ * you pass to it and render the children if any of the user's matching permissions grants access. If none do,
131
+ * it renders the NoPermissions component. Whilst these checks happen it will render the loading component
132
+ * and should the check fail it will render the error component with a notification.
133
133
  */ const Protect = ({ permissions = [], children })=>{
134
134
  const userPermissions = useAuth('Protect', (state)=>state.permissions);
135
135
  const { toggleNotification } = useNotification();
136
136
  const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
137
137
  const matchingPermissions = (userPermissions || []).filter((permission)=>permissions.findIndex((perm)=>perm.action === permission.action && perm.subject === permission.subject) >= 0);
138
- const shouldCheckConditions = matchingPermissions.some((perm)=>Array.isArray(perm.conditions) && perm.conditions.length > 0);
138
+ const hasConditions = (permission)=>Array.isArray(permission.conditions) && permission.conditions.length > 0;
139
+ const shouldCheckConditions = matchingPermissions.some(hasConditions);
139
140
  const { isLoading, error, data } = useCheckPermissionsQuery({
140
141
  permissions: matchingPermissions.map((perm)=>({
141
142
  action: perm.action,
@@ -163,7 +164,8 @@ const PageMain = ({ children, ...restProps })=>{
163
164
  return /*#__PURE__*/ jsx(Error, {});
164
165
  }
165
166
  const { data: permissionsData } = data || {};
166
- const canAccess = shouldCheckConditions && permissionsData ? !permissionsData.includes(false) : matchingPermissions.length > 0;
167
+ const hasUnconditionedPermission = matchingPermissions.some((permission)=>!hasConditions(permission));
168
+ const canAccess = hasUnconditionedPermission || (permissionsData ?? []).some((perm)=>perm === true);
167
169
  if (!canAccess) {
168
170
  return /*#__PURE__*/ jsx(NoPermissions, {});
169
171
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PageHelpers.mjs","sources":["../../../../../admin/src/components/PageHelpers.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n EmptyStateLayout,\n type EmptyStateLayoutProps,\n Flex,\n Loader,\n Main,\n MainProps,\n} from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { EmptyPermissions, EmptyDocuments } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { useAuth, Permission } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport { useCheckPermissionsQuery } from '../services/auth';\n\n/* -------------------------------------------------------------------------------------------------\n * Main\n * -----------------------------------------------------------------------------------------------*/\ninterface PageMainProps extends MainProps {\n children: React.ReactNode;\n}\n\nconst PageMain = ({ children, ...restProps }: PageMainProps) => {\n return <Main {...restProps}>{children}</Main>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Loading\n * -----------------------------------------------------------------------------------------------*/\ninterface LoadingProps {\n /**\n * @default 'Loading content.'\n */\n children?: React.ReactNode;\n}\n\n/**\n * @public\n * @description A loading component that should be rendered as the page\n * whilst you load the content for the aforementioned page.\n */\nconst Loading = ({ children = 'Loading content.' }: LoadingProps) => {\n return (\n <PageMain height=\"100dvh\" aria-busy={true}>\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Loader>{children}</Loader>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Error\n * -----------------------------------------------------------------------------------------------*/\ninterface ErrorProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * TODO: should we start passing our errors here so they're persisted on the screen?\n * This could follow something similar to how the global app error works...?\n */\n\n/**\n * @public\n * @description An error component that should be rendered as the page\n * when an error occurs.\n */\nconst Error = (props: ErrorProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <EmptyStateLayout\n icon={<WarningCircle width=\"16rem\" />}\n content={formatMessage({\n id: 'anErrorOccurred',\n defaultMessage: 'Whoops! Something went wrong. Please, try again.',\n })}\n {...props}\n />\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoPermissions\n * -----------------------------------------------------------------------------------------------*/\ninterface NoPermissionsProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when the user does not have the permissions to access the content.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoPermissions = (props: NoPermissionsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyPermissions width=\"16rem\" />}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-permissions',\n defaultMessage: \"You don't have the permissions to access that content\",\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoData\n * -----------------------------------------------------------------------------------------------*/\ninterface NoDataProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when there is no data available to display.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoData = (props: NoDataProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\" background=\"neutral100\">\n <Flex alignItems=\"center\" height=\"100%\" width=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyDocuments width=\"16rem\" />}\n action={props.action}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Protect\n * -----------------------------------------------------------------------------------------------*/\nexport interface ProtectProps {\n /**\n * The children to render if the user has the required permissions.\n * If providing a function, it will be called with an object containing\n * the permissions the user has based on the array you passed to the component.\n */\n children: React.ReactNode | ((args: { permissions: Permission[] }) => React.ReactNode);\n /**\n * The permissions the user needs to have to access the content.\n */\n permissions?: Array<Omit<Partial<Permission>, 'action'> & Pick<Permission, 'action'>>;\n}\n\n/**\n * @public\n * @description A wrapper component that should be used to protect a page. It will check the permissions\n * you pass to it and render the children if the user has the required permissions. If a user does not have ALL\n * the required permissions, it will redirect the user to the home page. Whilst these checks happen it will render\n * the loading component and should the check fail it will render the error component with a notification.\n */\nconst Protect = ({ permissions = [], children }: ProtectProps) => {\n const userPermissions = useAuth('Protect', (state) => state.permissions);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const matchingPermissions = (userPermissions || []).filter(\n (permission) =>\n permissions.findIndex(\n (perm) => perm.action === permission.action && perm.subject === permission.subject\n ) >= 0\n );\n\n const shouldCheckConditions = matchingPermissions.some(\n (perm) => Array.isArray(perm.conditions) && perm.conditions.length > 0\n );\n\n const { isLoading, error, data } = useCheckPermissionsQuery(\n {\n permissions: matchingPermissions.map((perm) => ({\n action: perm.action,\n subject: perm.subject,\n })),\n },\n {\n skip: !shouldCheckConditions,\n }\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n if (isLoading) {\n return <Loading />;\n }\n\n if (error) {\n return <Error />;\n }\n\n const { data: permissionsData } = data || {};\n\n const canAccess =\n shouldCheckConditions && permissionsData\n ? !permissionsData.includes(false)\n : matchingPermissions.length > 0;\n\n if (!canAccess) {\n return <NoPermissions />;\n }\n\n return (\n <>\n {typeof children === 'function' ? children({ permissions: matchingPermissions }) : children}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Title\n * -----------------------------------------------------------------------------------------------*/\nexport interface TitleProps {\n children: string;\n}\n\n/**\n * @public\n * @description This component takes the children (must be a string) and sets\n * it as the title of the html.\n */\nconst Title = ({ children: title }: TitleProps) => {\n React.useEffect(() => {\n document.title = `${title} | Strapi`;\n }, [title]);\n\n return null;\n};\n\nconst Page = {\n Error,\n Loading,\n NoPermissions,\n Protect,\n NoData,\n Main: PageMain,\n Title,\n};\n\nexport { Page };\nexport type { ErrorProps, LoadingProps, NoPermissionsProps, PageMainProps as MainProps };\n"],"names":["PageMain","children","restProps","_jsx","Main","Loading","height","aria-busy","Flex","alignItems","justifyContent","Loader","Error","props","formatMessage","useIntl","EmptyStateLayout","icon","WarningCircle","width","content","id","defaultMessage","NoPermissions","Box","minWidth","EmptyPermissions","NoData","background","EmptyDocuments","action","Protect","permissions","userPermissions","useAuth","state","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","matchingPermissions","filter","permission","findIndex","perm","subject","shouldCheckConditions","some","Array","isArray","conditions","length","isLoading","error","data","useCheckPermissionsQuery","map","skip","React","useEffect","type","message","permissionsData","canAccess","includes","_Fragment","Title","title","document","Page"],"mappings":"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"}
1
+ {"version":3,"file":"PageHelpers.mjs","sources":["../../../../../admin/src/components/PageHelpers.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n EmptyStateLayout,\n type EmptyStateLayoutProps,\n Flex,\n Loader,\n Main,\n MainProps,\n} from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { EmptyPermissions, EmptyDocuments } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { useAuth, Permission } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport { useCheckPermissionsQuery } from '../services/auth';\n\n/* -------------------------------------------------------------------------------------------------\n * Main\n * -----------------------------------------------------------------------------------------------*/\ninterface PageMainProps extends MainProps {\n children: React.ReactNode;\n}\n\nconst PageMain = ({ children, ...restProps }: PageMainProps) => {\n return <Main {...restProps}>{children}</Main>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Loading\n * -----------------------------------------------------------------------------------------------*/\ninterface LoadingProps {\n /**\n * @default 'Loading content.'\n */\n children?: React.ReactNode;\n}\n\n/**\n * @public\n * @description A loading component that should be rendered as the page\n * whilst you load the content for the aforementioned page.\n */\nconst Loading = ({ children = 'Loading content.' }: LoadingProps) => {\n return (\n <PageMain height=\"100dvh\" aria-busy={true}>\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Loader>{children}</Loader>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Error\n * -----------------------------------------------------------------------------------------------*/\ninterface ErrorProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * TODO: should we start passing our errors here so they're persisted on the screen?\n * This could follow something similar to how the global app error works...?\n */\n\n/**\n * @public\n * @description An error component that should be rendered as the page\n * when an error occurs.\n */\nconst Error = (props: ErrorProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <EmptyStateLayout\n icon={<WarningCircle width=\"16rem\" />}\n content={formatMessage({\n id: 'anErrorOccurred',\n defaultMessage: 'Whoops! Something went wrong. Please, try again.',\n })}\n {...props}\n />\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoPermissions\n * -----------------------------------------------------------------------------------------------*/\ninterface NoPermissionsProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when the user does not have the permissions to access the content.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoPermissions = (props: NoPermissionsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyPermissions width=\"16rem\" />}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-permissions',\n defaultMessage: \"You don't have the permissions to access that content\",\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoData\n * -----------------------------------------------------------------------------------------------*/\ninterface NoDataProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when there is no data available to display.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoData = (props: NoDataProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\" background=\"neutral100\">\n <Flex alignItems=\"center\" height=\"100%\" width=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyDocuments width=\"16rem\" />}\n action={props.action}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Protect\n * -----------------------------------------------------------------------------------------------*/\nexport interface ProtectProps {\n /**\n * The children to render if the user has the required permissions.\n * If providing a function, it will be called with an object containing\n * the permissions the user has based on the array you passed to the component.\n */\n children: React.ReactNode | ((args: { permissions: Permission[] }) => React.ReactNode);\n /**\n * The permissions the user needs to have to access the content.\n */\n permissions?: Array<Omit<Partial<Permission>, 'action'> & Pick<Permission, 'action'>>;\n}\n\n/**\n * @public\n * @description A wrapper component that should be used to protect a page. It will check the permissions\n * you pass to it and render the children if any of the user's matching permissions grants access. If none do,\n * it renders the NoPermissions component. Whilst these checks happen it will render the loading component\n * and should the check fail it will render the error component with a notification.\n */\nconst Protect = ({ permissions = [], children }: ProtectProps) => {\n const userPermissions = useAuth('Protect', (state) => state.permissions);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const matchingPermissions = (userPermissions || []).filter(\n (permission) =>\n permissions.findIndex(\n (perm) => perm.action === permission.action && perm.subject === permission.subject\n ) >= 0\n );\n\n const hasConditions = (permission: Permission) =>\n Array.isArray(permission.conditions) && permission.conditions.length > 0;\n\n const shouldCheckConditions = matchingPermissions.some(hasConditions);\n\n const { isLoading, error, data } = useCheckPermissionsQuery(\n {\n permissions: matchingPermissions.map((perm) => ({\n action: perm.action,\n subject: perm.subject,\n })),\n },\n {\n skip: !shouldCheckConditions,\n }\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n if (isLoading) {\n return <Loading />;\n }\n\n if (error) {\n return <Error />;\n }\n\n const { data: permissionsData } = data || {};\n\n const hasUnconditionedPermission = matchingPermissions.some(\n (permission) => !hasConditions(permission)\n );\n\n const canAccess =\n hasUnconditionedPermission || (permissionsData ?? []).some((perm) => perm === true);\n\n if (!canAccess) {\n return <NoPermissions />;\n }\n\n return (\n <>\n {typeof children === 'function' ? children({ permissions: matchingPermissions }) : children}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Title\n * -----------------------------------------------------------------------------------------------*/\nexport interface TitleProps {\n children: string;\n}\n\n/**\n * @public\n * @description This component takes the children (must be a string) and sets\n * it as the title of the html.\n */\nconst Title = ({ children: title }: TitleProps) => {\n React.useEffect(() => {\n document.title = `${title} | Strapi`;\n }, [title]);\n\n return null;\n};\n\nconst Page = {\n Error,\n Loading,\n NoPermissions,\n Protect,\n NoData,\n Main: PageMain,\n Title,\n};\n\nexport { Page };\nexport type { ErrorProps, LoadingProps, NoPermissionsProps, PageMainProps as MainProps };\n"],"names":["PageMain","children","restProps","_jsx","Main","Loading","height","aria-busy","Flex","alignItems","justifyContent","Loader","Error","props","formatMessage","useIntl","EmptyStateLayout","icon","WarningCircle","width","content","id","defaultMessage","NoPermissions","Box","minWidth","EmptyPermissions","NoData","background","EmptyDocuments","action","Protect","permissions","userPermissions","useAuth","state","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","matchingPermissions","filter","permission","findIndex","perm","subject","hasConditions","Array","isArray","conditions","length","shouldCheckConditions","some","isLoading","error","data","useCheckPermissionsQuery","map","skip","React","useEffect","type","message","permissionsData","hasUnconditionedPermission","canAccess","_Fragment","Title","title","document","Page"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Widgets.js","sources":["../../../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import { useAuth, useTracking } from '@strapi/admin/strapi-admin';\nimport { Avatar, Badge, Box, Flex, LinkButton, Typography } from '@strapi/design-system';\nimport {\n Cloud,\n CloudUpload,\n Earth,\n Images,\n User,\n Key,\n Files,\n Layout,\n Graph,\n Webhooks,\n} from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useGetCountDocumentsQuery, useGetKeyStatisticsQuery } from '../services/homepage';\nimport { getDisplayName, getInitials } from '../utils/users';\n\nimport { Widget } from './WidgetHelpers';\n\n/* -------------------------------------------------------------------------------------------------\n * ProfileWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DisplayNameTypography = styled(Typography)`\n font-size: 2.4rem;\n`;\n\nconst ProfileWidget = () => {\n const user = useAuth('User', (state) => state.user);\n const userDisplayName = getDisplayName(user);\n const initials = getInitials(user);\n\n return (\n <Flex direction=\"column\" gap={3} height=\"100%\" justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials} />\n {userDisplayName && (\n <DisplayNameTypography fontWeight=\"bold\" textTransform=\"none\" textAlign=\"center\">\n {userDisplayName}\n </DisplayNameTypography>\n )}\n {user?.email && (\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {user?.email}\n </Typography>\n )}\n {user?.roles?.length && (\n <Flex marginTop={2} gap={1} wrap=\"wrap\">\n {user?.roles?.map((role) => <Badge key={role.id}>{role.name}</Badge>)}\n </Flex>\n )}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Key Statistics\n * -----------------------------------------------------------------------------------------------*/\nconst Grid = styled(Box)`\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 0;\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n overflow: hidden;\n`;\n\nconst GridCell = styled(Box)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-right: 1px solid ${({ theme }) => theme.colors.neutral200};\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n &:nth-child(2n) {\n border-right: none;\n }\n &:nth-last-child(-n + 2) {\n border-bottom: none;\n }\n`;\n\nconst formatNumber = ({ locale, number }: { locale: string; number: number }) => {\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(number);\n};\n\nconst LinkCell = styled(Link)`\n text-decoration: none;\n padding: ${({ theme }) => theme.spaces[3]};\n`;\n\nconst KeyStatisticsWidget = () => {\n const { trackUsage } = useTracking();\n const { formatMessage, locale } = useIntl();\n const { data: countDocuments, isLoading: isLoadingCountDocuments } = useGetCountDocumentsQuery();\n const { data: countKeyStatistics, isLoading: isLoadingKeyStatistics } =\n useGetKeyStatisticsQuery();\n\n if (isLoadingKeyStatistics || isLoadingCountDocuments) {\n return <Widget.Loading />;\n }\n\n if (!countKeyStatistics || !countDocuments) {\n return <Widget.Error />;\n }\n\n const keyStatisticsList = {\n entries: {\n label: {\n id: 'widget.key-statistics.list.entries',\n defaultMessage: 'Entries',\n },\n icon: {\n component: <Files />,\n background: 'primary100',\n color: 'primary600',\n },\n link: '/content-manager',\n },\n assets: {\n label: {\n id: 'widget.key-statistics.list.assets',\n defaultMessage: 'Assets',\n },\n icon: {\n component: <Images />,\n background: 'warning100',\n color: 'warning600',\n },\n link: '/plugins/upload',\n },\n contentTypes: {\n label: {\n id: 'widget.key-statistics.list.contentTypes',\n defaultMessage: 'Content-Types',\n },\n icon: {\n component: <Layout />,\n background: 'secondary100',\n color: 'secondary600',\n },\n link: '/plugins/content-type-builder',\n },\n components: {\n label: {\n id: 'widget.key-statistics.list.components',\n defaultMessage: 'Components',\n },\n icon: {\n component: <Graph />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/plugins/content-type-builder',\n },\n locales: {\n label: {\n id: 'widget.key-statistics.list.locales',\n defaultMessage: 'Locales',\n },\n icon: {\n component: <Earth />,\n background: 'success100',\n color: 'success600',\n },\n link: '/settings/internationalization',\n },\n admins: {\n label: {\n id: 'widget.key-statistics.list.admins',\n defaultMessage: 'Admins',\n },\n icon: {\n component: <User />,\n background: 'danger100',\n color: 'danger600',\n },\n link: '/settings/users?pageSize=10&page=1&sort=firstname',\n },\n webhooks: {\n label: {\n id: 'widget.key-statistics.list.webhooks',\n defaultMessage: 'Webhooks',\n },\n icon: {\n component: <Webhooks />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/settings/webhooks',\n },\n apiTokens: {\n label: {\n id: 'widget.key-statistics.list.apiTokens',\n defaultMessage: 'API Tokens',\n },\n icon: {\n component: <Key />,\n background: 'neutral100',\n color: 'neutral600',\n },\n link: '/settings/api-tokens?sort=name:ASC',\n },\n };\n\n const { draft, published, modified } = countDocuments ?? {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n const totalCountEntries = draft + published + modified;\n\n return (\n <Grid>\n {Object.entries(keyStatisticsList).map(([key, item]) => {\n const value = countKeyStatistics?.[key as keyof typeof countKeyStatistics];\n return (\n value !== null && (\n <GridCell\n as={LinkCell}\n to={item.link}\n key={`key-statistics-${key}`}\n data-testid={`stat-${key}`}\n onClick={() => trackUsage('didOpenKeyStatisticsWidgetLink', { itemKey: key })}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Flex\n padding={2}\n borderRadius={1}\n background={item.icon.background}\n color={item.icon.color}\n >\n {item.icon.component}\n </Flex>\n <Flex direction=\"column\" alignItems=\"flex-start\">\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral500\">\n {formatMessage(item.label)}\n </Typography>\n <Typography variant=\"omega\" fontWeight=\"bold\" textColor=\"neutral800\">\n {formatNumber({\n locale,\n number: key === 'entries' ? totalCountEntries : value,\n })}\n </Typography>\n </Flex>\n </Flex>\n </GridCell>\n )\n );\n })}\n </Grid>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DeployNowWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DeployNowWidget = () => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex direction=\"column\" gap={4} height=\"100%\" alignItems=\"center\" justifyContent=\"center\">\n <CloudUpload width=\"3.2rem\" height=\"3.2rem\" />\n <Flex direction=\"column\" gap={2}>\n <Typography variant=\"beta\" textAlign=\"center\">\n {formatMessage({\n id: 'HomePage.widget.deploy-now.title',\n defaultMessage: 'Ready to go live ?',\n })}\n </Typography>\n <Typography variant=\"omega\" textColor=\"neutral600\" textAlign=\"center\">\n {formatMessage({\n id: 'HomePage.widget.deploy-now.description',\n defaultMessage: 'Deploy with Strapi Cloud',\n })}\n </Typography>\n </Flex>\n <LinkButton href=\"https://cloud.strapi.io/login\" isExternal size=\"L\" startIcon={<Cloud />}>\n {formatMessage({ id: 'HomePage.widget.deploy-now.button', defaultMessage: 'Deploy Now' })}\n </LinkButton>\n </Flex>\n );\n};\n\nexport { ProfileWidget, KeyStatisticsWidget, DeployNowWidget };\n"],"names":["DisplayNameTypography","styled","Typography","ProfileWidget","user","useAuth","state","userDisplayName","getDisplayName","initials","getInitials","_jsxs","Flex","direction","gap","height","justifyContent","_jsx","Avatar","Item","delayMs","fallback","fontWeight","textTransform","textAlign","email","variant","textColor","roles","length","marginTop","wrap","map","role","Badge","name","id","Grid","Box","theme","colors","neutral200","borderRadius","GridCell","formatNumber","locale","number","Intl","NumberFormat","notation","maximumFractionDigits","format","LinkCell","Link","spaces","KeyStatisticsWidget","trackUsage","useTracking","formatMessage","useIntl","data","countDocuments","isLoading","isLoadingCountDocuments","useGetCountDocumentsQuery","countKeyStatistics","isLoadingKeyStatistics","useGetKeyStatisticsQuery","Widget","Loading","Error","keyStatisticsList","entries","label","defaultMessage","icon","component","Files","background","color","link","assets","Images","contentTypes","Layout","components","Graph","locales","Earth","admins","User","webhooks","Webhooks","apiTokens","Key","draft","published","modified","totalCountEntries","Object","key","item","value","as","to","data-testid","onClick","itemKey","alignItems","padding","DeployNowWidget","CloudUpload","width","LinkButton","href","isExternal","size","startIcon","Cloud"],"mappings":";;;;;;;;;;;;;AAuBA;;AAEkG,qGAElG,MAAMA,qBAAAA,GAAwBC,uBAAAA,CAAOC,uBAAAA,CAAW;;AAEhD,CAAC;AAED,MAAMC,aAAAA,GAAgB,IAAA;AACpB,IAAA,MAAMC,OAAOC,mBAAAA,CAAQ,MAAA,EAAQ,CAACC,KAAAA,GAAUA,MAAMF,IAAI,CAAA;AAClD,IAAA,MAAMG,kBAAkBC,oBAAAA,CAAeJ,IAAAA,CAAAA;AACvC,IAAA,MAAMK,WAAWC,iBAAAA,CAAYN,IAAAA,CAAAA;AAE7B,IAAA,qBACEO,eAAA,CAACC,iBAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,GAAAA,EAAK,CAAA;QAAGC,MAAAA,EAAO,MAAA;QAAOC,cAAAA,EAAe,QAAA;;AAC5D,0BAAAC,cAAA,CAACC,oBAAOC,IAAI,EAAA;gBAACC,OAAAA,EAAS,CAAA;gBAAGC,QAAAA,EAAUZ;;AAClCF,YAAAA,eAAAA,kBACCU,cAAA,CAACjB,qBAAAA,EAAAA;gBAAsBsB,UAAAA,EAAW,MAAA;gBAAOC,aAAAA,EAAc,MAAA;gBAAOC,SAAAA,EAAU,QAAA;AACrEjB,gBAAAA,QAAAA,EAAAA;;AAGJH,YAAAA,IAAAA,EAAMqB,uBACLR,cAAA,CAACf,uBAAAA,EAAAA;gBAAWwB,OAAAA,EAAQ,OAAA;gBAAQC,SAAAA,EAAU,YAAA;0BACnCvB,IAAAA,EAAMqB;;YAGVrB,IAAAA,EAAMwB,KAAAA,EAAOC,wBACZZ,cAAA,CAACL,iBAAAA,EAAAA;gBAAKkB,SAAAA,EAAW,CAAA;gBAAGhB,GAAAA,EAAK,CAAA;gBAAGiB,IAAAA,EAAK,MAAA;AAC9B3B,gBAAAA,QAAAA,EAAAA,IAAAA,EAAMwB,KAAAA,EAAOI,GAAAA,CAAI,CAACC,IAAAA,iBAAShB,cAAA,CAACiB,kBAAAA,EAAAA;AAAqBD,wBAAAA,QAAAA,EAAAA,IAAAA,CAAKE;AAAfF,qBAAAA,EAAAA,IAAAA,CAAKG,EAAE,CAAA;;;;AAKzD;AAEA;;AAEkG,qGAClG,MAAMC,IAAAA,GAAOpC,uBAAAA,CAAOqC,gBAAAA,CAAI;;;;oBAIJ,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;AAC5C,iBAAA,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMG,YAAY,CAAC;;AAErD,CAAC;AAED,MAAMC,QAAAA,GAAW1C,uBAAAA,CAAOqC,gBAAAA,CAAI;2BACD,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;0BAC1C,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;;;;;;;;;;;AAWnE,CAAC;AAED,MAAMG,eAAe,CAAC,EAAEC,MAAM,EAAEC,MAAM,EAAsC,GAAA;AAC1E,IAAA,OAAO,IAAIC,IAAAA,CAAKC,YAAY,CAACH,MAAAA,EAAQ;QACnCI,QAAAA,EAAU,SAAA;QACVC,qBAAAA,EAAuB;AACzB,KAAA,CAAA,CAAGC,MAAM,CAACL,MAAAA,CAAAA;AACZ,CAAA;AAEA,MAAMM,QAAAA,GAAWnD,uBAAAA,CAAOoD,mBAAAA,CAAK;;WAElB,EAAE,CAAC,EAAEd,KAAK,EAAE,GAAKA,KAAAA,CAAMe,MAAM,CAAC,CAAA,CAAE,CAAC;AAC5C,CAAC;AAED,MAAMC,mBAAAA,GAAsB,IAAA;IAC1B,MAAM,EAAEC,UAAU,EAAE,GAAGC,uBAAAA,EAAAA;AACvB,IAAA,MAAM,EAAEC,aAAa,EAAEb,MAAM,EAAE,GAAGc,iBAAAA,EAAAA;AAClC,IAAA,MAAM,EAAEC,IAAAA,EAAMC,cAAc,EAAEC,SAAAA,EAAWC,uBAAuB,EAAE,GAAGC,kCAAAA,EAAAA;AACrE,IAAA,MAAM,EAAEJ,IAAAA,EAAMK,kBAAkB,EAAEH,SAAAA,EAAWI,sBAAsB,EAAE,GACnEC,iCAAAA,EAAAA;AAEF,IAAA,IAAID,0BAA0BH,uBAAAA,EAAyB;QACrD,qBAAO9C,cAAA,CAACmD,qBAAOC,OAAO,EAAA,EAAA,CAAA;AACxB,IAAA;IAEA,IAAI,CAACJ,kBAAAA,IAAsB,CAACJ,cAAAA,EAAgB;QAC1C,qBAAO5C,cAAA,CAACmD,qBAAOE,KAAK,EAAA,EAAA,CAAA;AACtB,IAAA;AAEA,IAAA,MAAMC,iBAAAA,GAAoB;QACxBC,OAAAA,EAAS;YACPC,KAAAA,EAAO;gBACLrC,EAAAA,EAAI,oCAAA;gBACJsC,cAAAA,EAAgB;AAClB,aAAA;YACAC,IAAAA,EAAM;AACJC,gBAAAA,SAAAA,gBAAW3D,cAAA,CAAC4D,WAAAA,EAAAA,EAAAA,CAAAA;gBACZC,UAAAA,EAAY,YAAA;gBACZC,KAAAA,EAAO;AACT,aAAA;YACAC,IAAAA,EAAM;AACR,SAAA;QACAC,MAAAA,EAAQ;YACNR,KAAAA,EAAO;gBACLrC,EAAAA,EAAI,mCAAA;gBACJsC,cAAAA,EAAgB;AAClB,aAAA;YACAC,IAAAA,EAAM;AACJC,gBAAAA,SAAAA,gBAAW3D,cAAA,CAACiE,YAAAA,EAAAA,EAAAA,CAAAA;gBACZJ,UAAAA,EAAY,YAAA;gBACZC,KAAAA,EAAO;AACT,aAAA;YACAC,IAAAA,EAAM;AACR,SAAA;QACAG,YAAAA,EAAc;YACZV,KAAAA,EAAO;gBACLrC,EAAAA,EAAI,yCAAA;gBACJsC,cAAAA,EAAgB;AAClB,aAAA;YACAC,IAAAA,EAAM;AACJC,gBAAAA,SAAAA,gBAAW3D,cAAA,CAACmE,YAAAA,EAAAA,EAAAA,CAAAA;gBACZN,UAAAA,EAAY,cAAA;gBACZC,KAAAA,EAAO;AACT,aAAA;YACAC,IAAAA,EAAM;AACR,SAAA;QACAK,UAAAA,EAAY;YACVZ,KAAAA,EAAO;gBACLrC,EAAAA,EAAI,uCAAA;gBACJsC,cAAAA,EAAgB;AAClB,aAAA;YACAC,IAAAA,EAAM;AACJC,gBAAAA,SAAAA,gBAAW3D,cAAA,CAACqE,WAAAA,EAAAA,EAAAA,CAAAA;gBACZR,UAAAA,EAAY,gBAAA;gBACZC,KAAAA,EAAO;AACT,aAAA;YACAC,IAAAA,EAAM;AACR,SAAA;QACAO,OAAAA,EAAS;YACPd,KAAAA,EAAO;gBACLrC,EAAAA,EAAI,oCAAA;gBACJsC,cAAAA,EAAgB;AAClB,aAAA;YACAC,IAAAA,EAAM;AACJC,gBAAAA,SAAAA,gBAAW3D,cAAA,CAACuE,WAAAA,EAAAA,EAAAA,CAAAA;gBACZV,UAAAA,EAAY,YAAA;gBACZC,KAAAA,EAAO;AACT,aAAA;YACAC,IAAAA,EAAM;AACR,SAAA;QACAS,MAAAA,EAAQ;YACNhB,KAAAA,EAAO;gBACLrC,EAAAA,EAAI,mCAAA;gBACJsC,cAAAA,EAAgB;AAClB,aAAA;YACAC,IAAAA,EAAM;AACJC,gBAAAA,SAAAA,gBAAW3D,cAAA,CAACyE,UAAAA,EAAAA,EAAAA,CAAAA;gBACZZ,UAAAA,EAAY,WAAA;gBACZC,KAAAA,EAAO;AACT,aAAA;YACAC,IAAAA,EAAM;AACR,SAAA;QACAW,QAAAA,EAAU;YACRlB,KAAAA,EAAO;gBACLrC,EAAAA,EAAI,qCAAA;gBACJsC,cAAAA,EAAgB;AAClB,aAAA;YACAC,IAAAA,EAAM;AACJC,gBAAAA,SAAAA,gBAAW3D,cAAA,CAAC2E,cAAAA,EAAAA,EAAAA,CAAAA;gBACZd,UAAAA,EAAY,gBAAA;gBACZC,KAAAA,EAAO;AACT,aAAA;YACAC,IAAAA,EAAM;AACR,SAAA;QACAa,SAAAA,EAAW;YACTpB,KAAAA,EAAO;gBACLrC,EAAAA,EAAI,sCAAA;gBACJsC,cAAAA,EAAgB;AAClB,aAAA;YACAC,IAAAA,EAAM;AACJC,gBAAAA,SAAAA,gBAAW3D,cAAA,CAAC6E,SAAAA,EAAAA,EAAAA,CAAAA;gBACZhB,UAAAA,EAAY,YAAA;gBACZC,KAAAA,EAAO;AACT,aAAA;YACAC,IAAAA,EAAM;AACR;AACF,KAAA;IAEA,MAAM,EAAEe,KAAK,EAAEC,SAAS,EAAEC,QAAQ,EAAE,GAAGpC,cAAAA,IAAkB;QACvDkC,KAAAA,EAAO,CAAA;QACPC,SAAAA,EAAW,CAAA;QACXC,QAAAA,EAAU;AACZ,KAAA;IAEA,MAAMC,iBAAAA,GAAoBH,QAAQC,SAAAA,GAAYC,QAAAA;AAE9C,IAAA,qBACEhF,cAAA,CAACoB,IAAAA,EAAAA;kBACE8D,MAAAA,CAAO3B,OAAO,CAACD,iBAAAA,CAAAA,CAAmBvC,GAAG,CAAC,CAAC,CAACoE,KAAKC,IAAAA,CAAK,GAAA;YACjD,MAAMC,KAAAA,GAAQrC,kBAAAA,GAAqBmC,GAAAA,CAAuC;YAC1E,OACEE,KAAAA,KAAU,sBACRrF,cAAA,CAAC0B,QAAAA,EAAAA;gBACC4D,EAAAA,EAAInD,QAAAA;AACJoD,gBAAAA,EAAAA,EAAIH,KAAKrB,IAAI;gBAEbyB,aAAAA,EAAa,CAAC,KAAK,EAAEL,GAAAA,CAAAA,CAAK;gBAC1BM,OAAAA,EAAS,IAAMlD,WAAW,gCAAA,EAAkC;wBAAEmD,OAAAA,EAASP;AAAI,qBAAA,CAAA;AAE3E,gBAAA,QAAA,gBAAAzF,eAAA,CAACC,iBAAAA,EAAAA;oBAAKgG,UAAAA,EAAW,QAAA;oBAAS9F,GAAAA,EAAK,CAAA;;sCAC7BG,cAAA,CAACL,iBAAAA,EAAAA;4BACCiG,OAAAA,EAAS,CAAA;4BACTnE,YAAAA,EAAc,CAAA;4BACdoC,UAAAA,EAAYuB,IAAAA,CAAK1B,IAAI,CAACG,UAAU;4BAChCC,KAAAA,EAAOsB,IAAAA,CAAK1B,IAAI,CAACI,KAAK;sCAErBsB,IAAAA,CAAK1B,IAAI,CAACC;;sCAEbjE,eAAA,CAACC,iBAAAA,EAAAA;4BAAKC,SAAAA,EAAU,QAAA;4BAAS+F,UAAAA,EAAW,YAAA;;8CAClC3F,cAAA,CAACf,uBAAAA,EAAAA;oCAAWwB,OAAAA,EAAQ,IAAA;oCAAKJ,UAAAA,EAAW,MAAA;oCAAOK,SAAAA,EAAU,YAAA;AAClD+B,oCAAAA,QAAAA,EAAAA,aAAAA,CAAc2C,KAAK5B,KAAK;;8CAE3BxD,cAAA,CAACf,uBAAAA,EAAAA;oCAAWwB,OAAAA,EAAQ,OAAA;oCAAQJ,UAAAA,EAAW,MAAA;oCAAOK,SAAAA,EAAU,YAAA;8CACrDiB,YAAAA,CAAa;AACZC,wCAAAA,MAAAA;wCACAC,MAAAA,EAAQsD,GAAAA,KAAQ,YAAYF,iBAAAA,GAAoBI;AAClD,qCAAA;;;;;;eArBD,CAAC,eAAe,EAAEF,GAAAA,CAAAA,CAAK,CAAA;AA4BpC,QAAA,CAAA;;AAGN;AAEA;;AAEkG,2GAE5FU,eAAAA,GAAkB,IAAA;IACtB,MAAM,EAAEpD,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAE1B,IAAA,qBACEhD,eAAA,CAACC,iBAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,GAAAA,EAAK,CAAA;QAAGC,MAAAA,EAAO,MAAA;QAAO6F,UAAAA,EAAW,QAAA;QAAS5F,cAAAA,EAAe,QAAA;;0BAChFC,cAAA,CAAC8F,iBAAAA,EAAAA;gBAAYC,KAAAA,EAAM,QAAA;gBAASjG,MAAAA,EAAO;;0BACnCJ,eAAA,CAACC,iBAAAA,EAAAA;gBAAKC,SAAAA,EAAU,QAAA;gBAASC,GAAAA,EAAK,CAAA;;kCAC5BG,cAAA,CAACf,uBAAAA,EAAAA;wBAAWwB,OAAAA,EAAQ,MAAA;wBAAOF,SAAAA,EAAU,QAAA;kCAClCkC,aAAAA,CAAc;4BACbtB,EAAAA,EAAI,kCAAA;4BACJsC,cAAAA,EAAgB;AAClB,yBAAA;;kCAEFzD,cAAA,CAACf,uBAAAA,EAAAA;wBAAWwB,OAAAA,EAAQ,OAAA;wBAAQC,SAAAA,EAAU,YAAA;wBAAaH,SAAAA,EAAU,QAAA;kCAC1DkC,aAAAA,CAAc;4BACbtB,EAAAA,EAAI,wCAAA;4BACJsC,cAAAA,EAAgB;AAClB,yBAAA;;;;0BAGJzD,cAAA,CAACgG,uBAAAA,EAAAA;gBAAWC,IAAAA,EAAK,+BAAA;gBAAgCC,UAAU,EAAA,IAAA;gBAACC,IAAAA,EAAK,GAAA;AAAIC,gBAAAA,SAAAA,gBAAWpG,cAAA,CAACqG,WAAAA,EAAAA,EAAAA,CAAAA;0BAC9E5D,aAAAA,CAAc;oBAAEtB,EAAAA,EAAI,mCAAA;oBAAqCsC,cAAAA,EAAgB;AAAa,iBAAA;;;;AAI/F;;;;;;"}
1
+ {"version":3,"file":"Widgets.js","sources":["../../../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import { useAuth, useTracking } from '@strapi/admin/strapi-admin';\nimport { Avatar, Badge, Box, Flex, LinkButton, Typography } from '@strapi/design-system';\nimport {\n Cloud,\n CloudUpload,\n Earth,\n Images,\n User,\n Key,\n Files,\n Layout,\n Graph,\n Webhooks,\n} from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useGetCountDocumentsQuery, useGetKeyStatisticsQuery } from '../services/homepage';\nimport { getDisplayName, getInitials } from '../utils/users';\n\nimport { Widget } from './WidgetHelpers';\n\n/* -------------------------------------------------------------------------------------------------\n * ProfileWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DisplayNameTypography = styled(Typography)`\n font-size: 2.4rem;\n`;\n\nconst ProfileWidget = () => {\n const user = useAuth('User', (state) => state.user);\n const userDisplayName = getDisplayName(user);\n const initials = getInitials(user);\n\n return (\n <Flex direction=\"column\" gap={3} height=\"100%\" justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials} />\n {userDisplayName && (\n <DisplayNameTypography fontWeight=\"bold\" textTransform=\"none\" textAlign=\"center\">\n {userDisplayName}\n </DisplayNameTypography>\n )}\n {user?.email && (\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {user?.email}\n </Typography>\n )}\n {user?.roles?.length && (\n <Flex marginTop={2} gap={1} wrap=\"wrap\">\n {user?.roles?.map((role) => (\n <Badge key={role.id}>{role.name}</Badge>\n ))}\n </Flex>\n )}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Key Statistics\n * -----------------------------------------------------------------------------------------------*/\nconst Grid = styled(Box)`\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 0;\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n overflow: hidden;\n`;\n\nconst GridCell = styled(Box)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-right: 1px solid ${({ theme }) => theme.colors.neutral200};\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n &:nth-child(2n) {\n border-right: none;\n }\n &:nth-last-child(-n + 2) {\n border-bottom: none;\n }\n`;\n\nconst formatNumber = ({ locale, number }: { locale: string; number: number }) => {\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(number);\n};\n\nconst LinkCell = styled(Link)`\n text-decoration: none;\n padding: ${({ theme }) => theme.spaces[3]};\n`;\n\nconst KeyStatisticsWidget = () => {\n const { trackUsage } = useTracking();\n const { formatMessage, locale } = useIntl();\n const { data: countDocuments, isLoading: isLoadingCountDocuments } = useGetCountDocumentsQuery();\n const { data: countKeyStatistics, isLoading: isLoadingKeyStatistics } =\n useGetKeyStatisticsQuery();\n\n if (isLoadingKeyStatistics || isLoadingCountDocuments) {\n return <Widget.Loading />;\n }\n\n if (!countKeyStatistics || !countDocuments) {\n return <Widget.Error />;\n }\n\n const keyStatisticsList = {\n entries: {\n label: {\n id: 'widget.key-statistics.list.entries',\n defaultMessage: 'Entries',\n },\n icon: {\n component: <Files />,\n background: 'primary100',\n color: 'primary600',\n },\n link: '/content-manager',\n },\n assets: {\n label: {\n id: 'widget.key-statistics.list.assets',\n defaultMessage: 'Assets',\n },\n icon: {\n component: <Images />,\n background: 'warning100',\n color: 'warning600',\n },\n link: '/plugins/upload',\n },\n contentTypes: {\n label: {\n id: 'widget.key-statistics.list.contentTypes',\n defaultMessage: 'Content-Types',\n },\n icon: {\n component: <Layout />,\n background: 'secondary100',\n color: 'secondary600',\n },\n link: '/plugins/content-type-builder',\n },\n components: {\n label: {\n id: 'widget.key-statistics.list.components',\n defaultMessage: 'Components',\n },\n icon: {\n component: <Graph />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/plugins/content-type-builder',\n },\n locales: {\n label: {\n id: 'widget.key-statistics.list.locales',\n defaultMessage: 'Locales',\n },\n icon: {\n component: <Earth />,\n background: 'success100',\n color: 'success600',\n },\n link: '/settings/internationalization',\n },\n admins: {\n label: {\n id: 'widget.key-statistics.list.admins',\n defaultMessage: 'Admins',\n },\n icon: {\n component: <User />,\n background: 'danger100',\n color: 'danger600',\n },\n link: '/settings/users?pageSize=10&page=1&sort=firstname',\n },\n webhooks: {\n label: {\n id: 'widget.key-statistics.list.webhooks',\n defaultMessage: 'Webhooks',\n },\n icon: {\n component: <Webhooks />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/settings/webhooks',\n },\n apiTokens: {\n label: {\n id: 'widget.key-statistics.list.apiTokens',\n defaultMessage: 'API Tokens',\n },\n icon: {\n component: <Key />,\n background: 'neutral100',\n color: 'neutral600',\n },\n link: '/settings/api-tokens?sort=name:ASC',\n },\n };\n\n const { draft, published, modified } = countDocuments ?? {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n const totalCountEntries = draft + published + modified;\n\n return (\n <Grid>\n {Object.entries(keyStatisticsList).map(([key, item]) => {\n const value = countKeyStatistics?.[key as keyof typeof countKeyStatistics];\n return (\n value !== null && (\n <GridCell\n as={LinkCell}\n to={item.link}\n key={`key-statistics-${key}`}\n data-testid={`stat-${key}`}\n onClick={() => trackUsage('didOpenKeyStatisticsWidgetLink', { itemKey: key })}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Flex\n padding={2}\n borderRadius={1}\n background={item.icon.background}\n color={item.icon.color}\n >\n {item.icon.component}\n </Flex>\n <Flex direction=\"column\" alignItems=\"flex-start\">\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral500\">\n {formatMessage(item.label)}\n </Typography>\n <Typography variant=\"omega\" fontWeight=\"bold\" textColor=\"neutral800\">\n {formatNumber({\n locale,\n number: key === 'entries' ? totalCountEntries : value,\n })}\n </Typography>\n </Flex>\n </Flex>\n </GridCell>\n )\n );\n })}\n </Grid>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DeployNowWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DeployNowWidget = () => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex direction=\"column\" gap={4} height=\"100%\" alignItems=\"center\" justifyContent=\"center\">\n <CloudUpload width=\"3.2rem\" height=\"3.2rem\" />\n <Flex direction=\"column\" gap={2}>\n <Typography variant=\"beta\" textAlign=\"center\">\n {formatMessage({\n id: 'HomePage.widget.deploy-now.title',\n defaultMessage: 'Ready to go live ?',\n })}\n </Typography>\n <Typography variant=\"omega\" textColor=\"neutral600\" textAlign=\"center\">\n {formatMessage({\n id: 'HomePage.widget.deploy-now.description',\n defaultMessage: 'Deploy with Strapi Cloud',\n })}\n </Typography>\n </Flex>\n <LinkButton href=\"https://cloud.strapi.io/login\" isExternal size=\"L\" startIcon={<Cloud />}>\n {formatMessage({ id: 'HomePage.widget.deploy-now.button', defaultMessage: 'Deploy Now' })}\n </LinkButton>\n </Flex>\n );\n};\n\nexport { ProfileWidget, KeyStatisticsWidget, DeployNowWidget };\n"],"names":["DisplayNameTypography","styled","Typography","ProfileWidget","user","useAuth","state","userDisplayName","getDisplayName","initials","getInitials","_jsxs","Flex","direction","gap","height","justifyContent","_jsx","Avatar","Item","delayMs","fallback","fontWeight","textTransform","textAlign","email","variant","textColor","roles","length","marginTop","wrap","map","role","Badge","name","id","Grid","Box","theme","colors","neutral200","borderRadius","GridCell","formatNumber","locale","number","Intl","NumberFormat","notation","maximumFractionDigits","format","LinkCell","Link","spaces","KeyStatisticsWidget","trackUsage","useTracking","formatMessage","useIntl","data","countDocuments","isLoading","isLoadingCountDocuments","useGetCountDocumentsQuery","countKeyStatistics","isLoadingKeyStatistics","useGetKeyStatisticsQuery","Widget","Loading","Error","keyStatisticsList","entries","label","defaultMessage","icon","component","Files","background","color","link","assets","Images","contentTypes","Layout","components","Graph","locales","Earth","admins","User","webhooks","Webhooks","apiTokens","Key","draft","published","modified","totalCountEntries","Object","key","item","value","as","to","data-testid","onClick","itemKey","alignItems","padding","DeployNowWidget","CloudUpload","width","LinkButton","href","isExternal","size","startIcon","Cloud"],"mappings":"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"}