1
0
mirror of synced 2026-01-20 12:02:14 -05:00
Files
docs/src/github-apps/components/PermissionsList.tsx
Rachael Sewell 3cc4a10b44 Prog access data in rest reference docs (#49072)
Co-authored-by: Sarah Edwards <skedwards88@github.com>
Co-authored-by: Grace Park <gracepark@github.com>
2024-02-15 00:42:02 +00:00

157 lines
5.9 KiB
TypeScript

import { useRouter } from 'next/router'
import cx from 'classnames'
import { slug as githubSlug } from 'github-slugger'
import { CheckIcon, XIcon } from '@primer/octicons-react'
import { HeadingLink } from 'src/frame/components/article/HeadingLink'
import { useTranslation } from 'src/languages/components/useTranslation'
import { Link } from 'src/frame/components/Link'
import { MainContextT } from 'src/frame/components/context/MainContext'
import {
AutomatedPageContext,
AutomatedPageContextT,
} from 'src/automated-pipelines/components/AutomatedPageContext'
import { AutomatedPage } from 'src/automated-pipelines/components/AutomatedPage'
import { RestRedirect } from 'src/rest/components/RestRedirect'
import styles from 'src/github-apps/components/PermissionTable.module.scss'
const IAT_DOCS_REF =
'/apps/creating-github-apps/authenticating-with-a-github-app/authenticating-as-a-github-app-installation'
const UAT_DOCS_REF =
'/apps/creating-github-apps/authenticating-with-a-github-app/authenticating-with-a-github-app-on-behalf-of-a-user'
type PermissionOperationsT = {
slug: string
category: string
subcategory: string
verb: string
requestPath: string
access: 'admin' | 'write' | 'read'
'user-to-server': boolean
'server-to-server': boolean
'additional-permissions': []
}
export type PermissionT = {
displayTitle: string
resourceGroup: string
permissions: PermissionOperationsT[]
}
export type PermissionListT = Record<string, PermissionT>
type Props = {
items: PermissionListT
currentVersion: string
categoriesWithoutSubcategories: string[]
mainContext: MainContextT
automatedPageContext: AutomatedPageContextT
tokenTypes?: boolean
}
export function PermissionsList({
items,
currentVersion,
categoriesWithoutSubcategories,
automatedPageContext,
mainContext,
tokenTypes = false,
}: Props) {
const { locale } = useRouter()
const DEFAULT_VERSION = mainContext.nonEnterpriseDefaultVersion
const rootPath =
currentVersion === DEFAULT_VERSION ? `/${locale}` : `/${locale}/${currentVersion}`
// Translated strings
const { t } = useTranslation('rest')
const ENDPOINTS_TH = t('rest.overview.permissions.endpoints')
const ACCESS_TH = t('rest.overview.permissions.access')
const TOKENS_TH = t('rest.overview.permissions.tokens')
const ADDITIONAL_TH = t('rest.overview.permissions.additionalPermissions')
const UAT = t('rest.overview.permissions.uat')
const IAT = t('rest.overview.permissions.iat')
const content = Object.entries(items).map(([permissionName, permissionObject]) => {
const { displayTitle, permissions } = permissionObject
const adminPermissions = permissions.filter((permission) => permission.access === 'admin')
const writePermissions = permissions.filter((permission) => permission.access === 'write')
const readPermissions = permissions.filter((permission) => permission.access === 'read')
const sortedPermissions = [...adminPermissions, ...writePermissions, ...readPermissions]
return (
<div key={permissionName} className={cx(styles.parameterTable)}>
<HeadingLink as="h2" slug={githubSlug(displayTitle)}>
{displayTitle}
</HeadingLink>
<table>
<thead>
<tr>
<th className="text-left">{ENDPOINTS_TH}</th>
<th className="text-center">{ACCESS_TH}</th>
{tokenTypes ? <th className="text-center">{TOKENS_TH}</th> : null}
<th className="text-center">{ADDITIONAL_TH}</th>
</tr>
</thead>
<tbody>
{sortedPermissions.map((operation, index) => {
const { slug, verb, requestPath } = operation
const category = categoriesWithoutSubcategories.includes(operation.category)
? `${operation.category}`
: `${operation.category}/${operation.subcategory}`
const opPath = `${rootPath}/rest/${category}#${slug}`
const iat = operation['server-to-server'] ? (
<span className="label mt-2">
<Link href={`${rootPath}${IAT_DOCS_REF}`}>{IAT}</Link>
</span>
) : null
const uat = operation['user-to-server'] ? (
<span className="label no-underline">
<Link href={`${rootPath}${UAT_DOCS_REF}`}>{UAT}</Link>
</span>
) : null
const permissionsClass = operation['additional-permissions'].length
? ''
: 'text-center'
return (
<tr key={`${permissionName}-${operation.slug}-${index}`}>
<td>
<Link href={`${opPath}`}>
<span>{verb.toUpperCase()}</span> {`${requestPath}`}
</Link>
</td>
<td className="v-align-middle text-center">{operation.access}</td>
{tokenTypes ? (
<td className="v-align-middle text-center">
{uat}
<br />
{iat}
</td>
) : null}
<td className={permissionsClass}>
{operation['additional-permissions'] ? (
<Link href={opPath} title={t('screen_reader_text_checkmark_icon')}>
<CheckIcon aria-hidden="true" />
<span className="visually-hidden">
{t('screen_reader_text_checkmark_icon')}
</span>
</Link>
) : (
<XIcon />
)}
</td>
</tr>
)
})}
</tbody>
</table>
</div>
)
})
return (
<AutomatedPageContext.Provider value={automatedPageContext}>
<RestRedirect />
<AutomatedPage>{content}</AutomatedPage>
</AutomatedPageContext.Provider>
)
}