@vuu-ui/vuu-utils 0.5.3 → 0.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/vuu-utils/src/index.ts", "../../../packages/vuu-utils/src/array-utils.ts", "../../../packages/vuu-utils/src/column-utils.ts", "../../../packages/vuu-utils/src/range-utils.ts", "../../../packages/vuu-utils/src/DataWindow.ts", "../../../packages/vuu-utils/src/data-utils.ts", "../../../packages/vuu-utils/src/date-utils.ts", "../../../packages/vuu-utils/src/event-emitter.ts", "../../../packages/vuu-utils/src/getUniqueId.ts", "../../../packages/vuu-utils/src/input-utils.ts", "../../../packages/vuu-utils/src/invariant.ts", "../../../packages/vuu-utils/src/nanoid/index.ts", "../../../packages/vuu-utils/src/round-decimal.ts", "../../../packages/vuu-utils/src/row-utils.ts", "../../../packages/vuu-utils/src/text-utils.ts"],
4
+ "sourcesContent": ["export * from \"./array-utils\";\nexport * from \"./column-utils\";\nexport * from \"./DataWindow\";\nexport * from \"./data-utils\";\nexport * from \"./date-utils\";\nexport * from \"./event-emitter\";\nexport * from \"./getUniqueId\";\nexport * from \"./input-utils\";\nexport * from \"./invariant\";\nexport * from \"./nanoid\";\nexport * from \"./round-decimal\";\nexport * from \"./range-utils\";\nexport * from \"./row-utils\";\nexport * from \"./text-utils\";\n", "export type PartitionTest<T> = (value: T, index: number) => boolean;\n\nexport function partition<T>(\n array: T[],\n test: PartitionTest<T>,\n pass: T[] = [],\n fail: T[] = []\n): [T[], T[]] {\n for (let i = 0, len = array.length; i < len; i++) {\n (test(array[i], i) ? pass : fail).push(array[i]);\n }\n return [pass, fail];\n}\n", "import {\n ColumnDescriptor,\n KeyedColumnDescriptor,\n} from \"@vuu-ui/vuu-datagrid/src/grid-model/gridModelTypes\";\nimport { Row } from \"./row-utils\";\n\nexport interface ColumnMap {\n [columnName: string]: number;\n}\n\nconst SORT_ASC = \"asc\";\n\nexport type SortCriteriaItem = string | [string, \"asc\"]; // TODO where is 'desc'?\n\nexport function mapSortCriteria(\n sortCriteria: SortCriteriaItem[],\n columnMap: ColumnMap,\n metadataOffset = 0\n): [number, \"asc\"][] {\n return sortCriteria.map((s) => {\n if (typeof s === \"string\") {\n return [columnMap[s] + metadataOffset, \"asc\"];\n } else if (Array.isArray(s)) {\n const [columnName, sortDir] = s;\n return [columnMap[columnName] + metadataOffset, sortDir || SORT_ASC];\n } else {\n throw Error(\"columnUtils.mapSortCriteria invalid input\");\n }\n });\n}\n\nexport function isKeyedColumn(\n column: ColumnDescriptor\n): column is KeyedColumnDescriptor {\n return typeof (column as KeyedColumnDescriptor).key === \"number\";\n}\n\nexport const toColumnDescriptor = (name: string): ColumnDescriptor => ({\n name,\n});\n\nexport const toKeyedColumn = (\n column: string | ColumnDescriptor,\n key: number\n): KeyedColumnDescriptor => {\n if (typeof column === \"string\") {\n return { key, name: column };\n }\n if (isKeyedColumn(column)) {\n return column;\n }\n return { ...column, key };\n};\n\nconst EMPTY_COLUMN_MAP = {} as const;\n\nexport function buildColumnMap(columns?: (Column | string)[]): ColumnMap {\n const start = metadataKeys.count;\n if (columns) {\n return columns.reduce((map, column, i) => {\n if (typeof column === \"string\") {\n map[column] = start + i;\n } else if (typeof column.key === \"number\") {\n map[column.name] = column.key;\n } else {\n map[column.name] = start + i;\n }\n return map;\n }, {} as ColumnMap);\n } else {\n return EMPTY_COLUMN_MAP;\n }\n}\n\nexport function projectUpdates(updates: number[]): number[] {\n const results: number[] = [];\n const metadataOffset = metadataKeys.count - 2;\n for (let i = 0; i < updates.length; i += 3) {\n results[i] = updates[i] + metadataOffset;\n results[i + 1] = updates[i + 1];\n results[i + 2] = updates[i + 2];\n }\n return results;\n}\n\nexport function projectColumns(\n tableRowColumnMap: ColumnMap,\n columns: ColumnDescriptor[]\n) {\n const columnCount = columns.length;\n const { IDX, RENDER_IDX, DEPTH, COUNT, KEY, SELECTED, count } = metadataKeys;\n return (startIdx: number, offset: number, selectedRows: Row[] = []) =>\n (row: Row, i: number) => {\n // selectedRows are indices of rows within underlying dataset (not sorted or filtered)\n // row is the original row from this set, with original index in IDX pos, which might\n // be overwritten with a different value below if rows are sorted/filtered\n const baseRowIdx: any = row[IDX]; // TODO\n const out = [];\n for (let i = 0; i < columnCount; i++) {\n const colIdx = tableRowColumnMap[columns[i].name];\n out[count + i] = row[colIdx];\n }\n\n out[IDX] = startIdx + i + offset;\n out[RENDER_IDX] = 0;\n out[DEPTH] = 0;\n out[COUNT] = 0;\n out[KEY] = row[tableRowColumnMap.KEY];\n out[SELECTED] = selectedRows.includes(baseRowIdx) ? 1 : 0;\n return out;\n };\n}\n\nexport type Meta = {\n [key: string]: any;\n} & any[];\n\nexport const metadataKeys = {\n IDX: 0,\n RENDER_IDX: 1,\n IS_LEAF: 2,\n IS_EXPANDED: 3,\n DEPTH: 4,\n COUNT: 5,\n KEY: 6,\n SELECTED: 7,\n count: 8,\n // TODO following only used in datamodel\n PARENT_IDX: \"parent_idx\",\n IDX_POINTER: \"idx_pointer\",\n FILTER_COUNT: \"filter_count\",\n NEXT_FILTER_IDX: \"next_filter_idx\",\n} as const;\n", "export interface VuuRange {\n from: number;\n to: number;\n bufferSize?: number;\n reset?: boolean;\n}\n\ninterface FromToRange {\n from: number;\n to: number;\n}\n\nexport function getFullRange(\n { from, to }: VuuRange,\n bufferSize: number = 0,\n rowCount: number = Number.MAX_SAFE_INTEGER\n): FromToRange {\n if (bufferSize === 0) {\n return { from, to: Math.min(to, rowCount) };\n } else if (from === 0) {\n return { from, to: Math.min(to + bufferSize, rowCount) };\n } else {\n const rangeSize = to - from;\n const buff = Math.round(bufferSize / 2);\n const shortfallBefore = from - buff < 0;\n const shortFallAfter = rowCount - (to + buff) < 0;\n\n if (shortfallBefore && shortFallAfter) {\n return { from: 0, to: rowCount };\n } else if (shortfallBefore) {\n return { from: 0, to: rangeSize + bufferSize };\n } else if (shortFallAfter) {\n return { from: Math.max(0, rowCount - (rangeSize + bufferSize)), to: rowCount };\n } else {\n return { from: from - buff, to: to + buff };\n }\n }\n}\n\nexport function resetRange({ from, to, bufferSize = 0 }: VuuRange): VuuRange {\n return {\n from: 0,\n to: to - from,\n bufferSize,\n reset: true\n };\n}\n\nexport class WindowRange {\n public from: number;\n public to: number;\n\n constructor(from: number, to: number) {\n this.from = from;\n this.to = to;\n }\n\n public isWithin(index: number) {\n return index >= this.from && index < this.to;\n }\n\n //find the overlap of this range and a new one\n public overlap(from: number, to: number): [number, number] {\n return from >= this.to || to < this.from\n ? [0, 0]\n : [Math.max(from, this.from), Math.min(to, this.to)];\n }\n\n public copy(): WindowRange {\n return new WindowRange(this.from, this.to);\n }\n}\n", "import { WindowRange } from \"./range-utils\";\nimport { metadataKeys } from \"./column-utils\";\n\nexport type DataItem = string | number | boolean;\nexport type DataRow = [\n /** index */\n number,\n /** render index */\n number,\n /** isLeaf */\n boolean,\n /** isExpanded */\n boolean,\n /** depth */\n number,\n /** child count */\n number,\n /** key */\n string,\n /** selected */\n number,\n /** data values */\n ...DataItem[]\n];\nexport type RangeLike = { from: number; to: number };\n\nconst { KEY } = metadataKeys;\n\nconst log = (message: string) =>\n console.log(`%c[DataWindow] ${message}`, \"color: purple;font-weight: bold;\");\nexport class DataWindow {\n private range: WindowRange;\n public data: DataRow[];\n public rowCount = 0;\n constructor({ from, to }: RangeLike) {\n log(`constructor ${from} - ${to}`);\n this.range = new WindowRange(from, to);\n //internal data is always 0 based, we add range.from to determine an offset\n this.data = new Array(to - from);\n // window.dataWindow = this.data;\n // log(`constructor initial range ${from} - ${to}`);\n }\n\n setRowCount = (rowCount: number) => {\n // log(`rowCount => ${rowCount}`);\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n this.rowCount = rowCount;\n };\n\n // return true if existing row was updated\n add(data: DataRow) {\n const [index] = data;\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.range.from;\n const isUpdate = this.data[internalIndex] !== undefined;\n this.data[internalIndex] = data;\n return isUpdate;\n } else {\n return false;\n }\n }\n\n getAtIndex(index: number) {\n return this.range.isWithin(index) &&\n this.data[index - this.range.from] != null\n ? this.data[index - this.range.from]\n : undefined;\n }\n\n getByKey(key: string) {\n return this.data.find((row) => row[KEY] === key);\n }\n\n isWithinRange(index: number) {\n return this.range.isWithin(index) && index <= this.rowCount;\n }\n\n setRange(from: number, to: number) {\n log(`setRange ${from} ${to}`);\n if (from !== this.range.from || to !== this.range.to) {\n const [overlapFrom, overlapTo] = this.range.overlap(from, to);\n const newData = new Array(to - from);\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.range.from = from;\n this.range.to = to;\n }\n }\n\n hasData(from: number, to: number) {\n const offset = this.range.from;\n const start = from - offset;\n const end = Math.min(to - offset - 1, this.rowCount - 1);\n return this.data[start] !== undefined && this.data[end] !== undefined;\n }\n\n getData(from: number, to: number): any[] {\n const { from: clientFrom, to: clientTo } = this.range;\n const startOffset = Math.max(0, from - clientFrom);\n const endOffset = Math.min(to - clientFrom, this.rowCount ?? to);\n return this.data.slice(startOffset, endOffset);\n }\n}\n", "export type valueChangeDirection = \"up1\" | \"up2\" | \"down1\" | \"down2\" | \"\";\n\nexport const UP1 = \"up1\";\nexport const UP2 = \"up2\";\nexport const DOWN1 = \"down1\";\nexport const DOWN2 = \"down2\";\n\nexport const isValidNumber = (n: unknown): n is number =>\n typeof n === \"number\" && isFinite(n);\n\nexport function getMovingValueDirection(\n newValue: number,\n direction?: valueChangeDirection,\n prevValue?: number,\n /** the number of decimal places to take into account when highlighting a change */\n decimalPlaces?: number\n): valueChangeDirection {\n if (\n !isFinite(newValue) ||\n prevValue === undefined ||\n direction === undefined\n ) {\n return \"\";\n } else {\n let diff = newValue - prevValue;\n if (diff) {\n // make sure there is still a diff when reduced to number of decimals to be displayed\n if (typeof decimalPlaces === \"number\") {\n diff =\n +newValue.toFixed(decimalPlaces) - +prevValue.toFixed(decimalPlaces);\n }\n }\n\n if (diff) {\n if (direction === \"\") {\n if (diff < 0) {\n return DOWN1;\n } else {\n return UP1;\n }\n } else if (diff > 0) {\n if (direction === DOWN1 || direction === DOWN2 || direction === UP2) {\n return UP1;\n } else {\n return UP2;\n }\n } else if (\n direction === UP1 ||\n direction === UP2 ||\n direction === DOWN2\n ) {\n return DOWN1;\n } else {\n return DOWN2;\n }\n } else {\n return \"\";\n }\n }\n}\n", "//TODO\nexport const formatDate = (date: Date, format: string) => {\n return date.toUTCString();\n};\n", "export interface Event {}\n\nexport type EventListener = (evtName: string, ...args: any[]) => void;\n\nexport type EventListenerMap = {\n [eventName: string]: EventListener[] | EventListener;\n};\n\nfunction isArrayOfListeners(\n listeners: EventListener | EventListener[]\n): listeners is EventListener[] {\n return Array.isArray(listeners);\n}\n\nfunction isOnlyListener(\n listeners: EventListener | EventListener[]\n): listeners is EventListener {\n return !Array.isArray(listeners);\n}\n\nexport interface IEventEmitter {\n emit: (type: string, ...args: unknown[]) => void;\n}\n\nexport class EventEmitter implements IEventEmitter {\n private _events?: EventListenerMap;\n\n constructor() {\n this._events = {};\n }\n\n addListener(type: string, listener: EventListener) {\n if (!this._events) {\n this._events = {};\n }\n\n const listeners = this._events[type];\n\n if (!listeners) {\n this._events[type] = listener;\n } else if (isArrayOfListeners(listeners)) {\n listeners.push(listener);\n } else if (isOnlyListener(listeners)) {\n this._events[type] = [listeners, listener];\n }\n }\n\n removeListener(type: string, listener: EventListener) {\n if (!this._events || !this._events[type]) {\n return;\n }\n\n const listenerOrListeners = this._events[type];\n let position = -1;\n\n if (listenerOrListeners === listener) {\n delete this._events[type];\n } else if (Array.isArray(listenerOrListeners)) {\n for (let i = length; i-- > 0; ) {\n if (listenerOrListeners[i] === listener) {\n position = i;\n break;\n }\n }\n\n if (position < 0) {\n return;\n }\n\n if (listenerOrListeners.length === 1) {\n listenerOrListeners.length = 0;\n delete this._events[type];\n } else {\n listenerOrListeners.splice(position, 1);\n }\n }\n }\n\n removeAllListeners(type: string) {\n if (!this._events) {\n return;\n } else if (type === undefined) {\n delete this._events;\n } else {\n delete this._events[type];\n }\n }\n\n emit(type: string, ...args: unknown[]) {\n if (this._events) {\n const handler = this._events[type];\n if (handler) {\n invokeHandler(handler, type, args);\n }\n const wildcardHandler = this._events[\"*\"];\n if (wildcardHandler) {\n invokeHandler(wildcardHandler, type, args);\n }\n }\n }\n\n once(type: string, listener: EventListener) {\n const handler = (evtName: string, message: unknown) => {\n this.removeListener(evtName, handler);\n listener(evtName, message);\n };\n\n this.on(type, handler);\n }\n\n on(type: string, listener: EventListener) {\n return this.addListener(type, listener);\n }\n}\n\nfunction invokeHandler(\n handler: EventListener | EventListener[],\n type: string,\n args: unknown[]\n) {\n if (isArrayOfListeners(handler)) {\n handler.slice().forEach((listener) => invokeHandler(listener, type, args));\n } else {\n switch (args.length) {\n case 0:\n handler(type);\n break;\n case 1:\n handler(type, args[0]);\n break;\n case 2:\n handler(type, args[0], args[1]);\n break;\n // slower\n default:\n handler.call(null, type, ...args);\n }\n }\n}\n", "export const getUniqueId = () => `hw-${Math.round(Math.random() * 1e5)}`;\n", "const actionKeys = {\n Enter: 'Enter',\n Delete: 'Delete'\n};\n\nconst navigationKeys = {\n Home: 'Home',\n End: 'End',\n ArrowRight: 'ArrowRight',\n ArrowLeft: 'ArrowLeft',\n ArrowDown: 'ArrowDown',\n ArrowUp: 'ArrowUp',\n Tab: 'Tab'\n};\nconst functionKeys = {\n F1: 'F1',\n F2: 'F2',\n F3: 'F3',\n F4: 'F4',\n F5: 'F5',\n F6: 'F6',\n F7: 'F7',\n F8: 'F8',\n F9: 'F9',\n F10: 'F10',\n F11: 'F11',\n F12: 'F12'\n};\n\nconst specialKeys = {\n ...actionKeys,\n ...navigationKeys,\n ...functionKeys\n};\ntype specialKey = keyof typeof specialKeys;\n\nconst isSpecialKey = (key: string): key is specialKey => key in specialKeys;\n\nexport const isCharacterKey = (evt: KeyboardEvent) => {\n if (isSpecialKey(evt.key)) {\n return false;\n }\n if (typeof evt.which === 'number' && evt.which > 0) {\n return !evt.ctrlKey && !evt.metaKey && !evt.altKey && evt.which !== 8;\n }\n};\n\nexport const isQuoteKey = (evt: KeyboardEvent) => {\n return evt.key === '\"' || evt.key === \"'\";\n};\n", "export function invariant(condition: boolean, message: string) {\n if (!condition) {\n const error = new Error(message);\n error.name = 'Invariant Violation';\n // TODO what is framesToPop?\n // @ts-ignore\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n}\n", "// This is the index.browser.js file from nanoid\n// couldn't get original code to work as npm import without crypro warnings -\n// seemed to be picking up node version, not browser version\n\nexport const uuid = (size: number = 21): string => {\n let id: string = '';\n let bytes = crypto.getRandomValues(new Uint8Array(size));\n\n // A compact alternative for `for (var i = 0; i < step; i++)`.\n while (size--) {\n // It is incorrect to use bytes exceeding the alphabet size.\n // The following mask reduces the random byte in the 0-255 value\n // range to the 0-63 value range. Therefore, adding hacks, such\n // as empty string fallback or magic numbers, is unneccessary because\n // the bitmask trims bytes down to the alphabet size.\n let byte = bytes[size] & 63;\n if (byte < 36) {\n // `0-9a-z`\n id += byte.toString(36);\n } else if (byte < 62) {\n // `A-Z`\n id += (byte - 26).toString(36).toUpperCase();\n } else if (byte < 63) {\n id += '_';\n } else {\n id += '-';\n }\n }\n return id;\n};\n", "const PUNCTUATION_STR = String.fromCharCode(8200);\nconst DIGIT_STR = String.fromCharCode(8199);\nconst DECIMALS_AUTO = -1;\n\ntype PadMap = {\n DIGIT: string;\n TWO_DIGITS: string;\n THREE_DIGITS: string;\n FULL_PADDING: [null, string, string, string, string];\n};\n\nconst Space: PadMap = {\n DIGIT: DIGIT_STR,\n TWO_DIGITS: DIGIT_STR + DIGIT_STR,\n THREE_DIGITS: DIGIT_STR + DIGIT_STR + DIGIT_STR,\n FULL_PADDING: [\n null,\n PUNCTUATION_STR + DIGIT_STR,\n PUNCTUATION_STR + DIGIT_STR + DIGIT_STR,\n PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR,\n PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR,\n ],\n};\n\nconst Zero: PadMap = {\n DIGIT: \"0\",\n TWO_DIGITS: \"00\",\n THREE_DIGITS: \"000\",\n FULL_PADDING: [null, \"0\", \"00\", \"000\", \"0000\"],\n};\n\nfunction padLeft(value: string, maxLength = 6) {\n return (LEADING_FILL + value).slice(-maxLength);\n}\n\nconst LEADING_FILL =\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR;\n\nconst Align = {\n Right: \"right\",\n Center: \"center\",\n Left: \"left\",\n};\n\nfunction pad(n: string, dp: number, Pad: PadMap): string {\n let len = n.length;\n const diff = dp - len;\n\n if (diff > 0) {\n if (diff === 1) {\n n = n + Pad.DIGIT;\n } else if (diff === 2) {\n n = n + Pad.TWO_DIGITS;\n } else if (diff === 3) {\n n = n + Pad.THREE_DIGITS;\n }\n } else {\n if (diff < 0) {\n n = n.slice(0, dp);\n len = dp;\n }\n\n if (Pad === Space && n.charAt(len - 1) === \"0\") {\n n = n.replace(/0+$/, \"\");\n return pad(n, dp, Pad);\n }\n }\n return n;\n}\n\nexport function roundDecimal(\n value?: number,\n align = Align.Right,\n decimals = 4,\n zeroPad?: boolean,\n alignOnDecimals?: boolean\n) {\n if (value === undefined || typeof value !== \"number\" || isNaN(value)) {\n return \"\";\n }\n let integral, fraction, Pad;\n\n const [part1, part2 = \"\"] = value.toString().split(\".\");\n const actualDecimals = part2.length;\n\n integral = parseFloat(part1).toLocaleString();\n\n if (align === Align.Left && alignOnDecimals) {\n integral = padLeft(integral);\n }\n\n if (decimals === DECIMALS_AUTO || actualDecimals === decimals) {\n fraction = part2;\n } else if (actualDecimals > decimals) {\n fraction = parseFloat(\"0.\" + part2)\n .toFixed(decimals)\n .slice(2);\n } else {\n /* eslint-disable no-cond-assign */\n if (\n (Pad = zeroPad\n ? Zero\n : alignOnDecimals && align !== Align.Left\n ? Space\n : null)\n ) {\n if (actualDecimals === 0) {\n fraction = Pad.FULL_PADDING[decimals];\n } else {\n fraction = pad(part2, decimals, Pad);\n }\n } else {\n fraction = part2;\n }\n }\n\n return integral + (fraction ? \".\" + fraction : \"\");\n}\n", "export type RowIndex = {\n [field: string]: number;\n}\n\n// TODO\nexport type Row = {\n [strKey: string]: any;\n} & any[];\n\nexport function addRowsToIndex(rows: Row[], index: RowIndex, indexField: string) {\n for (let idx = 0, len = rows.length; idx < len; idx++) {\n index[rows[idx][indexField]] = idx;\n }\n return index;\n}\n\nexport function indexRows(rows: Row[], indexField: string) {\n return addRowsToIndex(rows, {}, indexField);\n}\n\nexport function isEmptyRow(row: Row) {\n return row[0] === undefined;\n}\n\n// TODO rename\nexport function update(rows: Row[], updates: any) { // TODO\n const results = rows.slice();\n const [[offsetIdx]] = rows;\n for (let i = 0; i < updates.length; i++) {\n const idx = updates[i][0] - offsetIdx;\n // slow, refactor for performance\n if (rows[idx]) {\n const row = rows[idx].slice();\n for (let j = 1; j < updates[i].length; j += 3) {\n row[updates[i][j]] = updates[i][j + 2];\n }\n results[idx] = row;\n } else {\n console.log(`row not found in rows`);\n }\n }\n\n return results;\n}\n", "export const lastWord = (text: string): string => {\n const trimmedText = text.trim();\n const pos = trimmedText.lastIndexOf(' ');\n if (pos === -1) {\n return trimmedText;\n } else {\n return trimmedText.slice(pos + 1);\n }\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["src_exports", "__export", "DOWN1", "DOWN2", "DataWindow", "EventEmitter", "UP1", "UP2", "WindowRange", "addRowsToIndex", "buildColumnMap", "formatDate", "getFullRange", "getMovingValueDirection", "getUniqueId", "indexRows", "invariant", "isCharacterKey", "isEmptyRow", "isKeyedColumn", "isQuoteKey", "isValidNumber", "lastWord", "mapSortCriteria", "metadataKeys", "partition", "projectColumns", "projectUpdates", "resetRange", "roundDecimal", "toColumnDescriptor", "toKeyedColumn", "update", "uuid", "__toCommonJS", "partition", "array", "test", "pass", "fail", "i", "len", "SORT_ASC", "mapSortCriteria", "sortCriteria", "columnMap", "metadataOffset", "s", "columnName", "sortDir", "isKeyedColumn", "column", "toColumnDescriptor", "name", "toKeyedColumn", "key", "EMPTY_COLUMN_MAP", "buildColumnMap", "columns", "start", "metadataKeys", "map", "i", "projectUpdates", "updates", "results", "projectColumns", "tableRowColumnMap", "columnCount", "IDX", "RENDER_IDX", "DEPTH", "COUNT", "KEY", "SELECTED", "count", "startIdx", "offset", "selectedRows", "row", "baseRowIdx", "out", "colIdx", "getFullRange", "from", "to", "bufferSize", "rowCount", "rangeSize", "buff", "shortfallBefore", "shortFallAfter", "resetRange", "WindowRange", "index", "KEY", "metadataKeys", "log", "message", "DataWindow", "from", "to", "rowCount", "WindowRange", "data", "index", "internalIndex", "isUpdate", "key", "row", "overlapFrom", "overlapTo", "newData", "i", "offset", "start", "end", "_a", "clientFrom", "clientTo", "startOffset", "endOffset", "UP1", "UP2", "DOWN1", "DOWN2", "isValidNumber", "n", "getMovingValueDirection", "newValue", "direction", "prevValue", "decimalPlaces", "diff", "formatDate", "date", "format", "isArrayOfListeners", "listeners", "isOnlyListener", "EventEmitter", "type", "listener", "listenerOrListeners", "position", "args", "handler", "invokeHandler", "wildcardHandler", "evtName", "message", "getUniqueId", "actionKeys", "navigationKeys", "functionKeys", "specialKeys", "isSpecialKey", "key", "isCharacterKey", "evt", "isQuoteKey", "invariant", "condition", "message", "error", "uuid", "size", "id", "bytes", "byte", "PUNCTUATION_STR", "DIGIT_STR", "DECIMALS_AUTO", "Space", "Zero", "padLeft", "value", "maxLength", "LEADING_FILL", "Align", "pad", "n", "dp", "Pad", "len", "diff", "roundDecimal", "align", "decimals", "zeroPad", "alignOnDecimals", "integral", "fraction", "part1", "part2", "actualDecimals", "addRowsToIndex", "rows", "index", "indexField", "idx", "len", "indexRows", "isEmptyRow", "row", "update", "updates", "results", "offsetIdx", "i", "j", "lastWord", "text", "trimmedText", "pos"]
7
+ }
package/esm/index.js ADDED
@@ -0,0 +1,2 @@
1
+ function Q(t,e,n=[],r=[]){for(let o=0,i=t.length;o<i;o++)(e(t[o],o)?n:r).push(t[o]);return[n,r]}var N="asc";function J(t,e,n=0){return t.map(r=>{if(typeof r=="string")return[e[r]+n,"asc"];if(Array.isArray(r)){let[o,i]=r;return[e[o]+n,i||N]}else throw Error("columnUtils.mapSortCriteria invalid input")})}function U(t){return typeof t.key=="number"}var z=t=>({name:t}),ee=(t,e)=>typeof t=="string"?{key:e,name:t}:U(t)?t:{...t,key:e},k={};function te(t){let e=h.count;return t?t.reduce((n,r,o)=>(typeof r=="string"?n[r]=e+o:typeof r.key=="number"?n[r.name]=r.key:n[r.name]=e+o,n),{}):k}function ne(t){let e=[],n=h.count-2;for(let r=0;r<t.length;r+=3)e[r]=t[r]+n,e[r+1]=t[r+1],e[r+2]=t[r+2];return e}function re(t,e){let n=e.length,{IDX:r,RENDER_IDX:o,DEPTH:i,COUNT:a,KEY:u,SELECTED:m,count:l}=h;return(p,C,A=[])=>(b,K)=>{let S=b[r],f=[];for(let g=0;g<n;g++){let M=t[e[g].name];f[l+g]=b[M]}return f[r]=p+K+C,f[o]=0,f[i]=0,f[a]=0,f[u]=b[t.KEY],f[m]=A.includes(S)?1:0,f}}var h={IDX:0,RENDER_IDX:1,IS_LEAF:2,IS_EXPANDED:3,DEPTH:4,COUNT:5,KEY:6,SELECTED:7,count:8,PARENT_IDX:"parent_idx",IDX_POINTER:"idx_pointer",FILTER_COUNT:"filter_count",NEXT_FILTER_IDX:"next_filter_idx"};function ie({from:t,to:e},n=0,r=Number.MAX_SAFE_INTEGER){if(n===0)return{from:t,to:Math.min(e,r)};if(t===0)return{from:t,to:Math.min(e+n,r)};{let o=e-t,i=Math.round(n/2),a=t-i<0,u=r-(e+i)<0;return a&&u?{from:0,to:r}:a?{from:0,to:o+n}:u?{from:Math.max(0,r-(o+n)),to:r}:{from:t-i,to:e+i}}}function se({from:t,to:e,bufferSize:n=0}){return{from:0,to:e-t,bufferSize:n,reset:!0}}var c=class{constructor(e,n){this.from=e,this.to=n}isWithin(e){return e>=this.from&&e<this.to}overlap(e,n){return e>=this.to||n<this.from?[0,0]:[Math.max(e,this.from),Math.min(n,this.to)]}copy(){return new c(this.from,this.to)}};var{KEY:G}=h,R=t=>console.log(`%c[DataWindow] ${t}`,"color: purple;font-weight: bold;"),_=class{constructor({from:e,to:n}){this.rowCount=0;this.setRowCount=e=>{e<this.data.length&&(this.data.length=e),this.rowCount=e};R(`constructor ${e} - ${n}`),this.range=new c(e,n),this.data=new Array(n-e)}add(e){let[n]=e;if(this.isWithinRange(n)){let r=n-this.range.from,o=this.data[r]!==void 0;return this.data[r]=e,o}else return!1}getAtIndex(e){return this.range.isWithin(e)&&this.data[e-this.range.from]!=null?this.data[e-this.range.from]:void 0}getByKey(e){return this.data.find(n=>n[G]===e)}isWithinRange(e){return this.range.isWithin(e)&&e<=this.rowCount}setRange(e,n){if(R(`setRange ${e} ${n}`),e!==this.range.from||n!==this.range.to){let[r,o]=this.range.overlap(e,n),i=new Array(n-e);for(let a=r;a<o;a++){let u=this.getAtIndex(a);if(u){let m=a-e;i[m]=u}}this.data=i,this.range.from=e,this.range.to=n}}hasData(e,n){let r=this.range.from,o=e-r,i=Math.min(n-r-1,this.rowCount-1);return this.data[o]!==void 0&&this.data[i]!==void 0}getData(e,n){var u;let{from:r,to:o}=this.range,i=Math.max(0,e-r),a=Math.min(n-r,(u=this.rowCount)!=null?u:n);return this.data.slice(i,a)}};var x="up1",y="up2",D="down1",E="down2",ce=t=>typeof t=="number"&&isFinite(t);function me(t,e,n,r){if(!isFinite(t)||n===void 0||e===void 0)return"";{let o=t-n;return o&&typeof r=="number"&&(o=+t.toFixed(r)-+n.toFixed(r)),o?e===""?o<0?D:x:o>0?e===D||e===E||e===y?x:y:e===x||e===y||e===E?D:E:""}}var he=(t,e)=>t.toUTCString();function v(t){return Array.isArray(t)}function O(t){return!Array.isArray(t)}var L=class{constructor(){this._events={}}addListener(e,n){this._events||(this._events={});let r=this._events[e];r?v(r)?r.push(n):O(r)&&(this._events[e]=[r,n]):this._events[e]=n}removeListener(e,n){if(!this._events||!this._events[e])return;let r=this._events[e],o=-1;if(r===n)delete this._events[e];else if(Array.isArray(r)){for(let i=length;i-- >0;)if(r[i]===n){o=i;break}if(o<0)return;r.length===1?(r.length=0,delete this._events[e]):r.splice(o,1)}}removeAllListeners(e){if(this._events)e===void 0?delete this._events:delete this._events[e];else return}emit(e,...n){if(this._events){let r=this._events[e];r&&I(r,e,n);let o=this._events["*"];o&&I(o,e,n)}}once(e,n){let r=(o,i)=>{this.removeListener(o,r),n(o,i)};this.on(e,r)}on(e,n){return this.addListener(e,n)}};function I(t,e,n){if(v(t))t.slice().forEach(r=>I(r,e,n));else switch(n.length){case 0:t(e);break;case 1:t(e,n[0]);break;case 2:t(e,n[0],n[1]);break;default:t.call(null,e,...n)}}var be=()=>`hw-${Math.round(Math.random()*1e5)}`;var P={Enter:"Enter",Delete:"Delete"},W={Home:"Home",End:"End",ArrowRight:"ArrowRight",ArrowLeft:"ArrowLeft",ArrowDown:"ArrowDown",ArrowUp:"ArrowUp",Tab:"Tab"},H={F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F11",F12:"F12"},X={...P,...W,...H},$=t=>t in X,ye=t=>{if($(t.key))return!1;if(typeof t.which=="number"&&t.which>0)return!t.ctrlKey&&!t.metaKey&&!t.altKey&&t.which!==8},De=t=>t.key==='"'||t.key==="'";function Ie(t,e){if(!t){let n=new Error(e);throw n.name="Invariant Violation",n.framesToPop=1,n}}var Re=(t=21)=>{let e="",n=crypto.getRandomValues(new Uint8Array(t));for(;t--;){let r=n[t]&63;r<36?e+=r.toString(36):r<62?e+=(r-26).toString(36).toUpperCase():r<63?e+="_":e+="-"}return e};var d=String.fromCharCode(8200),s=String.fromCharCode(8199),Y=-1,w={DIGIT:s,TWO_DIGITS:s+s,THREE_DIGITS:s+s+s,FULL_PADDING:[null,d+s,d+s+s,d+s+s+s,d+s+s+s+s]},V={DIGIT:"0",TWO_DIGITS:"00",THREE_DIGITS:"000",FULL_PADDING:[null,"0","00","000","0000"]};function j(t,e=6){return(B+t).slice(-e)}var B=s+s+s+s+s+s+s+s+s,T={Right:"right",Center:"center",Left:"left"};function F(t,e,n){let r=t.length,o=e-r;if(o>0)o===1?t=t+n.DIGIT:o===2?t=t+n.TWO_DIGITS:o===3&&(t=t+n.THREE_DIGITS);else if(o<0&&(t=t.slice(0,e),r=e),n===w&&t.charAt(r-1)==="0")return t=t.replace(/0+$/,""),F(t,e,n);return t}function Le(t,e=T.Right,n=4,r,o){if(t===void 0||typeof t!="number"||isNaN(t))return"";let i,a,u,[m,l=""]=t.toString().split("."),p=l.length;return i=parseFloat(m).toLocaleString(),e===T.Left&&o&&(i=j(i)),n===Y||p===n?a=l:p>n?a=parseFloat("0."+l).toFixed(n).slice(2):(u=r?V:o&&e!==T.Left?w:null)?p===0?a=u.FULL_PADDING[n]:a=F(l,n,u):a=l,i+(a?"."+a:"")}function q(t,e,n){for(let r=0,o=t.length;r<o;r++)e[t[r][n]]=r;return e}function we(t,e){return q(t,{},e)}function Fe(t){return t[0]===void 0}function Ce(t,e){let n=t.slice(),[[r]]=t;for(let o=0;o<e.length;o++){let i=e[o][0]-r;if(t[i]){let a=t[i].slice();for(let u=1;u<e[o].length;u+=3)a[e[o][u]]=e[o][u+2];n[i]=a}else console.log("row not found in rows")}return n}var Ke=t=>{let e=t.trim(),n=e.lastIndexOf(" ");return n===-1?e:e.slice(n+1)};export{D as DOWN1,E as DOWN2,_ as DataWindow,L as EventEmitter,x as UP1,y as UP2,c as WindowRange,q as addRowsToIndex,te as buildColumnMap,he as formatDate,ie as getFullRange,me as getMovingValueDirection,be as getUniqueId,we as indexRows,Ie as invariant,ye as isCharacterKey,Fe as isEmptyRow,U as isKeyedColumn,De as isQuoteKey,ce as isValidNumber,Ke as lastWord,J as mapSortCriteria,h as metadataKeys,Q as partition,re as projectColumns,ne as projectUpdates,se as resetRange,Le as roundDecimal,z as toColumnDescriptor,ee as toKeyedColumn,Ce as update,Re as uuid};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/vuu-utils/src/array-utils.ts", "../../../packages/vuu-utils/src/column-utils.ts", "../../../packages/vuu-utils/src/range-utils.ts", "../../../packages/vuu-utils/src/DataWindow.ts", "../../../packages/vuu-utils/src/data-utils.ts", "../../../packages/vuu-utils/src/date-utils.ts", "../../../packages/vuu-utils/src/event-emitter.ts", "../../../packages/vuu-utils/src/getUniqueId.ts", "../../../packages/vuu-utils/src/input-utils.ts", "../../../packages/vuu-utils/src/invariant.ts", "../../../packages/vuu-utils/src/nanoid/index.ts", "../../../packages/vuu-utils/src/round-decimal.ts", "../../../packages/vuu-utils/src/row-utils.ts", "../../../packages/vuu-utils/src/text-utils.ts"],
4
+ "sourcesContent": ["export type PartitionTest<T> = (value: T, index: number) => boolean;\n\nexport function partition<T>(\n array: T[],\n test: PartitionTest<T>,\n pass: T[] = [],\n fail: T[] = []\n): [T[], T[]] {\n for (let i = 0, len = array.length; i < len; i++) {\n (test(array[i], i) ? pass : fail).push(array[i]);\n }\n return [pass, fail];\n}\n", "import {\n ColumnDescriptor,\n KeyedColumnDescriptor,\n} from \"@vuu-ui/vuu-datagrid/src/grid-model/gridModelTypes\";\nimport { Row } from \"./row-utils\";\n\nexport interface ColumnMap {\n [columnName: string]: number;\n}\n\nconst SORT_ASC = \"asc\";\n\nexport type SortCriteriaItem = string | [string, \"asc\"]; // TODO where is 'desc'?\n\nexport function mapSortCriteria(\n sortCriteria: SortCriteriaItem[],\n columnMap: ColumnMap,\n metadataOffset = 0\n): [number, \"asc\"][] {\n return sortCriteria.map((s) => {\n if (typeof s === \"string\") {\n return [columnMap[s] + metadataOffset, \"asc\"];\n } else if (Array.isArray(s)) {\n const [columnName, sortDir] = s;\n return [columnMap[columnName] + metadataOffset, sortDir || SORT_ASC];\n } else {\n throw Error(\"columnUtils.mapSortCriteria invalid input\");\n }\n });\n}\n\nexport function isKeyedColumn(\n column: ColumnDescriptor\n): column is KeyedColumnDescriptor {\n return typeof (column as KeyedColumnDescriptor).key === \"number\";\n}\n\nexport const toColumnDescriptor = (name: string): ColumnDescriptor => ({\n name,\n});\n\nexport const toKeyedColumn = (\n column: string | ColumnDescriptor,\n key: number\n): KeyedColumnDescriptor => {\n if (typeof column === \"string\") {\n return { key, name: column };\n }\n if (isKeyedColumn(column)) {\n return column;\n }\n return { ...column, key };\n};\n\nconst EMPTY_COLUMN_MAP = {} as const;\n\nexport function buildColumnMap(columns?: (Column | string)[]): ColumnMap {\n const start = metadataKeys.count;\n if (columns) {\n return columns.reduce((map, column, i) => {\n if (typeof column === \"string\") {\n map[column] = start + i;\n } else if (typeof column.key === \"number\") {\n map[column.name] = column.key;\n } else {\n map[column.name] = start + i;\n }\n return map;\n }, {} as ColumnMap);\n } else {\n return EMPTY_COLUMN_MAP;\n }\n}\n\nexport function projectUpdates(updates: number[]): number[] {\n const results: number[] = [];\n const metadataOffset = metadataKeys.count - 2;\n for (let i = 0; i < updates.length; i += 3) {\n results[i] = updates[i] + metadataOffset;\n results[i + 1] = updates[i + 1];\n results[i + 2] = updates[i + 2];\n }\n return results;\n}\n\nexport function projectColumns(\n tableRowColumnMap: ColumnMap,\n columns: ColumnDescriptor[]\n) {\n const columnCount = columns.length;\n const { IDX, RENDER_IDX, DEPTH, COUNT, KEY, SELECTED, count } = metadataKeys;\n return (startIdx: number, offset: number, selectedRows: Row[] = []) =>\n (row: Row, i: number) => {\n // selectedRows are indices of rows within underlying dataset (not sorted or filtered)\n // row is the original row from this set, with original index in IDX pos, which might\n // be overwritten with a different value below if rows are sorted/filtered\n const baseRowIdx: any = row[IDX]; // TODO\n const out = [];\n for (let i = 0; i < columnCount; i++) {\n const colIdx = tableRowColumnMap[columns[i].name];\n out[count + i] = row[colIdx];\n }\n\n out[IDX] = startIdx + i + offset;\n out[RENDER_IDX] = 0;\n out[DEPTH] = 0;\n out[COUNT] = 0;\n out[KEY] = row[tableRowColumnMap.KEY];\n out[SELECTED] = selectedRows.includes(baseRowIdx) ? 1 : 0;\n return out;\n };\n}\n\nexport type Meta = {\n [key: string]: any;\n} & any[];\n\nexport const metadataKeys = {\n IDX: 0,\n RENDER_IDX: 1,\n IS_LEAF: 2,\n IS_EXPANDED: 3,\n DEPTH: 4,\n COUNT: 5,\n KEY: 6,\n SELECTED: 7,\n count: 8,\n // TODO following only used in datamodel\n PARENT_IDX: \"parent_idx\",\n IDX_POINTER: \"idx_pointer\",\n FILTER_COUNT: \"filter_count\",\n NEXT_FILTER_IDX: \"next_filter_idx\",\n} as const;\n", "export interface VuuRange {\n from: number;\n to: number;\n bufferSize?: number;\n reset?: boolean;\n}\n\ninterface FromToRange {\n from: number;\n to: number;\n}\n\nexport function getFullRange(\n { from, to }: VuuRange,\n bufferSize: number = 0,\n rowCount: number = Number.MAX_SAFE_INTEGER\n): FromToRange {\n if (bufferSize === 0) {\n return { from, to: Math.min(to, rowCount) };\n } else if (from === 0) {\n return { from, to: Math.min(to + bufferSize, rowCount) };\n } else {\n const rangeSize = to - from;\n const buff = Math.round(bufferSize / 2);\n const shortfallBefore = from - buff < 0;\n const shortFallAfter = rowCount - (to + buff) < 0;\n\n if (shortfallBefore && shortFallAfter) {\n return { from: 0, to: rowCount };\n } else if (shortfallBefore) {\n return { from: 0, to: rangeSize + bufferSize };\n } else if (shortFallAfter) {\n return { from: Math.max(0, rowCount - (rangeSize + bufferSize)), to: rowCount };\n } else {\n return { from: from - buff, to: to + buff };\n }\n }\n}\n\nexport function resetRange({ from, to, bufferSize = 0 }: VuuRange): VuuRange {\n return {\n from: 0,\n to: to - from,\n bufferSize,\n reset: true\n };\n}\n\nexport class WindowRange {\n public from: number;\n public to: number;\n\n constructor(from: number, to: number) {\n this.from = from;\n this.to = to;\n }\n\n public isWithin(index: number) {\n return index >= this.from && index < this.to;\n }\n\n //find the overlap of this range and a new one\n public overlap(from: number, to: number): [number, number] {\n return from >= this.to || to < this.from\n ? [0, 0]\n : [Math.max(from, this.from), Math.min(to, this.to)];\n }\n\n public copy(): WindowRange {\n return new WindowRange(this.from, this.to);\n }\n}\n", "import { WindowRange } from \"./range-utils\";\nimport { metadataKeys } from \"./column-utils\";\n\nexport type DataItem = string | number | boolean;\nexport type DataRow = [\n /** index */\n number,\n /** render index */\n number,\n /** isLeaf */\n boolean,\n /** isExpanded */\n boolean,\n /** depth */\n number,\n /** child count */\n number,\n /** key */\n string,\n /** selected */\n number,\n /** data values */\n ...DataItem[]\n];\nexport type RangeLike = { from: number; to: number };\n\nconst { KEY } = metadataKeys;\n\nconst log = (message: string) =>\n console.log(`%c[DataWindow] ${message}`, \"color: purple;font-weight: bold;\");\nexport class DataWindow {\n private range: WindowRange;\n public data: DataRow[];\n public rowCount = 0;\n constructor({ from, to }: RangeLike) {\n log(`constructor ${from} - ${to}`);\n this.range = new WindowRange(from, to);\n //internal data is always 0 based, we add range.from to determine an offset\n this.data = new Array(to - from);\n // window.dataWindow = this.data;\n // log(`constructor initial range ${from} - ${to}`);\n }\n\n setRowCount = (rowCount: number) => {\n // log(`rowCount => ${rowCount}`);\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n this.rowCount = rowCount;\n };\n\n // return true if existing row was updated\n add(data: DataRow) {\n const [index] = data;\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.range.from;\n const isUpdate = this.data[internalIndex] !== undefined;\n this.data[internalIndex] = data;\n return isUpdate;\n } else {\n return false;\n }\n }\n\n getAtIndex(index: number) {\n return this.range.isWithin(index) &&\n this.data[index - this.range.from] != null\n ? this.data[index - this.range.from]\n : undefined;\n }\n\n getByKey(key: string) {\n return this.data.find((row) => row[KEY] === key);\n }\n\n isWithinRange(index: number) {\n return this.range.isWithin(index) && index <= this.rowCount;\n }\n\n setRange(from: number, to: number) {\n log(`setRange ${from} ${to}`);\n if (from !== this.range.from || to !== this.range.to) {\n const [overlapFrom, overlapTo] = this.range.overlap(from, to);\n const newData = new Array(to - from);\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.range.from = from;\n this.range.to = to;\n }\n }\n\n hasData(from: number, to: number) {\n const offset = this.range.from;\n const start = from - offset;\n const end = Math.min(to - offset - 1, this.rowCount - 1);\n return this.data[start] !== undefined && this.data[end] !== undefined;\n }\n\n getData(from: number, to: number): any[] {\n const { from: clientFrom, to: clientTo } = this.range;\n const startOffset = Math.max(0, from - clientFrom);\n const endOffset = Math.min(to - clientFrom, this.rowCount ?? to);\n return this.data.slice(startOffset, endOffset);\n }\n}\n", "export type valueChangeDirection = \"up1\" | \"up2\" | \"down1\" | \"down2\" | \"\";\n\nexport const UP1 = \"up1\";\nexport const UP2 = \"up2\";\nexport const DOWN1 = \"down1\";\nexport const DOWN2 = \"down2\";\n\nexport const isValidNumber = (n: unknown): n is number =>\n typeof n === \"number\" && isFinite(n);\n\nexport function getMovingValueDirection(\n newValue: number,\n direction?: valueChangeDirection,\n prevValue?: number,\n /** the number of decimal places to take into account when highlighting a change */\n decimalPlaces?: number\n): valueChangeDirection {\n if (\n !isFinite(newValue) ||\n prevValue === undefined ||\n direction === undefined\n ) {\n return \"\";\n } else {\n let diff = newValue - prevValue;\n if (diff) {\n // make sure there is still a diff when reduced to number of decimals to be displayed\n if (typeof decimalPlaces === \"number\") {\n diff =\n +newValue.toFixed(decimalPlaces) - +prevValue.toFixed(decimalPlaces);\n }\n }\n\n if (diff) {\n if (direction === \"\") {\n if (diff < 0) {\n return DOWN1;\n } else {\n return UP1;\n }\n } else if (diff > 0) {\n if (direction === DOWN1 || direction === DOWN2 || direction === UP2) {\n return UP1;\n } else {\n return UP2;\n }\n } else if (\n direction === UP1 ||\n direction === UP2 ||\n direction === DOWN2\n ) {\n return DOWN1;\n } else {\n return DOWN2;\n }\n } else {\n return \"\";\n }\n }\n}\n", "//TODO\nexport const formatDate = (date: Date, format: string) => {\n return date.toUTCString();\n};\n", "export interface Event {}\n\nexport type EventListener = (evtName: string, ...args: any[]) => void;\n\nexport type EventListenerMap = {\n [eventName: string]: EventListener[] | EventListener;\n};\n\nfunction isArrayOfListeners(\n listeners: EventListener | EventListener[]\n): listeners is EventListener[] {\n return Array.isArray(listeners);\n}\n\nfunction isOnlyListener(\n listeners: EventListener | EventListener[]\n): listeners is EventListener {\n return !Array.isArray(listeners);\n}\n\nexport interface IEventEmitter {\n emit: (type: string, ...args: unknown[]) => void;\n}\n\nexport class EventEmitter implements IEventEmitter {\n private _events?: EventListenerMap;\n\n constructor() {\n this._events = {};\n }\n\n addListener(type: string, listener: EventListener) {\n if (!this._events) {\n this._events = {};\n }\n\n const listeners = this._events[type];\n\n if (!listeners) {\n this._events[type] = listener;\n } else if (isArrayOfListeners(listeners)) {\n listeners.push(listener);\n } else if (isOnlyListener(listeners)) {\n this._events[type] = [listeners, listener];\n }\n }\n\n removeListener(type: string, listener: EventListener) {\n if (!this._events || !this._events[type]) {\n return;\n }\n\n const listenerOrListeners = this._events[type];\n let position = -1;\n\n if (listenerOrListeners === listener) {\n delete this._events[type];\n } else if (Array.isArray(listenerOrListeners)) {\n for (let i = length; i-- > 0; ) {\n if (listenerOrListeners[i] === listener) {\n position = i;\n break;\n }\n }\n\n if (position < 0) {\n return;\n }\n\n if (listenerOrListeners.length === 1) {\n listenerOrListeners.length = 0;\n delete this._events[type];\n } else {\n listenerOrListeners.splice(position, 1);\n }\n }\n }\n\n removeAllListeners(type: string) {\n if (!this._events) {\n return;\n } else if (type === undefined) {\n delete this._events;\n } else {\n delete this._events[type];\n }\n }\n\n emit(type: string, ...args: unknown[]) {\n if (this._events) {\n const handler = this._events[type];\n if (handler) {\n invokeHandler(handler, type, args);\n }\n const wildcardHandler = this._events[\"*\"];\n if (wildcardHandler) {\n invokeHandler(wildcardHandler, type, args);\n }\n }\n }\n\n once(type: string, listener: EventListener) {\n const handler = (evtName: string, message: unknown) => {\n this.removeListener(evtName, handler);\n listener(evtName, message);\n };\n\n this.on(type, handler);\n }\n\n on(type: string, listener: EventListener) {\n return this.addListener(type, listener);\n }\n}\n\nfunction invokeHandler(\n handler: EventListener | EventListener[],\n type: string,\n args: unknown[]\n) {\n if (isArrayOfListeners(handler)) {\n handler.slice().forEach((listener) => invokeHandler(listener, type, args));\n } else {\n switch (args.length) {\n case 0:\n handler(type);\n break;\n case 1:\n handler(type, args[0]);\n break;\n case 2:\n handler(type, args[0], args[1]);\n break;\n // slower\n default:\n handler.call(null, type, ...args);\n }\n }\n}\n", "export const getUniqueId = () => `hw-${Math.round(Math.random() * 1e5)}`;\n", "const actionKeys = {\n Enter: 'Enter',\n Delete: 'Delete'\n};\n\nconst navigationKeys = {\n Home: 'Home',\n End: 'End',\n ArrowRight: 'ArrowRight',\n ArrowLeft: 'ArrowLeft',\n ArrowDown: 'ArrowDown',\n ArrowUp: 'ArrowUp',\n Tab: 'Tab'\n};\nconst functionKeys = {\n F1: 'F1',\n F2: 'F2',\n F3: 'F3',\n F4: 'F4',\n F5: 'F5',\n F6: 'F6',\n F7: 'F7',\n F8: 'F8',\n F9: 'F9',\n F10: 'F10',\n F11: 'F11',\n F12: 'F12'\n};\n\nconst specialKeys = {\n ...actionKeys,\n ...navigationKeys,\n ...functionKeys\n};\ntype specialKey = keyof typeof specialKeys;\n\nconst isSpecialKey = (key: string): key is specialKey => key in specialKeys;\n\nexport const isCharacterKey = (evt: KeyboardEvent) => {\n if (isSpecialKey(evt.key)) {\n return false;\n }\n if (typeof evt.which === 'number' && evt.which > 0) {\n return !evt.ctrlKey && !evt.metaKey && !evt.altKey && evt.which !== 8;\n }\n};\n\nexport const isQuoteKey = (evt: KeyboardEvent) => {\n return evt.key === '\"' || evt.key === \"'\";\n};\n", "export function invariant(condition: boolean, message: string) {\n if (!condition) {\n const error = new Error(message);\n error.name = 'Invariant Violation';\n // TODO what is framesToPop?\n // @ts-ignore\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n}\n", "// This is the index.browser.js file from nanoid\n// couldn't get original code to work as npm import without crypro warnings -\n// seemed to be picking up node version, not browser version\n\nexport const uuid = (size: number = 21): string => {\n let id: string = '';\n let bytes = crypto.getRandomValues(new Uint8Array(size));\n\n // A compact alternative for `for (var i = 0; i < step; i++)`.\n while (size--) {\n // It is incorrect to use bytes exceeding the alphabet size.\n // The following mask reduces the random byte in the 0-255 value\n // range to the 0-63 value range. Therefore, adding hacks, such\n // as empty string fallback or magic numbers, is unneccessary because\n // the bitmask trims bytes down to the alphabet size.\n let byte = bytes[size] & 63;\n if (byte < 36) {\n // `0-9a-z`\n id += byte.toString(36);\n } else if (byte < 62) {\n // `A-Z`\n id += (byte - 26).toString(36).toUpperCase();\n } else if (byte < 63) {\n id += '_';\n } else {\n id += '-';\n }\n }\n return id;\n};\n", "const PUNCTUATION_STR = String.fromCharCode(8200);\nconst DIGIT_STR = String.fromCharCode(8199);\nconst DECIMALS_AUTO = -1;\n\ntype PadMap = {\n DIGIT: string;\n TWO_DIGITS: string;\n THREE_DIGITS: string;\n FULL_PADDING: [null, string, string, string, string];\n};\n\nconst Space: PadMap = {\n DIGIT: DIGIT_STR,\n TWO_DIGITS: DIGIT_STR + DIGIT_STR,\n THREE_DIGITS: DIGIT_STR + DIGIT_STR + DIGIT_STR,\n FULL_PADDING: [\n null,\n PUNCTUATION_STR + DIGIT_STR,\n PUNCTUATION_STR + DIGIT_STR + DIGIT_STR,\n PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR,\n PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR,\n ],\n};\n\nconst Zero: PadMap = {\n DIGIT: \"0\",\n TWO_DIGITS: \"00\",\n THREE_DIGITS: \"000\",\n FULL_PADDING: [null, \"0\", \"00\", \"000\", \"0000\"],\n};\n\nfunction padLeft(value: string, maxLength = 6) {\n return (LEADING_FILL + value).slice(-maxLength);\n}\n\nconst LEADING_FILL =\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR;\n\nconst Align = {\n Right: \"right\",\n Center: \"center\",\n Left: \"left\",\n};\n\nfunction pad(n: string, dp: number, Pad: PadMap): string {\n let len = n.length;\n const diff = dp - len;\n\n if (diff > 0) {\n if (diff === 1) {\n n = n + Pad.DIGIT;\n } else if (diff === 2) {\n n = n + Pad.TWO_DIGITS;\n } else if (diff === 3) {\n n = n + Pad.THREE_DIGITS;\n }\n } else {\n if (diff < 0) {\n n = n.slice(0, dp);\n len = dp;\n }\n\n if (Pad === Space && n.charAt(len - 1) === \"0\") {\n n = n.replace(/0+$/, \"\");\n return pad(n, dp, Pad);\n }\n }\n return n;\n}\n\nexport function roundDecimal(\n value?: number,\n align = Align.Right,\n decimals = 4,\n zeroPad?: boolean,\n alignOnDecimals?: boolean\n) {\n if (value === undefined || typeof value !== \"number\" || isNaN(value)) {\n return \"\";\n }\n let integral, fraction, Pad;\n\n const [part1, part2 = \"\"] = value.toString().split(\".\");\n const actualDecimals = part2.length;\n\n integral = parseFloat(part1).toLocaleString();\n\n if (align === Align.Left && alignOnDecimals) {\n integral = padLeft(integral);\n }\n\n if (decimals === DECIMALS_AUTO || actualDecimals === decimals) {\n fraction = part2;\n } else if (actualDecimals > decimals) {\n fraction = parseFloat(\"0.\" + part2)\n .toFixed(decimals)\n .slice(2);\n } else {\n /* eslint-disable no-cond-assign */\n if (\n (Pad = zeroPad\n ? Zero\n : alignOnDecimals && align !== Align.Left\n ? Space\n : null)\n ) {\n if (actualDecimals === 0) {\n fraction = Pad.FULL_PADDING[decimals];\n } else {\n fraction = pad(part2, decimals, Pad);\n }\n } else {\n fraction = part2;\n }\n }\n\n return integral + (fraction ? \".\" + fraction : \"\");\n}\n", "export type RowIndex = {\n [field: string]: number;\n}\n\n// TODO\nexport type Row = {\n [strKey: string]: any;\n} & any[];\n\nexport function addRowsToIndex(rows: Row[], index: RowIndex, indexField: string) {\n for (let idx = 0, len = rows.length; idx < len; idx++) {\n index[rows[idx][indexField]] = idx;\n }\n return index;\n}\n\nexport function indexRows(rows: Row[], indexField: string) {\n return addRowsToIndex(rows, {}, indexField);\n}\n\nexport function isEmptyRow(row: Row) {\n return row[0] === undefined;\n}\n\n// TODO rename\nexport function update(rows: Row[], updates: any) { // TODO\n const results = rows.slice();\n const [[offsetIdx]] = rows;\n for (let i = 0; i < updates.length; i++) {\n const idx = updates[i][0] - offsetIdx;\n // slow, refactor for performance\n if (rows[idx]) {\n const row = rows[idx].slice();\n for (let j = 1; j < updates[i].length; j += 3) {\n row[updates[i][j]] = updates[i][j + 2];\n }\n results[idx] = row;\n } else {\n console.log(`row not found in rows`);\n }\n }\n\n return results;\n}\n", "export const lastWord = (text: string): string => {\n const trimmedText = text.trim();\n const pos = trimmedText.lastIndexOf(' ');\n if (pos === -1) {\n return trimmedText;\n } else {\n return trimmedText.slice(pos + 1);\n }\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["partition", "array", "test", "pass", "fail", "i", "len", "SORT_ASC", "mapSortCriteria", "sortCriteria", "columnMap", "metadataOffset", "s", "columnName", "sortDir", "isKeyedColumn", "column", "toColumnDescriptor", "name", "toKeyedColumn", "key", "EMPTY_COLUMN_MAP", "buildColumnMap", "columns", "start", "metadataKeys", "map", "i", "projectUpdates", "updates", "results", "projectColumns", "tableRowColumnMap", "columnCount", "IDX", "RENDER_IDX", "DEPTH", "COUNT", "KEY", "SELECTED", "count", "startIdx", "offset", "selectedRows", "row", "baseRowIdx", "out", "colIdx", "getFullRange", "from", "to", "bufferSize", "rowCount", "rangeSize", "buff", "shortfallBefore", "shortFallAfter", "resetRange", "WindowRange", "index", "KEY", "metadataKeys", "log", "message", "DataWindow", "from", "to", "rowCount", "WindowRange", "data", "index", "internalIndex", "isUpdate", "key", "row", "overlapFrom", "overlapTo", "newData", "i", "offset", "start", "end", "_a", "clientFrom", "clientTo", "startOffset", "endOffset", "UP1", "UP2", "DOWN1", "DOWN2", "isValidNumber", "n", "getMovingValueDirection", "newValue", "direction", "prevValue", "decimalPlaces", "diff", "formatDate", "date", "format", "isArrayOfListeners", "listeners", "isOnlyListener", "EventEmitter", "type", "listener", "listenerOrListeners", "position", "args", "handler", "invokeHandler", "wildcardHandler", "evtName", "message", "getUniqueId", "actionKeys", "navigationKeys", "functionKeys", "specialKeys", "isSpecialKey", "key", "isCharacterKey", "evt", "isQuoteKey", "invariant", "condition", "message", "error", "uuid", "size", "id", "bytes", "byte", "PUNCTUATION_STR", "DIGIT_STR", "DECIMALS_AUTO", "Space", "Zero", "padLeft", "value", "maxLength", "LEADING_FILL", "Align", "pad", "n", "dp", "Pad", "len", "diff", "roundDecimal", "align", "decimals", "zeroPad", "alignOnDecimals", "integral", "fraction", "part1", "part2", "actualDecimals", "addRowsToIndex", "rows", "index", "indexField", "idx", "len", "indexRows", "isEmptyRow", "row", "update", "updates", "results", "offsetIdx", "i", "j", "lastWord", "text", "trimmedText", "pos"]
7
+ }
package/package.json CHANGED
@@ -1,22 +1,16 @@
1
1
  {
2
2
  "name": "@vuu-ui/vuu-utils",
3
- "version": "0.5.3",
3
+ "version": "0.5.5",
4
4
  "author": "heswell",
5
5
  "license": "Apache-2.0",
6
- "scripts": {
7
- "build": "node ../../scripts/run-build.mjs",
8
- "test": "vitest run",
9
- "type-defs": "node ../../scripts/build-type-defs.mjs"
10
- },
11
6
  "devDependencies": {},
12
7
  "peerDependencies": {
13
8
  "react": "^17.0.2",
14
9
  "react-dom": "^17.0.2"
15
10
  },
16
11
  "files": [
17
- "index.js",
18
- "index.js.map",
19
- "/src"
12
+ "cjs",
13
+ "esm"
20
14
  ],
21
15
  "module": "esm/index.js",
22
16
  "main": "cjs/index.js"
package/src/DataWindow.ts DELETED
@@ -1,111 +0,0 @@
1
- import { WindowRange } from "./range-utils";
2
- import { metadataKeys } from "./column-utils";
3
-
4
- export type DataItem = string | number | boolean;
5
- export type DataRow = [
6
- /** index */
7
- number,
8
- /** render index */
9
- number,
10
- /** isLeaf */
11
- boolean,
12
- /** isExpanded */
13
- boolean,
14
- /** depth */
15
- number,
16
- /** child count */
17
- number,
18
- /** key */
19
- string,
20
- /** selected */
21
- number,
22
- /** data values */
23
- ...DataItem[]
24
- ];
25
- export type RangeLike = { from: number; to: number };
26
-
27
- const { KEY } = metadataKeys;
28
-
29
- const log = (message: string) =>
30
- console.log(`%c[DataWindow] ${message}`, "color: purple;font-weight: bold;");
31
- export class DataWindow {
32
- private range: WindowRange;
33
- public data: DataRow[];
34
- public rowCount = 0;
35
- constructor({ from, to }: RangeLike) {
36
- log(`constructor ${from} - ${to}`);
37
- this.range = new WindowRange(from, to);
38
- //internal data is always 0 based, we add range.from to determine an offset
39
- this.data = new Array(to - from);
40
- // window.dataWindow = this.data;
41
- // log(`constructor initial range ${from} - ${to}`);
42
- }
43
-
44
- setRowCount = (rowCount: number) => {
45
- // log(`rowCount => ${rowCount}`);
46
- if (rowCount < this.data.length) {
47
- this.data.length = rowCount;
48
- }
49
- this.rowCount = rowCount;
50
- };
51
-
52
- // return true if existing row was updated
53
- add(data: DataRow) {
54
- const [index] = data;
55
- if (this.isWithinRange(index)) {
56
- const internalIndex = index - this.range.from;
57
- const isUpdate = this.data[internalIndex] !== undefined;
58
- this.data[internalIndex] = data;
59
- return isUpdate;
60
- } else {
61
- return false;
62
- }
63
- }
64
-
65
- getAtIndex(index: number) {
66
- return this.range.isWithin(index) &&
67
- this.data[index - this.range.from] != null
68
- ? this.data[index - this.range.from]
69
- : undefined;
70
- }
71
-
72
- getByKey(key: string) {
73
- return this.data.find((row) => row[KEY] === key);
74
- }
75
-
76
- isWithinRange(index: number) {
77
- return this.range.isWithin(index) && index <= this.rowCount;
78
- }
79
-
80
- setRange(from: number, to: number) {
81
- log(`setRange ${from} ${to}`);
82
- if (from !== this.range.from || to !== this.range.to) {
83
- const [overlapFrom, overlapTo] = this.range.overlap(from, to);
84
- const newData = new Array(to - from);
85
- for (let i = overlapFrom; i < overlapTo; i++) {
86
- const data = this.getAtIndex(i);
87
- if (data) {
88
- const index = i - from;
89
- newData[index] = data;
90
- }
91
- }
92
- this.data = newData;
93
- this.range.from = from;
94
- this.range.to = to;
95
- }
96
- }
97
-
98
- hasData(from: number, to: number) {
99
- const offset = this.range.from;
100
- const start = from - offset;
101
- const end = Math.min(to - offset - 1, this.rowCount - 1);
102
- return this.data[start] !== undefined && this.data[end] !== undefined;
103
- }
104
-
105
- getData(from: number, to: number): any[] {
106
- const { from: clientFrom, to: clientTo } = this.range;
107
- const startOffset = Math.max(0, from - clientFrom);
108
- const endOffset = Math.min(to - clientFrom, this.rowCount ?? to);
109
- return this.data.slice(startOffset, endOffset);
110
- }
111
- }
@@ -1,22 +0,0 @@
1
- export function arrayOfIndices(length: number): number[] {
2
- // not the neatest, but far and away the fastest way to do this ...
3
- const result = Array(length);
4
- for (let i = 0; i < length; i++) {
5
- result[i] = i;
6
- }
7
- return result;
8
- }
9
-
10
- export type PartitionTest<T> = (value: T, index: number) => boolean;
11
-
12
- export function partition<T>(
13
- array: T[],
14
- test: PartitionTest<T>,
15
- pass: T[] = [],
16
- fail: T[] = []
17
- ): [T[], T[]] {
18
- for (let i = 0, len = array.length; i < len; i++) {
19
- (test(array[i], i) ? pass : fail).push(array[i]);
20
- }
21
- return [pass, fail];
22
- }
@@ -1,133 +0,0 @@
1
- import {
2
- ColumnDescriptor,
3
- KeyedColumnDescriptor,
4
- } from "@vuu-ui/vuu-datagrid/src/grid-model/gridModelTypes";
5
- import { Row } from "./row-utils";
6
-
7
- export interface ColumnMap {
8
- [columnName: string]: number;
9
- }
10
-
11
- const SORT_ASC = "asc";
12
-
13
- export type SortCriteriaItem = string | [string, "asc"]; // TODO where is 'desc'?
14
-
15
- export function mapSortCriteria(
16
- sortCriteria: SortCriteriaItem[],
17
- columnMap: ColumnMap,
18
- metadataOffset = 0
19
- ): [number, "asc"][] {
20
- return sortCriteria.map((s) => {
21
- if (typeof s === "string") {
22
- return [columnMap[s] + metadataOffset, "asc"];
23
- } else if (Array.isArray(s)) {
24
- const [columnName, sortDir] = s;
25
- return [columnMap[columnName] + metadataOffset, sortDir || SORT_ASC];
26
- } else {
27
- throw Error("columnUtils.mapSortCriteria invalid input");
28
- }
29
- });
30
- }
31
-
32
- export function isKeyedColumn(
33
- column: ColumnDescriptor
34
- ): column is KeyedColumnDescriptor {
35
- return typeof (column as KeyedColumnDescriptor).key === "number";
36
- }
37
-
38
- export const toColumnDescriptor = (name: string): ColumnDescriptor => ({
39
- name,
40
- });
41
-
42
- export const toKeyedColumn = (
43
- column: string | ColumnDescriptor,
44
- key: number
45
- ): KeyedColumnDescriptor => {
46
- if (typeof column === "string") {
47
- return { key, name: column };
48
- }
49
- if (isKeyedColumn(column)) {
50
- return column;
51
- }
52
- return { ...column, key };
53
- };
54
-
55
- const EMPTY_COLUMN_MAP = {} as const;
56
-
57
- export function buildColumnMap(columns?: (Column | string)[]): ColumnMap {
58
- const start = metadataKeys.count;
59
- if (columns) {
60
- return columns.reduce((map, column, i) => {
61
- if (typeof column === "string") {
62
- map[column] = start + i;
63
- } else if (typeof column.key === "number") {
64
- map[column.name] = column.key;
65
- } else {
66
- map[column.name] = start + i;
67
- }
68
- return map;
69
- }, {} as ColumnMap);
70
- } else {
71
- return EMPTY_COLUMN_MAP;
72
- }
73
- }
74
-
75
- export function projectUpdates(updates: number[]): number[] {
76
- const results: number[] = [];
77
- const metadataOffset = metadataKeys.count - 2;
78
- for (let i = 0; i < updates.length; i += 3) {
79
- results[i] = updates[i] + metadataOffset;
80
- results[i + 1] = updates[i + 1];
81
- results[i + 2] = updates[i + 2];
82
- }
83
- return results;
84
- }
85
-
86
- export function projectColumns(
87
- tableRowColumnMap: ColumnMap,
88
- columns: ColumnDescriptor[]
89
- ) {
90
- const columnCount = columns.length;
91
- const { IDX, RENDER_IDX, DEPTH, COUNT, KEY, SELECTED, count } = metadataKeys;
92
- return (startIdx: number, offset: number, selectedRows: Row[] = []) =>
93
- (row: Row, i: number) => {
94
- // selectedRows are indices of rows within underlying dataset (not sorted or filtered)
95
- // row is the original row from this set, with original index in IDX pos, which might
96
- // be overwritten with a different value below if rows are sorted/filtered
97
- const baseRowIdx: any = row[IDX]; // TODO
98
- const out = [];
99
- for (let i = 0; i < columnCount; i++) {
100
- const colIdx = tableRowColumnMap[columns[i].name];
101
- out[count + i] = row[colIdx];
102
- }
103
-
104
- out[IDX] = startIdx + i + offset;
105
- out[RENDER_IDX] = 0;
106
- out[DEPTH] = 0;
107
- out[COUNT] = 0;
108
- out[KEY] = row[tableRowColumnMap.KEY];
109
- out[SELECTED] = selectedRows.includes(baseRowIdx) ? 1 : 0;
110
- return out;
111
- };
112
- }
113
-
114
- export type Meta = {
115
- [key: string]: any;
116
- } & any[];
117
-
118
- export const metadataKeys = {
119
- IDX: 0,
120
- RENDER_IDX: 1,
121
- IS_LEAF: 2,
122
- IS_EXPANDED: 3,
123
- DEPTH: 4,
124
- COUNT: 5,
125
- KEY: 6,
126
- SELECTED: 7,
127
- count: 8,
128
- // TODO following only used in datamodel
129
- PARENT_IDX: "parent_idx",
130
- IDX_POINTER: "idx_pointer",
131
- FILTER_COUNT: "filter_count",
132
- NEXT_FILTER_IDX: "next_filter_idx",
133
- } as const;
package/src/data-utils.ts DELETED
@@ -1,60 +0,0 @@
1
- export type valueChangeDirection = "up1" | "up2" | "down1" | "down2" | "";
2
-
3
- export const UP1 = "up1";
4
- export const UP2 = "up2";
5
- export const DOWN1 = "down1";
6
- export const DOWN2 = "down2";
7
-
8
- export const isValidNumber = (n: unknown): n is number =>
9
- typeof n === "number" && isFinite(n);
10
-
11
- export function getMovingValueDirection(
12
- newValue: number,
13
- direction?: valueChangeDirection,
14
- prevValue?: number,
15
- /** the number of decimal places to take into account when highlighting a change */
16
- decimalPlaces?: number
17
- ): valueChangeDirection {
18
- if (
19
- !isFinite(newValue) ||
20
- prevValue === undefined ||
21
- direction === undefined
22
- ) {
23
- return "";
24
- } else {
25
- let diff = newValue - prevValue;
26
- if (diff) {
27
- // make sure there is still a diff when reduced to number of decimals to be displayed
28
- if (typeof decimalPlaces === "number") {
29
- diff =
30
- +newValue.toFixed(decimalPlaces) - +prevValue.toFixed(decimalPlaces);
31
- }
32
- }
33
-
34
- if (diff) {
35
- if (direction === "") {
36
- if (diff < 0) {
37
- return DOWN1;
38
- } else {
39
- return UP1;
40
- }
41
- } else if (diff > 0) {
42
- if (direction === DOWN1 || direction === DOWN2 || direction === UP2) {
43
- return UP1;
44
- } else {
45
- return UP2;
46
- }
47
- } else if (
48
- direction === UP1 ||
49
- direction === UP2 ||
50
- direction === DOWN2
51
- ) {
52
- return DOWN1;
53
- } else {
54
- return DOWN2;
55
- }
56
- } else {
57
- return "";
58
- }
59
- }
60
- }
package/src/date-utils.ts DELETED
@@ -1,4 +0,0 @@
1
- //TODO
2
- export const formatDate = (date: Date, format: string) => {
3
- return date.toUTCString();
4
- };