tsgrid-ui 2.7.1 → 2.9.0

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.
Files changed (68) hide show
  1. package/CHANGELOG.md +173 -0
  2. package/dist/base.d.ts +148 -0
  3. package/dist/base.es6.js +11 -0
  4. package/dist/base.es6.js.map +1 -0
  5. package/dist/chunks/chunk-26XP2XU3.js +1795 -0
  6. package/dist/chunks/chunk-26XP2XU3.js.map +1 -0
  7. package/dist/chunks/chunk-3NYH6545.js +2423 -0
  8. package/dist/chunks/chunk-3NYH6545.js.map +1 -0
  9. package/dist/chunks/chunk-BIB3X2TW.js +1638 -0
  10. package/dist/chunks/chunk-BIB3X2TW.js.map +1 -0
  11. package/dist/chunks/chunk-DXZJHS4M.js +1283 -0
  12. package/dist/chunks/chunk-DXZJHS4M.js.map +1 -0
  13. package/dist/chunks/chunk-EVZMMVXO.js +1212 -0
  14. package/dist/chunks/chunk-EVZMMVXO.js.map +1 -0
  15. package/dist/chunks/chunk-GJD5NFWQ.js +2305 -0
  16. package/dist/chunks/chunk-GJD5NFWQ.js.map +1 -0
  17. package/dist/chunks/chunk-IYF3Q7GX.js +127 -0
  18. package/dist/chunks/chunk-IYF3Q7GX.js.map +1 -0
  19. package/dist/chunks/chunk-OFASTA2A.js +2980 -0
  20. package/dist/chunks/chunk-OFASTA2A.js.map +1 -0
  21. package/dist/chunks/chunk-OMLGN735.js +677 -0
  22. package/dist/chunks/chunk-OMLGN735.js.map +1 -0
  23. package/dist/chunks/chunk-WKSLGUB3.js +1127 -0
  24. package/dist/chunks/chunk-WKSLGUB3.js.map +1 -0
  25. package/dist/chunks/chunk-YBY52G2U.js +849 -0
  26. package/dist/chunks/chunk-YBY52G2U.js.map +1 -0
  27. package/dist/field.d.ts +329 -0
  28. package/dist/field.es6.js +11 -0
  29. package/dist/field.es6.js.map +1 -0
  30. package/dist/form.d.ts +162 -0
  31. package/dist/form.es6.js +14 -0
  32. package/dist/form.es6.js.map +1 -0
  33. package/dist/layout.d.ts +108 -0
  34. package/dist/layout.es6.js +13 -0
  35. package/dist/layout.es6.js.map +1 -0
  36. package/dist/locale.d.ts +30 -0
  37. package/dist/locale.es6.js +7 -0
  38. package/dist/locale.es6.js.map +1 -0
  39. package/dist/metafile-esm.json +1 -0
  40. package/dist/popup.d.ts +92 -0
  41. package/dist/popup.es6.js +18 -0
  42. package/dist/popup.es6.js.map +1 -0
  43. package/dist/query-CKGg5Ugv.d.ts +81 -0
  44. package/dist/sidebar.d.ts +138 -0
  45. package/dist/sidebar.es6.js +11 -0
  46. package/dist/sidebar.es6.js.map +1 -0
  47. package/dist/tabs.d.ts +63 -0
  48. package/dist/tabs.es6.js +11 -0
  49. package/dist/tabs.es6.js.map +1 -0
  50. package/dist/toolbar.d.ts +97 -0
  51. package/dist/toolbar.es6.js +11 -0
  52. package/dist/toolbar.es6.js.map +1 -0
  53. package/dist/tooltip.d.ts +322 -0
  54. package/dist/tooltip.es6.js +18 -0
  55. package/dist/tooltip.es6.js.map +1 -0
  56. package/dist/tsgrid-ui.css +2 -2
  57. package/dist/tsgrid-ui.d.ts +16 -2004
  58. package/dist/tsgrid-ui.es6.js +7750 -23830
  59. package/dist/tsgrid-ui.es6.js.map +1 -1
  60. package/dist/tsgrid-ui.es6.min.js +28 -28
  61. package/dist/tsgrid-ui.js +96 -17
  62. package/dist/tsgrid-ui.min.css +2 -2
  63. package/dist/tsgrid-ui.min.js +24 -24
  64. package/dist/tsutils-message-CogFtVtO.d.ts +82 -0
  65. package/dist/utils.d.ts +418 -0
  66. package/dist/utils.es6.js +14 -0
  67. package/dist/utils.es6.js.map +1 -0
  68. package/package.json +26 -5
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/tsfield.ts"],"sourcesContent":["/**\n * Part of TsUi 2.0 library\n * - Dependencies: mQuery, TsUtils, TsBase, TsTooltip, TsColor, TsMenu, TsDate\n *\n * T4.1: Ported to TypeScript with aggressive typing per typing_policy.\n * No @ts-nocheck. Targeted `any` sites documented with // any: comments.\n * Discriminated union on `type` property for per-type option shapes.\n *\n * == TODO ==\n * - upload (regular files)\n * - BUG with prefix/postfix and arrows (test in different contexts)\n * - multiple date selection\n * - month selection, year selections\n * - MultiSelect - Allow Copy/Paste for single and multi values\n * - add routeData to list/enum\n * - ENUM, LIST: should have same as grid (limit, offset, search, sort)\n * - ENUM, LIST: should support wild chars\n * - add selection of predefined times (used for appointments)\n * - options.items - can be an array\n * - options.msgNoItems - can be a function\n * - REMOTE fields\n *\n * == 2.0 changes\n * - removed jQuery dependency\n * - enum options.autoAdd\n * - [numeric, date] - options.autoCorrect to enforce range and validity\n * - remote source response items => records or just an array\n * - deprecated \"success\" field for remote source response\n * - CSP - fixed inline events\n * - remove clear, use reset instead\n * - options.msgSearch\n * - options.msgNoItems\n */\n\nimport { TsBase, TsEventPayload } from './tsbase.js'\nimport { TsUtils } from './tsutils.js'\nimport { TsTooltip as _w2tooltip, TsColor as _w2color, TsMenu as _w2menu, TsDate as _w2date } from './tstooltip.js'\nimport { query as _queryRaw, Query } from './query.js'\n\n// any: query() returns Query|void; cast once here for clean chaining\nconst query = _queryRaw as (selector: unknown, context?: unknown) => Query\n\n// any: TsMenu/TsColor/TsDate/TsTooltip have rich return types with .select()/.hide()/.show()\n// that are hard to match from external call sites; cast once here for clean usage\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst TsMenu = _w2menu as any // any: overlay manager with .show()/.hide()/.get() returning dynamic overlay objects\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst TsColor = _w2color as any // any: color picker with .show() returning AttachReturn with .select()/.liveUpdate()\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst TsDate = _w2date as any // any: date picker with .show()/.inRange()/.str2min()/.min2str() etc.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst TsTooltip = _w2tooltip as any // any: tooltip manager with .show()/.hide() accepting flexible option shapes\n\n// ---------------------------------------------------------------------------\n// Type definitions\n// ---------------------------------------------------------------------------\n\n/** Shared numeric-field options (int, float, money, currency, percent, alphanumeric, bin, hex, text) */\nexport interface TsFieldNumericOptions {\n type?: string\n min?: number | null\n max?: number | null\n step?: number\n autoFormat?: boolean\n autoCorrect?: boolean\n currency?: {\n prefix: string\n suffix: string\n precision: number\n }\n decimalSymbol?: string\n groupSymbol?: string\n arrows?: boolean\n keyboard?: boolean\n precision?: number | null\n prefix?: string\n suffix?: string\n // computed at init\n numberRE?: RegExp\n moneyRE?: RegExp\n percentRE?: RegExp\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: options extended dynamically in init()\n}\n\n/** Color-field options */\nexport interface TsFieldColorOptions {\n type?: string\n prefix?: string\n suffix?: string\n arrows?: boolean\n advanced?: boolean | null\n transparent?: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: options may be user-extended\n}\n\n/** Date-field options */\nexport interface TsFieldDateOptions {\n type?: string\n format?: string\n keyboard?: boolean\n autoCorrect?: boolean\n start?: string | null\n end?: string | null\n blockDates?: string[]\n blockWeekdays?: number[]\n colored?: Record<string, string>\n btnNow?: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: options may be user-extended\n}\n\n/** Time-field options */\nexport interface TsFieldTimeOptions {\n type?: string\n format?: string\n keyboard?: boolean\n autoCorrect?: boolean\n start?: string | null\n end?: string | null\n btnNow?: boolean\n noMinutes?: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: options may be user-extended\n}\n\n/** DateTime-field options */\nexport interface TsFieldDateTimeOptions {\n type?: string\n format?: string\n keyboard?: boolean\n autoCorrect?: boolean\n start?: string | null\n end?: string | null\n startTime?: string | null\n endTime?: string | null\n blockDates?: string[]\n blockWeekdays?: number[]\n colored?: Record<string, string>\n btnNow?: boolean\n noMinutes?: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: options may be user-extended\n}\n\n/** List/combo-field options */\nexport interface TsFieldListOptions {\n type?: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items?: any[] // any: items can be strings, objects, or a function\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _items_fun?: ((...args: any[]) => any) | null // any: function signature varies\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n selected?: Record<string, any> | null // any: selected item shape\n itemMap?: { id: string; text: string } | null\n match?: 'contains' | 'is' | 'begins' | 'ends'\n filter?: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n compare?: ((...args: any[]) => any) | null // any: user-defined compare function\n prefix?: string\n suffix?: string\n icon?: string | null\n iconStyle?: string\n url?: string | null\n method?: string | null\n postData?: Record<string, unknown>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n recId?: string | ((item: any) => any) | null // any: mapping function result\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n recText?: string | ((item: any) => any) | null // any: mapping function result\n debounce?: number\n minLength?: number\n cacheMax?: number\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n renderDrop?: ((...args: any[]) => string) | null // any: render function\n maxDropHeight?: number\n maxDropWidth?: number | null\n minDropWidth?: number | null\n markSearch?: boolean\n align?: 'left' | 'right' | 'both' | 'none'\n altRows?: boolean\n openOnFocus?: boolean\n hideSelected?: boolean\n msgNoItems?: string\n msgSearch?: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onSearch?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onRequest?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onLoad?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onError?: ((...args: any[]) => void) | null // any: event callback\n index?: number[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: options may be user-extended\n}\n\n/** Enum-field options */\nexport interface TsFieldEnumOptions {\n type?: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items?: any[] // any: items can be strings, objects, or a function\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _items_fun?: ((...args: any[]) => any) | null // any: function signature varies\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n selected?: any[] // any: array of selected items\n itemMap?: { id: string; text: string } | null\n max?: number\n match?: 'contains' | 'is' | 'begins' | 'ends'\n filter?: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n compare?: ((...args: any[]) => any) | null // any: user-defined compare function\n url?: string | null\n method?: string | null\n postData?: Record<string, unknown>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n recId?: string | ((item: any) => any) | null // any: mapping function result\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n recText?: string | ((item: any) => any) | null // any: mapping function result\n debounce?: number\n minLength?: number\n cacheMax?: number\n maxItemWidth?: number\n maxDropHeight?: number\n maxDropWidth?: number | null\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n renderItem?: ((item: any, ind: number, removeBtn: string) => string) | null // any: render result\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n renderDrop?: ((...args: any[]) => string) | null // any: render function\n style?: string\n openOnFocus?: boolean\n markSearch?: boolean\n align?: 'left' | 'right' | 'both' | 'none'\n altRows?: boolean\n hideSelected?: boolean\n msgNoItems?: string\n msgSearch?: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onAdd?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onNew?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onRemove?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onSearch?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onClick?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onRequest?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onLoad?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onError?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onScroll?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onMouseEnter?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onMouseLeave?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: options may be user-extended\n}\n\n/** File-field options */\nexport interface TsFieldFileOptions {\n type?: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n selected?: any[] // any: array of file objects\n max?: number\n maxSize?: number\n maxFileSize?: number\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n renderItem?: ((item: any, ind: number, removeBtn: string) => string) | null // any: render result\n maxItemWidth?: number\n maxDropHeight?: number\n maxDropWidth?: number | null\n readContent?: boolean\n showErrors?: boolean\n align?: 'left' | 'right' | 'both' | 'none'\n altRows?: boolean\n style?: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onClick?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onAdd?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onRemove?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onMouseEnter?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onMouseLeave?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: options may be user-extended\n}\n\n/** Discriminated union: all possible options for a TsField instance */\nexport type TsFieldOptions =\n | TsFieldNumericOptions\n | TsFieldColorOptions\n | TsFieldDateOptions\n | TsFieldTimeOptions\n | TsFieldDateTimeOptions\n | TsFieldListOptions\n | TsFieldEnumOptions\n | TsFieldFileOptions\n\n/** Constructor input — the type discriminant lives here */\ninterface TsFieldInput {\n type?: string\n el?: HTMLElement | null\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onClick?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onAdd?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onNew?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onRemove?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onMouseEnter?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onMouseLeave?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onScroll?: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: options extended dynamically\n}\n\n/** Helper elements bag */\ninterface TsFieldHelpers {\n prefix?: HTMLElement | null\n suffix?: HTMLElement | null\n arrows?: HTMLElement | null\n search?: HTMLElement | null\n search_focus?: HTMLInputElement // input element for list type\n multi?: Query // Query wrapper for enum/file multi-container\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: helpers are added dynamically\n}\n\n/** Temp state bag */\ninterface TsFieldTmp {\n 'old-padding-left'?: string | null\n 'old-padding-right'?: string | null\n 'old-background-color'?: string\n 'old-border-color'?: string\n 'old-tabIndex'?: number\n 'min-height'?: number\n 'max-height'?: number\n 'current_width'?: number\n pholder?: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay?: any // any: TsMenu overlay instance with dynamic .overlay sub-object\n openedOnFocus?: boolean\n sizeTimer?: ReturnType<typeof setInterval>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: temp state grows dynamically\n}\n\n// ---------------------------------------------------------------------------\n// HTMLElement extension for TsField reference\n// ---------------------------------------------------------------------------\ndeclare global {\n interface HTMLElement {\n _w2field?: TsField\n }\n interface HTMLInputElement {\n _w2field?: TsField\n }\n interface HTMLTextAreaElement {\n _w2field?: TsField\n }\n}\n\n// TsField only supports INPUT and TEXTAREA elements (validated in init())\nexport type TsFieldElement = HTMLInputElement | HTMLTextAreaElement\n\nclass TsField extends TsBase {\n el: TsFieldElement | null\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n selected: any // any: can be null, an object (list), or an array (enum/file)\n helpers: TsFieldHelpers\n type: string\n options: TsFieldOptions\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onClick: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onAdd: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onNew: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onRemove: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onMouseEnter: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onMouseLeave: ((...args: any[]) => void) | null // any: event callback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onScroll: ((...args: any[]) => void) | null // any: event callback\n tmp: TsFieldTmp\n\n constructor(type: string | TsFieldInput, options?: TsFieldInput) {\n super()\n // sanitization\n if (typeof type == 'string' && options == null) {\n options = { type: type }\n }\n if (typeof type == 'object' && options == null) {\n options = TsUtils.clone(type)\n }\n if (typeof type == 'string' && typeof options == 'object') {\n options.type = type\n }\n // options is always defined after the three branches above\n const opts = options! // non-null: all code paths above assign options\n opts.type = String(opts.type).toLowerCase()\n this.el = (opts.el ?? null) as TsFieldElement | null\n this.selected = null\n this.helpers = {} // object or helper elements\n this.type = opts.type ?? 'text'\n this.options = TsUtils.clone(opts)\n this.onClick = opts.onClick ?? null\n this.onAdd = opts.onAdd ?? null\n this.onNew = opts.onNew ?? null\n this.onRemove = opts.onRemove ?? null\n this.onMouseEnter= opts.onMouseEnter ?? null\n this.onMouseLeave= opts.onMouseLeave ?? null\n this.onScroll = opts.onScroll ?? null\n this.tmp = {} // temp object\n // clean up some options\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n delete (this.options as any).type\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n delete (this.options as any).onClick\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n delete (this.options as any).onMouseEnter\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n delete (this.options as any).onMouseLeave\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n delete (this.options as any).onScroll\n\n if (this.el) {\n this.render(this.el)\n }\n }\n\n override render(el: HTMLElement): void {\n if (!(el instanceof HTMLElement)) {\n console.log('ERROR: Cannot init TsField on empty subject')\n return\n }\n // after init() validates INPUT/TEXTAREA, el is safe to treat as TsFieldElement\n const fieldEl = el as TsFieldElement\n fieldEl._w2field?.reset?.() // will remove all previous events\n fieldEl._w2field = this\n this.el = fieldEl\n this.init()\n }\n\n init(): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let options = this.options as any // any: options shape depends on type; accessed via key-lookup below\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let defaults: Record<string, any> // any: defaults are type-specific bags assembled per switch case\n\n // only for INPUT or TEXTAREA\n if (this.el == null || !['INPUT', 'TEXTAREA'].includes(this.el.tagName.toUpperCase())) {\n console.log('ERROR: TsField could only be applied to INPUT or TEXTAREA.', this.el)\n return\n }\n // non-null: guarded above; use local alias so TypeScript tracks narrowing\n const _fieldEl = this.el\n\n switch (this.type) {\n case 'text':\n case 'int':\n case 'float':\n case 'money':\n case 'currency':\n case 'percent':\n case 'alphanumeric':\n case 'bin':\n case 'hex': {\n defaults = {\n min: null,\n max: null,\n step: 1,\n autoFormat: true,\n autoCorrect: true,\n currency: {\n prefix: TsUtils.settings.currencyPrefix,\n suffix: TsUtils.settings.currencySuffix,\n precision: TsUtils.settings.currencyPrecision\n },\n decimalSymbol: TsUtils.settings.decimalSymbol,\n groupSymbol: TsUtils.settings.groupSymbol,\n arrows: false,\n keyboard: true,\n precision: null,\n prefix: '',\n suffix: ''\n }\n this.options = TsUtils.extend({}, defaults, options)\n options = this.options // since object is re-created, need to re-assign\n options.numberRE = new RegExp('['+ options.groupSymbol + ']', 'g')\n options.moneyRE = new RegExp('['+ options.currency.prefix + options.currency.suffix + options.groupSymbol +']', 'g')\n options.percentRE = new RegExp('['+ options.groupSymbol + '%]', 'g')\n // no keyboard support needed\n if (['text', 'alphanumeric', 'hex', 'bin'].includes(this.type)) {\n options.arrows = false\n options.keyboard = false\n }\n break\n }\n case 'color': {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const size = parseInt((getComputedStyle(this.el!) as any)['font-size'] ?? '12') || 12 // any: CSSStyleDeclaration has numeric-only index; cast for hyphenated key access\n defaults = {\n prefix : '#',\n suffix : `<div style=\"width: ${size}px; height: ${size}px; margin-top: -2px;\n position: relative; top: 50%; transform: translateY(-50%);\">&#160;</div>`,\n arrows : false,\n advanced : null, // open advanced by default\n transparent : true\n }\n this.options = TsUtils.extend({}, defaults, options)\n options = this.options // since object is re-created, need to re-assign\n break\n }\n case 'date': {\n defaults = {\n format : TsUtils.settings.dateFormat, // date format\n keyboard : true, // if true, allows to select date with format\n autoCorrect : true, // correc date or shows the error\n start : null, // first date allowed to select\n end : null, // last date allowed to select\n blockDates : [], // array of blocked dates\n blockWeekdays : [], // blocked weekdays 0 - sunday, 1 - monday, etc\n colored : {}, // ex: { '3/13/2022': 'bg-color|text-color' }\n btnNow : true // if true, displays Now button\n }\n this.options = TsUtils.extend({ type: 'date' }, defaults, options)\n options = this.options // since object is re-created, need to re-assign\n if (query(this.el).attr('placeholder') == null) {\n query(this.el).attr('placeholder', options.format)\n }\n break\n }\n case 'time': {\n defaults = {\n format : TsUtils.settings.timeFormat,\n keyboard : true,\n autoCorrect : true,\n start : null,\n end : null,\n btnNow : true,\n noMinutes : false\n }\n this.options = TsUtils.extend({ type: 'time' }, defaults, options)\n options = this.options // since object is re-created, need to re-assign\n if (query(this.el).attr('placeholder') == null) {\n query(this.el).attr('placeholder', options.format)\n }\n break\n }\n case 'datetime': {\n defaults = {\n format : TsUtils.settings.dateFormat + '|' + TsUtils.settings.timeFormat,\n keyboard : true,\n autoCorrect : true,\n start : null,\n end : null,\n startTime : null,\n endTime : null,\n blockDates : [], // array of blocked dates\n blockWeekdays : [], // blocked weekdays 0 - sunday, 1 - monday, etc\n colored : {}, // ex: { '3/13/2022': 'bg-color|text-color' }\n btnNow : true,\n noMinutes : false\n }\n this.options = TsUtils.extend({ type: 'datetime' }, defaults, options)\n options = this.options // since object is re-created, need to re-assign\n if (query(this.el).attr('placeholder') == null) {\n query(this.el).attr('placeholder', options.placeholder || options.format)\n }\n break\n }\n case 'list':\n case 'combo': {\n defaults = {\n items : [], // array of items, can be a function\n selected : {}, // selected item\n itemMap : null, // can be { id: 'id', text: 'text' } to specify field mapping for an item\n match : 'begins', // ['contains', 'is', 'begins', 'ends']\n filter : true, // weather to filter at all\n compare : null, // compare function for filtering\n prefix : '', // prefix for input\n suffix : '', // sufix for input\n icon : null, // icon class for selected item\n iconStyle : '', // icon style for selected item\n // -- remote items --\n url : null, // remove data source for items\n method : null, // default comes from TsUtils.settings.dataType\n postData : {}, // additional data to submit to URL\n recId : null, // map retrieved data from url to id, can be string or function\n recText : null, // map retrieved data from url to text, can be string or function\n debounce : 250, // number of ms to wait before sending server call on search\n minLength : 1, // min number of chars when trigger search\n cacheMax : 250,\n // -- drop items --\n renderDrop : null, // render function for drop down item\n maxDropHeight : 350, // max height for drop down menu\n maxDropWidth : null, // if null then auto set\n minDropWidth : null, // if null then auto set\n // -- misc --\n markSearch : false, // if true, highlights search phrase\n align : 'both', // align with the input ['left', 'right', 'both', 'none']\n altRows : true, // alternate row color for drop itesm\n openOnFocus : false, // if true, shows drop items on focus\n hideSelected : false, // hide selected item from drop down\n msgNoItems : 'No matches',\n msgSearch : 'Type to search...',\n // -- events --\n onSearch : null, // when search needs to be performed\n onRequest : null, // when request is submitted\n onLoad : null, // when data is received\n onError : null, // when data fails to load due to server error\n }\n if (typeof options.items == 'function') {\n options._items_fun = options.items\n }\n // need to be first\n options.items = TsUtils.normMenu.call(this, options.items, options)\n if (this.type === 'list') {\n // defaults.search = (options.items && options.items.length >= 10 ? true : false);\n query(this.el).addClass('tsg-select')\n // if simple value - look it up\n if (!TsUtils.isPlainObject(options.selected) && Array.isArray(options.items)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options.items.forEach((item: any) => { // any: item in items array\n if (item && item.id === options.selected) {\n options.selected = TsUtils.clone(item)\n }\n })\n }\n }\n options = TsUtils.extend({}, defaults, options)\n // validate match\n const valid = ['is', 'begins', 'contains', 'ends']\n if (!valid.includes(options.match)) {\n console.log(`ERROR: invalid value \"${options.match}\" for option.match. It should be one of following: ${valid.join(', ')}.`)\n }\n this.options = options\n if (!TsUtils.isPlainObject(options.selected)) options.selected = {}\n this.selected = options.selected\n query(this.el)\n .attr('autocapitalize', 'off')\n .attr('autocomplete', 'off')\n .attr('autocorrect', 'off')\n .attr('spellcheck', 'false')\n if (options.selected.text != null) {\n query(this.el).val(options.selected.text)\n }\n break\n }\n case 'enum': {\n defaults = {\n items : [], // id, text, tooltip, icon\n selected : [],\n itemMap : null, // can be { id: 'id', text: 'text' } to specify field mapping for an item\n max : 0, // max number of selected items, 0 - unlimited\n match : 'begins', // ['contains', 'is', 'begins', 'ends']\n filter : true, // if true, will apply filtering\n compare : null, // compare function for filtering\n // -- remote items --\n url : null, // remove source for items\n method : null, // default httpMethod\n postData : {},\n recId : null, // map retrieved data from url to id, can be string or function\n recText : null, // map retrieved data from url to text, can be string or function\n debounce : 250, // number of ms to wait before sending server call on search\n minLength : 1, // min number of chars when trigger search\n cacheMax : 250,\n // -- item and drop items --\n maxItemWidth : 250, // max width for a single item\n maxDropHeight : 350, // max height for drop down menu\n maxDropWidth : null, // if null then auto set\n renderItem : null, // render selected item\n renderDrop : null, // render function for drop down item\n // -- misc --\n style : '', // style for container div\n openOnFocus : false, // if true, opens drop down on focus\n markSearch : false, // if true, highlights search phrase\n align : 'both',// align with the input ['left', 'right', 'both', 'none']\n altRows : true, // if ture, will use alternate row colors\n hideSelected : true, // hide selected items from drop down\n msgNoItems : 'No matches',\n msgSearch : 'Type to search...',\n // -- events --\n onAdd : null, // when item is selected from drop down\n onNew : null, // when new item should be added\n onRemove : null, // when item is removed\n onSearch : null, // when search is triggered\n onClick : null, // when item is clicked\n onRequest : null, // when data is requested\n onLoad : null, // when data is received\n onError : null, // when data fails to load due to server error\n onScroll : null, // when div with selected items is scrolled\n onMouseEnter : null, // when mouse enters item\n onMouseLeave : null, // when mouse leaves item\n }\n options = TsUtils.extend({}, defaults, options, { suffix: '' })\n if (typeof options.items == 'function') {\n options._items_fun = options.items\n }\n // validate match\n const valid = ['is', 'begins', 'contains', 'ends']\n if (!valid.includes(options.match)) {\n console.log(`ERROR: invalid value \"${options.match}\" for option.match. It should be one of following: ${valid.join(', ')}.`)\n }\n options.items = TsUtils.normMenu.call(this, options.items, options)\n options.selected = TsUtils.normMenu.call(this, options.selected, options)\n this.options = options\n if (!Array.isArray(options.selected)) options.selected = []\n this.selected = options.selected\n break\n }\n case 'file': {\n defaults = {\n selected : [], // array of selected files\n max : 0, // max number of selected files, 0 - unlim\n maxSize : 0, // max size of all files, 0 - unlimited\n maxFileSize : 0, // max size of a single file, 0 -unlimited\n renderItem : null, // render function fo the selected item\n // -- misc --\n maxItemWidth : 250, // max width for a single item\n maxDropHeight : 350, // max height for drop down menu\n maxDropWidth : null, // if null then auto set\n readContent : true, // if true, it will readAsDataURL content of the file\n showErrors : true, // if not true, will show errors\n align : 'both', // align with the input ['left', 'right', 'both', 'none']\n altRows : true, // alternate row color for drop itesm\n style : '', // style for container div\n // -- events --\n onClick : null, // when item is clicked\n onAdd : null, // when item is added\n onRemove : null, // when item is removed\n onMouseEnter : null, // when item is mouse over\n onMouseLeave : null // when item is mouse out\n }\n options = TsUtils.extend({}, defaults, options)\n this.options = options\n if (!Array.isArray(options.selected)) options.selected = []\n this.selected = options.selected\n if (query(this.el).attr('placeholder') == null) {\n query(this.el).attr('placeholder', TsUtils.lang('Attach files by dragging and dropping or Click to Select'))\n }\n break\n }\n default: {\n console.log(`ERROR: field type \"${this.type}\" is not supported.`)\n break\n }\n }\n // attach events\n const $elInit = query(this.el)\n $elInit.css('box-sizing', 'border-box')\n $elInit.addClass('TsField tsg-input')\n .off('.TsField')\n .on('change.TsField', (event: Event) => { this.change(event) })\n .on('click.TsField', (event: Event) => { this.click(event as MouseEvent) })\n .on('focus.TsField', (event: Event) => { this.focus(event as FocusEvent) })\n .on('blur.TsField', (event: Event) => { if (this.type !== 'list') this.blur(event as FocusEvent) })\n .on('keydown.TsField', (event: Event) => { this.keyDown(event as KeyboardEvent) })\n .on('keyup.TsField', (event: Event) => { this.keyUp(event as KeyboardEvent) })\n // suffix and prefix need to be after styles\n this.addPrefix() // only will add if needed\n this.addSuffix() // only will add if needed\n this.addSearch()\n this.addMultiSearch()\n // this.refresh() // do not call refresh, on change will trigger refresh (for list at list)\n // format initial value\n this.change(new Event('change'))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(): any { // any: return varies by type (string for text, array for enum/file, object for list)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let ret: any // any: return type varies by field type\n if (['list', 'enum', 'file'].indexOf(this.type) !== -1) {\n ret = this.selected\n } else {\n ret = query(this.el).val()\n }\n return ret\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n set(val: any, append?: boolean): void { // any: val can be string, object, array depending on type\n if (['list', 'enum', 'file'].indexOf(this.type) !== -1) {\n const overlay = TsMenu.get(this.el!.id + '_menu')\n overlay?.hide()\n if (this.type !== 'list' && append) {\n if (!Array.isArray(this.selected)) this.selected = []\n this.selected.push(val)\n // update selected array in overlay\n if (overlay) overlay.options.selected = this.selected\n query(this.el).trigger('input').trigger('change')\n } else {\n if (val == null) val = []\n const it = (this.type === 'enum' && !Array.isArray(val) ? [val] : val)\n this.selected = it\n query(this.el).trigger('input').trigger('change')\n }\n this.refresh()\n } else {\n query(this.el).val(val)\n }\n }\n\n setIndex(ind: number, append?: boolean): boolean {\n if (['list', 'enum'].indexOf(this.type) !== -1) {\n const overlay = TsMenu.get(this.el!.id + '_menu')\n overlay?.hide()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const items = (this.options as any).items // any: items array is type-specific\n if (items && items[ind]) {\n if (this.type == 'list') {\n this.selected = items[ind]\n }\n if (this.type == 'enum') {\n if (!append) this.selected = []\n this.selected.push(items[ind])\n }\n if (overlay) overlay.options.selected = this.selected\n query(this.el).trigger('input').trigger('change')\n this.refresh()\n return true\n }\n }\n return false\n }\n\n refresh(): number {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const options = this.options as any // any: options shape depends on type\n const time = Date.now()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const styles = getComputedStyle(this.el!) as any // any: CSSStyleDeclaration has numeric-only index; cast for hyphenated key access\n // update color\n if (this.type == 'color') {\n let color = this.el!.value\n if (color.substr(0, 1) != '#' && color.substr(0, 3) != 'rgb') {\n color = '#' + color\n }\n query(this.helpers.suffix).find(':scope > div').css('background-color', color)\n }\n // enum\n if (this.type == 'list') {\n // next line will not work in a form with span: -1\n // query(this.el).parent().css('white-space', 'nowrap') // needs this for arrow always to appear on the right side\n // hide focus and show text\n if (this.helpers.prefix) query(this.helpers.prefix).hide()\n if (!this.helpers.search) return Date.now() - time\n // if empty show no icon\n if (this.selected == null && options.icon) {\n options.prefix = `\n <span class=\"tsg-icon ${options.icon} \"style=\"cursor: pointer; font-size: 14px;\n display: inline-block; margin-top: -1px; color: #7F98AD; ${options.iconStyle}\">\n </span>`\n this.addPrefix()\n } else {\n options.prefix = ''\n this.addPrefix()\n }\n // focus helper\n const focus = query(this.helpers.search_focus)\n const icon = query((focus.get(0) as Element).previousElementSibling)\n focus.css({ outline: 'none' })\n if (focus.val() === '') {\n focus.css('opacity', 0)\n icon.css('opacity', 0)\n if (this.selected?.id != null) { // id could be \"\", then it is valid\n const text = this.selected.text\n const ind = this.findItemIndex(options.items, this.selected.id)\n if (text != null) {\n ;(query(this.el).val(TsUtils.lang(text)) as Query)\n .data({\n selected: text,\n selectedIndex: ind[0]\n })\n }\n } else {\n this.el!.value = ''\n query(this.el).removeData('selected selectedIndex')\n }\n } else {\n focus.css('opacity', 1)\n icon.css('opacity', 1)\n query(this.el).val('')\n setTimeout(() => {\n if (this.helpers.prefix) query(this.helpers.prefix).hide()\n if (options.icon) {\n focus.css('margin-left', '17px')\n query(this.helpers.search).find('.tsg-icon-search')\n .addClass('show-search')\n } else {\n focus.css('margin-left', '0px')\n query(this.helpers.search).find('.tsg-icon-search')\n .removeClass('show-search')\n }\n }, 1)\n }\n // if readonly or disabled\n if (query(this.el).prop('readOnly') || query(this.el).prop('disabled')) {\n setTimeout(() => {\n if (this.helpers.prefix) query(this.helpers.prefix).css('opacity', '0.6')\n if (this.helpers.suffix) query(this.helpers.suffix).css('opacity', '0.6')\n }, 1)\n } else {\n setTimeout(() => {\n if (this.helpers.prefix) query(this.helpers.prefix).css('opacity', '1')\n if (this.helpers.suffix) query(this.helpers.suffix).css('opacity', '1')\n }, 1)\n }\n }\n // multi select control\n const div = this.helpers.multi\n if (['enum', 'file'].includes(this.type) && div) {\n let html = ''\n if (Array.isArray(this.selected)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.selected.forEach((it: any, ind: number) => { // any: selected item shape varies by type\n if (it == null) return\n html += `\n <div class=\"li-item\" index=\"${ind}\" style=\"max-width: ${parseInt(options.maxItemWidth)}px; ${it.style ? it.style : ''}\">\n ${\n typeof options.renderItem === 'function'\n ? options.renderItem(it, ind, `<div class=\"tsg-list-remove\" index=\"${ind}\">&#160;&#160;</div>`)\n : `\n ${it.icon ? `<span class=\"tsg-icon ${it.icon}\"></span>` : ''}\n <div class=\"tsg-list-remove\" index=\"${ind}\">&#160;&#160;</div>\n ${(this.type === 'enum' ? it.text : it.name) ?? it.id ?? it }\n ${it.size ? `<span class=\"file-size\"> - ${TsUtils.formatSize(it.size)}</span>` : ''}\n `\n }\n </div>`\n })\n }\n const ul = div.find('.tsg-multi-items')\n if (options.style) {\n div.attr('style', div.attr('style') + ';' + options.style)\n }\n query(this.el).css('z-index', '-1')\n if (query(this.el).prop('readOnly') || query(this.el).prop('disabled')) {\n setTimeout(() => {\n (div.get(0) as HTMLElement).scrollTop = 0 // scroll to the top\n div.addClass('tsg-readonly')\n .find('.li-item').css('opacity', '0.9')\n ;(div.find('.li-item') as Query).parent().find('.li-search').hide()\n .find('input').prop('readOnly', true)\n .closest('.tsg-multi-items')\n .find('.tsg-list-remove').hide()\n }, 1)\n } else {\n setTimeout(() => {\n div.removeClass('tsg-readonly')\n .find('.li-item').css('opacity', '1')\n ;(div.find('.li-item') as Query).parent().find('.li-search').show()\n .find('input').prop('readOnly', false)\n .closest('.tsg-multi-items')\n .find('.tsg-list-remove').show()\n }, 1)\n }\n\n // clean\n if (this.selected?.length > 0) {\n query(this.el).attr('placeholder', '')\n }\n div.find('.tsg-enum-placeholder').remove()\n ul.find('.li-item').remove()\n\n // add new list\n if (html !== '') {\n ul.prepend(html)\n } else if (query(this.el).attr('placeholder') != null && div.find('input').val() === '') {\n const style = TsUtils.stripSpaces(`\n padding-top: ${styles['padding-top']};\n padding-left: ${styles['padding-left']};\n box-sizing: ${styles['box-sizing']};\n line-height: ${styles['line-height']};\n font-size: ${styles['font-size']};\n font-family: ${styles['font-family']};\n `)\n div.prepend(`<div class=\"tsg-enum-placeholder\" style=\"${style}\">${query(this.el).attr('placeholder')}</div>`)\n }\n // ITEMS events\n div.off('.w2item')\n .on('scroll.w2item', (event: Event) => {\n const edata = this.trigger('scroll', { target: this.el, originalEvent: event })\n if (edata.isCancelled === true) return\n // hide tooltip if any\n TsTooltip.hide(this.el!.id + '_preview')\n // event after\n edata.finish()\n })\n .find('.li-item')\n .on('click.w2item', (event: Event) => {\n const mouseEvent = event as MouseEvent\n const target = query(mouseEvent.target).closest('.li-item')\n const index = target.attr('index')\n // any: selected is dynamic array; index from attr() may be undefined\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const item = index != null ? (this.selected as any[])[Number(index)] : undefined\n if (query(target).hasClass('li-search')) return\n mouseEvent.stopPropagation()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let edata: any // any: trigger() returns an event-data object with dynamic properties\n // default behavior\n if (query(mouseEvent.target).hasClass('tsg-list-remove')) {\n if (query(this.el).prop('readOnly') || query(this.el).prop('disabled')) return\n // trigger event\n edata = this.trigger('remove', { target: this.el, originalEvent: mouseEvent, item })\n if (edata.isCancelled === true) return\n // remove file from input element\n const transfer = new DataTransfer()\n const input = query(mouseEvent.target).closest('.tsg-list').find('input.file-input').get(0) as HTMLInputElement\n if (input) {\n Array.from(input.files ?? [])\n .filter((f: File) => f.name != item.name)\n .forEach((f: File) => transfer.items.add(f))\n input.files = transfer.files\n }\n // remove placeholder in the field\n if (index != null) this.selected.splice(Number(index), 1)\n query(this.el).trigger('input').trigger('change')\n query(mouseEvent.target).remove()\n } else {\n // trigger event\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n edata = this.trigger('click', { target: this.el, originalEvent: (mouseEvent as any).originalEvent, item })\n if (edata.isCancelled === true) return\n // if file - show image preview\n let preview = item.tooltip\n if (this.type === 'file') {\n if ((/image/i).test(item.type)) { // image\n preview = `\n <div class=\"tsg-file-preview\">\n <img src=\"${(item.content ? 'data:'+ item.type +';base64,'+ item.content : '')}\"\n style=\"max-width: 300px\">\n </div>`\n }\n preview += `\n <div class=\"tsg-file-info\">\n <div class=\"file-caption\">${TsUtils.lang('Name')}:</div>\n <div class=\"file-value\">${item.name}</div>\n <div class=\"file-caption\">${TsUtils.lang('Size')}:</div>\n <div class=\"file-value\">${TsUtils.formatSize(item.size)}</div>\n <div class=\"file-caption\">${TsUtils.lang('Type')}:</div>\n <div class=\"file-value file-type\">${item.type}</div>\n <div class=\"file-caption\">${TsUtils.lang('Modified')}:</div>\n <div class=\"file-value\">${TsUtils.date(item.modified)}</div>\n </div>`\n }\n if (preview) {\n const name = this.el!.id + '_preview'\n TsTooltip.show({\n name,\n anchor: target.get(0),\n html: preview,\n hideOn: ['doc-click'],\n class: ''\n })\n .show((_event: Event) => {\n const $img = query(`#w2overlay-${name} img`)\n $img.on('load', function (this: HTMLImageElement, _event: Event) {\n const w = this.clientWidth\n const h = this.clientHeight\n if (w < 300 && h < 300) return\n if (w >= h && w > 300) query(this).css('width', '300px')\n if (w < h && h > 300) query(this).css('height', '300px')\n })\n .on('error', function (this: HTMLElement, _event: Event) {\n this.style.display = 'none'\n })\n\n })\n }\n }\n edata.finish()\n })\n .on('mouseenter.w2item', (event: Event) => {\n const mouseEvent = event as MouseEvent\n const target = query(mouseEvent.target).closest('.li-item')\n if (query(target).hasClass('li-search')) return\n const idx = query(mouseEvent.target).attr('index')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const item = idx != null ? (this.selected as any[])[Number(idx)] : undefined // any: selected is a dynamic array\n // trigger event\n const edata = this.trigger('mouseEnter', { target: this.el, originalEvent: mouseEvent, item })\n if (edata.isCancelled === true) return\n // event after\n edata.finish()\n })\n .on('mouseleave.w2item', (event: Event) => {\n const mouseEvent = event as MouseEvent\n const target = query(mouseEvent.target).closest('.li-item')\n if (query(target).hasClass('li-search')) return\n const idx = query(mouseEvent.target).attr('index')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const item = idx != null ? (this.selected as any[])[Number(idx)] : undefined // any: selected is a dynamic array\n // trigger event\n const edata = this.trigger('mouseLeave', { target: this.el, originalEvent: mouseEvent, item })\n if (edata.isCancelled === true) return\n // event after\n edata.finish()\n })\n\n // update size for enum, hide for file\n if (this.type === 'enum') {\n const search = this.helpers.multi?.find('input')\n search?.css({ width: '15px' })\n } else {\n this.helpers.multi?.find('.li-search').hide()\n }\n this.resize()\n }\n return Date.now() - time\n }\n\n // resizing width of list, enum, file controls\n resize(): void {\n const width = this.el!.clientWidth\n // let height = this.el!.clientHeight\n // if (this.tmp.current_width == width && height > 0) return\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const styles = getComputedStyle(this.el!) as any // any: CSSStyleDeclaration has numeric-only index; cast for hyphenated key access\n\n const focus = this.helpers.search\n const multi = this.helpers.multi\n const suffix = this.helpers.suffix\n const prefix = this.helpers.prefix\n\n // resize helpers\n if (focus) {\n query(focus).css('width', width)\n }\n if (multi) {\n query(multi).css('width', width - parseInt(styles['margin-left'], 10) - parseInt(styles['margin-right'], 10))\n }\n if (suffix) {\n this.addSuffix()\n }\n if (prefix) {\n this.addPrefix()\n }\n // enum or file\n const div = this.helpers.multi\n if (['enum', 'file'].includes(this.type) && div) {\n // adjust height\n query(this.el).css('height', '')\n let cntHeight = (query(div).find(':scope div.tsg-multi-items').get(0) as HTMLElement).clientHeight + 5\n if (cntHeight < 20) cntHeight = 20\n // max height\n if (this.tmp['max-height'] != null && cntHeight > this.tmp['max-height']) {\n cntHeight = this.tmp['max-height'] ?? cntHeight\n }\n // min height\n if (this.tmp['min-height'] != null && cntHeight < this.tmp['min-height']) {\n cntHeight = this.tmp['min-height'] ?? cntHeight\n }\n const inpHeight = TsUtils.getSize(this.el, 'height') - 2\n if (inpHeight > cntHeight) cntHeight = inpHeight\n query(div).css({\n 'height': cntHeight + 'px',\n overflow: (cntHeight == this.tmp['max-height'] ? 'auto' : 'hidden')\n })\n query(div).css('height', cntHeight + 'px')\n query(this.el).css({ 'height': cntHeight + 'px' })\n }\n // remember width\n this.tmp.current_width = width\n }\n\n reset(): void {\n // restore paddings\n if (this.tmp != null) {\n query(this.el).css('height', '')\n ;['padding-left', 'padding-right', 'background-color', 'border-color'].forEach((prop: string) => {\n if (this.tmp && this.tmp['old-'+ prop] != null) {\n query(this.el).css(prop, this.tmp['old-' + prop])\n delete this.tmp['old-' + prop]\n }\n })\n // remove resize watcher\n clearInterval(this.tmp.sizeTimer)\n }\n // remove events and (data)\n ;(query(this.el).val(this.clean(query(this.el).val())) as Query)\n .removeClass('TsField tsg-input')\n .removeData('selected selectedIndex')\n .off('.TsField') // remove only events added by TsField\n // remove helpers\n Object.keys(this.helpers).forEach((key: string) => {\n query(this.helpers[key]).remove()\n })\n this.helpers = {}\n delete this.el!._w2field\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n clean(val: any): any { // any: val can be string or number; returns cleaned string or number\n // issue #499\n if (typeof val === 'number'){\n return val\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const options = this.options as any // any: options shape depends on type\n val = String(val).trim()\n // clean\n if (['int', 'float', 'money', 'currency', 'percent'].includes(this.type)) {\n if (typeof val === 'string') {\n if (options.autoFormat) {\n if (['money', 'currency'].includes(this.type)) {\n val = String(val).replace(options.moneyRE, '')\n }\n if (this.type === 'percent') {\n val = String(val).replace(options.percentRE, '')\n }\n if (['int', 'float'].includes(this.type)) {\n val = String(val).replace(options.numberRE, '')\n }\n }\n // escape group symbol for regex as it could be a ., which is wild card in regex\n const esc_gsroupSymbol = options.groupSymbol.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const esc_decimalSymbol = options.decimalSymbol.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n val = val.replace(/\\s+/g, '')\n .replace(new RegExp(esc_gsroupSymbol, 'g'), '')\n .replace(new RegExp(esc_decimalSymbol, 'g'), '.')\n }\n if (val !== '' && TsUtils.isFloat(val)) val = Number(val); else val = ''\n }\n return val\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n format(val: any): any { // any: val is the raw field value; return is the formatted display string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const options = this.options as any // any: options shape depends on type\n // auto format numbers or money\n if (options.autoFormat && val !== '') {\n switch (this.type) {\n case 'money':\n case 'currency':\n val = TsUtils.formatNumber(val, options.currency.precision, true)\n if (val !== '') val = options.currency.prefix + val + options.currency.suffix\n break\n case 'percent':\n val = TsUtils.formatNumber(val, options.precision, true)\n if (val !== '') val += '%'\n break\n case 'float':\n val = TsUtils.formatNumber(val, options.precision, true)\n break\n case 'int':\n val = TsUtils.formatNumber(val, 0, true)\n break\n }\n // if default group symbol does not match - replase it\n const group = (1000).toLocaleString(TsUtils.settings.locale, { useGrouping: true }).slice(1, 2)\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (group !== (this.options as any).groupSymbol) {\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n val = val.replaceAll(group, (this.options as any).groupSymbol)\n }\n }\n return val\n }\n\n change(event: Event): false | void {\n // numeric\n if (['int', 'float', 'money', 'currency', 'percent'].indexOf(this.type) !== -1) {\n // check max/min\n const val = query(this.el).val()\n const new_val = this.format(this.clean(query(this.el).val()))\n // if was modified\n if (val !== '' && val != new_val) {\n query(this.el).val(new_val)\n // cancel event\n event.stopPropagation()\n event.preventDefault()\n return false\n }\n }\n // color\n if (this.type === 'color') {\n let color = query(this.el).val() as string\n if (color.substr(0, 3).toLowerCase() !== 'rgb') {\n color = '#' + color\n const len = (query(this.el).val() as string).length\n if (len !== 8 && len !== 6 && len !== 3) color = ''\n }\n const next = (query(this.el).get(0) as Element).nextElementSibling\n query(next).find('div').css('background-color', color)\n if (query(this.el).hasClass('has-focus')) {\n this.updateOverlay()\n }\n }\n // list, enum\n if (['list', 'enum', 'file'].indexOf(this.type) !== -1) {\n this.refresh()\n }\n // date, time\n if (['date', 'time', 'datetime'].indexOf(this.type) !== -1) {\n // convert linux timestamps\n let tmp = parseInt(this.el!.value)\n if (TsUtils.isInt(this.el!.value) && tmp > 3000) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (this.type === 'time') tmp = TsUtils.formatTime(new Date(tmp), (this.options as any).format) as any // any: formatTime returns string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (this.type === 'date') tmp = TsUtils.formatDate(new Date(tmp), (this.options as any).format) as any // any: formatDate returns string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (this.type === 'datetime') tmp = TsUtils.formatDateTime(new Date(tmp), (this.options as any).format) as any // any: formatDateTime returns string\n ;(query(this.el).val(String(tmp)) as Query).trigger('input').trigger('change')\n }\n }\n }\n\n click(event: MouseEvent): void {\n // lists\n if (['list', 'combo', 'enum'].includes(this.type)) {\n if (!query(this.el).hasClass('has-focus')) {\n this.focus(event as unknown as FocusEvent)\n }\n if (this.type == 'list' || this.type == 'combo') {\n // if overlay is already open (and not just opened on focus event) then hide it\n if (!this.tmp.openedOnFocus) {\n const name = this.el!.id + '_menu'\n const overlay = TsMenu.get(name)\n if (overlay?.displayed) {\n TsMenu.hide(name)\n } else {\n this.updateOverlay()\n }\n }\n delete this.tmp.openedOnFocus\n if (this.type == 'list') {\n // since list has separate search input, in order to keep the overlay open, need to stop\n event.stopPropagation()\n }\n }\n if (this.type == 'enum') {\n this.updateOverlay()\n }\n }\n // other fields with drops\n if (['date', 'time', 'datetime', 'color'].includes(this.type)) {\n this.updateOverlay()\n }\n }\n\n focus(event: FocusEvent & { showMenu?: boolean }): void {\n if (this.type == 'list' && document.activeElement == this.el) {\n this.helpers.search_focus?.focus()\n // update overlay if needed\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (event.showMenu !== false && (this.options as any).openOnFocus !== false && query(this.el).hasClass('has-focus')\n && !this.tmp.overlay?.overlay?.displayed) {\n setTimeout(() => {\n this.tmp.openedOnFocus = true\n this.updateOverlay()\n }, 0) // execute at the end of event loop\n }\n return\n }\n // color, date, time\n if (['color', 'date', 'time', 'datetime'].indexOf(this.type) !== -1) {\n if (query(this.el).prop('readOnly') || query(this.el).prop('disabled')) return\n this.updateOverlay()\n }\n // menu\n if (['list', 'combo', 'enum'].indexOf(this.type) !== -1) {\n if (query(this.el).prop('readOnly') || query(this.el).prop('disabled')) {\n // still add focus\n query(this.el).addClass('has-focus')\n return\n }\n // regenerate items\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (typeof (this.options as any)._items_fun == 'function') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(this.options as any).items = TsUtils.normMenu.call(this, (this.options as any)._items_fun, this.options as any) // any: options is TsFieldOptions which is a superset of TsNormMenuOptions\n }\n if (this.helpers.search) {\n const search = this.helpers.search_focus\n if (search) {\n search.value = ''\n search.select()\n }\n }\n if (this.type == 'enum') {\n // file control in particular need to receive focus after file select\n const search = query(this.el!.previousElementSibling).find('.li-search input').get(0) as HTMLInputElement\n if (document.activeElement !== search) {\n search.focus()\n }\n }\n this.resize()\n // update overlay if needed\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (event.showMenu !== false && (this.options as any).openOnFocus !== false && query(this.el).hasClass('has-focus')\n && !this.tmp.overlay?.overlay?.displayed) {\n setTimeout(() => {\n this.tmp.openedOnFocus = true\n this.updateOverlay()\n }, 0) // execute at the end of event loop\n }\n }\n if (this.type == 'file') {\n const prev = (query(this.el).get(0) as Element).previousElementSibling\n query(prev).addClass('has-focus')\n }\n query(this.el).addClass('has-focus')\n }\n\n blur(_event: FocusEvent): void {\n const val = (query(this.el).val() as string).trim()\n query(this.el).removeClass('has-focus')\n\n if (['int', 'float', 'money', 'currency', 'percent'].includes(this.type)) {\n if (val !== '') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let newVal: any = val // any: newVal may be string or number after clean()\n let error = ''\n if (!this.isStrValid(val)) { // validity is also checked in blur\n newVal = ''\n } else {\n const rVal = this.clean(val)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const options = this.options as any // any: options shape depends on type\n if (options.min != null && rVal < options.min) {\n newVal = options.min\n error = `Should be >= ${options.min}`\n }\n if (options.max != null && rVal > options.max) {\n newVal = options.max\n error = `Should be <= ${options.max}`\n }\n }\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((this.options as any).autoCorrect) {\n ;(query(this.el).val(newVal) as Query).trigger('input').trigger('change')\n if (error) {\n TsTooltip.show({\n name: this.el!.id + '_error',\n anchor: this.el,\n html: error\n })\n setTimeout(() => { TsTooltip.hide(this.el!.id + '_error') }, 3000)\n }\n }\n }\n }\n // date or time\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (['date', 'time', 'datetime'].includes(this.type) && (this.options as any).autoCorrect) {\n if (val !== '') {\n const check = this.type == 'date' ? TsUtils.isDate :\n (this.type == 'time' ? TsUtils.isTime : TsUtils.isDateTime)\n if (!TsDate.inRange(this.el!.value, this.options)\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n || !check.bind(TsUtils)(this.el!.value, (this.options as any).format)) {\n // if not in range or wrong value - clear it\n ;(query(this.el).val('') as Query).trigger('input').trigger('change')\n }\n }\n }\n // clear search input\n if (this.type === 'enum') {\n ;(query(this.helpers.multi).find('input').val('') as Query).css('width', '15px')\n // don't hide menu on blur, it should be hidden on tab key up instead, or it will not alow select with click\n // TsMenu.hide(this.el!.id + '_menu')\n }\n if (this.type == 'file') {\n const prev = this.el!.previousElementSibling\n query(prev).removeClass('has-focus')\n }\n if (this.type === 'list') {\n this.el!.value = this.selected?.text ?? ''\n // don't hide menu on blur, it should be hidden on tab key up instead, or it will not alow select with click\n // TsMenu.hide(this.el!.id + '_menu')\n }\n }\n\n keyDown(event: KeyboardEvent, extra?: { keyCode?: number }): false | void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const options = this.options as any // any: options shape depends on type\n const key = event.keyCode || (extra && extra.keyCode)\n let cancel = false\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let val: any, inc: number, daymil: number, dt: Date | boolean, newValue: number, newDT: string // any: val holds current field value (string or number)\n // ignore wrong pressed key\n if (['int', 'float', 'money', 'currency', 'percent', 'hex', 'bin', 'color', 'alphanumeric'].includes(this.type)) {\n if (!event.metaKey && !event.ctrlKey && !event.altKey) {\n if (!this.isStrValid(event.key ?? '1', true) && // valid & is not arrows, dot, comma, etc keys\n ![9, 8, 13, 27, 37, 38, 39, 40, 46].includes(event.keyCode)) {\n event.preventDefault()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (event.stopPropagation) event.stopPropagation(); else (event as any).cancelBubble = true // any: cancelBubble is legacy IE\n return false\n }\n }\n }\n // numeric\n if (['int', 'float', 'money', 'currency', 'percent'].includes(this.type)) {\n if (!options.keyboard || query(this.el).prop('readOnly') || query(this.el).prop('disabled')) return\n val = parseFloat((query(this.el).val() as string).replace(options.moneyRE, '')) || 0\n inc = options.step\n if (event.ctrlKey || event.metaKey) inc = options.step * 10\n switch (key) {\n case 38: // up\n if (event.shiftKey) break // no action if shift key is pressed\n newValue = (val + inc <= options.max || options.max == null ? Number((val + inc).toFixed(12)) : options.max)\n ;(query(this.el).val(String(newValue)) as Query).trigger('input').trigger('change')\n cancel = true\n break\n case 40: // down\n if (event.shiftKey) break // no action if shift key is pressed\n newValue = (val - inc >= options.min || options.min == null ? Number((val - inc).toFixed(12)) : options.min)\n ;(query(this.el).val(String(newValue)) as Query).trigger('input').trigger('change')\n cancel = true\n break\n }\n if (cancel) {\n event.preventDefault()\n this.moveCaret2end()\n }\n }\n // date/datetime\n if (['date', 'datetime'].includes(this.type)) {\n if (!options.keyboard || query(this.el).prop('readOnly') || query(this.el).prop('disabled')) return\n const is = (this.type == 'date' ? TsUtils.isDate : TsUtils.isDateTime).bind(TsUtils) as (val: string, format: string, returnDate: boolean) => Date | boolean\n const format = (this.type == 'date' ? TsUtils.formatDate : TsUtils.formatDateTime).bind(TsUtils) as (time: number, format: string) => string\n\n daymil = 24*60*60*1000\n inc = 1\n if (event.ctrlKey || event.metaKey) inc = 10 // by month\n dt = is(query(this.el).val() as string, options.format, true)\n if (!dt) { dt = new Date(); daymil = 0 }\n switch (key) {\n case 38: // up\n if (event.shiftKey) break // no action if shift key is pressed\n if (inc == 10) {\n (dt as Date).setMonth((dt as Date).getMonth() + 1)\n } else {\n (dt as Date).setTime((dt as Date).getTime() + daymil)\n }\n newDT = format((dt as Date).getTime(), options.format)\n ;(query(this.el).val(newDT) as Query).trigger('input').trigger('change')\n cancel = true\n break\n case 40: // down\n if (event.shiftKey) break // no action if shift key is pressed\n if (inc == 10) {\n (dt as Date).setMonth((dt as Date).getMonth() - 1)\n } else {\n (dt as Date).setTime((dt as Date).getTime() - daymil)\n }\n newDT = format((dt as Date).getTime(), options.format)\n ;(query(this.el).val(newDT) as Query).trigger('input').trigger('change')\n cancel = true\n break\n }\n if (cancel) {\n event.preventDefault()\n this.moveCaret2end()\n this.updateOverlay()\n }\n }\n // time\n if (this.type === 'time') {\n if (!options.keyboard || query(this.el).prop('readOnly') || query(this.el).prop('disabled')) return\n inc = (event.ctrlKey || event.metaKey ? 60 : 1)\n val = query(this.el).val()\n let time = TsDate.str2min(val as string) || TsDate.str2min((new Date()).getHours() + ':' + ((new Date()).getMinutes() - 1))\n switch (key) {\n case 38: // up\n if (event.shiftKey) break // no action if shift key is pressed\n time += inc\n cancel = true\n break\n case 40: // down\n if (event.shiftKey) break // no action if shift key is pressed\n time -= inc\n cancel = true\n break\n }\n if (cancel) {\n event.preventDefault()\n ;(query(this.el).val(TsDate.min2str(time)) as Query).trigger('input').trigger('change')\n this.moveCaret2end()\n }\n }\n // list/enum\n if (['list', 'enum'].includes(this.type)) {\n switch (key) {\n case 8: // delete\n case 46: // backspace\n if (this.type == 'list') {\n const search = query(this.helpers.search_focus)\n if (search.val() == '') {\n const edata = this.trigger('remove', { target: this.el, originalEvent: event, item: this.selected })\n if (edata.isCancelled === true) return\n this.selected = null\n TsMenu.hide(this.el!.id + '_menu')\n ;(query(this.el).val('') as Query).trigger('input').trigger('change')\n edata.finish()\n }\n } else {\n const search = query(this.helpers.multi).find('input')\n if (search.val() == '') {\n const edata = this.trigger('remove', { target: this.el, originalEvent: event, item: this.selected[this.selected.length - 1] })\n if (edata.isCancelled === true) return\n\n TsMenu.hide(this.el!.id + '_menu')\n this.selected.pop()\n // update selected array in overlay\n const overlay = TsMenu.get(this.el!.id + '_menu')\n if (overlay) overlay.options.selected = this.selected\n this.refresh()\n edata.finish()\n }\n }\n break\n case 9: // tab key\n case 16: // shift key (when shift+tab)\n TsMenu.hide(this.el!.id + '_menu')\n break\n case 27: // escape\n TsMenu.hide(this.el!.id + '_menu')\n this.refresh()\n break\n default: {\n // intentionally blank\n }\n }\n }\n }\n\n keyUp(event: KeyboardEvent): void {\n if (this.type == 'list') {\n const search = query(this.helpers.search_focus)\n if (search.val() !== '') {\n query(this.el).attr('placeholder', '')\n } else {\n query(this.el).attr('placeholder', this.tmp.pholder)\n }\n if (event.keyCode == 13) {\n setTimeout(() => {\n search.val('')\n TsMenu.hide(this.el!.id + '_menu')\n this.refresh()\n }, 1)\n }\n // if arrows are clicked, it will show overlay\n if ([38, 40].includes(event.keyCode) && !this.tmp.overlay?.overlay?.displayed) {\n this.updateOverlay()\n }\n this.refresh()\n }\n if (this.type == 'combo') {\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (![9, 16, 27].includes(event.keyCode) && (this.options as any).openOnFocus !== true) {\n // do not show when receives focus on tab or shift + tab or on esc\n this.updateOverlay()\n }\n // if arrows are clicked, it will show overlay\n if ([38, 40].includes(event.keyCode) && !this.tmp.overlay?.overlay?.displayed) {\n this.updateOverlay()\n }\n }\n if (this.type == 'enum') {\n const search = this.helpers.multi?.find('input')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const styles = getComputedStyle(search?.get(0) as HTMLElement) as any // any: CSSStyleDeclaration has numeric-only index; cast for hyphenated key access\n const width = TsUtils.getStrWidth(search?.val() as string,\n `font-family: ${styles['font-family']}; font-size: ${styles['font-size']};`, undefined)\n search?.css({ width: (width + 15) + 'px' })\n this.resize()\n // if delete, backspace, tab, shift, escape - hide menu\n if ([8, 46, 9, 16, 27].includes(event.keyCode)) {\n if (this.tmp.overlay?.overlay?.displayed) {\n TsMenu.hide(this.el!.id + '_menu')\n }\n } else {\n this.updateOverlay()\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n findItemIndex(items: any[], id: any, parents?: number[]): number[] { // any: items/id vary by field type\n let inds: number[] = []\n if (!parents) parents = []\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (['list', 'combo', 'enum'].includes(this.type) && (this.options as any).url) {\n // remove source, so get it from overlay\n const overlay = TsMenu.get(this.el!.id + '_menu')\n if (overlay) {\n items = overlay.options.items\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(this.options as any).items = items\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items.forEach((item: any, ind: number) => { // any: item shape varies by field type\n if (item.id === id) {\n inds = parents.concat([ind])\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(this.options as any).index = [ind]\n }\n if (inds.length == 0 && item.items && item.items.length > 0) {\n parents.push(ind)\n inds = this.findItemIndex(item.items, id, parents)\n parents.pop()\n }\n })\n return inds\n }\n\n updateOverlay(_indexOnly?: boolean): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const options = this.options as any // any: options shape depends on type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let params: any // any: params object is assembled per-type and passed to TsMenu/TsColor/TsDate\n // color\n if (this.type === 'color') {\n if (query(this.el).prop('readOnly') || query(this.el).prop('disabled')) return\n TsColor.show(TsUtils.extend({\n name: this.el!.id + '_color',\n anchor: this.el,\n transparent: options.transparent,\n advanced: options.advanced,\n color: this.el!.value,\n liveUpdate: true\n }, this.options))\n .select((event: TsEventPayload) => {\n const color = event.detail['color'] as string // any: detail shape determined by TsColor overlay\n ;(query(this.el).val(color) as Query).trigger('input').trigger('change')\n })\n .liveUpdate((event: TsEventPayload) => {\n const color = event.detail['color'] as string // any: detail shape determined by TsColor overlay\n query(this.helpers.suffix).find(':scope > div').css('background-color', '#' + color)\n })\n }\n // list\n if (['list', 'combo', 'enum'].includes(this.type)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let el: any = this.el // any: el is TsFieldElement|HTMLElement depending on type\n let input: HTMLElement = this.el!\n if (this.type === 'enum') {\n el = this.helpers.multi?.get(0) as TsFieldElement ?? this.el\n input = query(el).find('input').get(0) as HTMLElement ?? this.el\n }\n if (this.type === 'list') {\n const sel = this.selected\n if (TsUtils.isPlainObject(sel) && Object.keys(sel).length > 0) {\n const ind = this.findItemIndex(options.items, sel.id)\n if (ind.length > 0) {\n options.index = ind\n }\n }\n input = this.helpers.search_focus ?? this.el!\n }\n if (query(this.el).hasClass('has-focus') && !this.el!.readOnly && !this.el!.disabled) {\n params = TsUtils.extend({}, options, {\n name: this.el!.id + '_menu',\n anchor: input,\n selected: this.selected,\n search: false,\n render: options.renderDrop,\n anchorClass: '',\n offsetY: 5,\n maxHeight: options.maxDropHeight, // TODO: check\n maxWidth: options.maxDropWidth, // TODO: check\n minWidth: options.minDropWidth // TODO: check\n })\n this.tmp.overlay = TsMenu.show(params)\n .select((event: TsEventPayload) => {\n if (['list', 'combo'].includes(this.type)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.selected = event.detail['item'] as any // any: detail shape determined by TsMenu overlay\n query(input).val('')\n ;(query(this.el).val(this.selected.text) as Query).trigger('input').trigger('change')\n this.focus({ showMenu: false } as FocusEvent & { showMenu?: boolean })\n } else {\n const selected = this.selected\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const newItem = event.detail?.['item'] as any // any: detail shape determined by TsMenu overlay\n if (newItem) {\n // trigger event\n const edata = this.trigger('add', { target: this.el, item: newItem, originalEvent: event })\n if (edata.isCancelled === true) return\n // default behavior\n if (selected.length >= options.max && options.max > 0) selected.pop()\n delete newItem.hidden\n selected.push(newItem)\n query(this.el).trigger('input').trigger('change')\n query(this.helpers.multi).find('input').val('')\n // updaet selected array in overlays\n const overlay = TsMenu.get(this.el!.id + '_menu')\n if (overlay) overlay.options.selected = this.selected\n // event after\n edata.finish()\n }\n }\n })\n }\n }\n // date\n if (['date', 'time', 'datetime'].includes(this.type)) {\n if (query(this.el).prop('readOnly') || query(this.el).prop('disabled')) return\n TsDate.show(TsUtils.extend({\n name: this.el!.id + '_date',\n anchor: this.el,\n value: this.el!.value,\n }, this.options))\n .select((event: TsEventPayload) => {\n const date = event.detail['date'] as string | null | undefined // any: detail shape determined by TsDate overlay\n if (date != null) {\n ;(query(this.el).val(date) as Query).trigger('input').trigger('change')\n }\n })\n }\n }\n\n /*\n * INTERNAL FUNCTIONS\n */\n\n isStrValid(ch: string, loose?: boolean): boolean {\n let isValid = true\n switch (this.type) {\n case 'int':\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (loose && ['-', (this.options as any).groupSymbol].includes(ch)) {\n isValid = true\n } else {\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n isValid = TsUtils.isInt(ch.replace((this.options as any).numberRE, ''))\n }\n break\n case 'percent':\n ch = ch.replace(/%/g, '')\n // falls through to float\n case 'float':\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (loose && ['-', '', (this.options as any).decimalSymbol, (this.options as any).groupSymbol].includes(ch)) {\n isValid = true\n } else {\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n isValid = TsUtils.isFloat(ch.replace((this.options as any).numberRE, ''))\n }\n break\n case 'money':\n case 'currency':\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (loose && ['-', (this.options as any).decimalSymbol, (this.options as any).groupSymbol, (this.options as any).currency.prefix,\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.options as any).currency.suffix].includes(ch)) {\n isValid = true\n } else {\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n isValid = TsUtils.isFloat(ch.replace((this.options as any).moneyRE, ''))\n }\n break\n case 'bin':\n isValid = TsUtils.isBin(ch)\n break\n case 'color':\n case 'hex':\n isValid = TsUtils.isHex(ch)\n break\n case 'alphanumeric':\n isValid = TsUtils.isAlphaNumeric(ch)\n break\n }\n return isValid\n }\n\n addPrefix(): void {\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (!(this.options as any).prefix) {\n return\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const styles = getComputedStyle(this.el!) as any // any: CSSStyleDeclaration has numeric-only index; cast for hyphenated key access\n if (this.tmp['old-padding-left'] == null) {\n this.tmp['old-padding-left'] = styles['padding-left']\n }\n // remove if already displayed\n if (this.helpers.prefix) query(this.helpers.prefix).remove()\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n query(this.el).before(`<div class=\"tsg-field-helper\">${(this.options as any).prefix}</div>`)\n const helper = (query(this.el).get(0) as Element).previousElementSibling as HTMLElement\n query(helper)\n .css({\n 'color' : styles['color'],\n 'font-family' : styles['font-family'],\n 'font-size' : styles['font-size'],\n 'height' : this.el!.clientHeight + 'px',\n 'padding-top' : parseInt(styles['padding-top'], 10) + 1 + 'px',\n 'padding-bottom' : parseInt(styles['padding-bottom'], 10) - 1 + 'px',\n 'padding-left' : this.tmp['old-padding-left'] ?? '',\n 'padding-right' : 0,\n 'margin-top' : (parseInt(styles['margin-top'], 10)) + 'px',\n 'margin-bottom' : (parseInt(styles['margin-bottom'], 10)) + 'px',\n 'margin-left' : styles['margin-left'],\n 'margin-right' : 0,\n 'z-index' : 1,\n 'display' : 'inline-flex',\n 'align-items' : 'center'\n })\n // only if visible\n query(this.el).css('padding-left', helper.clientWidth + 'px !important')\n // remember helper\n this.helpers.prefix = helper\n }\n\n addSuffix(): void {\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (!(this.options as any).suffix && !(this.options as any).arrows) {\n return\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const styles = getComputedStyle(this.el!) as any // any: CSSStyleDeclaration has numeric-only index; cast for hyphenated key access\n if (this.tmp['old-padding-right'] == null) {\n this.tmp['old-padding-right'] = styles['padding-right']\n }\n let pr = parseInt(styles['padding-right'] || '0')\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((this.options as any).arrows) {\n // remove if already displayed\n if (this.helpers.arrows) query(this.helpers.arrows).remove()\n // add fresh\n query(this.el).after(\n '<div class=\"tsg-field-helper\" style=\"border: 1px solid transparent\">&#160;'+\n ' <div class=\"tsg-field-up\" type=\"up\">'+\n ' <div class=\"arrow-up\" type=\"up\"></div>'+\n ' </div>'+\n ' <div class=\"tsg-field-down\" type=\"down\">'+\n ' <div class=\"arrow-down\" type=\"down\"></div>'+\n ' </div>'+\n '</div>')\n const arrowHelper = (query(this.el).get(0) as Element).nextElementSibling as HTMLElement\n const $arrowHelper = query(arrowHelper)\n $arrowHelper.css({\n 'color' : styles['color'],\n 'font-family' : styles['font-family'],\n 'font-size' : styles['font-size'],\n 'height' : this.el!.clientHeight + 'px',\n 'padding' : 0,\n 'margin-top' : (parseInt(styles['margin-top'], 10) + 1) + 'px',\n 'margin-bottom' : 0,\n 'border-left' : '1px solid silver',\n 'width' : '16px',\n 'transform' : 'translateX(-100%)'\n })\n $arrowHelper.on('mousedown', (event: Event) => {\n const mouseEvent = event as MouseEvent\n if (query(mouseEvent.target).hasClass('arrow-up')) {\n this.keyDown(mouseEvent as unknown as KeyboardEvent, { keyCode: 38 })\n }\n if (query(mouseEvent.target).hasClass('arrow-down')) {\n this.keyDown(mouseEvent as unknown as KeyboardEvent, { keyCode: 40 })\n }\n })\n pr += arrowHelper.clientWidth // width of the control\n query(this.el).css('padding-right', pr + 'px !important')\n this.helpers.arrows = arrowHelper\n }\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((this.options as any).suffix !== '') {\n // remove if already displayed\n if (this.helpers.suffix) query(this.helpers.suffix).remove()\n // add fresh\n // any: cast-to-any for dynamic dispatch; TsField instance shape varies by `type` (text/list/date/color/etc) at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n query(this.el).after(`<div class=\"tsg-field-helper\">${(this.options as any).suffix}</div>`)\n const suffixHelper = (query(this.el).get(0) as Element).nextElementSibling as HTMLElement\n query(suffixHelper)\n .css({\n 'color' : styles['color'],\n 'font-family' : styles['font-family'],\n 'font-size' : styles['font-size'],\n 'height' : this.el!.clientHeight + 'px',\n 'padding-top' : styles['padding-top'],\n 'padding-bottom' : styles['padding-bottom'],\n 'padding-left' : 0,\n 'padding-right' : styles['padding-right'],\n 'margin-top' : (parseInt(styles['margin-top'], 10) + 2) + 'px',\n 'margin-bottom' : (parseInt(styles['margin-bottom'], 10) + 1) + 'px',\n 'transform' : 'translateX(-100%)'\n })\n\n query(this.el).css('padding-right', suffixHelper.clientWidth + 'px !important')\n this.helpers.suffix = suffixHelper\n }\n }\n\n // Only used for list\n addSearch(): void {\n if (this.type !== 'list') return\n // clean up & init\n if (this.helpers.search) query(this.helpers.search).remove()\n // remember original tabindex\n let tabIndex = parseInt(query(this.el).attr('tabIndex') as string)\n if (!isNaN(tabIndex) && tabIndex !== -1) this.tmp['old-tabIndex'] = tabIndex\n if (this.tmp['old-tabIndex']) tabIndex = this.tmp['old-tabIndex']\n if (tabIndex == null || isNaN(tabIndex)) tabIndex = 0\n // if there is id, add to search with \"_search\"\n let searchId = ''\n if (query(this.el).attr('id') != null) {\n searchId = 'id=\"' + query(this.el).attr('id') + '_search\"'\n }\n // build helper\n const html = `\n <div class=\"tsg-field-helper\">\n <span class=\"tsg-icon tsg-icon-search\"></span>\n <input ${searchId} type=\"text\" tabIndex=\"${tabIndex}\" ${query(this.el).prop('readOnly') ? 'readonly' : ''}\n autocapitalize=\"off\" autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"/>\n </div>`\n query(this.el).attr('tabindex', String(-1)).before(html)\n const helper = (query(this.el).get(0) as Element).previousElementSibling as HTMLElement\n this.helpers.search = helper\n this.helpers.search_focus = query(helper).find('input').get(0) as HTMLInputElement\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const styles = getComputedStyle(this.el!) as any // any: CSSStyleDeclaration has numeric-only index; cast for hyphenated key access\n const $helperSearch = query(helper)\n $helperSearch.css({\n width : this.el!.clientWidth + 'px',\n 'margin-top' : styles['margin-top'],\n 'margin-left' : styles['margin-left'],\n 'margin-bottom' : styles['margin-bottom'],\n 'margin-right' : styles['margin-right']\n })\n $helperSearch.find('input')\n .css({\n cursor : 'default',\n width : '100%',\n opacity : 1,\n padding : styles['padding'],\n margin : styles['margin'],\n border : '1px solid transparent',\n 'background-color' : 'transparent'\n })\n // INPUT events\n query(helper).find('input')\n .off('.tsg-helper')\n .on('focus.tsg-helper', (event: Event) => {\n const focusEvent = event as FocusEvent\n query(focusEvent.target).val('')\n this.tmp.pholder = query(this.el).attr('placeholder') ?? ''\n this.focus(focusEvent)\n focusEvent.stopPropagation()\n })\n .on('blur.tsg-helper', (event: Event) => {\n const focusEvent = event as FocusEvent\n query(focusEvent.target).val('')\n if (this.tmp.pholder != null) query(this.el).attr('placeholder', this.tmp.pholder)\n this.blur(focusEvent)\n focusEvent.stopPropagation()\n })\n .on('keydown.tsg-helper', (event: Event) => { this.keyDown(event as KeyboardEvent) })\n .on('keyup.tsg-helper', (event: Event) => { this.keyUp(event as KeyboardEvent) })\n // MAIN div\n query(helper)\n .off('.tsg-helper')\n .on('click.tsg-helper', (_event: Event) => {\n (query(helper).find('input').get(0) as HTMLInputElement).focus()\n })\n }\n\n // Used in enum/file\n addMultiSearch(): void {\n if (!['enum', 'file'].includes(this.type)) {\n return\n }\n // clean up & init\n query(this.helpers.multi).remove()\n // build helper\n let html = ''\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const styles = getComputedStyle(this.el!) as any // any: CSSStyleDeclaration has numeric-only index; cast for hyphenated key access\n const margin = TsUtils.stripSpaces(`\n margin-top: 0px;\n margin-bottom: 0px;\n margin-left: ${styles['margin-left']};\n margin-right: ${styles['margin-right']};\n width: ${(TsUtils.getSize(this.el, 'width') - parseInt(styles['margin-left'], 10)\n - parseInt(styles['margin-right'], 10))}px;\n `)\n if (this.tmp['min-height'] == null) {\n const min = this.tmp['min-height'] = parseInt((styles['min-height'] != 'none' ? styles['min-height'] : '0') || '0')\n const current = parseInt(styles['height'])\n this.tmp['min-height'] = Math.max(min, current)\n }\n if (this.tmp['max-height'] == null && styles['max-height'] != 'none') {\n this.tmp['max-height'] = parseInt(styles['max-height'])\n }\n\n // if there is id, add to search with \"_search\"\n let searchId = ''\n if (query(this.el).attr('id') != null) {\n searchId = `id=\"${query(this.el).attr('id')}_search\"`\n }\n // remember original tabindex\n let tabIndex = parseInt(query(this.el).attr('tabIndex') as string)\n if (!isNaN(tabIndex) && tabIndex !== -1) this.tmp['old-tabIndex'] = tabIndex\n if (this.tmp['old-tabIndex']) tabIndex = this.tmp['old-tabIndex']\n if (tabIndex == null || isNaN(tabIndex)) tabIndex = 0\n\n if (this.type === 'enum') {\n html = `\n <div class=\"tsg-field-helper tsg-list\" style=\"${margin}\">\n <div class=\"tsg-multi-items\">\n <div class=\"li-search\">\n <input ${searchId} type=\"text\" autocapitalize=\"off\" autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"\n tabindex=\"${tabIndex}\"\n ${query(this.el).prop('readOnly') ? 'readonly': '' }\n ${query(this.el).prop('disabled') ? 'disabled': '' }>\n </div>\n </div>\n </div>`\n }\n if (this.type === 'file') {\n html = `\n <div class=\"tsg-field-helper tsg-list\" style=\"${margin}\">\n <div class=\"tsg-multi-file\">\n <input name=\"attachment\" class=\"file-input\" type=\"file\" tabindex=\"-1\"'\n style=\"width: 100%; height: 100%; opacity: 0\" title=\"\"\n ${(this.options as { max?: number }).max !== 1 ? 'multiple' : ''}\n ${query(this.el).prop('readOnly') || query(this.el).prop('disabled') ? 'disabled': ''}\n ${query(this.el).attr('accept') ? ' accept=\"'+ query(this.el).attr('accept') +'\"': ''}>\n </div>\n <div class=\"tsg-multi-items\">\n <div class=\"li-search\" style=\"display: none\">\n <input ${searchId} type=\"text\" autocapitalize=\"off\" autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"\n tabindex=\"${tabIndex}\"\n ${query(this.el).prop('readOnly') ? 'readonly': '' }\n ${query(this.el).prop('disabled') ? 'disabled': '' }>\n </div>\n </div>\n </div>`\n }\n // old bg and border\n this.tmp['old-background-color'] = styles['background-color']\n this.tmp['old-border-color'] = styles['border-color']\n\n query(this.el)\n .before(html)\n .css({\n 'border-color': 'transparent',\n 'background-color': 'transparent'\n })\n\n const div = query(this.el!.previousElementSibling)\n this.helpers.multi = div\n query(this.el).attr('tabindex', String(-1))\n // click anywhere on the field\n div.on('mousedown', (event: Event) => { query(event.target).addClass('has-focus') }) // this is needed so that visually focus is there\n .on('mouseup', (event: Event) => { query(event.target).removeClass('has-focus') })\n .on('click', (event: Event) => { this.focus(event as unknown as FocusEvent); this.updateOverlay() })\n\n // search field (small and growing one)\n div.find('input:not(.file-input)')\n .on('click', (event: Event) => { this.click(event as MouseEvent) })\n .on('focus', (event: Event) => { this.focus(event as FocusEvent) })\n .on('blur', (event: Event) => { this.blur(event as FocusEvent) })\n .on('keydown', (event: Event) => { this.keyDown(event as KeyboardEvent) })\n .on('keyup', (event: Event) => { this.keyUp(event as KeyboardEvent) })\n\n // file input\n if (this.type === 'file') {\n div.find('input.file-input')\n .off('.drag')\n .on('click.drag', (event: Event) => {\n const mouseEvent = event as MouseEvent\n mouseEvent.stopPropagation()\n if (query(this.el).prop('readOnly') || query(this.el).prop('disabled')) return\n this.focus(mouseEvent as unknown as FocusEvent)\n })\n .on('dragenter.drag', (_event: Event) => {\n if (query(this.el).prop('readOnly') || query(this.el).prop('disabled')) return\n div.addClass('tsg-file-dragover')\n })\n .on('dragleave.drag', (_event: Event) => {\n if (query(this.el).prop('readOnly') || query(this.el).prop('disabled')) return\n div.removeClass('tsg-file-dragover')\n })\n .on('drop.drag', (event: Event) => {\n const dragEvent = event as DragEvent\n if (query(this.el).prop('readOnly') || query(this.el).prop('disabled')) return\n div.removeClass('tsg-file-dragover')\n const files = Array.from(dragEvent.dataTransfer?.files ?? [])\n files.forEach((file: File) => { this.addFile(file) })\n this.focus(dragEvent as unknown as FocusEvent)\n // cancel to stop browser behaviour\n dragEvent.preventDefault()\n dragEvent.stopPropagation()\n })\n .on('dragover.drag', (event: Event) => {\n const dragEvent = event as DragEvent\n // cancel to stop browser behaviour\n dragEvent.preventDefault()\n dragEvent.stopPropagation()\n })\n .on('change.drag', (event: Event) => {\n const target = event.target as HTMLInputElement\n if (target.files != null) {\n Array.from(target.files).forEach((file: File) => { this.addFile(file) })\n }\n this.focus(event as unknown as FocusEvent)\n })\n }\n this.refresh()\n }\n\n addFile(file: File): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const options = this.options as any // any: options shape depends on type (file-specific here)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const selected = this.selected as any[] // any: selected is array of file-like objects\n const newItem: {\n name: string\n type: string\n modified: Date\n size: number\n content: string | null\n file: File\n } = {\n name : file.name,\n type : file.type,\n modified : new Date(file.lastModified),\n size : file.size,\n content : null,\n file : file\n }\n let size = 0\n let cnt = 0\n const errors: string[] = []\n if (Array.isArray(selected)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n selected.forEach((item: any) => { // any: item is a file-like object\n if (item.name == file.name && item.size == file.size) {\n errors.push(TsUtils.lang('The file \"${name}\" (${size}) is already added.', {\n name: file.name, size: String(TsUtils.formatSize(file.size)) }))\n }\n size += item.size\n cnt++\n })\n }\n if (options.maxFileSize !== 0 && newItem.size > options.maxFileSize) {\n errors.push(TsUtils.lang('Maximum file size is ${size}', { size: String(TsUtils.formatSize(options.maxFileSize)) }))\n }\n if (options.maxSize !== 0 && size + newItem.size > options.maxSize) {\n errors.push(TsUtils.lang('Maximum total size is ${size}', { size: String(TsUtils.formatSize(options.maxSize)) }))\n }\n if (options.max !== 0 && cnt >= options.max) {\n errors.push(TsUtils.lang('Maximum number of files is ${count}', { count: options.max }))\n }\n\n // trigger event\n const edata = this.trigger('add', { target: this.el, file: newItem, total: cnt, totalSize: size, errors })\n if (edata.isCancelled === true) return\n // if errors\n if (errors.length > 0) {\n if (options.showErrors) {\n TsTooltip.show({\n anchor: this.el,\n html: 'Errors: ' + errors.join('<br>'),\n hideOn: ['input', 'doc-click']\n })\n }\n console.log('ERRORS (while adding files): ', errors)\n return\n }\n // check params\n selected.push(newItem)\n // read file as base64\n if (typeof FileReader !== 'undefined' && options.readContent === true) {\n const reader = new FileReader()\n // need a closure — use arrow function to avoid no-this-alias\n reader.onload = (event: ProgressEvent<FileReader>) => {\n const fl = event.target?.result as string ?? ''\n const ind = fl.indexOf(',')\n newItem.content = fl.substr(ind + 1)\n this.refresh()\n query(this.el).trigger('input').trigger('change')\n // event after\n edata.finish()\n }\n reader.readAsDataURL(file)\n } else {\n this.refresh()\n query(this.el).trigger('input').trigger('change')\n edata.finish()\n }\n }\n\n // move cursror to end\n moveCaret2end(): void {\n setTimeout(() => {\n this.el!.setSelectionRange(this.el!.value.length, this.el!.value.length)\n }, 0)\n }\n}\n\nexport { TsField }\n"],"mappings":"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","names":["query","TsMenu","TsColor","TsDate","TsTooltip","_event"]}