import {Const} from '../../utils/const'; import {IGridSelectItem} from './grid-select-item'; export class GridSelectFactory { /** * Returns select item for grid */ static getGridSelect(headerName: string, field: string, editable: boolean, values: any[], itemKey: string, itemValueKeys: string[], mandatory: boolean = true, relatesOnDgField: string = null, headerClass: string = null, pinned: boolean = false, cellClass: any = null, exclusive: boolean = false, exclusiveCompareData: any = null, exclusiveCompareDataKey: string = null): {} { if (null !== relatesOnDgField && exclusive) { // NOTE: This is not allowed for now, maybe needed in future throw new Error('Select can be either relative or exclusive'); } const res = { headerName, field, headerClass, pinned, editable, cellClass: null === cellClass ?? (editable ? '' : Const.CSS_NO_EDIT), cellRenderer: 'gridSelectRenderer', cellEditor: 'gridSelectEditor', cellEditorParams: { values: null === relatesOnDgField && !exclusive ? GridSelectFactory.getGridSelectItems(values, itemKey, itemValueKeys, mandatory) : values, itemKey, itemValueKeys, mandatory, relatesOnDgField, exclusive, exclusiveCompareData, exclusiveCompareDataKey } }; if (mandatory) { res['cellClassRules'] = { error(params) { return params.value == null; } }; } return res; } /** * Returns select item for grid without renderer and editor */ static getGridSelectForSelectors(headerName: string, field: string, editable: boolean, values: any[], itemKey: string, itemValueKeys: string[], mandatory: boolean = true, relatesOnDgField: string = null, headerClass: string = null, pinned: boolean = false, cellClass: any = null, exclusive: boolean = false, exclusiveCompareData: any = null, exclusiveCompareDataKey: string = null): {} { const res: {} = GridSelectFactory.getGridSelect( headerName, field, editable, values, itemKey, itemValueKeys, mandatory, relatesOnDgField, headerClass, pinned, cellClass, exclusive, exclusiveCompareData, exclusiveCompareDataKey ); delete res['cellRenderer']; delete res['cellEditor']; return res; } /** * Returns array of grid select items */ static getGridSelectItems(objArray: any[], key: string, valueKeys: string[], mandatory: boolean = true): IGridSelectItem[] { const res: IGridSelectItem[] = []; if (!mandatory) { // Add empty item (null value) res.push(GridSelectFactory.getGridSelectItem({key: null, value: '-'}, 'key', valueKeys, true)); } objArray.forEach(item => { res.push(GridSelectFactory.getGridSelectItem(item, key, valueKeys)); }); return res; } /** * Returns single grid select item */ static getGridSelectItem(obj: any, key: string, valueKeys: string[], isNullItem: boolean = false): IGridSelectItem { if (!obj.hasOwnProperty(key)) { throw new Error('GridFactory: Key not found: ' + key); } let gridItem: {} = {}; if (!isNullItem) { for (const item of valueKeys) { if (!obj.hasOwnProperty(key) || !obj.hasOwnProperty(item)) { throw new Error('GridFactory: Value not found: ' + item); } } gridItem = { key: obj[key], value: GridSelectFactory.getGridSelectItemValue(obj, valueKeys) }; } else { // Empty placeholder item gridItem = { key: obj.key, value: obj.value }; } return gridItem as IGridSelectItem; } /** * Returns displayed value of grid item */ static getGridSelectItemValue(obj: any, valueKeys: string[]): string { let value = ''; for (let i = 0; i < valueKeys.length; i++) { value += obj[valueKeys[i]]; value += i < (valueKeys.length - 1) ? ' - ' : ''; } return value; } }