153 lines
4.8 KiB
TypeScript
153 lines
4.8 KiB
TypeScript
import {
|
|
CogIcon,
|
|
CpuChipIcon,
|
|
DocumentIcon,
|
|
InformationCircleIcon,
|
|
} from '@heroicons/react/24/outline';
|
|
import { DocumentMetadata } from '@nx/nx-dev/models-document';
|
|
import { FileMetadata } from '@nx/nx-dev/models-package';
|
|
import { renderMarkdown } from '@nx/nx-dev/ui-markdoc';
|
|
import Link from 'next/link';
|
|
import React from 'react';
|
|
|
|
export function DocumentList({
|
|
documents,
|
|
}: {
|
|
documents: DocumentMetadata[];
|
|
}): JSX.Element {
|
|
return (
|
|
<ul className="divide-y divide-slate-100 dark:divide-slate-800">
|
|
{!!documents.length ? (
|
|
documents.map((guide) => (
|
|
<DocumentListItem key={guide.id} document={guide} />
|
|
))
|
|
) : (
|
|
<EmptyList type="document" />
|
|
)}
|
|
</ul>
|
|
);
|
|
}
|
|
|
|
function DocumentListItem({
|
|
document,
|
|
}: {
|
|
document: DocumentMetadata;
|
|
}): JSX.Element {
|
|
return (
|
|
<li
|
|
key={document.name}
|
|
className="relative flex px-2 py-2 transition focus-within:ring-2 focus-within:ring-blue-500 focus-within:ring-offset-2 hover:bg-slate-50 dark:focus-within:ring-sky-500 dark:hover:bg-slate-800/60"
|
|
>
|
|
<div className="flex-shrink-0 self-start rounded-lg border-slate-200 bg-slate-100 p-2 dark:border-slate-600 dark:bg-slate-700">
|
|
<DocumentIcon className="h-5 w-5" role="img" />
|
|
</div>
|
|
<div className="ml-3 py-2">
|
|
<p className="text-sm font-bold">
|
|
<Link href={document.path} className="focus:outline-none">
|
|
<span className="absolute inset-0" aria-hidden="true"></span>
|
|
{document.name}
|
|
</Link>
|
|
</p>
|
|
</div>
|
|
</li>
|
|
);
|
|
}
|
|
|
|
export function SchemaList({
|
|
files,
|
|
type,
|
|
}: {
|
|
files: FileMetadata[];
|
|
type: 'executor' | 'generator';
|
|
}): JSX.Element {
|
|
return (
|
|
<ul className="divide-y divide-slate-100 dark:divide-slate-800">
|
|
{!!files.length ? (
|
|
files.map((schema) => (
|
|
<SchemaListItem key={schema.name} file={schema} />
|
|
))
|
|
) : (
|
|
<EmptyList type={type} />
|
|
)}
|
|
</ul>
|
|
);
|
|
}
|
|
|
|
function SchemaListItem({ file }: { file: FileMetadata }): JSX.Element {
|
|
return (
|
|
<li
|
|
key={file.name}
|
|
className="relative flex px-2 py-2 transition focus-within:ring-2 focus-within:ring-blue-500 focus-within:ring-offset-2 hover:bg-slate-50 dark:focus-within:ring-sky-500 dark:hover:bg-slate-800/60"
|
|
>
|
|
<div className="flex-shrink-0 self-start rounded-lg border-slate-200 bg-slate-100 p-2 dark:border-slate-600 dark:bg-slate-700">
|
|
{file.type === 'executor' ? (
|
|
<CpuChipIcon className="h-5 w-5 " role="img" />
|
|
) : (
|
|
<CogIcon className="h-5 w-5" role="img" />
|
|
)}
|
|
</div>
|
|
<div className="ml-3 py-2">
|
|
<p className="text-sm font-bold">
|
|
<Link href={file.path} className="focus:outline-none">
|
|
<span className="absolute inset-0" aria-hidden="true"></span>
|
|
{file.name}
|
|
</Link>
|
|
|
|
{file.hidden && (
|
|
<span className="ml-4 inline-flex rounded-md border border-red-100 bg-red-50 px-2 py-1 text-xs font-medium uppercase text-red-600 dark:border-red-900 dark:bg-red-900/30 dark:text-red-400">
|
|
Internal
|
|
</span>
|
|
)}
|
|
</p>
|
|
<div className="prose prose-slate dark:prose-invert prose-sm">
|
|
{
|
|
renderMarkdown(file.description, {
|
|
filePath: '',
|
|
}).node
|
|
}
|
|
</div>
|
|
</div>
|
|
</li>
|
|
);
|
|
}
|
|
|
|
function EmptyList({
|
|
type,
|
|
}: {
|
|
type: 'executor' | 'generator' | 'document';
|
|
}): JSX.Element {
|
|
return (
|
|
<li className="relative flex px-2 py-2 transition focus-within:ring-2 focus-within:ring-blue-500 focus-within:ring-offset-2 hover:bg-slate-50 dark:focus-within:ring-sky-500 dark:hover:bg-slate-800/60">
|
|
<div className="flex-shrink-0 self-start rounded-lg border-slate-200 bg-slate-100 p-2 dark:border-slate-600 dark:bg-slate-700">
|
|
<InformationCircleIcon
|
|
className="h-5 w-5 flex-shrink-0 rounded-md border-slate-200 bg-slate-50 dark:bg-slate-800 dark:bg-slate-700"
|
|
role="img"
|
|
/>
|
|
</div>
|
|
<div className="ml-3 py-2">
|
|
<p className="text-sm font-medium">
|
|
<Link
|
|
href="https://github.com/nrwl/nx/discussions"
|
|
className="focus:outline-none"
|
|
rel="noreferrer"
|
|
target="_blank"
|
|
>
|
|
<span className="absolute inset-0" aria-hidden="true"></span>No{' '}
|
|
{type} available for this package yet!
|
|
</Link>
|
|
</p>
|
|
<div className="prose prose-slate dark:prose-invert prose-sm">
|
|
<a
|
|
href="https://github.com/nrwl/nx/discussions"
|
|
target="_blank"
|
|
rel="noreferrer"
|
|
>
|
|
Please be sure to check the Nx roadmap on GitHub, we are probably
|
|
working on what you are looking for.
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
);
|
|
}
|