/**
* External dependencies
*/
import clsx from 'clsx';
import type { Properties } from 'csstype';
/**
* WordPress dependencies
*/
import {
RichText,
useBlockProps,
// @ts-ignore: has no exported member
__experimentalGetColorClassesAndStyles as getColorClassesAndStyles,
} from '@wordpress/block-editor';
import type { BlockSaveProps } from '@wordpress/blocks';
/**
* Internal dependencies
*/
import { convertToObject } from './utils/style-converter';
import { toInteger } from './utils/helper';
import type { BlockAttributes, SectionName, Row } from './BlockAttributes';
// To fix a problem with link colors not being applied
const v1 = {
attributes: {
contentJustification: {
type: 'string',
},
hasFixedLayout: {
type: 'boolean',
default: true,
},
isScrollOnPc: {
type: 'boolean',
default: false,
},
isScrollOnMobile: {
type: 'boolean',
default: false,
},
isStackedOnMobile: {
type: 'boolean',
default: false,
},
sticky: {
type: 'string',
},
tableStyles: {
type: 'string',
source: 'attribute',
selector: 'table',
attribute: 'style',
},
captionSide: {
type: 'string',
default: 'bottom',
},
caption: {
type: 'string',
source: 'html',
selector: 'figcaption',
},
captionStyles: {
type: 'string',
source: 'attribute',
selector: 'figcaption',
attribute: 'style',
},
head: {
type: 'array',
default: [],
source: 'query',
selector: 'thead tr',
query: {
cells: {
type: 'array',
default: [],
source: 'query',
selector: 'td,th',
query: {
content: {
type: 'string',
source: 'html',
},
styles: {
type: 'string',
source: 'attribute',
attribute: 'style',
},
tag: {
type: 'string',
default: 'td',
source: 'tag',
},
className: {
type: 'string',
source: 'attribute',
attribute: 'class',
},
id: {
type: 'string',
source: 'attribute',
attribute: 'id',
},
headers: {
type: 'string',
source: 'attribute',
attribute: 'headers',
},
scope: {
enum: [ 'row', 'col', 'rowgroup', 'colgroup' ],
source: 'attribute',
attribute: 'scope',
},
rowSpan: {
type: 'string',
source: 'attribute',
attribute: 'rowspan',
},
colSpan: {
type: 'string',
source: 'attribute',
attribute: 'colspan',
},
},
},
},
},
body: {
type: 'array',
default: [],
source: 'query',
selector: 'tbody tr',
query: {
cells: {
type: 'array',
default: [],
source: 'query',
selector: 'td,th',
query: {
content: {
type: 'string',
source: 'html',
},
styles: {
type: 'string',
source: 'attribute',
attribute: 'style',
},
tag: {
type: 'string',
default: 'td',
source: 'tag',
},
className: {
type: 'string',
source: 'attribute',
attribute: 'class',
},
id: {
type: 'string',
source: 'attribute',
attribute: 'id',
},
headers: {
type: 'string',
source: 'attribute',
attribute: 'headers',
},
scope: {
enum: [ 'row', 'col', 'rowgroup', 'colgroup' ],
source: 'attribute',
attribute: 'scope',
},
rowSpan: {
type: 'string',
source: 'attribute',
attribute: 'rowspan',
},
colSpan: {
type: 'string',
source: 'attribute',
attribute: 'colspan',
},
},
},
},
},
foot: {
type: 'array',
default: [],
source: 'query',
selector: 'tfoot tr',
query: {
cells: {
type: 'array',
default: [],
source: 'query',
selector: 'td,th',
query: {
content: {
type: 'string',
source: 'html',
},
styles: {
type: 'string',
source: 'attribute',
attribute: 'style',
},
tag: {
type: 'string',
default: 'td',
source: 'tag',
},
className: {
type: 'string',
source: 'attribute',
attribute: 'class',
},
id: {
type: 'string',
source: 'attribute',
attribute: 'id',
},
headers: {
type: 'string',
source: 'attribute',
attribute: 'headers',
},
scope: {
enum: [ 'row', 'col', 'rowgroup', 'colgroup' ],
source: 'attribute',
attribute: 'scope',
},
rowSpan: {
type: 'string',
source: 'attribute',
attribute: 'rowspan',
},
colSpan: {
type: 'string',
source: 'attribute',
attribute: 'colspan',
},
},
},
},
},
},
supports: {
anchor: true,
align: [ 'left', 'right', 'wide', 'full' ],
color: {
__experimentalSkipSerialization: true,
gradients: true,
link: true,
},
typography: {
fontSize: true,
lineHeight: true,
__experimentalFontFamily: true,
__experimentalTextTransform: true,
__experimentalFontStyle: true,
__experimentalFontWeight: true,
__experimentalLetterSpacing: true,
},
spacing: {
margin: true,
},
__experimentalSelector: '.wp-block-flexible-table-block-table > table',
},
save( { attributes }: BlockSaveProps< BlockAttributes > ) {
const {
contentJustification,
tableStyles,
hasFixedLayout,
isStackedOnMobile,
isScrollOnPc,
isScrollOnMobile,
sticky,
head,
body,
foot,
caption,
captionSide,
captionStyles,
} = attributes;
const isEmpty: boolean = ! head.length && ! body.length && ! foot.length;
if ( isEmpty ) {
return null;
}
const tableStylesObj: Properties = convertToObject( tableStyles );
const captionStylesObj: Properties = convertToObject( captionStyles );
const colorProps = getColorClassesAndStyles( attributes );
const blockProps = useBlockProps.save( {
className: clsx( {
[ `is-content-justification-${ contentJustification }` ]: contentJustification,
'is-scroll-on-pc': isScrollOnPc,
'is-scroll-on-mobile': isScrollOnMobile,
} ),
} );
const tableClasses: string = clsx( colorProps.className, {
'has-fixed-layout': hasFixedLayout,
'is-stacked-on-mobile': isStackedOnMobile,
[ `is-sticky-${ sticky }` ]: sticky,
} );
const hasCaption: boolean = ! RichText.isEmpty( caption || '' );
const Section = ( { type, rows }: { type: SectionName; rows: Row[] } ) => {
if ( ! rows.length ) {
return null;
}
const Tag = `t${ type }` as const;
return (
{ rows.map( ( { cells }, rowIndex ) => (
{ cells.map(
(
{ content, tag, className, id, headers, scope, rowSpan, colSpan, styles },
cellIndex
) => (
1 ? toInteger( rowSpan ) : undefined }
colSpan={ toInteger( colSpan ) > 1 ? toInteger( colSpan ) : undefined }
style={ convertToObject( styles ) }
/>
)
) }
) ) }
);
};
const Caption = () => (
);
return (
{ hasCaption && 'top' === captionSide && }
{ hasCaption && 'bottom' === captionSide && }
);
},
};
export default [ v1 ];