cv-dialog-sdk
Version:
Catavolt Dialog Javascript API
223 lines (197 loc) • 7.66 kB
text/typescript
import moment from 'moment';
import { DateTimeValue } from '../util/DateTimeValue';
import { DateValue } from '../util/DateValue';
import { StringDictionary } from '../util/StringDictionary';
import { TimeValue } from '../util/TimeValue';
import { CodeRef } from './CodeRef';
import { DataAnnotation } from './DataAnnotation';
import { GpsReading } from './GpsReading';
import { MapLocation } from './MapLocation';
import { ModelUtil } from "./ModelUtil";
import { ObjectRef } from './ObjectRef';
import { PropertyDef } from './PropertyDef';
import { TypeNames } from './types';
/**
* Represents a 'value' or field in a row or record. See {@link Record}
* A Prop has a corresponding {@link PropertyDef} that describes the property.
* Like an {@link Record}, a Prop may also have {@link Annotation}s (style annotations),
* but these apply to the property only
*/
export class Property {
private type:string = TypeNames.PropertyTypeName;
public static fromJSON(jsonObject: StringDictionary, modelUtil: ModelUtil): Promise<Property> {
return modelUtil.jsonToModel<DataAnnotation[]>(jsonObject.annotations).then(async (annotations: DataAnnotation[]) => {
const value = await Property.parseJSONValue(jsonObject.value, jsonObject.format, modelUtil);
return new Property(
jsonObject.name,
value,
jsonObject.format,
annotations
);
});
}
/**
* Produce a value that can be used for comparison purposes
* Props considered 'equal' should produce the same identity value
*
* @param o
* @returns {any}
*/
public static valueForCompare(o: any): any {
if(o === null || o === undefined) {
return o;
}
if (typeof o === 'number') {
return o;
} else if (typeof o === 'object') {
if (o instanceof Date) {
return o.getTime();
} else if (o instanceof DateValue) {
return o.dateObj.getTime();
} else if (o instanceof DateTimeValue) {
return o.dateObj.getTime();
} else if (o instanceof TimeValue) {
return o.toDateValue().getTime();
} else if (o instanceof CodeRef) {
return o.code;
} else if (o instanceof ObjectRef) {
return o.objectId;
} else if (o instanceof GpsReading) {
return o.toString();
} else if (o instanceof MapLocation) {
return o.toString();
} else {
return String(o);
}
} else {
return String(o);
}
}
/**
*
* @param {string} name
* @param value
* @param {string} format
* @param {Array<DataAnnotation>} annotations
*/
constructor(
readonly name: string,
readonly value: any,
readonly format?: string,
readonly annotations: DataAnnotation[] = []
) {}
public equals(prop: Property): boolean {
return this.name === prop.name && this.value === prop.value;
}
get backgroundColor(): string {
return DataAnnotation.backgroundColor(this.annotations);
}
get foregroundColor(): string {
return DataAnnotation.foregroundColor(this.annotations);
}
get imageName(): string {
return DataAnnotation.imageName(this.annotations);
}
get imagePlacement(): string {
return DataAnnotation.imagePlacement(this.annotations);
}
get isBoldText(): boolean {
return DataAnnotation.isBoldText(this.annotations);
}
get isItalicText(): boolean {
return DataAnnotation.isItalicText(this.annotations);
}
get isPlacementCenter(): boolean {
return DataAnnotation.isPlacementCenter(this.annotations);
}
get isPlacementLeft(): boolean {
return DataAnnotation.isPlacementLeft(this.annotations);
}
get isPlacementRight(): boolean {
return DataAnnotation.isPlacementRight(this.annotations);
}
get isPlacementStretchUnder(): boolean {
return DataAnnotation.isPlacementStretchUnder(this.annotations);
}
get isPlacementUnder(): boolean {
return DataAnnotation.isPlacementUnder(this.annotations);
}
get isUnderline(): boolean {
return DataAnnotation.isUnderlineText(this.annotations);
}
get overrideText(): string {
return DataAnnotation.overrideText(this.annotations);
}
get tipText(): string {
return DataAnnotation.tipText(this.annotations);
}
/**
* Get a primative value appropriate for comparison
*/
get comparable(): any {
return Property.valueForCompare(this.value);
}
/*
Prepare value to be written to server
*/
get valueForWrite() {
const o = this.value;
if (typeof o === 'object') {
if (o instanceof Date) {
// remove the 'Z' from the end of the ISO string for now, until the server supports timezones...
return o.toISOString().slice(0, -1);
} else if (o instanceof DateTimeValue) {
// remove the 'Z' from the end of the ISO string for now, until the server supports timezones...
return o.dateObj.toISOString().slice(0, -1);
} else if (o instanceof DateValue) {
// remove all Time information from the end of the ISO string from the 'T' to the end...
const isoString = o.dateObj.toISOString();
return isoString.slice(0, isoString.indexOf('T'));
} else if (o instanceof TimeValue) {
return o.toString();
} else {
// for any other type of value, return the object itself
// this could include string, Array, CodeRef, ObjectRef, GpsReadingProperty, MapLocationProperty, InlineBinaryRef
return o;
}
} else {
return o;
}
}
public toJSON() {
const jsonObject = {
name: this.name,
value: this.valueForWrite,
type: TypeNames.PropertyTypeName,
propertyType: null,
format: null
};
if (this.format) {
jsonObject.format = this.format;
}
return jsonObject;
}
private static parseJSONValue(value: any, format: string, modelUtil:ModelUtil): Promise<any> {
let result = value;
if (value && typeof value === 'string' && format) {
if (['integer', 'decimal', 'int32', 'int64', 'float', 'double'].some(v => format === v)) {
result = Number(value);
} else if (format === 'date') {
// parse as ISO - no offset specified by server right now, so we assume local time
result = moment(value, 'YYYY-M-D').toDate();
} else if (format === 'date-time') {
// parse as ISO - no offset specified by server right now, so we assume local time
// strip invalid suffix (sometimes) provided by server
const i = value.indexOf('T0:');
result = moment(i > -1 ? value.substring(0, i) : value).toDate();
} else if (format === 'time') {
result = TimeValue.fromString(value);
} else {
result = value;
}
} else if (value && typeof value === 'object' && value.type) {
return modelUtil.jsonToModel(value);
}
return Promise.resolve(result);
}
}