import { RenderPageCtx } from 'datocms-plugin-sdk'; import { Canvas, SelectField, Button } from 'datocms-react-ui'; import { useMemo, useState } from 'react'; import ReactJson from 'react-json-view-ts'; import { buildClient } from '@datocms/cma-client-browser'; import s from './styles.module.scss'; type Props = { ctx: RenderPageCtx; }; export default function ExportPage({ ctx }: Props) { const [selectedItemType, setSelectedItemType] = useState(undefined); const [entries, setEntries] = useState([]); const [entriesCount, setEntriesCount] = useState(0); const [loading, setLoading] = useState(false); const [fields, setFields] = useState<{ label: string; value: string }[]>([]); const [selectedFields, setSelectedFields] = useState<{ label: string; value: string }[]>([]); if (!ctx.currentUserAccessToken) { return

Token is missing

; } const client = useMemo(() => { return buildClient({ apiToken: ctx.currentUserAccessToken!, environment: ctx.environment, }); }, [ctx.currentUserAccessToken]); async function selectItemType(itemType: string | undefined) { setSelectedItemType(itemType); if (!itemType) return; ctx.loadItemTypeFields(itemType).then((rawFields) => { const fields = [ ...rawFields.map((field) => ({ label: field.attributes.label, value: field.attributes.api_key, })), { label: 'Updated at', value: 'updated_at' }, { label: 'Created at', value: 'created_at' }, ].sort((a, b) => a.label.localeCompare(b.label)); setFields(fields); setSelectedFields([...fields]); }); client.items.rawList({ filter: { type: itemType }, page: { limit: 0 } }).then((items) => { setEntriesCount(items.meta.total_count); }); client.items.list({ filter: { type: itemType }, page: { limit: 10 }, nested: 'true' }).then((items) => { setEntries(items); }); } async function download() { const pages = client.items.listPagedIterator({ filter: { type: selectedItemType } }); const articles = []; for await (const article of pages) { articles.push(article); setLoading(articles.length); } setLoading(false); var dataStr = 'data:text/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(filterResult(articles), null, 2)); var dlAnchorElem = document.createElement('a'); document.body.appendChild(dlAnchorElem); dlAnchorElem.setAttribute('href', dataStr); dlAnchorElem.setAttribute('download', getItemTypeName(selectedItemType!) + '.json'); dlAnchorElem.click(); document.body.removeChild(dlAnchorElem); } function filterResult(entries: any[]) { return entries.map((entry) => { const result: Partial = {}; const apiKeys = ['id', ...selectedFields.map((field) => field.value)]; Object.keys(entry) .filter((key) => apiKeys.includes(key)) .forEach((key) => { result[key] = entry[key]; }); return result; }); } function getItemTypeName(itemType: string) { return Object.values(ctx.itemTypes).find((value) => value?.id === itemType)?.attributes.name; } return (
    {Object.entries(ctx.itemTypes) .filter(([key, value]) => !value?.attributes.modular_block) .map(([key, value]) => (
  • ))}
{selectedItemType && ( <> setSelectedFields([...newValue])} /> )} {entries.length > 0 && ( <>

{loading === false ? ( ) : ( )}

Preview

)}
); }