stackpress
Version:
Incept is a content management framework.
92 lines (91 loc) • 2.92 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = generate;
exports.generateSpan = generateSpan;
function generate(directory, registry) {
for (const model of registry.model.values()) {
model.columns.forEach(column => generateSpan(directory, model, column));
}
}
function generateSpan(directory, model, column) {
if (typeof column.span.component !== 'string')
return;
const path = `${model.name}/components/spans/${column.title}Span.tsx`;
const source = directory.createSourceFile(path, '', { overwrite: true });
source.addImportDeclaration({
isTypeOnly: true,
moduleSpecifier: 'stackpress/view/client',
namedImports: ['FieldProps', 'ControlProps']
});
source.addImportDeclaration({
moduleSpecifier: 'r22n',
namedImports: ['useLanguage']
});
source.addImportDeclaration({
moduleSpecifier: 'frui/form/Control',
defaultImport: 'Control'
});
source.addImportDeclaration({
moduleSpecifier: `frui/field/${column.span.component}`,
defaultImport: column.span.component
});
source.addFunction({
isExported: true,
name: `${column.title}Span`,
parameters: [
{ name: 'props', type: 'FieldProps' }
],
statements: (`
//props
const { className, value, change, error = false } = props;
const attributes = ${JSON.stringify(column.span.attributes)};
const values = Array.isArray(value) ? value : [];
//render
return (
<>
<${column.span.component}
{...attributes}
name="span[${column.name}][0]}"
className={className}
error={error}
defaultValue={values[0]}
onUpdate={value => change && change('span[${column.name}][0]', value)}
/>
<br />
<${column.span.component}
{...attributes}
name="span[${column.name}][1]}"
className={className}
error={error}
defaultValue={values[1]}
onUpdate={value => change && change('span[${column.name}][1]', value)}
/>
</>
);
`)
});
source.addFunction({
isExported: true,
name: `${column.title}SpanControl`,
parameters: [
{ name: 'props', type: 'ControlProps' }
],
statements: (`
//props
const { className, value, change, error } = props;
//hooks
const { _ } = useLanguage();
//render
return (
<Control label={_('${column.label}')} error={error} className={className}>
<${column.title}Span
className="!border-b2 dark:bg-gray-300 outline-none"
error={!!error}
value={value}
change={change}
/>
</Control>
);
`)
});
}