@sanity/dashboard 5.0.1 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +4 -50
  3. package/dist/index.d.ts +54 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +605 -0
  6. package/dist/index.js.map +1 -0
  7. package/package.json +37 -79
  8. package/lib/index.d.mts +0 -65
  9. package/lib/index.d.ts +0 -65
  10. package/lib/index.esm.js +0 -568
  11. package/lib/index.esm.js.map +0 -1
  12. package/lib/index.js +0 -564
  13. package/lib/index.js.map +0 -1
  14. package/lib/index.mjs +0 -568
  15. package/lib/index.mjs.map +0 -1
  16. package/sanity.json +0 -8
  17. package/src/components/DashboardLayout.tsx +0 -10
  18. package/src/components/DashboardWidgetContainer.tsx +0 -69
  19. package/src/components/NotFoundWidget.tsx +0 -30
  20. package/src/components/WidgetGroup.tsx +0 -106
  21. package/src/containers/Dashboard.tsx +0 -19
  22. package/src/containers/DashboardContext.tsx +0 -8
  23. package/src/containers/WidgetContainer.tsx +0 -21
  24. package/src/index.ts +0 -7
  25. package/src/plugin.tsx +0 -72
  26. package/src/types.ts +0 -21
  27. package/src/versionedClient.ts +0 -5
  28. package/src/widgets/projectInfo/ProjectInfo.tsx +0 -221
  29. package/src/widgets/projectInfo/index.ts +0 -10
  30. package/src/widgets/projectInfo/types.ts +0 -28
  31. package/src/widgets/projectUsers/ProjectUser.tsx +0 -45
  32. package/src/widgets/projectUsers/ProjectUsers.tsx +0 -148
  33. package/src/widgets/projectUsers/index.ts +0 -10
  34. package/src/widgets/sanityTutorials/SanityTutorials.tsx +0 -77
  35. package/src/widgets/sanityTutorials/Tutorial.tsx +0 -111
  36. package/src/widgets/sanityTutorials/dataAdapter.ts +0 -49
  37. package/src/widgets/sanityTutorials/index.ts +0 -10
  38. package/v2-incompatible.js +0 -11
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/components/DashboardWidgetContainer.tsx","../src/containers/DashboardContext.tsx","../src/containers/WidgetContainer.tsx","../src/versionedClient.ts","../src/widgets/projectInfo/ProjectInfo.tsx","../src/widgets/projectInfo/index.ts","../src/widgets/projectUsers/ProjectUser.tsx","../src/widgets/projectUsers/ProjectUsers.tsx","../src/widgets/projectUsers/index.ts","../src/widgets/sanityTutorials/dataAdapter.ts","../src/widgets/sanityTutorials/Tutorial.tsx","../src/widgets/sanityTutorials/SanityTutorials.tsx","../src/widgets/sanityTutorials/index.ts","../src/components/DashboardLayout.tsx","../src/components/WidgetGroup.tsx","../src/containers/Dashboard.tsx","../src/plugin.tsx"],"sourcesContent":["import {Card, Box, Heading} from '@sanity/ui'\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport React, {forwardRef} from 'react'\nimport {styled} from 'styled-components'\n\nconst Root = styled(Card)`\n display: flex;\n flex-direction: column;\n justify-content: stretch;\n height: 100%;\n box-sizing: border-box;\n position: relative;\n`\n\nconst Header = styled(Card)`\n position: sticky;\n top: 0;\n z-index: 2;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n`\n\nconst Footer = styled(Card)`\n position: sticky;\n overflow: hidden;\n bottom: 0;\n z-index: 2;\n border-bottom-right-radius: inherit;\n border-bottom-left-radius: inherit;\n margin-top: auto;\n`\n\nconst Content = styled(Box)`\n position: relative;\n z-index: 1;\n height: stretch;\n min-height: 21.5em;\n\n @media (min-width: ${({theme}) => getTheme_v2(theme).media[0]}px) {\n overflow-y: auto;\n outline: none;\n }\n`\n\ninterface DashboardWidgetProps {\n header?: string\n children: React.ReactNode\n footer?: React.ReactNode\n}\n\nexport const DashboardWidgetContainer = forwardRef(function DashboardWidgetContainer(\n props: DashboardWidgetProps,\n ref: React.Ref<HTMLDivElement>,\n) {\n const {header, children, footer} = props\n\n return (\n <Root radius={3} display=\"flex\" ref={ref}>\n {header && (\n <Header borderBottom paddingX={3} paddingY={4}>\n <Heading size={1} textOverflow=\"ellipsis\">\n {header}\n </Heading>\n </Header>\n )}\n {children && <Content>{children}</Content>}\n {footer && <Footer borderTop>{footer}</Footer>}\n </Root>\n )\n})\n","import {createContext, useContext} from 'react'\n\nimport {type DashboardConfig} from '../types'\n\nexport const DashboardContext = createContext<DashboardConfig>({widgets: []})\n\nexport function useDashboardConfig(): DashboardConfig {\n return useContext(DashboardContext)\n}\n","import {Card} from '@sanity/ui'\nimport {useMemo} from 'react'\n\nimport {type DashboardWidget} from '../types'\nimport {useDashboardConfig} from './DashboardContext'\n\nexport function WidgetContainer(props: DashboardWidget) {\n const config = useDashboardConfig()\n const layout = useMemo(\n () => ({\n ...props.layout,\n ...config.layout,\n }),\n [props.layout, config.layout],\n )\n\n const Widget = props.component\n\n return (\n <Card shadow={1} data-width={layout.width} data-height={layout.height}>\n <Widget />\n </Card>\n )\n}\n","import {useClient} from 'sanity'\n\nexport function useVersionedClient() {\n return useClient({apiVersion: '2024-08-01'})\n}\n","import {Box, Card, Stack, Heading, Grid, Label, Text, Code, Button} from '@sanity/ui'\nimport {useEffect, useMemo, useState} from 'react'\nimport {type Subscription} from 'rxjs'\n\nimport {DashboardWidgetContainer} from '../../components/DashboardWidgetContainer'\nimport {WidgetContainer} from '../../containers/WidgetContainer'\nimport {type DashboardWidget} from '../../types'\nimport {useVersionedClient} from '../../versionedClient'\nimport {type App, type ProjectInfoProps, type ProjectData, type UserApplication} from './types'\n\nfunction isUrl(url?: string) {\n return url && /^https?:\\/\\//.test(url)\n}\n\nfunction getGraphQLUrl(projectId: string, dataset: string) {\n return `https://${projectId}.api.sanity.io/v1/graphql/${dataset}/default`\n}\n\nfunction getGroqUrl(projectId: string, dataset: string) {\n return `https://${projectId}.api.sanity.io/v1/groq/${dataset}`\n}\n\nfunction getManageUrl(projectId: string) {\n return `https://manage.sanity.io/projects/${projectId}`\n}\n\nconst NO_EXPERIMENTAL: DashboardWidget[] = []\nconst NO_DATA: ProjectData[] = []\n\nexport function ProjectInfo(props: ProjectInfoProps) {\n const {__experimental_before = NO_EXPERIMENTAL, data = NO_DATA} = props\n const [studioApps, setStudioApps] = useState<UserApplication[] | {error: string} | undefined>()\n const [graphQLApi, setGraphQLApi] = useState<string | {error: string} | undefined>()\n const versionedClient = useVersionedClient()\n const {projectId = 'unknown', dataset = 'unknown'} = versionedClient.config()\n\n useEffect(() => {\n const subscriptions: Subscription[] = []\n\n subscriptions.push(\n versionedClient.observable\n .request<UserApplication[]>({uri: '/user-applications', tag: 'dashboard.project-info'})\n .subscribe({\n next: (result) => setStudioApps(result.filter((app) => app.type === 'studio')),\n error: (error) => {\n console.error('Error while resolving user applications', error)\n setStudioApps({\n error: 'Something went wrong while resolving user applications. See console.',\n })\n },\n }),\n )\n\n // ping assumed graphql endpoint\n subscriptions.push(\n versionedClient.observable\n .request({\n method: 'HEAD',\n uri: `/graphql/${dataset}/default`,\n tag: 'dashboard.project-info.graphql-api',\n })\n .subscribe({\n next: () => setGraphQLApi(getGraphQLUrl(projectId, dataset)),\n error: (error) => {\n if (error.statusCode === 404) {\n setGraphQLApi(undefined)\n } else {\n console.error('Error while looking for graphQLApi', error)\n setGraphQLApi({\n error: 'Something went wrong while looking up graphQLApi. See console.',\n })\n }\n },\n }),\n )\n\n return () => {\n subscriptions.forEach((s) => s.unsubscribe())\n }\n }, [dataset, projectId, versionedClient, setGraphQLApi])\n\n const assembleTableRows = useMemo(() => {\n let result: App[] = [\n {\n title: 'Sanity project',\n rows: [\n {title: 'Project ID', value: projectId},\n {title: 'Dataset', value: dataset},\n ],\n },\n ]\n\n const apps: App[] = data.filter((item) => item.category === 'apps')\n\n // Handle studios\n ;(Array.isArray(studioApps) ? studioApps : []).forEach((app) => {\n apps.push({\n title: app.title || 'Studio',\n value: app.urlType === 'internal' ? `https://${app.appHost}.sanity.studio` : app.appHost,\n })\n })\n\n if (apps.length > 0) {\n result = result.concat([{title: 'Apps', rows: apps}])\n }\n\n // Handle APIs\n result = result.concat(\n [\n {\n title: 'APIs',\n rows: [\n {title: 'GROQ', value: getGroqUrl(projectId, dataset)},\n {\n title: 'GraphQL',\n value: (typeof graphQLApi === 'object' ? 'Error' : graphQLApi) ?? 'Not deployed',\n },\n ],\n },\n ],\n data.filter((item) => item.category === 'apis'),\n )\n\n // Handle whatever else there might be\n const otherStuff: Record<string, ProjectData[]> = {}\n data.forEach((item) => {\n if (item.category && item.category !== 'apps' && item.category !== 'apis') {\n const group = otherStuff[item.category] ?? []\n group.push(item)\n otherStuff[item.category] = group\n }\n })\n Object.keys(otherStuff).forEach((category) => {\n result.push({title: category, rows: otherStuff[category]})\n })\n\n return result\n }, [graphQLApi, studioApps, projectId, dataset, data])\n\n return (\n <>\n {__experimental_before.map((widgetConfig, idx) => (\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n <WidgetContainer key={idx} {...widgetConfig} />\n ))}\n <Box height=\"fill\" marginTop={__experimental_before?.length > 0 ? 4 : 0}>\n <DashboardWidgetContainer\n footer={\n <Button\n style={{width: '100%'}}\n paddingX={2}\n paddingY={4}\n mode=\"bleed\"\n tone=\"primary\"\n text=\"Manage project\"\n as=\"a\"\n href={getManageUrl(projectId)}\n />\n }\n >\n <Card paddingY={4} radius={2} aria-label=\"Project info\">\n <Stack gap={4}>\n <Box paddingX={3} as=\"header\">\n <Heading size={1} as=\"h2\" id=\"project_info_table\">\n Project info\n </Heading>\n </Box>\n {assembleTableRows.map((item) => {\n if (!item || !item.rows) {\n return null\n }\n\n return (\n <Stack key={item.title} gap={3}>\n <Card borderBottom padding={3}>\n <Label size={0} muted>\n {item.title}\n </Label>\n </Card>\n <Stack gap={4} paddingX={3}>\n {item.rows.map((row) => {\n const rowValue = typeof row.value === 'object' ? row.value.error : row.value\n return (\n <Grid key={`${rowValue ?? ''}-${row.title}`} gridTemplateColumns={2}>\n <Text weight=\"medium\">{row.title}</Text>\n {typeof row.value === 'object' && (\n <Text size={1}>{row.value?.error}</Text>\n )}\n {typeof row.value === 'string' && (\n <>\n {isUrl(row.value) ? (\n <Text size={1} style={{wordBreak: 'break-word'}}>\n <a href={row.value}>{row.value}</a>\n </Text>\n ) : (\n <Code size={1} style={{wordBreak: 'break-word'}}>\n {row.value}\n </Code>\n )}\n </>\n )}\n </Grid>\n )\n })}\n </Stack>\n </Stack>\n )\n })}\n </Stack>\n </Card>\n </DashboardWidgetContainer>\n </Box>\n </>\n )\n}\n","import {type LayoutConfig, type DashboardWidget} from '../../types'\nimport {ProjectInfo} from './ProjectInfo'\n\nexport function projectInfoWidget(config?: {layout?: LayoutConfig}): DashboardWidget {\n return {\n name: 'project-info',\n component: ProjectInfo,\n layout: config?.layout ?? {width: 'medium'},\n }\n}\n","import {RobotIcon} from '@sanity/icons'\nimport {Box, Flex, rem, Stack, Text} from '@sanity/ui'\nimport {useListFormat, type User, UserAvatar} from 'sanity'\nimport {styled} from 'styled-components'\n\nconst Root = styled(Flex)`\n height: ${rem(33)}; // 33 = PREVIEW_SIZES.default.media.height\n box-sizing: content-box;\n`\n\nexport interface ProjectUserProps {\n user: User\n isRobot: boolean\n roles: string[]\n}\n\nexport function ProjectUser({user, isRobot, roles}: ProjectUserProps) {\n const listFormat = useListFormat({style: 'narrow'})\n return (\n <Root align=\"center\">\n <Flex align=\"center\" flex={1} gap={2}>\n <Box flex=\"none\">\n {isRobot ? (\n <Text size={2}>\n <RobotIcon />\n </Text>\n ) : (\n <UserAvatar user={user} />\n )}\n </Box>\n\n <Stack flex={1} gap={2}>\n <Text size={1} style={{color: 'inherit'}} textOverflow=\"ellipsis\" weight=\"medium\">\n {user.displayName}\n </Text>\n\n <Text muted size={1} textOverflow=\"ellipsis\">\n {listFormat.format(roles)}\n </Text>\n </Stack>\n </Flex>\n </Root>\n )\n}\n","import {Stack, Spinner, Box, Text, Button} from '@sanity/ui'\nimport {useCallback, useEffect, useState} from 'react'\nimport {from} from 'rxjs'\nimport {map, switchMap} from 'rxjs/operators'\nimport {type Role, type User, useUserStore} from 'sanity'\n\nimport {DashboardWidgetContainer} from '../../components/DashboardWidgetContainer'\nimport {useVersionedClient} from '../../versionedClient'\nimport {ProjectUser} from './ProjectUser'\n\nfunction getInviteUrl(projectId: string) {\n return `https://manage.sanity.io/projects/${projectId}/members`\n}\n\ninterface Member {\n id: string\n roles: Role[]\n isRobot: boolean\n isCurrentUser: boolean\n createdAt: string\n}\n\ninterface Project {\n id: string\n members: Member[]\n}\n\nexport function ProjectUsers() {\n const [project, setProject] = useState<Project | undefined>()\n const [users, setUsers] = useState<User[] | undefined>()\n const [error, setError] = useState<Error | undefined>()\n\n const userStore = useUserStore()\n const versionedClient = useVersionedClient()\n\n const fetchData = useCallback(() => {\n const {projectId} = versionedClient.config()\n const subscription = versionedClient.observable\n .request<Project>({\n uri: `/projects/${projectId}`,\n tag: 'dashboard.project-users',\n })\n .pipe(\n switchMap((_project) =>\n from(userStore.getUsers(_project.members.map((mem) => mem.id))).pipe(\n map((_users) => ({project: _project, users: _users})),\n ),\n ),\n )\n .subscribe({\n next: ({users: _users, project: _project}) => {\n setProject(_project)\n setUsers(\n (Array.isArray(_users) ? _users : [_users]).sort((userA, userB) =>\n sortUsersByRobotStatus(userA, userB, _project),\n ),\n )\n },\n error: (e: Error) => setError(e),\n })\n\n return () => subscription.unsubscribe()\n }, [userStore, versionedClient])\n\n useEffect(() => fetchData(), [fetchData])\n\n const handleRetryFetch = useCallback(() => fetchData(), [fetchData])\n\n const isLoading = !users || !project\n\n if (error) {\n return (\n <DashboardWidgetContainer header=\"Project users\">\n <Box padding={4}>\n <Stack gap={3}>\n <Text>Something went wrong while fetching data.</Text>\n <Box>\n <Button\n mode=\"ghost\"\n text=\"Retry\"\n title=\"Retry users fetch\"\n onClick={handleRetryFetch}\n />\n </Box>\n </Stack>\n </Box>\n </DashboardWidgetContainer>\n )\n }\n\n return (\n <DashboardWidgetContainer\n header=\"Project users\"\n footer={\n <Button\n style={{width: '100%'}}\n paddingX={2}\n paddingY={4}\n mode=\"bleed\"\n tone=\"primary\"\n text=\"Manage members\"\n as=\"a\"\n loading={isLoading}\n href={isLoading ? undefined : getInviteUrl(project.id)}\n />\n }\n >\n {isLoading && (\n <Box paddingY={5} paddingX={2}>\n <Stack gap={4}>\n <Text align=\"center\" muted size={1}>\n <Spinner />\n </Text>\n <Text align=\"center\" size={1} muted>\n Loading items…\n </Text>\n </Stack>\n </Box>\n )}\n\n {!isLoading && (\n <Stack gap={3} padding={3}>\n {users?.map((user) => {\n const membership = project.members.find((member) => member.id === user.id)\n return (\n <ProjectUser\n key={user.id}\n user={user}\n isRobot={membership?.isRobot ?? false}\n roles={membership?.roles.map((role) => role.title) || []}\n />\n )\n })}\n </Stack>\n )}\n </DashboardWidgetContainer>\n )\n}\n\nfunction sortUsersByRobotStatus(userA: User, userB: User, project: Project) {\n const {members} = project\n const membershipA = members.find((member) => member.id === userA?.id)\n const membershipB = members.find((member) => member.id === userB?.id)\n\n // On ties, sort by when the user was added\n if (membershipA?.isRobot === membershipB?.isRobot) {\n return (membershipA?.createdAt || '') > (membershipB?.createdAt || '') ? 1 : -1\n }\n\n // Robots go to the bottom\n return membershipA?.isRobot ? 1 : -1\n}\n","import {type LayoutConfig, type DashboardWidget} from '../../types'\nimport {ProjectUsers} from './ProjectUsers'\n\nexport function projectUsersWidget(config?: {layout?: LayoutConfig}): DashboardWidget {\n return {\n name: 'project-info',\n component: ProjectUsers,\n layout: config?.layout,\n }\n}\n","import imageUrlBuilder from '@sanity/image-url'\nimport {useMemo} from 'react'\n\nimport {useVersionedClient} from '../../versionedClient'\n\nconst tutorialsProjectConfig = {\n projectId: '3do82whm',\n dataset: 'next',\n}\n\nexport interface Guide {\n _type?: string\n slug?: {current: string}\n presenter?: {\n name?: string\n }\n}\n\nexport interface FeedItem {\n _id: string\n title?: string\n poster?: string\n category?: string\n guideOrTutorial?: Guide\n externalLink?: string\n presenter?: {\n name?: string\n }\n hasVideo?: boolean\n}\n\nexport function useDataAdapter() {\n const versionedClient = useVersionedClient()\n return useMemo(\n () => ({\n getFeed: (templateRepoId: string) => {\n const uri = templateRepoId\n ? `/addons/dashboard?templateRepoId=${templateRepoId}`\n : '/addons/dashboard'\n return versionedClient.observable.request<{items: FeedItem[]}>({\n uri,\n tag: 'dashboard.sanity-tutorials',\n withCredentials: false,\n })\n },\n urlBuilder: imageUrlBuilder(tutorialsProjectConfig),\n }),\n [versionedClient],\n )\n}\n","import {PlayIcon} from '@sanity/icons'\nimport {Card, Box, Heading, Flex, Text, Stack} from '@sanity/ui'\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport {styled} from 'styled-components'\n\nconst PlayIconBox = styled(Box)`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n &:before {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 2.75em;\n height: 2.75em;\n border-radius: 50%;\n background: ${({theme}) => getTheme_v2(theme).color.bg};\n opacity: 0.75;\n }\n`\n\nconst Root = styled(Flex)`\n &:hover {\n ${PlayIconBox} {\n &:before {\n opacity: 1;\n }\n }\n }\n`\n\nconst PosterCard = styled(Card)`\n width: 100%;\n padding-bottom: calc(9 / 16 * 100%);\n position: relative;\n`\n\nconst Poster = styled.img`\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n object-fit: cover;\n display: block;\n\n &:not([src]) {\n display: none;\n }\n`\n\nexport interface TutorialProps {\n title: string\n posterURL?: string\n href: string\n showPlayIcon?: boolean\n presenterName?: string\n presenterSubtitle?: string\n}\n\nexport function Tutorial(props: TutorialProps) {\n const {title, posterURL, showPlayIcon, href, presenterName, presenterSubtitle} = props\n\n return (\n <Root flex={1}>\n <Card\n sizing=\"border\"\n flex={1}\n padding={2}\n radius={2}\n as=\"a\"\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{position: 'relative'}}\n >\n <Flex direction=\"column\" style={{height: '100%'}}>\n {posterURL && (\n <PosterCard marginBottom={1}>\n <Poster src={posterURL} />\n {showPlayIcon && (\n <PlayIconBox display=\"flex\">\n <Text align=\"center\">\n <PlayIcon />\n </Text>\n </PlayIconBox>\n )}\n </PosterCard>\n )}\n <Flex direction=\"column\" justify=\"space-between\" paddingY={2} flex={1}>\n <Heading as=\"h3\" size={1}>\n {title}\n </Heading>\n <Box marginTop={4}>\n <Stack gap={2} flex={1}>\n <Text size={1}>{presenterName}</Text>\n <Text size={0} style={{opacity: 0.7}}>\n {presenterSubtitle}\n </Text>\n </Stack>\n </Box>\n </Flex>\n </Flex>\n </Card>\n </Root>\n )\n}\n","import {Flex} from '@sanity/ui'\nimport {useEffect, useState} from 'react'\n\nimport {DashboardWidgetContainer} from '../../components/DashboardWidgetContainer'\nimport {type FeedItem, type Guide, useDataAdapter} from './dataAdapter'\nimport {Tutorial} from './Tutorial'\n\nfunction createUrl(slug: {current: string}, type?: string) {\n if (type === 'tutorial') {\n return `https://www.sanity.io/docs/tutorials/${slug.current}`\n } else if (type === 'guide') {\n return `https://www.sanity.io/docs/guides/${slug.current}`\n }\n return false\n}\n\nexport interface SanityTutorialsProps {\n templateRepoId: string\n}\n\nexport function SanityTutorials(props: SanityTutorialsProps) {\n const {templateRepoId} = props\n const [feedItems, setFeedItems] = useState<FeedItem[]>([])\n\n const {getFeed, urlBuilder} = useDataAdapter()\n\n useEffect(() => {\n const subscription = getFeed(templateRepoId).subscribe((response) => {\n setFeedItems(response.items)\n })\n return () => {\n subscription.unsubscribe()\n }\n }, [setFeedItems, getFeed, templateRepoId])\n\n const title = 'Learn about Sanity'\n\n return (\n <DashboardWidgetContainer header={title}>\n <Flex as=\"ul\" overflow=\"auto\" align=\"stretch\" paddingY={2}>\n {feedItems?.map((feedItem, index) => {\n if (!feedItem.title || (!feedItem.guideOrTutorial && !feedItem.externalLink)) {\n return null\n }\n const presenter = feedItem.presenter || feedItem.guideOrTutorial?.presenter || {}\n const subtitle = feedItem.category\n const {guideOrTutorial = {} as Guide} = feedItem\n const href =\n (guideOrTutorial.slug\n ? createUrl(guideOrTutorial.slug, guideOrTutorial._type)\n : feedItem.externalLink) || feedItem.externalLink\n\n return (\n <Flex\n as=\"li\"\n key={feedItem._id}\n paddingRight={index < feedItems?.length - 1 ? 1 : 3}\n paddingLeft={index === 0 ? 3 : 0}\n align=\"stretch\"\n style={{minWidth: 272, width: '30%'}}\n >\n <Tutorial\n title={feedItem.title}\n href={href ?? ''}\n presenterName={presenter.name}\n presenterSubtitle={subtitle}\n showPlayIcon={feedItem.hasVideo}\n posterURL={\n feedItem.poster ? urlBuilder.image(feedItem.poster).height(360).url() : undefined\n }\n />\n </Flex>\n )\n })}\n </Flex>\n </DashboardWidgetContainer>\n )\n}\n","import {type LayoutConfig, type DashboardWidget} from '../../types'\nimport {SanityTutorials} from './SanityTutorials'\n\nexport function sanityTutorialsWidget(config?: {layout?: LayoutConfig}): DashboardWidget {\n return {\n name: 'sanity-tutorials',\n component: SanityTutorials,\n layout: config?.layout ?? {width: 'full'},\n }\n}\n","import {Container} from '@sanity/ui'\n\nexport function DashboardLayout({children}: {children: React.ReactNode}) {\n return (\n <Container width={4} padding={4} sizing=\"border\" style={{height: '100%', overflowY: 'auto'}}>\n {children}\n </Container>\n )\n}\n","import {Box, Card, Grid, Text} from '@sanity/ui'\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport {styled, css} from 'styled-components'\n\nimport {WidgetContainer} from '../containers/WidgetContainer'\nimport {type DashboardConfig, type LayoutConfig, type DashboardWidget} from '../types'\n\nconst media = {\n small: (...args: Parameters<typeof css>) => css`\n @media (min-width: ${({theme}) => getTheme_v2(theme).media[0]}px) {\n ${css(...args)}\n }\n `,\n medium: (...args: Parameters<typeof css>) => css`\n @media (min-width: ${({theme}) => getTheme_v2(theme).media[2]}px) {\n ${css(...args)}\n }\n `,\n}\n\nconst Root = styled(Grid)`\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n\n & > div {\n overflow: hidden;\n }\n\n & > div[data-width='medium'] {\n ${media.small`\n grid-column: span 2;\n `}\n }\n\n & > div[data-width='large'] {\n ${media.small`\n grid-column: span 2;\n `}\n\n ${media.medium`\n grid-column: span 3;\n `}\n }\n\n & > div[data-width='full'] {\n ${media.small`\n grid-column: 1 / -1;\n `}\n }\n\n & > div[data-height='medium'] {\n ${media.small`\n grid-row: span 2;\n `}\n }\n\n & > div[data-height='large'] {\n ${media.small`\n grid-row: span 2;\n `}\n\n ${media.medium`\n grid-row: span 3;\n `}\n }\n\n & > div[data-height='full'] {\n ${media.medium`\n grid-row: 1 / -1;\n `}\n }\n`\n\nexport interface WidgetGroupProps {\n config: Partial<DashboardConfig>\n}\n\nconst NO_WIDGETS: DashboardWidget[] = []\nconst NO_LAYOUT: LayoutConfig = {}\n\nexport function WidgetGroup(props: WidgetGroupProps) {\n const {\n config: {layout = NO_LAYOUT, widgets = NO_WIDGETS},\n } = props\n return (\n <Root\n autoFlow=\"row dense\"\n data-width={layout.width || 'auto'}\n data-height={layout.height || 'auto'}\n gap={4}\n >\n {widgets.length ? null : (\n <Card padding={4} shadow={1} tone=\"primary\">\n <Text align=\"center\">Add some widgets to populate this space.</Text>\n </Card>\n )}\n {widgets.map((widgetConfig, index) => {\n if (widgetConfig.type === '__experimental_group') {\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <WidgetGroup key={index} config={widgetConfig} />\n }\n if (widgetConfig.component) {\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <WidgetContainer key={index} {...widgetConfig} />\n }\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <Box key={index}>{widgetConfig.name} is missing widget component</Box>\n })}\n </Root>\n )\n}\n","import {DashboardLayout} from '../components/DashboardLayout'\nimport {WidgetGroup} from '../components/WidgetGroup'\nimport {type DashboardConfig} from '../types'\nimport {DashboardContext} from './DashboardContext'\n\nexport function Dashboard({config}: {config: DashboardConfig}) {\n if (!config) {\n return null\n }\n\n return (\n <DashboardContext.Provider value={config}>\n <DashboardLayout>\n <WidgetGroup config={config} />\n </DashboardLayout>\n </DashboardContext.Provider>\n )\n}\n","import {type ComponentType, type CSSProperties} from 'react'\nimport {definePlugin} from 'sanity'\n\nimport {Dashboard} from './containers/Dashboard'\nimport {type DashboardConfig, type DashboardWidget, type LayoutConfig} from './types'\n\nconst strokeStyle: CSSProperties = {\n stroke: 'currentColor',\n strokeWidth: 1.2,\n}\n\nconst DashboardIcon = () => (\n <svg\n data-sanity-icon\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n preserveAspectRatio=\"xMidYMid\"\n width=\"1em\"\n height=\"1em\"\n >\n <path d=\"M19.5 19.5H5.5V5.5H19.5V19.5Z\" style={strokeStyle} />\n <path d=\"M5.5 12.5H19.5\" style={strokeStyle} />\n <path d=\"M14.5 19.5V12.5M10.5 12.5V5.5\" style={strokeStyle} />\n </svg>\n)\n\nexport interface DashboardPluginConfig {\n /**\n * Dashboard tool title\n */\n title?: string\n /**\n * Dashboard tool name (used in url path)\n */\n name?: string\n /**\n * Dashboard tool icon\n */\n icon?: ComponentType\n widgets?: DashboardWidget[]\n\n /**\n * Will be used for widgets that do not define a layout directly.\n */\n defaultLayout?: LayoutConfig\n}\n\nexport const dashboardTool = definePlugin<DashboardPluginConfig>((config = {}) => {\n const pluginConfig: DashboardConfig = {\n layout: config.defaultLayout ?? {},\n widgets: config.widgets ?? [],\n }\n\n const title = config.title ?? 'Dashboard'\n const name = config.name ?? 'dashboard'\n const icon = config.icon ?? DashboardIcon\n\n return {\n name: 'dashboard',\n tools: [\n {\n title,\n name,\n icon,\n component: () => <Dashboard config={pluginConfig} />,\n },\n ],\n }\n})\n"],"names":["Root","styled","Card","withConfig","displayName","componentId","Header","Footer","Content","Box","theme","getTheme_v2","media","DashboardWidgetContainer","forwardRef","props","ref","$","_c","header","children","footer","t0","t1","t2","t3","DashboardContext","createContext","widgets","useDashboardConfig","useContext","WidgetContainer","config","layout","Widget","component","height","width","useVersionedClient","for","apiVersion","useClient","isUrl","url","test","getGraphQLUrl","projectId","dataset","getGroqUrl","getManageUrl","NO_EXPERIMENTAL","NO_DATA","ProjectInfo","__experimental_before","data","undefined","studioApps","setStudioApps","useState","graphQLApi","setGraphQLApi","versionedClient","t4","t5","observable","subscriptions","push","request","uri","tag","subscribe","next","result","filter","_temp","error","console","method","error_0","statusCode","forEach","_temp2","t6","useEffect","result_0","title","rows","value","apps","_temp3","Array","isArray","app_0","app","urlType","appHost","length","concat","_temp4","otherStuff","item_1","item","category","group","Object","keys","assembleTableRows","t7","map","_temp5","t8","t9","t10","t11","t12","Symbol","t13","_temp7","t14","t15","t16","t17","item_2","_temp6","row","rowValue","wordBreak","widgetConfig","idx","item_0","s","unsubscribe","type","projectInfoWidget","name","Flex","rem","ProjectUser","user","isRobot","roles","style","listFormat","useListFormat","color","format","getInviteUrl","ProjectUsers","project","setProject","users","setUsers","setError","userStore","useUserStore","subscription","pipe","switchMap","_project","from","getUsers","members","_users","_users_0","_project_0","sort","userA","userB","sortUsersByRobotStatus","e","fetchData","handleRetryFetch","isLoading","id","membership","find","member","role","mem","membershipA","membershipB","createdAt","projectUsersWidget","tutorialsProjectConfig","useDataAdapter","templateRepoId","withCredentials","imageUrlBuilder","getFeed","urlBuilder","PlayIconBox","bg","PosterCard","Poster","img","Tutorial","posterURL","showPlayIcon","href","presenterName","presenterSubtitle","position","opacity","createUrl","slug","current","SanityTutorials","feedItems","setFeedItems","response","items","feedItem","index","guideOrTutorial","externalLink","presenter","subtitle","_type","minWidth","hasVideo","poster","image","_id","sanityTutorialsWidget","DashboardLayout","overflowY","small","args","css","medium","Grid","NO_WIDGETS","NO_LAYOUT","WidgetGroup","Dashboard","strokeStyle","stroke","strokeWidth","DashboardIcon","dashboardTool","definePlugin","pluginConfig","defaultLayout","icon","tools"],"mappings":"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"}
package/package.json CHANGED
@@ -1,108 +1,66 @@
1
1
  {
2
2
  "name": "@sanity/dashboard",
3
- "version": "5.0.1",
3
+ "version": "6.0.0",
4
4
  "description": "Tool for rendering dashboard widgets",
5
5
  "keywords": [
6
- "sanity",
7
6
  "cms",
8
- "headless",
9
- "realtime",
10
7
  "content",
11
8
  "dashboard",
9
+ "headless",
10
+ "realtime",
11
+ "sanity",
12
12
  "sanity-plugin",
13
13
  "sanity-tool"
14
14
  ],
15
- "homepage": "https://github.com/sanity-io/dashboard#readme",
15
+ "homepage": "https://github.com/sanity-io/plugins/tree/main/plugins/@sanity/dashboard#readme",
16
16
  "bugs": {
17
- "url": "https://github.com/sanity-io/dashboard/issues"
18
- },
19
- "repository": {
20
- "type": "git",
21
- "url": "git@github.com:sanity-io/dashboard.git"
17
+ "url": "https://github.com/sanity-io/plugins/issues"
22
18
  },
23
19
  "license": "MIT",
24
20
  "author": "Sanity.io <hello@sanity.io>",
25
- "sideEffects": false,
26
- "exports": {
27
- ".": {
28
- "source": "./src/index.ts",
29
- "import": "./lib/index.mjs",
30
- "require": "./lib/index.js",
31
- "default": "./lib/index.mjs"
32
- },
33
- "./package.json": "./package.json"
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+ssh://git@github.com/sanity-io/plugins.git",
24
+ "directory": "plugins/@sanity/dashboard"
34
25
  },
35
- "main": "./lib/index.js",
36
- "module": "./lib/index.esm.js",
37
- "types": "./lib/index.d.ts",
38
26
  "files": [
39
- "lib",
40
- "sanity.json",
41
- "src",
42
- "v2-incompatible.js"
27
+ "dist"
43
28
  ],
44
- "scripts": {
45
- "prebuild": "npm run clean && plugin-kit verify-package --silent && pkg-utils",
46
- "build": "plugin-kit verify-package --silent && pkg-utils build --strict --check --clean",
47
- "clean": "rimraf lib",
48
- "compile": "tsc --noEmit",
49
- "dev": "sanity dev",
50
- "format": "prettier --write --cache --ignore-unknown .",
51
- "link-watch": "plugin-kit link-watch",
52
- "lint": "eslint .",
53
- "prepare": "husky install",
54
- "prepublishOnly": "npm run build",
55
- "watch": "pkg-utils watch --strict"
29
+ "type": "module",
30
+ "types": "./dist/index.d.ts",
31
+ "exports": {
32
+ ".": "./dist/index.js",
33
+ "./package.json": "./package.json"
56
34
  },
57
- "browserslist": "extends @sanity/browserslist-config",
58
35
  "dependencies": {
59
36
  "@sanity/icons": "^3.5.2",
60
37
  "@sanity/image-url": "^1.1.0",
61
- "@sanity/incompatible-plugin": "^1.0.4",
62
- "@sanity/ui": "^3.1.0",
63
- "lodash": "^4.17.21",
64
- "rxjs": "^7.8.1"
38
+ "@sanity/ui": "^3.2.0",
39
+ "rxjs": "^7.8.2"
65
40
  },
66
41
  "devDependencies": {
67
- "@commitlint/cli": "^19.8.0",
68
- "@commitlint/config-conventional": "^19.8.0",
69
- "@sanity/pkg-utils": "^6.13.4",
70
- "@sanity/plugin-kit": "^4.0.19",
71
- "@sanity/semantic-release-preset": "^5.0.0",
72
- "@types/react": "^19.2.3",
73
- "@typescript-eslint/eslint-plugin": "^7.18.0",
74
- "@typescript-eslint/parser": "^7.18.0",
75
- "eslint": "^8.57.1",
76
- "eslint-config-prettier": "^9.1.0",
77
- "eslint-config-sanity": "^6.0.0",
78
- "eslint-plugin-prettier": "^5.2.3",
79
- "eslint-plugin-react": "^7.37.4",
80
- "eslint-plugin-react-hooks": "^4.6.2",
81
- "husky": "^8.0.3",
82
- "lint-staged": "^15.2.11",
83
- "npm-run-all2": "^5.0.2",
84
- "prettier": "^3.5.3",
85
- "prettier-plugin-packagejson": "^2.5.10",
86
- "react": "^19.2.3",
87
- "react-dom": "^19.2.3",
88
- "react-is": "^19.2.3",
89
- "rimraf": "^6.0.0",
90
- "sanity": "^5.0.1",
91
- "semantic-release": "^24.2.3",
92
- "styled-components": "^6.1.15",
93
- "typescript": "^5.7.3"
42
+ "@sanity/pkg-utils": "^10.5.5",
43
+ "@types/react": "^19.2.17",
44
+ "@types/react-dom": "^19.2.3",
45
+ "babel-plugin-react-compiler": "^1.0.0",
46
+ "babel-plugin-styled-components": "^2.3.0",
47
+ "react": "^19.2.7",
48
+ "react-dom": "^19.2.7",
49
+ "sanity": "^6.0.0",
50
+ "styled-components": "^6.4.2",
51
+ "@repo/package.config": "0.0.0",
52
+ "@repo/tsconfig": "0.0.0"
94
53
  },
95
54
  "peerDependencies": {
96
- "react": "^18 || >=19.0.0-0",
97
- "sanity": "^3 || ^4.0.0-0 || ^5.0.0",
55
+ "react": "^19.2",
56
+ "react-dom": "^19.2",
57
+ "sanity": "^5 || ^6.0.0-0",
98
58
  "styled-components": "^6.1"
99
59
  },
100
60
  "engines": {
101
- "node": ">=18"
61
+ "node": ">=20.19 <22 || >=22.12"
102
62
  },
103
- "overrides": {
104
- "conventional-changelog-conventionalcommits": ">= 8.0.0",
105
- "cross-spawn": "^7.0.6"
106
- },
107
- "sanityExchangeUrl": "https://www.sanity.io/exchange/dashboard"
108
- }
63
+ "scripts": {
64
+ "build": "pkg build --strict --check --clean"
65
+ }
66
+ }
package/lib/index.d.mts DELETED
@@ -1,65 +0,0 @@
1
- import {ComponentClass} from 'react'
2
- import {ComponentType} from 'react'
3
- import {FunctionComponent} from 'react'
4
- import {Plugin as Plugin_2} from 'sanity'
5
- import {default as React_2} from 'react'
6
-
7
- export declare interface DashboardConfig {
8
- widgets: DashboardWidget[]
9
- layout?: LayoutConfig
10
- }
11
-
12
- export declare interface DashboardPluginConfig {
13
- /**
14
- * Dashboard tool title
15
- */
16
- title?: string
17
- /**
18
- * Dashboard tool name (used in url path)
19
- */
20
- name?: string
21
- /**
22
- * Dashboard tool icon
23
- */
24
- icon?: ComponentType
25
- widgets?: DashboardWidget[]
26
- /**
27
- * Will be used for widgets that do not define a layout directly.
28
- */
29
- defaultLayout?: LayoutConfig
30
- }
31
-
32
- export declare const dashboardTool: Plugin_2<DashboardPluginConfig>
33
-
34
- export declare interface DashboardWidget {
35
- name: string
36
- type?: '__experimental_group'
37
- component: FunctionComponent<any> | ComponentClass<any>
38
- layout?: LayoutConfig
39
- widgets?: DashboardWidget[]
40
- }
41
-
42
- export declare const DashboardWidgetContainer: React_2.ForwardRefExoticComponent<
43
- DashboardWidgetProps & React_2.RefAttributes<HTMLDivElement>
44
- >
45
-
46
- declare interface DashboardWidgetProps {
47
- header?: string
48
- children: React_2.ReactNode
49
- footer?: React_2.ReactNode
50
- }
51
-
52
- export declare interface LayoutConfig {
53
- width?: LayoutSize
54
- height?: LayoutSize
55
- }
56
-
57
- export declare type LayoutSize = 'auto' | 'small' | 'medium' | 'large' | 'full'
58
-
59
- export declare function projectInfoWidget(config?: {layout?: LayoutConfig}): DashboardWidget
60
-
61
- export declare function projectUsersWidget(config?: {layout?: LayoutConfig}): DashboardWidget
62
-
63
- export declare function sanityTutorialsWidget(config?: {layout?: LayoutConfig}): DashboardWidget
64
-
65
- export {}
package/lib/index.d.ts DELETED
@@ -1,65 +0,0 @@
1
- import {ComponentClass} from 'react'
2
- import {ComponentType} from 'react'
3
- import {FunctionComponent} from 'react'
4
- import {Plugin as Plugin_2} from 'sanity'
5
- import {default as React_2} from 'react'
6
-
7
- export declare interface DashboardConfig {
8
- widgets: DashboardWidget[]
9
- layout?: LayoutConfig
10
- }
11
-
12
- export declare interface DashboardPluginConfig {
13
- /**
14
- * Dashboard tool title
15
- */
16
- title?: string
17
- /**
18
- * Dashboard tool name (used in url path)
19
- */
20
- name?: string
21
- /**
22
- * Dashboard tool icon
23
- */
24
- icon?: ComponentType
25
- widgets?: DashboardWidget[]
26
- /**
27
- * Will be used for widgets that do not define a layout directly.
28
- */
29
- defaultLayout?: LayoutConfig
30
- }
31
-
32
- export declare const dashboardTool: Plugin_2<DashboardPluginConfig>
33
-
34
- export declare interface DashboardWidget {
35
- name: string
36
- type?: '__experimental_group'
37
- component: FunctionComponent<any> | ComponentClass<any>
38
- layout?: LayoutConfig
39
- widgets?: DashboardWidget[]
40
- }
41
-
42
- export declare const DashboardWidgetContainer: React_2.ForwardRefExoticComponent<
43
- DashboardWidgetProps & React_2.RefAttributes<HTMLDivElement>
44
- >
45
-
46
- declare interface DashboardWidgetProps {
47
- header?: string
48
- children: React_2.ReactNode
49
- footer?: React_2.ReactNode
50
- }
51
-
52
- export declare interface LayoutConfig {
53
- width?: LayoutSize
54
- height?: LayoutSize
55
- }
56
-
57
- export declare type LayoutSize = 'auto' | 'small' | 'medium' | 'large' | 'full'
58
-
59
- export declare function projectInfoWidget(config?: {layout?: LayoutConfig}): DashboardWidget
60
-
61
- export declare function projectUsersWidget(config?: {layout?: LayoutConfig}): DashboardWidget
62
-
63
- export declare function sanityTutorialsWidget(config?: {layout?: LayoutConfig}): DashboardWidget
64
-
65
- export {}