@pdfme/schemas
Version:
TypeScript base PDF generator and React base UI. Open source, developed by the community, and completely free to use under the MIT license!
105 lines (103 loc) • 3.33 kB
text/typescript
import type { PropPanel } from '@pdfme/common';
import type { TableSchema } from './types.js';
import { getFallbackFontName, DEFAULT_FONT_NAME } from '@pdfme/common';
import {
getDefaultCellStyles,
getCellPropPanelSchema,
getColumnStylesPropPanelSchema,
} from './helper.js';
import { HEX_COLOR_PATTERN } from '../constants.js';
export const propPanel: PropPanel<TableSchema> = {
schema: ({ activeSchema, options, i18n }) => {
// @ts-expect-error Type casting is necessary here as the activeSchema type is generic
const tableSchema = activeSchema as TableSchema;
const head = tableSchema.head || [];
const showHead = tableSchema.showHead || false;
const font = options.font || { [DEFAULT_FONT_NAME]: { data: '', fallback: true } };
const fontNames = Object.keys(font);
const fallbackFontName = getFallbackFontName(font);
return {
showHead: {
title: i18n('schemas.table.showHead'),
type: 'boolean',
widget: 'checkbox',
span: 24,
},
'-------': { type: 'void', widget: 'Divider' },
tableStyles: {
title: i18n('schemas.table.tableStyle'),
type: 'object',
widget: 'Card',
span: 24,
properties: {
borderWidth: {
title: i18n('schemas.borderWidth'),
type: 'number',
widget: 'inputNumber',
props: { min: 0, step: 0.1 },
step: 1,
},
borderColor: {
title: i18n('schemas.borderColor'),
type: 'string',
widget: 'color',
props: {
disabledAlpha: true,
},
rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],
},
},
},
headStyles: {
hidden: !showHead,
title: i18n('schemas.table.headStyle'),
type: 'object',
widget: 'Card',
span: 24,
properties: getCellPropPanelSchema({ i18n, fallbackFontName, fontNames }),
},
bodyStyles: {
title: i18n('schemas.table.bodyStyle'),
type: 'object',
widget: 'Card',
span: 24,
properties: getCellPropPanelSchema({ i18n, fallbackFontName, fontNames, isBody: true }),
},
columnStyles: {
title: i18n('schemas.table.columnStyle'),
type: 'object',
widget: 'Card',
span: 24,
properties: getColumnStylesPropPanelSchema({ head, i18n }),
},
};
},
defaultSchema: {
name: '',
type: 'table',
position: { x: 0, y: 0 },
width: 150,
height: 20,
content: JSON.stringify([
['Alice', 'New York', 'Alice is a freelance web designer and developer'],
['Bob', 'Paris', 'Bob is a freelance illustrator and graphic designer'],
]),
showHead: true,
head: ['Name', 'City', 'Description'],
headWidthPercentages: [30, 30, 40],
tableStyles: {
borderColor: '#000000',
borderWidth: 0.3,
},
headStyles: Object.assign(getDefaultCellStyles(), {
fontColor: '#ffffff',
backgroundColor: '#2980ba',
borderColor: '',
borderWidth: { top: 0, right: 0, bottom: 0, left: 0 },
}),
bodyStyles: Object.assign(getDefaultCellStyles(), {
alternateBackgroundColor: '#f5f5f5',
}),
columnStyles: {},
},
};