{"version":3,"file":"ListPage-lNb4WrLP.mjs","sources":["../../admin/src/pages/Settings/pages/Roles/components/RoleRow.tsx","../../admin/src/pages/Settings/pages/Roles/ListPage.tsx"],"sourcesContent":["import { Box, Flex, IconButton, IconButtonProps, Td, Tr, Typography } from '@strapi/design-system';\nimport { onRowClick, pxToRem, stopPropagation } from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\n\nimport type { AdminRole } from '../../../../../hooks/useAdminRoles';\n\ninterface RoleRowProps extends Pick<AdminRole, 'id' | 'name' | 'description' | 'usersCount'> {\n  icons: Array<Required<Pick<IconButtonProps, 'icon' | 'label' | 'onClick'>>>;\n  rowIndex: number;\n  canUpdate?: boolean;\n}\n\nconst RoleRow = ({\n  id,\n  name,\n  description,\n  usersCount,\n  icons,\n  rowIndex,\n  canUpdate,\n}: RoleRowProps) => {\n  const { formatMessage } = useIntl();\n  const [, editObject] = icons;\n\n  const usersCountText = formatMessage(\n    {\n      id: `Roles.RoleRow.user-count`,\n      defaultMessage: '{number, plural, =0 {#  user} one {#  user} other {# users}}',\n    },\n    { number: usersCount }\n  );\n\n  return (\n    <Tr\n      aria-rowindex={rowIndex}\n      key={id}\n      {...(canUpdate\n        ? onRowClick({\n            // @ts-expect-error – the prop uses `HTMLButtonElement` but we just specify `HTMLElement`\n            fn: editObject.onClick,\n          })\n        : {})}\n    >\n      <Td maxWidth={pxToRem(130)}>\n        <Typography ellipsis textColor=\"neutral800\">\n          {name}\n        </Typography>\n      </Td>\n      <Td maxWidth={pxToRem(250)}>\n        <Typography ellipsis textColor=\"neutral800\">\n          {description}\n        </Typography>\n      </Td>\n      <Td>\n        <Typography textColor=\"neutral800\">{usersCountText}</Typography>\n      </Td>\n      <Td>\n        <Flex justifyContent=\"flex-end\" {...stopPropagation}>\n          {icons.map((icon, i) =>\n            icon ? (\n              <Box key={icon.label} paddingLeft={i === 0 ? 0 : 1}>\n                <IconButton\n                  onClick={icon.onClick}\n                  label={icon.label}\n                  borderWidth={0}\n                  icon={icon.icon}\n                />\n              </Box>\n            ) : null\n          )}\n        </Flex>\n      </Td>\n    </Tr>\n  );\n};\n\nexport { RoleRow };\nexport type { RoleRowProps };\n","import * as React from 'react';\n\nimport {\n  ActionLayout,\n  Button,\n  ContentLayout,\n  HeaderLayout,\n  Main,\n  Table,\n  Tbody,\n  TFooter,\n  Th,\n  Thead,\n  Tr,\n  Typography,\n  VisuallyHidden,\n} from '@strapi/design-system';\nimport {\n  ConfirmDialog,\n  getFetchClient,\n  LoadingIndicatorPage,\n  SearchURLQuery,\n  SettingsPageTitle,\n  useAPIErrorHandler,\n  useFocusWhenNavigate,\n  useQueryParams,\n  useNotification,\n  useRBAC,\n  CheckPagePermissions,\n} from '@strapi/helper-plugin';\nimport { Duplicate, Pencil, Plus, Trash } from '@strapi/icons';\nimport { AxiosError } from 'axios';\nimport produce from 'immer';\nimport { useIntl } from 'react-intl';\nimport { useHistory } from 'react-router-dom';\n\nimport { useTypedSelector } from '../../../../core/store/hooks';\nimport { useAdminRoles, AdminRole } from '../../../../hooks/useAdminRoles';\nimport { selectAdminPermissions } from '../../../../selectors';\n\nimport { RoleRow, RoleRowProps } from './components/RoleRow';\n\nconst ListPage = () => {\n  const { formatMessage } = useIntl();\n  useFocusWhenNavigate();\n  const permissions = useTypedSelector(selectAdminPermissions);\n  const { formatAPIError } = useAPIErrorHandler();\n  const toggleNotification = useNotification();\n  const [isWarningDeleteAllOpened, setIsWarningDeleteAllOpenend] = React.useState(false);\n  const [{ query }] = useQueryParams<{ _q?: string }>();\n  const {\n    isLoading: isLoadingForPermissions,\n    allowedActions: { canCreate, canDelete, canRead, canUpdate },\n  } = useRBAC(permissions.settings?.roles);\n\n  const { roles, refetch: refetchRoles } = useAdminRoles(\n    { filters: query?._q ? { name: { $containsi: query._q } } : undefined },\n    {\n      refetchOnMountOrArgChange: true,\n      skip: isLoadingForPermissions || !canRead,\n    }\n  );\n\n  const { push } = useHistory();\n  const [{ showModalConfirmButtonLoading, roleToDelete }, dispatch] = React.useReducer(\n    reducer,\n    initialState\n  );\n\n  const { post } = getFetchClient();\n\n  const handleDeleteData = async () => {\n    try {\n      dispatch({\n        type: 'ON_REMOVE_ROLES',\n      });\n\n      await post('/admin/roles/batch-delete', {\n        ids: [roleToDelete],\n      });\n\n      await refetchRoles();\n\n      dispatch({\n        type: 'RESET_DATA_TO_DELETE',\n      });\n    } catch (error) {\n      if (error instanceof AxiosError) {\n        toggleNotification({\n          type: 'warning',\n          message: formatAPIError(error),\n        });\n      }\n    }\n    handleToggleModal();\n  };\n\n  const handleNewRoleClick = () => push('/settings/roles/new');\n\n  const handleToggleModal = () => setIsWarningDeleteAllOpenend((prev) => !prev);\n\n  const handleClickDelete = (role: AdminRole) => (e: React.MouseEvent<HTMLButtonElement>) => {\n    e.preventDefault();\n    e.stopPropagation();\n\n    if (role.usersCount) {\n      toggleNotification({\n        type: 'info',\n        message: { id: 'Roles.ListPage.notification.delete-not-allowed' },\n      });\n    } else {\n      dispatch({\n        type: 'SET_ROLE_TO_DELETE',\n        id: role.id,\n      });\n\n      handleToggleModal();\n    }\n  };\n\n  const handleClickDuplicate = (role: AdminRole) => (e: React.MouseEvent<HTMLButtonElement>) => {\n    e.preventDefault();\n    e.stopPropagation();\n\n    push(`/settings/roles/duplicate/${role.id}`);\n  };\n\n  const rowCount = roles.length + 1;\n  const colCount = 6;\n\n  if (isLoadingForPermissions) {\n    return (\n      <Main>\n        <LoadingIndicatorPage />\n      </Main>\n    );\n  }\n\n  return (\n    <Main>\n      <SettingsPageTitle name=\"Roles\" />\n      <HeaderLayout\n        primaryAction={\n          canCreate ? (\n            <Button onClick={handleNewRoleClick} startIcon={<Plus />} size=\"S\">\n              {formatMessage({\n                id: 'Settings.roles.list.button.add',\n                defaultMessage: 'Add new role',\n              })}\n            </Button>\n          ) : null\n        }\n        title={formatMessage({\n          id: 'global.roles',\n          defaultMessage: 'roles',\n        })}\n        subtitle={formatMessage({\n          id: 'Settings.roles.list.description',\n          defaultMessage: 'List of roles',\n        })}\n        as=\"h2\"\n      />\n      {canRead && (\n        <ActionLayout\n          startActions={\n            <SearchURLQuery\n              label={formatMessage(\n                { id: 'app.component.search.label', defaultMessage: 'Search for {target}' },\n                {\n                  target: formatMessage({\n                    id: 'global.roles',\n                    defaultMessage: 'roles',\n                  }),\n                }\n              )}\n            />\n          }\n        />\n      )}\n      {canRead && (\n        <ContentLayout>\n          <Table\n            colCount={colCount}\n            rowCount={rowCount}\n            footer={\n              canCreate ? (\n                <TFooter onClick={handleNewRoleClick} icon={<Plus />}>\n                  {formatMessage({\n                    id: 'Settings.roles.list.button.add',\n                    defaultMessage: 'Add new role',\n                  })}\n                </TFooter>\n              ) : null\n            }\n          >\n            <Thead>\n              <Tr aria-rowindex={1}>\n                <Th>\n                  <Typography variant=\"sigma\" textColor=\"neutral600\">\n                    {formatMessage({\n                      id: 'global.name',\n                      defaultMessage: 'Name',\n                    })}\n                  </Typography>\n                </Th>\n                <Th>\n                  <Typography variant=\"sigma\" textColor=\"neutral600\">\n                    {formatMessage({\n                      id: 'global.description',\n                      defaultMessage: 'Description',\n                    })}\n                  </Typography>\n                </Th>\n                <Th>\n                  <Typography variant=\"sigma\" textColor=\"neutral600\">\n                    {formatMessage({\n                      id: 'global.users',\n                      defaultMessage: 'Users',\n                    })}\n                  </Typography>\n                </Th>\n                <Th>\n                  <VisuallyHidden>\n                    {formatMessage({\n                      id: 'global.actions',\n                      defaultMessage: 'Actions',\n                    })}\n                  </VisuallyHidden>\n                </Th>\n              </Tr>\n            </Thead>\n            <Tbody>\n              {roles?.map((role, index) => (\n                <RoleRow\n                  key={role.id}\n                  id={role.id}\n                  name={role.name}\n                  description={role.description}\n                  usersCount={role.usersCount}\n                  icons={\n                    [\n                      canCreate &&\n                        ({\n                          onClick: handleClickDuplicate(role),\n                          label: formatMessage({\n                            id: 'app.utils.duplicate',\n                            defaultMessage: 'Duplicate',\n                          }),\n                          icon: <Duplicate />,\n                        } satisfies RoleRowProps['icons'][number]),\n                      canUpdate &&\n                        ({\n                          onClick: () => push(`/settings/roles/${role.id}`),\n                          label: formatMessage({ id: 'app.utils.edit', defaultMessage: 'Edit' }),\n                          icon: <Pencil />,\n                        } satisfies RoleRowProps['icons'][number]),\n                      canDelete &&\n                        ({\n                          onClick: handleClickDelete(role),\n                          label: formatMessage({ id: 'global.delete', defaultMessage: 'Delete' }),\n                          icon: <Trash />,\n                        } satisfies RoleRowProps['icons'][number]),\n                    ].filter(Boolean) as RoleRowProps['icons']\n                  }\n                  rowIndex={index + 2}\n                  canUpdate={canUpdate}\n                />\n              ))}\n            </Tbody>\n          </Table>\n        </ContentLayout>\n      )}\n      <ConfirmDialog\n        isOpen={isWarningDeleteAllOpened}\n        onConfirm={handleDeleteData}\n        isConfirmButtonLoading={showModalConfirmButtonLoading}\n        onToggleDialog={handleToggleModal}\n      />\n    </Main>\n  );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Reducer\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * TODO: do we actually need this reducer? It's not doing a lot...\n */\n\ninterface State {\n  roleToDelete: null | AdminRole['id'];\n  showModalConfirmButtonLoading: boolean;\n  shouldRefetchData: boolean;\n}\n\nconst initialState = {\n  roleToDelete: null,\n  showModalConfirmButtonLoading: false,\n  shouldRefetchData: false,\n} satisfies State;\n\ninterface SetRoleToDeleteAction extends Pick<AdminRole, 'id'> {\n  type: 'SET_ROLE_TO_DELETE';\n}\n\ninterface ResetDataToDeleteAction {\n  type: 'RESET_DATA_TO_DELETE';\n}\n\ninterface OnRemoveRolesAction {\n  type: 'ON_REMOVE_ROLES';\n}\n\ninterface OnRemoveRolesSucceededAction {\n  type: 'ON_REMOVE_ROLES_SUCCEEDED';\n}\n\ntype Action =\n  | SetRoleToDeleteAction\n  | ResetDataToDeleteAction\n  | OnRemoveRolesAction\n  | OnRemoveRolesSucceededAction;\n\nconst reducer = (state: State, action: Action) =>\n  produce(state, (draftState) => {\n    switch (action.type) {\n      case 'ON_REMOVE_ROLES': {\n        draftState.showModalConfirmButtonLoading = true;\n        break;\n      }\n      case 'ON_REMOVE_ROLES_SUCCEEDED': {\n        draftState.shouldRefetchData = true;\n        draftState.roleToDelete = null;\n        break;\n      }\n      case 'RESET_DATA_TO_DELETE': {\n        draftState.shouldRefetchData = false;\n        draftState.roleToDelete = null;\n        draftState.showModalConfirmButtonLoading = false;\n        break;\n      }\n      case 'SET_ROLE_TO_DELETE': {\n        draftState.roleToDelete = action.id;\n\n        break;\n      }\n      default:\n        return draftState;\n    }\n  });\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedListPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedListPage = () => {\n  const permissions = useTypedSelector(selectAdminPermissions);\n\n  return (\n    <CheckPagePermissions permissions={permissions.settings?.roles.main}>\n      <ListPage />\n    </CheckPagePermissions>\n  );\n};\n\nexport { ProtectedListPage, ListPage };\n"],"names":[],"mappings":"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"}