@dxos/plugin-devtools 0.13.0 → 0.14.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.
- package/dist/lib/chunk-GithubPanel.mjs +8 -3
- package/dist/lib/chunk-GithubPanel.mjs.map +1 -1
- package/dist/lib/chunk-RegistryArticle.mjs +21 -16
- package/dist/lib/chunk-RegistryArticle.mjs.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +32 -32
- package/src/containers/GithubPanel/GithubPanel.tsx +4 -2
- package/src/containers/RegistryArticle/RegistryArticle.tsx +7 -7
|
@@ -2,9 +2,9 @@ import { meta } from "#meta";
|
|
|
2
2
|
import { createContext, useContext, useEffect, useState } from "react";
|
|
3
3
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
4
|
import * as ScrollArea from "@dxos/react-ui/ScrollArea";
|
|
5
|
+
import * as Layout from "@dxos/react-ui/Layout";
|
|
5
6
|
import * as Button from "@dxos/react-ui/Button";
|
|
6
7
|
import * as Hooks from "@dxos/react-ui/Hooks";
|
|
7
|
-
import * as Layout from "@dxos/react-ui/Layout";
|
|
8
8
|
//#region src/containers/GithubPanel/GithubComponent.tsx
|
|
9
9
|
var DEFAULT_REPO = "dxos/dxos";
|
|
10
10
|
var DEFAULT_LIMIT = 20;
|
|
@@ -152,8 +152,13 @@ var GithubComponent = {
|
|
|
152
152
|
};
|
|
153
153
|
//#endregion
|
|
154
154
|
//#region src/containers/GithubPanel/GithubPanel.tsx
|
|
155
|
-
var GithubPanel = () => /* @__PURE__ */ jsx(GithubComponent.Root, { children: /* @__PURE__ */ jsxs(
|
|
156
|
-
|
|
155
|
+
var GithubPanel = () => /* @__PURE__ */ jsx(GithubComponent.Root, { children: /* @__PURE__ */ jsxs(Layout.Grid, {
|
|
156
|
+
rows: [
|
|
157
|
+
"auto",
|
|
158
|
+
"fill",
|
|
159
|
+
"auto"
|
|
160
|
+
],
|
|
161
|
+
classNames: "dx-fill overflow-hidden",
|
|
157
162
|
children: [
|
|
158
163
|
/* @__PURE__ */ jsx(GithubComponent.Header, {}),
|
|
159
164
|
/* @__PURE__ */ jsx(GithubComponent.Content, {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-GithubPanel.mjs","names":[],"sources":["../../src/containers/GithubPanel/GithubComponent.tsx","../../src/containers/GithubPanel/GithubPanel.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { type ReactNode, createContext, useContext, useEffect, useState } from 'react';\n\nimport * as Button from '@dxos/react-ui/Button';\nimport * as Hooks from '@dxos/react-ui/Hooks';\nimport * as Layout from '@dxos/react-ui/Layout';\nimport * as ScrollArea from '@dxos/react-ui/ScrollArea';\n\nimport { meta } from '#meta';\n\nconst DEFAULT_REPO = 'dxos/dxos';\nconst DEFAULT_LIMIT = 20;\n\ntype GithubUser = {\n login: string;\n avatar_url: string;\n html_url: string;\n};\n\ntype GithubPullRequest = {\n number: number;\n title: string;\n html_url: string;\n merged_at: string | null;\n user: GithubUser;\n};\n\ntype ComponentContextValue = {\n repo: string;\n pulls: GithubPullRequest[];\n unavailable: boolean;\n};\n\nconst ComponentContext = createContext<ComponentContextValue | null>(null);\n\nconst useComponentContext = () => {\n const ctx = useContext(ComponentContext);\n if (!ctx) {\n throw new Error('GithubComponent.* parts must be rendered inside GithubComponent.Root.');\n }\n return ctx;\n};\n\nexport type GithubComponentRootProps = {\n /** `<owner>/<name>`. Defaults to `dxos/dxos`. */\n repo?: string;\n /** Maximum number of merged PRs to fetch. */\n limit?: number;\n children?: ReactNode;\n};\n\nconst Root = ({ repo = DEFAULT_REPO, limit = DEFAULT_LIMIT, children }: GithubComponentRootProps) => {\n const [pulls, setPulls] = useState<GithubPullRequest[]>([]);\n const [unavailable, setUnavailable] = useState(false);\n\n useEffect(() => {\n const controller = new AbortController();\n setPulls([]);\n setUnavailable(false);\n void (async () => {\n try {\n const url = new URL(`https://api.github.com/repos/${repo}/pulls`);\n url.searchParams.set('state', 'closed');\n url.searchParams.set('sort', 'updated');\n url.searchParams.set('direction', 'desc');\n url.searchParams.set('per_page', String(limit * 2));\n const response = await fetch(url.toString(), {\n signal: controller.signal,\n headers: { Accept: 'application/vnd.github+json' },\n });\n if (!response.ok) {\n setUnavailable(true);\n return;\n }\n const items = (await response.json()) as GithubPullRequest[];\n setPulls(items.filter((pull) => pull.merged_at !== null).slice(0, limit));\n setUnavailable(false);\n } catch {\n if (controller.signal.aborted) {\n return;\n }\n setPulls([]);\n setUnavailable(true);\n }\n })();\n return () => controller.abort();\n }, [repo, limit]);\n\n return <ComponentContext.Provider value={{ repo, pulls, unavailable }}>{children}</ComponentContext.Provider>;\n};\n\nconst Header = () => {\n const { t } = Hooks.useTranslation(meta.profile.key);\n const { repo, pulls, unavailable } = useComponentContext();\n return (\n <header className='flex items-center justify-between gap-1 px-4 py-3 dx-modal-surface border-b border-separator-subtle'>\n <a\n href={`https://github.com/${repo}`}\n target='_blank'\n rel='noopener noreferrer'\n className='text-sm font-medium truncate'\n >\n @{repo}\n </a>\n <div className='text-xs text-fg-muted'>\n {unavailable\n ? t('github-unavailable.message')\n : pulls.length > 0\n ? t('recent-prs.label', { count: pulls.length })\n : t('github-loading.message')}\n </div>\n </header>\n );\n};\n\nconst RELATIVE_UNITS: Array<[Intl.RelativeTimeFormatUnit, number]> = [\n ['year', 60 * 60 * 24 * 365],\n ['month', 60 * 60 * 24 * 30],\n ['week', 60 * 60 * 24 * 7],\n ['day', 60 * 60 * 24],\n ['hour', 60 * 60],\n ['minute', 60],\n];\n\nconst formatRelative = (iso: string): string => {\n const formatter = new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' });\n const diffSeconds = (Date.parse(iso) - Date.now()) / 1000;\n const absDiff = Math.abs(diffSeconds);\n for (const [unit, secondsInUnit] of RELATIVE_UNITS) {\n if (absDiff >= secondsInUnit) {\n return formatter.format(Math.round(diffSeconds / secondsInUnit), unit);\n }\n }\n return formatter.format(Math.round(diffSeconds), 'second');\n};\n\nconst PullRow = ({ pull }: { pull: GithubPullRequest }) => (\n <li>\n <Layout.Flex asChild align='start' gap='sm' classNames='px-trim-sm py-trim-xs rounded-sm hover:bg-hover-surface'>\n <a href={pull.html_url} target='_blank' rel='noopener noreferrer'>\n <img src={pull.user.avatar_url} alt='' className='size-6 rounded-full shrink-0' />\n <Layout.Flex column classNames='min-w-0 flex-1'>\n {/* `leading-6` gives the title the avatar's line box, so the two align on their own. */}\n <span className='text-sm leading-6 truncate'>{pull.title}</span>\n <span className='text-xs text-fg-muted truncate'>\n #{pull.number} · {pull.user.login} · {pull.merged_at ? formatRelative(pull.merged_at) : ''}\n </span>\n </Layout.Flex>\n </a>\n </Layout.Flex>\n </li>\n);\n\nconst Content = () => {\n const { pulls } = useComponentContext();\n return (\n <ScrollArea.Root orientation='vertical'>\n <ScrollArea.Viewport>\n <ul className='flex flex-col p-1'>\n {pulls.map((pull) => (\n <PullRow key={pull.number} pull={pull} />\n ))}\n </ul>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n );\n};\n\nconst StatusBar = () => {\n const { t } = Hooks.useTranslation(meta.profile.key);\n const { repo } = useComponentContext();\n return (\n <Button.Root\n icon='ph--github-logo--regular'\n label={t('view-on-github.button')}\n variant='primary'\n classNames='w-full'\n onClick={() => {\n window.open(`https://github.com/${repo}`, '_blank', 'noopener,noreferrer');\n }}\n />\n );\n};\n\nexport const GithubComponent = {\n Root,\n Header,\n Content,\n StatusBar,\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport React from 'react';\n\nimport { GithubComponent } from './GithubComponent.tsx';\n\nexport const GithubPanel = () => (\n <GithubComponent.Root>\n <div className='dx-fill grid grid-rows-[auto_minmax(0,1fr)_auto] overflow-hidden'>\n <GithubComponent.Header />\n <GithubComponent.Content />\n <GithubComponent.StatusBar />\n </div>\n </GithubComponent.Root>\n);\n\nGithubPanel.displayName = 'GithubPanel';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chunk-GithubPanel.mjs","names":[],"sources":["../../src/containers/GithubPanel/GithubComponent.tsx","../../src/containers/GithubPanel/GithubPanel.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { type ReactNode, createContext, useContext, useEffect, useState } from 'react';\n\nimport * as Button from '@dxos/react-ui/Button';\nimport * as Hooks from '@dxos/react-ui/Hooks';\nimport * as Layout from '@dxos/react-ui/Layout';\nimport * as ScrollArea from '@dxos/react-ui/ScrollArea';\n\nimport { meta } from '#meta';\n\nconst DEFAULT_REPO = 'dxos/dxos';\nconst DEFAULT_LIMIT = 20;\n\ntype GithubUser = {\n login: string;\n avatar_url: string;\n html_url: string;\n};\n\ntype GithubPullRequest = {\n number: number;\n title: string;\n html_url: string;\n merged_at: string | null;\n user: GithubUser;\n};\n\ntype ComponentContextValue = {\n repo: string;\n pulls: GithubPullRequest[];\n unavailable: boolean;\n};\n\nconst ComponentContext = createContext<ComponentContextValue | null>(null);\n\nconst useComponentContext = () => {\n const ctx = useContext(ComponentContext);\n if (!ctx) {\n throw new Error('GithubComponent.* parts must be rendered inside GithubComponent.Root.');\n }\n return ctx;\n};\n\nexport type GithubComponentRootProps = {\n /** `<owner>/<name>`. Defaults to `dxos/dxos`. */\n repo?: string;\n /** Maximum number of merged PRs to fetch. */\n limit?: number;\n children?: ReactNode;\n};\n\nconst Root = ({ repo = DEFAULT_REPO, limit = DEFAULT_LIMIT, children }: GithubComponentRootProps) => {\n const [pulls, setPulls] = useState<GithubPullRequest[]>([]);\n const [unavailable, setUnavailable] = useState(false);\n\n useEffect(() => {\n const controller = new AbortController();\n setPulls([]);\n setUnavailable(false);\n void (async () => {\n try {\n const url = new URL(`https://api.github.com/repos/${repo}/pulls`);\n url.searchParams.set('state', 'closed');\n url.searchParams.set('sort', 'updated');\n url.searchParams.set('direction', 'desc');\n url.searchParams.set('per_page', String(limit * 2));\n const response = await fetch(url.toString(), {\n signal: controller.signal,\n headers: { Accept: 'application/vnd.github+json' },\n });\n if (!response.ok) {\n setUnavailable(true);\n return;\n }\n const items = (await response.json()) as GithubPullRequest[];\n setPulls(items.filter((pull) => pull.merged_at !== null).slice(0, limit));\n setUnavailable(false);\n } catch {\n if (controller.signal.aborted) {\n return;\n }\n setPulls([]);\n setUnavailable(true);\n }\n })();\n return () => controller.abort();\n }, [repo, limit]);\n\n return <ComponentContext.Provider value={{ repo, pulls, unavailable }}>{children}</ComponentContext.Provider>;\n};\n\nconst Header = () => {\n const { t } = Hooks.useTranslation(meta.profile.key);\n const { repo, pulls, unavailable } = useComponentContext();\n return (\n <header className='flex items-center justify-between gap-1 px-4 py-3 dx-modal-surface border-b border-separator-subtle'>\n <a\n href={`https://github.com/${repo}`}\n target='_blank'\n rel='noopener noreferrer'\n className='text-sm font-medium truncate'\n >\n @{repo}\n </a>\n <div className='text-xs text-fg-muted'>\n {unavailable\n ? t('github-unavailable.message')\n : pulls.length > 0\n ? t('recent-prs.label', { count: pulls.length })\n : t('github-loading.message')}\n </div>\n </header>\n );\n};\n\nconst RELATIVE_UNITS: Array<[Intl.RelativeTimeFormatUnit, number]> = [\n ['year', 60 * 60 * 24 * 365],\n ['month', 60 * 60 * 24 * 30],\n ['week', 60 * 60 * 24 * 7],\n ['day', 60 * 60 * 24],\n ['hour', 60 * 60],\n ['minute', 60],\n];\n\nconst formatRelative = (iso: string): string => {\n const formatter = new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' });\n const diffSeconds = (Date.parse(iso) - Date.now()) / 1000;\n const absDiff = Math.abs(diffSeconds);\n for (const [unit, secondsInUnit] of RELATIVE_UNITS) {\n if (absDiff >= secondsInUnit) {\n return formatter.format(Math.round(diffSeconds / secondsInUnit), unit);\n }\n }\n return formatter.format(Math.round(diffSeconds), 'second');\n};\n\nconst PullRow = ({ pull }: { pull: GithubPullRequest }) => (\n <li>\n <Layout.Flex asChild align='start' gap='sm' classNames='px-trim-sm py-trim-xs rounded-sm hover:bg-hover-surface'>\n <a href={pull.html_url} target='_blank' rel='noopener noreferrer'>\n <img src={pull.user.avatar_url} alt='' className='size-6 rounded-full shrink-0' />\n <Layout.Flex column classNames='min-w-0 flex-1'>\n {/* `leading-6` gives the title the avatar's line box, so the two align on their own. */}\n <span className='text-sm leading-6 truncate'>{pull.title}</span>\n <span className='text-xs text-fg-muted truncate'>\n #{pull.number} · {pull.user.login} · {pull.merged_at ? formatRelative(pull.merged_at) : ''}\n </span>\n </Layout.Flex>\n </a>\n </Layout.Flex>\n </li>\n);\n\nconst Content = () => {\n const { pulls } = useComponentContext();\n return (\n <ScrollArea.Root orientation='vertical'>\n <ScrollArea.Viewport>\n <ul className='flex flex-col p-1'>\n {pulls.map((pull) => (\n <PullRow key={pull.number} pull={pull} />\n ))}\n </ul>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n );\n};\n\nconst StatusBar = () => {\n const { t } = Hooks.useTranslation(meta.profile.key);\n const { repo } = useComponentContext();\n return (\n <Button.Root\n icon='ph--github-logo--regular'\n label={t('view-on-github.button')}\n variant='primary'\n classNames='w-full'\n onClick={() => {\n window.open(`https://github.com/${repo}`, '_blank', 'noopener,noreferrer');\n }}\n />\n );\n};\n\nexport const GithubComponent = {\n Root,\n Header,\n Content,\n StatusBar,\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport React from 'react';\n\nimport * as Layout from '@dxos/react-ui/Layout';\n\nimport { GithubComponent } from './GithubComponent.tsx';\n\nexport const GithubPanel = () => (\n <GithubComponent.Root>\n <Layout.Grid rows={['auto', 'fill', 'auto']} classNames='dx-fill overflow-hidden'>\n <GithubComponent.Header />\n <GithubComponent.Content />\n <GithubComponent.StatusBar />\n </Layout.Grid>\n </GithubComponent.Root>\n);\n\nGithubPanel.displayName = 'GithubPanel';\n"],"mappings":";;;;;;;;AAaA,IAAM,eAAe;AACrB,IAAM,gBAAgB;AAsBtB,IAAM,mBAAmB,cAA4C,IAAI;AAEzE,IAAM,4BAA4B;CAChC,MAAM,MAAM,WAAW,gBAAgB;CACvC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,uEAAuE;CAEzF,OAAO;AACT;AAUA,IAAM,QAAQ,EAAE,OAAO,cAAc,QAAQ,eAAe,eAAyC;CACnG,MAAM,CAAC,OAAO,YAAY,SAA8B,CAAC,CAAC;CAC1D,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;CAEpD,gBAAgB;EACd,MAAM,aAAa,IAAI,gBAAgB;EACvC,SAAS,CAAC,CAAC;EACX,eAAe,KAAK;EACpB,CAAM,YAAY;GAChB,IAAI;IACF,MAAM,MAAM,IAAI,IAAI,gCAAgC,KAAK,OAAO;IAChE,IAAI,aAAa,IAAI,SAAS,QAAQ;IACtC,IAAI,aAAa,IAAI,QAAQ,SAAS;IACtC,IAAI,aAAa,IAAI,aAAa,MAAM;IACxC,IAAI,aAAa,IAAI,YAAY,OAAO,QAAQ,CAAC,CAAC;IAClD,MAAM,WAAW,MAAM,MAAM,IAAI,SAAS,GAAG;KAC3C,QAAQ,WAAW;KACnB,SAAS,EAAE,QAAQ,8BAA8B;IACnD,CAAC;IACD,IAAI,CAAC,SAAS,IAAI;KAChB,eAAe,IAAI;KACnB;IACF;IACA,MAAM,QAAS,MAAM,SAAS,KAAK;IACnC,SAAS,MAAM,QAAQ,SAAS,KAAK,cAAc,IAAI,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC;IACxE,eAAe,KAAK;GACtB,QAAQ;IACN,IAAI,WAAW,OAAO,SACpB;IAEF,SAAS,CAAC,CAAC;IACX,eAAe,IAAI;GACrB;EACF,EAAA,CAAG;EACH,aAAa,WAAW,MAAM;CAChC,GAAG,CAAC,MAAM,KAAK,CAAC;CAEhB,OAAO,oBAAC,iBAAiB,UAAlB;EAA2B,OAAO;GAAE;GAAM;GAAO;EAAY;EAAI;CAAoC,CAAA;AAC9G;AAEA,IAAM,eAAe;CACnB,MAAM,EAAE,MAAM,MAAM,eAAe,KAAK,QAAQ,GAAG;CACnD,MAAM,EAAE,MAAM,OAAO,gBAAgB,oBAAoB;CACzD,OACE,qBAAC,UAAD;EAAQ,WAAU;EAAlB,UAAA,CACE,qBAAC,KAAD;GACE,MAAM,sBAAsB;GAC5B,QAAO;GACP,KAAI;GACJ,WAAU;GAJZ,UAAA,CAKA,KACI,IACD;EACH,CAAA,GAAA,oBAAC,OAAD;GAAK,WAAU;GACZ,UAAA,cACG,EAAE,4BAA4B,IAC9B,MAAM,SAAS,IACb,EAAE,oBAAoB,EAAE,OAAO,MAAM,OAAO,CAAC,IAC7C,EAAE,wBAAwB;EAC7B,CAAA,CACC;;AAEZ;AAEA,IAAM,iBAA+D;CACnE,CAAC,QAAQ,OAAkB;CAC3B,CAAC,SAAS,MAAiB;CAC3B,CAAC,QAAQ,MAAgB;CACzB,CAAC,OAAO,KAAY;CACpB,CAAC,QAAQ,IAAO;CAChB,CAAC,UAAU,EAAE;AACf;AAEA,IAAM,kBAAkB,QAAwB;CAC9C,MAAM,YAAY,IAAI,KAAK,mBAAmB,KAAA,GAAW,EAAE,SAAS,OAAO,CAAC;CAC5E,MAAM,eAAe,KAAK,MAAM,GAAG,IAAI,KAAK,IAAI,KAAK;CACrD,MAAM,UAAU,KAAK,IAAI,WAAW;CACpC,KAAK,MAAM,CAAC,MAAM,kBAAkB,gBAClC,IAAI,WAAW,eACb,OAAO,UAAU,OAAO,KAAK,MAAM,cAAc,aAAa,GAAG,IAAI;CAGzE,OAAO,UAAU,OAAO,KAAK,MAAM,WAAW,GAAG,QAAQ;AAC3D;AAEA,IAAM,WAAW,EAAE,WACjB,oBAAC,MAAD,EAAA,UACE,oBAAC,OAAO,MAAR;CAAa,SAAA;CAAQ,OAAM;CAAQ,KAAI;CAAK,YAAW;CACrD,UAAA,qBAAC,KAAD;EAAG,MAAM,KAAK;EAAU,QAAO;EAAS,KAAI;EAA5C,UAAA,CACE,oBAAC,OAAD;GAAK,KAAK,KAAK,KAAK;GAAY,KAAI;GAAG,WAAU;EAAgC,CAAA,GACjF,qBAAC,OAAO,MAAR;GAAa,QAAA;GAAO,YAAW;GAA/B,UAAA,CAEE,oBAAC,QAAD;IAAM,WAAU;IAA8B,UAAA,KAAK;GAAY,CAAA,GAC/D,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA;KAAgD;KAC5C,KAAK;KAAO;KAAI,KAAK,KAAK;KAAM;KAAI,KAAK,YAAY,eAAe,KAAK,SAAS,IAAI;IACpF;GACK,CAAA,CAAA;EACZ,CAAA,CAAA;;AACQ,CAAA,EACX,CAAA;AAGN,IAAM,gBAAgB;CACpB,MAAM,EAAE,UAAU,oBAAoB;CACtC,OACE,oBAAC,WAAW,MAAZ;EAAiB,aAAY;EAC3B,UAAA,oBAAC,WAAW,UAAZ,EAAA,UACE,oBAAC,MAAD;GAAI,WAAU;GACX,UAAA,MAAM,KAAK,SACV,oBAAC,SAAD,EAAiC,KAAO,GAA1B,KAAK,MAAqB,CACzC;EACC,CAAA,EACe,CAAA;CACN,CAAA;AAErB;AAEA,IAAM,kBAAkB;CACtB,MAAM,EAAE,MAAM,MAAM,eAAe,KAAK,QAAQ,GAAG;CACnD,MAAM,EAAE,SAAS,oBAAoB;CACrC,OACE,oBAAC,OAAO,MAAR;EACE,MAAK;EACL,OAAO,EAAE,uBAAuB;EAChC,SAAQ;EACR,YAAW;EACX,eAAe;GACb,OAAO,KAAK,sBAAsB,QAAQ,UAAU,qBAAqB;EAC3E;CACD,CAAA;AAEL;AAEA,IAAa,kBAAkB;CAC7B;CACA;CACA;CACA;AACF;;;ACtLA,IAAa,oBACX,oBAAC,gBAAgB,MAAjB,EAAA,UACE,qBAAC,OAAO,MAAR;CAAa,MAAM;EAAC;EAAQ;EAAQ;CAAM;CAAG,YAAW;CAAxD,UAAA;EACE,oBAAC,gBAAgB,QAAjB,CAAyB,CAAA;EACzB,oBAAC,gBAAgB,SAAjB,CAA0B,CAAA;EAC1B,oBAAC,gBAAgB,WAAjB,CAA4B,CAAA;CACjB;AACO,CAAA,EAAA,CAAA;AAGxB,YAAY,cAAc"}
|
|
@@ -5,9 +5,9 @@ import { Entity, Format, Obj, Type } from "@dxos/echo";
|
|
|
5
5
|
import { useClient } from "@dxos/react-client";
|
|
6
6
|
import * as Panel from "@dxos/react-ui/Panel";
|
|
7
7
|
import * as Operation from "@dxos/compute/Operation";
|
|
8
|
+
import * as Layout from "@dxos/react-ui/Layout";
|
|
8
9
|
import { DynamicTable } from "@dxos/react-ui-table";
|
|
9
10
|
import * as Toolbar from "@dxos/react-ui/Toolbar";
|
|
10
|
-
import { mx } from "@dxos/ui-theme";
|
|
11
11
|
//#region src/containers/RegistryArticle/RegistryArticle.tsx
|
|
12
12
|
var textFilter = (text) => {
|
|
13
13
|
if (!text) return () => true;
|
|
@@ -101,21 +101,26 @@ var RegistryArticle = ({ role }) => {
|
|
|
101
101
|
children: [/* @__PURE__ */ jsx(Panel.Header, { children: /* @__PURE__ */ jsx(Toolbar.Root, { children: /* @__PURE__ */ jsx(Searchbar, {
|
|
102
102
|
placeholder: "Filter...",
|
|
103
103
|
onChange: setFilter
|
|
104
|
-
}) }) }), /* @__PURE__ */ jsx(Panel.Body, {
|
|
105
|
-
|
|
106
|
-
children:
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
104
|
+
}) }) }), /* @__PURE__ */ jsx(Panel.Body, {
|
|
105
|
+
asChild: true,
|
|
106
|
+
children: /* @__PURE__ */ jsxs(Layout.Grid, {
|
|
107
|
+
cols: [2, 1],
|
|
108
|
+
classNames: "overflow-hidden",
|
|
109
|
+
children: [/* @__PURE__ */ jsx(Layout.Flex, {
|
|
110
|
+
column: true,
|
|
111
|
+
classNames: "dx-grow overflow-hidden",
|
|
112
|
+
children: /* @__PURE__ */ jsx(DynamicTable, {
|
|
113
|
+
properties,
|
|
114
|
+
rows,
|
|
115
|
+
features,
|
|
116
|
+
onRowClick: handleRowClicked
|
|
117
|
+
})
|
|
118
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
119
|
+
className: "h-full overflow-auto border-s border-separator text-sm",
|
|
120
|
+
children: detailJson ? /* @__PURE__ */ jsx(JsonView, { data: detailJson }) : /* @__PURE__ */ jsx(Placeholder, { label: "Details" })
|
|
121
|
+
})]
|
|
122
|
+
})
|
|
123
|
+
})]
|
|
119
124
|
});
|
|
120
125
|
};
|
|
121
126
|
RegistryArticle.displayName = "RegistryArticle";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-RegistryArticle.mjs","names":[],"sources":["../../src/containers/RegistryArticle/RegistryArticle.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport * as Operation from '@dxos/compute/Operation';\nimport { JsonView, Placeholder, Searchbar } from '@dxos/devtools';\nimport { Entity, Format, Obj, Type } from '@dxos/echo';\nimport { useClient } from '@dxos/react-client';\nimport { DynamicTable, type TableFeatures } from '@dxos/react-ui-table';\nimport * as
|
|
1
|
+
{"version":3,"file":"chunk-RegistryArticle.mjs","names":[],"sources":["../../src/containers/RegistryArticle/RegistryArticle.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport * as Operation from '@dxos/compute/Operation';\nimport { JsonView, Placeholder, Searchbar } from '@dxos/devtools';\nimport { Entity, Format, Obj, Type } from '@dxos/echo';\nimport { useClient } from '@dxos/react-client';\nimport { DynamicTable, type TableFeatures } from '@dxos/react-ui-table';\nimport * as Layout from '@dxos/react-ui/Layout';\nimport * as Panel from '@dxos/react-ui/Panel';\nimport * as Toolbar from '@dxos/react-ui/Toolbar';\n\ntype RegistryRow = {\n id: string;\n kind: string;\n label: string;\n _entity: Entity.Unknown;\n};\n\nconst textFilter = (text?: string) => {\n if (!text) {\n return () => true;\n }\n\n const matcher = new RegExp(text, 'i');\n return (entity: Entity.Unknown) => {\n const typename = Entity.getTypename(entity) ?? '';\n const metaKey = Obj.isObject(entity) ? (Obj.getMeta(entity).key ?? '') : '';\n const uri = Type.isType(entity) ? (Type.getURI(entity)?.toString() ?? '') : '';\n const operationKey =\n Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)\n ? (Operation.getKey(entity) ?? '')\n : '';\n const name = Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity) ? entity.name : '';\n return [typename, metaKey, uri, operationKey, name, getEntityId(entity)].some((value) => value.match(matcher));\n };\n};\n\nconst getEntityId = (entity: Entity.Unknown): string => {\n if (entity.id) {\n return entity.id;\n }\n if (Type.isType(entity)) {\n return Type.getURI(entity)?.toString() ?? Type.getTypename(entity) ?? 'unknown-type';\n }\n return Entity.getTypename(entity) ?? 'unknown';\n};\n\nconst getKind = (entity: Entity.Unknown): string => {\n if (Type.isType(entity)) {\n return 'type';\n }\n if (Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)) {\n return 'operation';\n }\n return 'other';\n};\n\nconst getLabel = (entity: Entity.Unknown): string => {\n if (Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)) {\n return entity.name || Operation.getKey(entity) || getEntityId(entity);\n }\n if (Type.isType(entity)) {\n return Type.getTypename(entity) ?? getEntityId(entity);\n }\n return getEntityId(entity);\n};\n\nconst toDetailJson = (entity: Entity.Unknown): object => {\n if (Type.isType(entity)) {\n return {\n id: getEntityId(entity),\n typename: Type.getTypename(entity),\n uri: Type.getURI(entity)?.toString(),\n version: Type.getVersion(entity),\n jsonSchema: entity.jsonSchema,\n };\n }\n if (Obj.isObject(entity)) {\n return Obj.toJSON(entity);\n }\n return { id: getEntityId(entity), typename: Entity.getTypename(entity) };\n};\n\nexport const RegistryArticle = ({ role }: { role?: string }) => {\n const client = useClient();\n const [entities, setEntities] = useState<Entity.Unknown[]>([]);\n const [filter, setFilter] = useState('');\n const [selected, setSelected] = useState<Entity.Unknown>();\n\n useEffect(() => {\n const registry = client.graph.registry;\n const refresh = () => setEntities([...registry.list()]);\n refresh();\n return registry.changed.on(refresh);\n }, [client]);\n\n const properties = useMemo(\n () => [\n { name: 'kind', format: Format.TypeFormat.String, size: 100 },\n { name: 'label', format: Format.TypeFormat.String },\n { name: 'id', format: Format.TypeFormat.String, size: 280 },\n ],\n [],\n );\n\n const rows = useMemo((): RegistryRow[] => {\n return entities\n .filter(textFilter(filter))\n .map((entity) => ({\n id: getEntityId(entity),\n kind: getKind(entity),\n label: getLabel(entity),\n _entity: entity,\n }))\n .toSorted((left, right) => left.label.localeCompare(right.label));\n }, [entities, filter]);\n\n const handleRowClicked = useCallback((row: RegistryRow | undefined) => {\n if (!row?._entity) {\n return;\n }\n setSelected(row._entity);\n }, []);\n\n const detailJson = useMemo(() => (selected ? toDetailJson(selected) : undefined), [selected]);\n\n const features: Partial<TableFeatures> = useMemo(() => ({ selection: { enabled: true, mode: 'single' } }), []);\n\n return (\n <Panel.Root role={role}>\n <Panel.Header>\n <Toolbar.Root>\n <Searchbar placeholder='Filter...' onChange={setFilter} />\n </Toolbar.Root>\n </Panel.Header>\n <Panel.Body asChild>\n <Layout.Grid cols={[2, 1]} classNames='overflow-hidden'>\n <Layout.Flex column classNames='dx-grow overflow-hidden'>\n <DynamicTable properties={properties} rows={rows} features={features} onRowClick={handleRowClicked} />\n </Layout.Flex>\n <div className='h-full overflow-auto border-s border-separator text-sm'>\n {detailJson ? <JsonView data={detailJson} /> : <Placeholder label='Details' />}\n </div>\n </Layout.Grid>\n </Panel.Body>\n </Panel.Root>\n );\n};\n\nRegistryArticle.displayName = 'RegistryArticle';\n"],"mappings":"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"}
|