@sanity/dashboard
6.0.86.0.9
~
Modified (5 files)
Index: package/dist/index.js
===================================================================
--- package/dist/index.js
+++ package/dist/index.js
@@ -570,9 +570,9 @@
})
}), $[21] = href, $[22] = t9, $[23] = t10) : t10 = $[23], t10;
}
function createUrl(slug, type) {
- return type === "tutorial" ? `https://www.sanity.io/docs/tutorials/${slug.current}` : type === "guide" ? `https://www.sanity.io/docs/guides/${slug.current}` : !1;
+ return type === "tutorial" ? `https://www.sanity.io/docs/tutorials/${slug.current}` : type === "guide" && `https://www.sanity.io/docs/guides/${slug.current}`;
}
function SanityTutorials(props) {
let $ = c(10), { templateRepoId } = props, t0;
$[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = [], $[0] = t0) : t0 = $[0]; Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
{
"name": "@sanity/dashboard",
- "version": "6.0.8",
+ "version": "6.0.9",
"description": "Tool for rendering dashboard widgets",
"keywords": [
"cms",
"content",
@@ -34,22 +34,22 @@
},
"dependencies": {
"@sanity/icons": "^5.0.0",
"@sanity/image-url": "^2.1.1",
- "@sanity/ui": "^3.3.1",
+ "@sanity/ui": "^3.3.5",
"rxjs": "^7.8.2"
},
"devDependencies": {
"@sanity/tsconfig": "^2.2.0",
- "@sanity/tsdown-config": "^0.11.0",
+ "@sanity/tsdown-config": "^0.13.1",
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"babel-plugin-react-compiler": "^1.0.0",
"react": "^19.2.7",
"react-dom": "^19.2.7",
"sanity": "^6.3.0",
"styled-components": "^6.4.3",
- "tsdown": "^0.22.3"
+ "tsdown": "^0.22.5"
},
"peerDependencies": {
"react": "^19.2",
"react-dom": "^19.2", Index: package/dist/index.d.ts.map
===================================================================
--- package/dist/index.d.ts.map
+++ package/dist/index.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/components/DashboardWidgetContainer.tsx","../src/widgets/projectInfo/index.ts","../src/widgets/projectUsers/index.ts","../src/widgets/sanityTutorials/index.ts","../src/plugin.tsx"],"mappings":";UAEiB,eAAA;EACf,IAAA;EACA,IAAA;EACA,SAAA,EAAW,iBAAA,QAAyB,cAAA;EACpC,MAAA,GAAS,YAAA;EACT,OAAA,GAAU,eAAA;AAAA;AAAA,KAGA,UAAA;AAAA,UAEK,YAAA;EACf,KAAA,GAAQ,UAAA;EACR,MAAA,GAAS,UAAU;AAAA;AAAA,UAGJ,eAAA;EACf,OAAA,EAAS,eAAA;EACT,MAAA,GAAS,YAAY;AAAA;AAAA,UCwBb,oBAAA;EACR,MAAA;EACA,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,MAAA,GAAS,KAAA,CAAM,SAAA;EACf,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,cAAA;AAAA;AAAA,iBAGF,wBAAA,CAAyB,KAAA,EAAO,oBAAoB,mBAAA,GAAA,CAAA,OAAA;AAAA,iBC/CpD,iBAAA,CAAkB,MAAA;EAAU,MAAA,GAAS,YAAA;AAAA,IAAgB,eAAe;AAAA,iBCApE,kBAAA,CAAmB,MAAA;EAAU,MAAA,GAAS,YAAA;AAAA,IAAgB,eAAe;AAAA,iBCArE,qBAAA,CAAsB,MAAA;EAAU,MAAA,GAAS,YAAA;AAAA,IAAgB,eAAe;AAAA,UCwBvE,qBAAA;ELzBe;;;EK6B9B,KAAA;ELzBS;;;EK6BT,IAAA;ELhCA;;;EKoCA,IAAA,GAAO,aAAA;EACP,OAAA,GAAU,eAAA;ELlCV;;;EKuCA,aAAA,GAAgB,YAAA;AAAA;AAAA,cAGL,aAAA,mBAAa,MAAA,CAAA,qBAAA"}
\ No newline at end of file
+{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/components/DashboardWidgetContainer.tsx","../src/widgets/projectInfo/index.ts","../src/widgets/projectUsers/index.ts","../src/widgets/sanityTutorials/index.ts","../src/plugin.tsx"],"mappings":";UAEiB;EACf;EACA;EACA,WAAW,yBAAyB;EACpC,SAAS;EACT,UAAU;;KAGA;UAEK;EACf,QAAQ;EACR,SAAS;;UAGM;EACf,SAAS;EACT,SAAS;;UCwBD;EACR;EACA,UAAU,MAAM;EAChB,SAAS,MAAM;EACf,MAAM,MAAM,IAAI;;iBAGF,yBAAyB,OAAO,uCAAoB,IAAA;iBC/CpD,kBAAkB;EAAU,SAAS;IAAgB;iBCArD,mBAAmB;EAAU,SAAS;IAAgB;iBCAtD,sBAAsB;EAAU,SAAS;IAAgB;UCwBxD;;;;EAIf;;;;EAIA;;;;EAIA,OAAO;EACP,UAAU;;;;EAKV,gBAAgB;;cAGL,gCAAa,OAAA"}
\ No newline at end of file Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["Card","Box","Heading","getTheme_v2","styled","Root","Header","Footer","Content","theme","media","DashboardWidgetProps","header","children","React","ReactNode","footer","ref","Ref","HTMLDivElement","DashboardWidgetContainer","props","$","_c","t0","t1","t2","t3","createContext","useContext","DashboardConfig","DashboardContext","widgets","useDashboardConfig","Card","useMemo","DashboardWidget","useDashboardConfig","WidgetContainer","props","$","_c","config","t0","layout","Widget","component","t1","t2","height","width","useClient","useVersionedClient","$","_c","t0","Symbol","for","apiVersion","Box","Card","Stack","Heading","Grid","Label","Text","Code","Button","useEffect","useMemo","useState","Subscription","DashboardWidgetContainer","WidgetContainer","DashboardWidget","useVersionedClient","App","ProjectInfoProps","ProjectData","UserApplication","isUrl","url","test","getGraphQLUrl","projectId","dataset","getGroqUrl","getManageUrl","NO_EXPERIMENTAL","NO_DATA","ProjectInfo","props","$","_c","__experimental_before","t0","data","t1","undefined","studioApps","setStudioApps","graphQLApi","setGraphQLApi","versionedClient","t2","config","t3","t4","t5","observable","subscriptions","push","request","uri","tag","subscribe","next","result","filter","_temp","error","console","method","error_0","statusCode","forEach","_temp2","t6","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","Symbol","for","width","t10","t11","t12","t13","_temp7","t14","t15","t16","t17","item_2","_temp6","row","rowValue","wordBreak","widgetConfig","idx","item_0","s","unsubscribe","type","LayoutConfig","DashboardWidget","ProjectInfo","projectInfoWidget","config","layout","name","component","width","RobotIcon","Box","Flex","rem","Stack","Text","useListFormat","User","UserAvatar","styled","Root","ProjectUserProps","user","isRobot","roles","ProjectUser","t0","$","_c","t1","Symbol","for","style","listFormat","t2","t3","color","t4","displayName","t5","format","t6","t7","t8","Stack","Spinner","Box","Text","Button","useCallback","useEffect","useState","from","map","switchMap","Role","User","useUserStore","DashboardWidgetContainer","useVersionedClient","ProjectUser","getInviteUrl","projectId","Member","id","roles","isRobot","isCurrentUser","createdAt","Project","members","ProjectUsers","$","_c","project","setProject","users","setUsers","error","setError","userStore","versionedClient","t0","config","subscription","observable","request","uri","tag","pipe","_project","getUsers","_temp","_users","subscribe","next","t1","_users_0","_project_0","Array","isArray","sort","userA","userB","sortUsersByRobotStatus","e","unsubscribe","fetchData","t2","t3","handleRetryFetch","isLoading","t4","Symbol","for","t5","width","undefined","t6","t7","t8","user","membership","find","member","_temp2","t9","role","title","mem","membershipA","membershipB","LayoutConfig","DashboardWidget","ProjectUsers","projectUsersWidget","config","layout","name","component","createImageUrlBuilder","useMemo","useVersionedClient","tutorialsProjectConfig","projectId","dataset","Guide","_type","slug","current","presenter","name","FeedItem","_id","title","poster","category","guideOrTutorial","externalLink","hasVideo","useDataAdapter","$","_c","versionedClient","t0","templateRepoId","uri","observable","request","tag","withCredentials","t1","Symbol","for","t2","getFeed","urlBuilder","PlayIcon","Card","Box","Heading","Flex","Text","Stack","getTheme_v2","styled","PlayIconBox","theme","color","bg","Root","PosterCard","Poster","img","TutorialProps","title","posterURL","href","showPlayIcon","presenterName","presenterSubtitle","Tutorial","props","$","_c","t0","Symbol","for","position","t1","height","t2","t3","t4","t5","opacity","t6","t7","t8","t9","t10","Flex","useEffect","useState","DashboardWidgetContainer","FeedItem","useDataAdapter","Tutorial","createUrl","slug","current","type","SanityTutorialsProps","templateRepoId","SanityTutorials","props","$","_c","t0","Symbol","for","feedItems","setFeedItems","getFeed","urlBuilder","t1","t2","subscription","subscribe","response","items","unsubscribe","t3","map","feedItem","index","title","guideOrTutorial","externalLink","presenter","subtitle","category","t4","undefined","href","_type","_id","length","minWidth","width","name","hasVideo","poster","image","height","url","LayoutConfig","DashboardWidget","SanityTutorials","sanityTutorialsWidget","config","layout","name","component","width","Container","DashboardLayout","t0","$","_c","children","t1","Symbol","for","height","overflowY","t2","Box","Card","Grid","Text","getTheme_v2","styled","css","WidgetContainer","DashboardConfig","LayoutConfig","DashboardWidget","media","small","args","Parameters","theme","medium","Root","WidgetGroupProps","config","Partial","NO_WIDGETS","NO_LAYOUT","WidgetGroup","props","$","_c","t0","layout","t1","widgets","t2","undefined","t3","width","t4","height","t5","length","t6","map","_temp","t7","widgetConfig","index","type","component","name","DashboardLayout","WidgetGroup","DashboardConfig","DashboardContext","Dashboard","t0","$","_c","config","t1","t2","ComponentType","CSSProperties","definePlugin","Dashboard","DashboardConfig","DashboardWidget","LayoutConfig","strokeStyle","stroke","strokeWidth","DashboardIcon","$","_c","t0","Symbol","for","DashboardPluginConfig","title","name","icon","widgets","defaultLayout","dashboardTool","config","pluginConfig","layout","tools","component"],"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 {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 ref?: React.Ref<HTMLDivElement>\n}\n\nexport function DashboardWidgetContainer(props: DashboardWidgetProps) {\n const {header, children, footer, ref} = 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/Robot'\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-users',\n component: ProjectUsers,\n layout: config?.layout,\n }\n}\n","import {createImageUrlBuilder} 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: createImageUrlBuilder(tutorialsProjectConfig),\n }),\n [versionedClient],\n )\n}\n","import {PlayIcon} from '@sanity/icons/Play'\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, 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 = {}} = 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"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["Card","Box","Heading","getTheme_v2","styled","Root","Header","Footer","Content","theme","media","DashboardWidgetProps","header","children","React","ReactNode","footer","ref","Ref","HTMLDivElement","DashboardWidgetContainer","props","$","_c","t0","t1","t2","t3","createContext","useContext","DashboardConfig","DashboardContext","widgets","useDashboardConfig","Card","useMemo","DashboardWidget","useDashboardConfig","WidgetContainer","props","$","_c","config","t0","layout","Widget","component","t1","t2","height","width","useClient","useVersionedClient","$","_c","t0","Symbol","for","apiVersion","Box","Card","Stack","Heading","Grid","Label","Text","Code","Button","useEffect","useMemo","useState","Subscription","DashboardWidgetContainer","WidgetContainer","DashboardWidget","useVersionedClient","App","ProjectInfoProps","ProjectData","UserApplication","isUrl","url","test","getGraphQLUrl","projectId","dataset","getGroqUrl","getManageUrl","NO_EXPERIMENTAL","NO_DATA","ProjectInfo","props","$","_c","__experimental_before","t0","data","t1","undefined","studioApps","setStudioApps","graphQLApi","setGraphQLApi","versionedClient","t2","config","t3","t4","t5","observable","subscriptions","push","request","uri","tag","subscribe","next","result","filter","_temp","error","console","method","error_0","statusCode","forEach","_temp2","t6","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","Symbol","for","width","t10","t11","t12","t13","_temp7","t14","t15","t16","t17","item_2","_temp6","row","rowValue","wordBreak","widgetConfig","idx","item_0","s","unsubscribe","type","LayoutConfig","DashboardWidget","ProjectInfo","projectInfoWidget","config","layout","name","component","width","RobotIcon","Box","Flex","rem","Stack","Text","useListFormat","User","UserAvatar","styled","Root","ProjectUserProps","user","isRobot","roles","ProjectUser","t0","$","_c","t1","Symbol","for","style","listFormat","t2","t3","color","t4","displayName","t5","format","t6","t7","t8","Stack","Spinner","Box","Text","Button","useCallback","useEffect","useState","from","map","switchMap","Role","User","useUserStore","DashboardWidgetContainer","useVersionedClient","ProjectUser","getInviteUrl","projectId","Member","id","roles","isRobot","isCurrentUser","createdAt","Project","members","ProjectUsers","$","_c","project","setProject","users","setUsers","error","setError","userStore","versionedClient","t0","config","subscription","observable","request","uri","tag","pipe","_project","getUsers","_temp","_users","subscribe","next","t1","_users_0","_project_0","Array","isArray","sort","userA","userB","sortUsersByRobotStatus","e","unsubscribe","fetchData","t2","t3","handleRetryFetch","isLoading","t4","Symbol","for","t5","width","undefined","t6","t7","t8","user","membership","find","member","_temp2","t9","role","title","mem","membershipA","membershipB","LayoutConfig","DashboardWidget","ProjectUsers","projectUsersWidget","config","layout","name","component","createImageUrlBuilder","useMemo","useVersionedClient","tutorialsProjectConfig","projectId","dataset","Guide","_type","slug","current","presenter","name","FeedItem","_id","title","poster","category","guideOrTutorial","externalLink","hasVideo","useDataAdapter","$","_c","versionedClient","t0","templateRepoId","uri","observable","request","tag","withCredentials","t1","Symbol","for","t2","getFeed","urlBuilder","PlayIcon","Card","Box","Heading","Flex","Text","Stack","getTheme_v2","styled","PlayIconBox","theme","color","bg","Root","PosterCard","Poster","img","TutorialProps","title","posterURL","href","showPlayIcon","presenterName","presenterSubtitle","Tutorial","props","$","_c","t0","Symbol","for","position","t1","height","t2","t3","t4","t5","opacity","t6","t7","t8","t9","t10","Flex","useEffect","useState","DashboardWidgetContainer","FeedItem","useDataAdapter","Tutorial","createUrl","slug","current","type","SanityTutorialsProps","templateRepoId","SanityTutorials","props","$","_c","t0","Symbol","for","feedItems","setFeedItems","getFeed","urlBuilder","t1","t2","subscription","subscribe","response","items","unsubscribe","t3","map","feedItem","index","title","guideOrTutorial","externalLink","presenter","subtitle","category","t4","undefined","href","_type","_id","length","minWidth","width","name","hasVideo","poster","image","height","url","LayoutConfig","DashboardWidget","SanityTutorials","sanityTutorialsWidget","config","layout","name","component","width","Container","DashboardLayout","t0","$","_c","children","t1","Symbol","for","height","overflowY","t2","Box","Card","Grid","Text","getTheme_v2","styled","css","WidgetContainer","DashboardConfig","LayoutConfig","DashboardWidget","media","small","args","Parameters","theme","medium","Root","WidgetGroupProps","config","Partial","NO_WIDGETS","NO_LAYOUT","WidgetGroup","props","$","_c","t0","layout","t1","widgets","t2","undefined","t3","width","t4","height","t5","length","t6","map","_temp","t7","widgetConfig","index","type","component","name","DashboardLayout","WidgetGroup","DashboardConfig","DashboardContext","Dashboard","t0","$","_c","config","t1","t2","ComponentType","CSSProperties","definePlugin","Dashboard","DashboardConfig","DashboardWidget","LayoutConfig","strokeStyle","stroke","strokeWidth","DashboardIcon","$","_c","t0","Symbol","for","DashboardPluginConfig","title","name","icon","widgets","defaultLayout","dashboardTool","config","pluginConfig","layout","tools","component"],"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 {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 ref?: React.Ref<HTMLDivElement>\n}\n\nexport function DashboardWidgetContainer(props: DashboardWidgetProps) {\n const {header, children, footer, ref} = 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/Robot'\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-users',\n component: ProjectUsers,\n layout: config?.layout,\n }\n}\n","import {createImageUrlBuilder} 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: createImageUrlBuilder(tutorialsProjectConfig),\n }),\n [versionedClient],\n )\n}\n","import {PlayIcon} from '@sanity/icons/Play'\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, 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 = {}} = 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"],"mappings":"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"}
\ No newline at end of file Index: package/README.md
===================================================================
--- package/README.md
+++ package/README.md
@@ -71,11 +71,9 @@
dashboardTool({
name: 'stats',
title: 'Statistics',
icon: ActivityIcon,
- widgets: [
- /* ... */
- ],
+ widgets: [/* ... */],
})
```
## How to install a widget