import { Integer, compareValue } from '@pbkware/js-utils'; import { RevHorizontalAlignId, RevTextFormattableValue } from '../../../../../cell-content/client'; import { RevTextFormatter } from '../../../../../cell-content/server'; import { RevSourcedFieldSourceDefinition } from '../../../../sourced-field/server'; import { RevRecordSourcedField, RevRecordSourcedFieldDefinition } from '../../../record/server'; import { RevGenericTableValue, RevTableValue, RevTableValuesRecord } from '../value'; /** @public */ export abstract class RevTableField extends RevRecordSourcedField { private _valueTypeId: TextFormattableValueTypeId; constructor( protected readonly _textFormatter: RevTextFormatter, definition: RevTableField.Definition, heading: string, ) { super(definition, heading); } get valueTypeId() { return this._valueTypeId; } compare(left: RevTableValuesRecord, right: RevTableValuesRecord): number { const leftValue = left.values[this.index]; const rightValue = right.values[this.index]; if (leftValue === rightValue) { return 0; } else { if (leftValue.isUndefined()) { if (rightValue.isUndefined()) { return 0; } else { return this.compareUndefinedToDefinedField(rightValue); } } else { if (rightValue.isUndefined()) { return -this.compareUndefinedToDefinedField(leftValue); } else { return this.compareDefined(leftValue, rightValue); } } } } compareDesc(left: RevTableValuesRecord, right: RevTableValuesRecord): number { const leftValue = left.values[this.index]; const rightValue = right.values[this.index]; if (leftValue === rightValue) { return 0; } else { if (leftValue.isUndefined()) { if (rightValue.isUndefined()) { return 0; } else { return -this.compareUndefinedToDefinedField(rightValue); } } else { if (rightValue.isUndefined()) { return this.compareUndefinedToDefinedField(leftValue); } else { return this.compareDefined(rightValue, leftValue); } } } } override getViewValue(record: RevTableValuesRecord): RevTextFormattableValue { const tableGridValue = record.values[this.index]; return tableGridValue.textFormattableValue; } protected setValueTypeId(value: TextFormattableValueTypeId) { this._valueTypeId = value; } protected compareUndefinedToDefinedField(definedValue: RevTableValue) { // left is undefined, right is defined (parameter) return -1; } protected abstract compareDefined(left: RevTableValue, right: RevTableValue): number; } /** @public */ export namespace RevTableField { export class Definition extends RevRecordSourcedFieldDefinition { constructor( sourceDefinition: RevSourcedFieldSourceDefinition, sourcelessName: string, defaultHeading: string, defaultTextAlignId: RevHorizontalAlignId, readonly gridFieldConstructor: RevTableField.Constructor, readonly gridValueConstructor: RevTableValue.Constructor, ) { super(sourceDefinition, sourcelessName, defaultHeading, defaultTextAlignId); } } export type Constructor = new( textFormatter: RevTextFormatter, definition: RevTableField.Definition, heading: string, index: Integer, ) => RevTableField; } /** @public */ export class RevGenericTableField< TextFormattableValueTypeId, TextFormattableValueAttributeTypeId > extends RevTableField { protected compareDefined( left: RevTableValue, right: RevTableValue ): number { return compareValue((left as RevGenericTableValue).definedData, (right as RevGenericTableValue).definedData); } }