UNPKG

virool-pivot

Version:

A web-based exploratory visualization UI for Druid.io

110 lines (89 loc) 2.7 kB
import { Class, Instance, isInstanceOf } from 'immutable-class'; import { hasOwnProperty } from '../../utils/general/general'; export interface DragPositionValue { insert?: number; replace?: number; } export interface DragPositionJS { insert?: number; replace?: number; } var check: Class<DragPositionValue, DragPositionJS>; export class DragPosition implements Instance<DragPositionValue, DragPositionJS> { static isDragPosition(candidate: any): candidate is DragPosition { return isInstanceOf(candidate, DragPosition); } static calculateFromOffset(offset: number, numItems: number, itemWidth: number, itemGap: number): DragPosition { if (!numItems) { return new DragPosition({ replace: 0 }); } if (offset < 0) { return new DragPosition({ insert: 0 }); } var sectionWidth = itemWidth + itemGap; var sectionNumber = Math.floor(offset / sectionWidth); if (numItems <= sectionNumber) { return new DragPosition({ replace: numItems }); } var offsetWithinSection = offset - sectionWidth * sectionNumber; if (offsetWithinSection < itemWidth) { return new DragPosition({ replace: sectionNumber }); } else { return new DragPosition({ insert: sectionNumber + 1 }); } } static fromJS(parameters: DragPositionJS): DragPosition { return new DragPosition(parameters); } public insert: number; public replace: number; constructor(parameters: DragPositionValue) { this.insert = hasOwnProperty(parameters, 'insert') ? parameters.insert : null; this.replace = hasOwnProperty(parameters, 'replace') ? parameters.replace : null; if (this.insert == null && this.replace == null) throw new Error('invalid drag position'); } public valueOf(): DragPositionValue { return { insert: this.insert, replace: this.replace }; } public toJS(): DragPositionJS { var js: DragPositionJS = {}; if (this.insert != null) js.insert = this.insert; if (this.replace != null) js.replace = this.replace; return js; } public toJSON(): DragPositionJS { return this.toJS(); } public toString(): string { if (this.insert != null) { return `[insert ${this.insert}]`; } else { return `[replace ${this.replace}]`; } } public equals(other: DragPosition): boolean { return DragPosition.isDragPosition(other) && this.insert === other.insert && this.replace === other.replace; } public isInsert(): boolean { return this.insert !== null; } public isReplace(): boolean { return this.replace !== null; } } check = DragPosition;