import * as React from 'react';
import className from 'classnames';
import {PropGridProps} from './PropGrid';
import {LabeledProp, StringProp, NumberProp, ListProp, ComponentProp} from './propView';
export abstract class PropRow {
setValues(values: any) {}
abstract render(key:string): any;
}
export class PropBorder extends PropRow {
render(key:string): JSX.Element {
return
;
}
}
export class PropGap extends PropRow {
private param: string;
constructor(param?: string) {
super();
this.param = param;
}
render(key:string): JSX.Element {
let w: string;
switch (this.param) {
default: w = 'py-2'; break;
case '=': w = 'py-1'; break;
case '-': w = 'pb-1'; break;
}
let cn = className(w);
return ;
}
}
const valueAlignStart = 'justify-content-start';
const valueAlignCenter = 'justify-content-center';
const valueAlignEnd = 'justify-content-end';
export abstract class LabeledPropRow extends PropRow {
protected gridProps: PropGridProps;
protected prop: LabeledProp;
protected content: any;
protected col: string;
//protected values: any;
constructor(gridProps:PropGridProps, prop: LabeledProp) {
super();
this.gridProps = gridProps;
this.prop = prop;
this.col = gridProps.labelFixLeft === true? 'col' : 'col-sm';
//this.values = values;
}
render(key:string):any {
let {onClick, bk} = this.prop;
let cn = className({
"cursor-pointer": onClick !== undefined,
"bg-white": bk === undefined,
"row": true
});
return
{this.renderLabel()}
{this.renderProp()}
;
}
protected renderLabel():any {
let {label} = this.prop;
if (label === undefined) return null;
return ;
}
protected renderProp():any {
let {label} = this.prop;
let align, vAlign;
switch (this.gridProps.alignValue) {
case 'left': align = valueAlignStart; break;
case 'center': align = valueAlignCenter; break;
case 'right': align = valueAlignEnd; break;
}
switch (this.prop.vAlign) {
case 'top': vAlign = 'align-items-start'; break;
default:
case 'center': vAlign = 'align-items-center'; break;
case 'bottom': vAlign = 'align-items-end'; break;
case 'stretch': vAlign = 'align-items-stretch'; break;
}
let col:string = this.col + (label===undefined? '-12':'-9');
let cn = className(align, vAlign, col, 'd-flex');
return
{this.renderPropBody()}
;
}
protected renderPropBody():any {
return
{this.renderPropContent()}
;
}
protected renderPropContent():any {
return this.content;
}
}
export class StringPropRow extends LabeledPropRow {
protected prop: StringProp;
setValues(values:any) {
if (values === undefined) this.content = undefined;
else this.content = values[this.prop.name];
}
}
export class NumberPropRow extends LabeledPropRow {
protected prop: NumberProp;
setValues(values:any) {
if (values === undefined) this.content = undefined;
else this.content = values[this.prop.name];
}
}
export class ListPropRow extends LabeledPropRow {
protected prop: ListProp;
setValues(values:any) {
if (values === undefined) this.content = undefined;
else {
let list = this.prop.list;
if (typeof list === 'string') this.content = values[list];
else this.content = undefined;
}
}
protected renderPropBody() {
let {list, row} = this.prop;
let items:any[] = typeof list === 'string'? this.content : list;
if (items === undefined) return ;
// new row(item)
return
{
items.map((item, index) =>
{index===0? null: }
{React.createElement(row, item)}
)
}
;
}
}
export class ComponentPropRow extends LabeledPropRow {
protected prop: ComponentProp;
protected renderPropBody() {
let {component} = this.prop;
return component;
}
protected renderProp():any {
let {label, full} = this.prop;
let align, vAlign;
switch (this.gridProps.alignValue) {
case 'left': align = valueAlignStart; break;
case 'center': align = valueAlignCenter; break;
case 'right': align = valueAlignEnd; break;
}
switch (this.prop.vAlign) {
case 'top': vAlign = 'align-items-start'; break;
default:
case 'center': vAlign = 'align-items-center'; break;
case 'bottom': vAlign = 'align-items-end'; break;
case 'stretch': vAlign = 'align-items-stretch'; break;
}
let col:string;
if (full !== true)
col = this.col + (label===undefined? '-12':'-9');
else
col = 'w-100';
let cn = className(align, vAlign, col, 'd-flex');
return
{this.renderPropBody()}
;
}
}