stackpress
Version:
Incept is a content management framework.
193 lines (192 loc) • 6.4 kB
JavaScript
import { VariableDeclarationKind } from 'ts-morph';
export default function removePage(directory, _registry, model) {
const file = `${model.name}/admin/views/remove.tsx`;
const source = directory.createSourceFile(file, '', { overwrite: true });
const ids = model.ids.map(column => column.name);
const path = ids.map(name => `\${results.${name}}`).join('/');
const link = (action) => `\`\${base}/${model.dash}/${action}/${path}\``;
source.addImportDeclaration({
isTypeOnly: true,
moduleSpecifier: 'stackpress/view/client',
namedImports: ['ServerPageProps']
});
source.addImportDeclaration({
isTypeOnly: true,
moduleSpecifier: 'stackpress/admin/types',
namedImports: ['AdminConfigProps']
});
source.addImportDeclaration({
isTypeOnly: true,
moduleSpecifier: 'stackpress/sql',
namedImports: ['SearchParams']
});
source.addImportDeclaration({
isTypeOnly: true,
moduleSpecifier: '../../types',
namedImports: [`${model.title}Extended`]
});
source.addImportDeclaration({
moduleSpecifier: 'r22n',
namedImports: ['useLanguage']
});
source.addImportDeclaration({
moduleSpecifier: 'stackpress/view/client',
namedImports: ['useServer', 'Crumbs', 'LayoutAdmin']
});
source.addFunction({
isExported: true,
name: `Admin${model.title}RemoveCrumbs`,
parameters: [{
name: 'props',
type: `{ base: string, results: ${model.title}Extended }`
}],
statements: (`
const { base, results } = props;
//hooks
const { _ } = useLanguage();
//variables
const crumbs = [
{
label: (
<span className="theme-info">{_('${model.plural}')}</span>
),
icon: '${model.icon}',
href: \`\${base}/${model.dash}/search\`
},
{
label: (
<span className="theme-info">
{\`${model.transformTemplate('${results?.%s || \'\'}')}\`}
</span>
),
icon: '${model.icon}',
href: ${link('detail')}
},
{
label: _('Remove'),
icon: 'trash'
}
];
return (<Crumbs crumbs={crumbs} />);
`)
});
source.addFunction({
isExported: true,
name: `Admin${model.title}RemoveForm`,
parameters: [{
name: 'props',
type: `{ base: string, results: ${model.title}Extended }`
}],
statements: (`
const { base, results } = props;
const { _ } = useLanguage();
return (
<div>
<div className="theme-bg-bg1 px-fs-16 px-p-20">
<i className="px-mr-5 inline-block fas fa-fw fa-info-circle"></i>
<strong className="font-semibold">
{_(
'Are you sure you want to remove %s forever?',
\`${model.transformTemplate('${results?.%s || \'\'}')}\`
)}
</strong>
<br />
<em className="px-fs-14">{_('(Thats a real long time)')}</em>
</div>
<div className="px-mt-20">
<a
className="theme-bg-muted px-px-14 px-py-10 inline-block rounded"
href={${link('detail')}}
>
<i className="px-mr-5 inline-block fas fa-fw fa-arrow-left"></i>
<span>Nevermind.</span>
</a>
<a
className="theme-bg-error px-px-14 px-py-10 px-ml-10 inline-block rounded"
href="?confirmed=true"
>
<i className="px-mr-5 inline-block fas fa-fw fa-trash"></i>
<span>{_('Confirmed')}</span>
</a>
</div>
</div>
);
`)
});
source.addFunction({
isExported: true,
name: `Admin${model.title}RemoveBody`,
statements: (`
const { config, response } = useServer<${[
`AdminConfigProps`,
'Partial<SearchParams>',
`${model.title}Extended`
].join(', ')}>();
const base = config.path('admin.base', '/admin');
const results = response.results as ${model.title}Extended;
//render
return (
<main className="flex flex-col px-h-100-0 theme-bg-bg0 relative">
<div className="px-px-10 px-py-14 theme-bg-bg2">
<Admin${model.title}RemoveCrumbs base={base} results={results} />
</div>
<div className="px-p-10">
<Admin${model.title}RemoveForm base={base} results={results} />
</div>
</main>
);
`)
});
source.addFunction({
isExported: true,
name: `Admin${model.title}RemoveHead`,
parameters: [{
name: 'props',
type: 'ServerPageProps<AdminConfigProps>'
}],
statements: (`
const { data, styles = [] } = props;
const { favicon = '/favicon.ico' } = data?.brand || {};
const { _ } = useLanguage();
const mimetype = favicon.endsWith('.png')
? 'image/png'
: favicon.endsWith('.svg')
? 'image/svg+xml'
: 'image/x-icon';
return (
<>
<title>{_('Remove ${model.singular}')}</title>
{favicon && <link rel="icon" type={mimetype} href={favicon} />}
<link rel="stylesheet" type="text/css" href="/styles/global.css" />
{styles.map((href, index) => (
<link key={index} rel="stylesheet" type="text/css" href={href} />
))}
</>
);
`)
});
source.addFunction({
isExported: true,
name: `Admin${model.title}RemovePage`,
parameters: [{
name: 'props',
type: 'ServerPageProps<AdminConfigProps>'
}],
statements: (`
return (
<LayoutAdmin {...props}>
<Admin${model.title}RemoveBody />
</LayoutAdmin>
);
`)
});
source.addVariableStatement({
isExported: true,
declarationKind: VariableDeclarationKind.Const,
declarations: [{
name: 'Head',
initializer: `Admin${model.title}RemoveHead`
}]
});
source.addStatements(`export default Admin${model.title}RemovePage;`);
}